<?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>6461</bug_id>
          
          <creation_ts>2006-01-10 00:52:53 -0800</creation_ts>
          <short_desc>html_formimpl.* should be split into multiple files (one per class)</short_desc>
          <delta_ts>2006-01-13 00:16:09 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P4</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>28109</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-10 00:52:53 -0800</bug_when>
    <thetext>html_formimpl.* should be split into multiple files (one per class)

the attached patch does just that.  I used a slightly better version of my split_class.pl script to start with, 
then mostly more manual removal.  The changes are simple, but large.  I&apos;ll happilly go over them all with 
someone over IRC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28112</commentid>
    <comment_count>1</comment_count>
      <attachid>5588</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-10 00:57:33 -0800</bug_when>
    <thetext>Created attachment 5588
patch (1 of 3) splitting html_formimpl.* into multiple classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28115</commentid>
    <comment_count>2</comment_count>
      <attachid>5591</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-10 00:58:49 -0800</bug_when>
    <thetext>Created attachment 5591
patch (2 of 3) splitting html_formimpl.* into multiple classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28117</commentid>
    <comment_count>3</comment_count>
      <attachid>5593</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-10 01:00:09 -0800</bug_when>
    <thetext>Created attachment 5593
patch (3 of 3) splitting html_formimpl.* into multiple classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28118</commentid>
    <comment_count>4</comment_count>
      <attachid>5594</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-10 01:01:10 -0800</bug_when>
    <thetext>Created attachment 5594
split_class.pl script I used</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28190</commentid>
    <comment_count>5</comment_count>
    <who name="">mitz</who>
    <bug_when>2006-01-10 14:38:05 -0800</bug_when>
    <thetext>html_formimpl.* are still in the tree and Frame.cpp still includes html_formimpl.h </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28350</commentid>
    <comment_count>6</comment_count>
    <who name="">mitz</who>
    <bug_when>2006-01-13 00:16:09 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; html_formimpl.* are still in the tree and Frame.cpp still includes html_formimpl.h 

mjs fixed this in revision 12047.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5588</attachid>
            <date>2006-01-10 00:57:33 -0800</date>
            <delta_ts>2006-01-10 00:57:33 -0800</delta_ts>
            <desc>patch (1 of 3) splitting html_formimpl.* into multiple classes.</desc>
            <filename>form.patch</filename>
            <type>text/plain</type>
            <size>633762</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL2todG1sdmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwva2h0bWx2aWV3
LmNwcAkocmV2aXNpb24gMTE5NzgpCisrKyBraHRtbC9raHRtbHZpZXcuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yOSw3ICsyOSw3IEBACiAKICNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBs
LmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2lubGluZWltcGwuaCIKLSNpbmNsdWRlICJodG1sL2h0
bWxfZm9ybWltcGwuaCIKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50SW1wbC5oIgogI2luY2x1
ZGUgInJlbmRlcmluZy9yZW5kZXJfYXJlbmEuaCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVy
X29iamVjdC5oIgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfY2FudmFzLmgiCkluZGV4OiBr
aHRtbC94bWwvZG9tX2RvY2ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9kb21fZG9j
aW1wbC5jcHAJKHJldmlzaW9uIDExOTc4KQorKysga2h0bWwveG1sL2RvbV9kb2NpbXBsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNjYsNyArNjYsNyBAQAogI2luY2x1ZGUgImh0bWwvaHRtbF9kb2N1
bWVudGltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfaGVhZGltcGwuaCIKICNpbmNsdWRlICJo
dG1sL2h0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCisj
aW5jbHVkZSAiSFRNTElucHV0RWxlbWVudEltcGwuaCIKICNpbmNsdWRlICJodG1sZmFjdG9yeS5o
IgogCiAjaW5jbHVkZSAiY3NzdmFsdWVzLmgiCkluZGV4OiBraHRtbC9odG1sL0hUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9IVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbC5oCShyZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0bWwvSFRNTFRleHRBcmVhRWxl
bWVudEltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAo
QykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAgIChDKSAxOTk5
IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQogICogICAgICAgICAgIChDKSAyMDAw
IERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDA0IEFw
cGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBw
bGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjIsNjk5ICsyMiwxNyBA
QAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZuZGVmIEhUTUxf
Rk9STUlNUExfSAotI2RlZmluZSBIVE1MX0ZPUk1JTVBMX0gKKyNpZm5kZWYgSFRNTF9IVE1MVGV4
dEFyZWFFbGVtZW50SW1wbF9ICisjZGVmaW5lIEhUTUxfSFRNTFRleHRBcmVhRWxlbWVudEltcGxf
SAogCi0jaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9o
dG1sX21pc2NpbXBsLmgiCisjaW5jbHVkZSAiSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCIK
IAotI2luY2x1ZGUgPHFwdHJ2ZWN0b3IuaD4KLSNpbmNsdWRlIDxxbWVtYXJyYXkuaD4KLSNpbmNs
dWRlIDxreG1sY29yZS9IYXNoTWFwLmg+Ci0KLWNsYXNzIEtIVE1MVmlldzsKLWNsYXNzIFFUZXh0
Q29kZWM7Ci0KLW5hbWVzcGFjZSBraHRtbAotewotICAgIGNsYXNzIEZvcm1EYXRhOwotICAgIGNs
YXNzIFJlbmRlckZvcm1FbGVtZW50OworbmFtZXNwYWNlIGtodG1sIHsKICAgICBjbGFzcyBSZW5k
ZXJUZXh0QXJlYTsKLSAgICBjbGFzcyBSZW5kZXJTZWxlY3Q7Ci0gICAgY2xhc3MgUmVuZGVyTGlu
ZUVkaXQ7Ci0gICAgY2xhc3MgUmVuZGVyRmlsZUJ1dHRvbjsKLSAgICBjbGFzcyBSZW5kZXJTbGlk
ZXI7CiB9CiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7Ci1jbGFzcyBGb3Jt
RGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTEltYWdl
RWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1MT3B0aW9uRWxl
bWVudEltcGw7Ci1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1l
bnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVh
bCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3Rh
dHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0
dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIHZvaWQg
aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1
bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1lbnRzKCk7Ci0g
ICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUoKSBjb25zdCB7
IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZGFy
eTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9v
bCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsgfQotCi0gICAg
dmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0
dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVu
dEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBs
ICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJtaXQoYm9vbCBh
Y3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2
b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9IG1hbGZvcm1l
ZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1fbWFsZm9ybWVk
OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwg
KmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAgICBib29sIGZv
cm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKTsKLQotICAg
IERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmlu
ZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY3Rp
b24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAg
ICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2QoY29uc3QgRE9N
U3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkxOG5EYXRhKCk7
Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVuZCBjbGFzcyBI
VE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBsOjpDb2xsZWN0
aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1MSW1hZ2VFbGVt
ZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAgIERPTVN0cmlu
ZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0cmluZyBtX2Jv
dW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9vbCBtX3Bvc3Qg
OiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRvY29tcGxldGUg
OiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5nc3VibWl0IDog
MTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1lZCA6IDE7Ci0g
ICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmluZyAmKTsK
LSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQotICAgIHVuc2ln
bmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0KLSAg
ICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1wbAot
ewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZyaWVuZCBjbGFz
cyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFn
UmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAgdmlydHVhbCBE
T01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRyb2wo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5hYmxlZCgpIGNv
bnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lk
IGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wgZGVlcCk7
Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0gICAgdmly
dHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAgICB2b2lkIG9u
Q2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREaXNh
YmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBj
b25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29s
IGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGJvb2wgcmVh
ZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBzZXRSZWFkT25s
eShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxl
Q2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNH
ZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBi
b29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLyoKLSAg
ICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNvZGVkIG5hbWU9
dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJuIHRydWUgZm9y
IGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAgKi8KLSAgICB2
aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkgeyByZXR1cm4g
ZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAgICB2aXJ0dWFs
IFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdM
aXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRv
bigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVk
U3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0
aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgoKSBjb25zdDsK
LSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICpt
X2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVhZE9ubHk6IDE7
Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxCdXR0
b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAgIFNVQk1JVCwK
LSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBET01TdHJpbmcg
dHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3Qg
KmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxlKik7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAq
YXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpl
dnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29s
KTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0gICAgdmly
dHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdmlydHVhbCB2
b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgRE9NU3Ry
aW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0
cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmFs
dWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBt
X3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51bSAgbV90eXBl
IDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAgIG1fYWN0aXZl
U3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEZpZWxk
U2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLXB1
YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRN
TEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVsZFNldEVsZW1l
bnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJl
dHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdD
aGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAg
ICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
ICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUo
KSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElucHV0RWxl
bWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmll
bmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6
UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0RWxlbWVudElt
cGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1YmxpYzoKLSAg
ICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVtIHsKLSAgICAg
ICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0gICAgICAgIENI
RUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAgICBSRVNFVCwK
LSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwKLSAgICAgICAg
QlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsKLQotICAgIEhU
TUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBs
ICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYg
dGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsK
LSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwot
Ci0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyBy
ZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHko
KSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3Vz
YWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsg
cmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBu
YW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
YXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29uc3QgeyBy
ZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0ZSgpIGNv
bnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHRCdXR0b24o
KSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCB8fCBt
X3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25z
dCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29sKTsKLSAgICBi
b29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5hdGU7IH0KLSAg
ICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0aCgpIGNvbnN0
IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Np
emU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VHlwZShjb25z
dCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWVXaXRo
RGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBE
T01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1Jl
bmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVh
bCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NXT1JEOyB9Ci0g
ICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0
ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigpOwotCi0gICAg
aW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAgIHZvaWQg
c2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwot
Ci0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50
KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMgPSBm
YWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWNj
ZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wg
bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRl
RW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmli
dXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlO
b25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpOwotCi0gICAg
dmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVk
KGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3Qg
KmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRh
KEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1
Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRlZFN1Ym1pdCgp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKTsK
LQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQotICAg
IHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0gICAgdmlydHVh
bCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlwZT1pbWFnZSB3
YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBvczsgfQotICAg
IGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQq
IHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFsIHZv
aWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKTsK
LSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0g
ICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBhbHRUZXh0KCkg
Y29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUlt
cGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7IHJldHVybiBt
X21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBjb25zdDsKLSAg
ICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAgCi0gICAgYm9v
bCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQoYm9v
bCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHQo
Y29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmlu
ZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNvbnN0IERPTVN0
cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBET01TdHJpbmcg
c3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAg
dm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAoKSBjb25zdDsK
LSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAg
ICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7Ci0KLSAgICBB
dG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGludCAgICAg
ICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAgbV9zaXplOwot
ICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0czsKLQotICAg
IEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVtIG1fdHlwZSA6
IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0Q2hlY2tlZCA6
IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1faW5kZXRl
cm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29sIG1fYWN0aXZl
U3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBib29sIG1fdmFs
dWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsKLXB1Ymxp
YzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmly
dHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9y
aXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxl
KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9u
KGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZm9ybSBlbGVt
ZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8KLSAgICBFbGVtZW50SW1w
bCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0oKTsKLQot
ICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZvcigpIGNvbnN0OwotICAg
IHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIGZvY3VzKCk7
Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50SUQ7Ci19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdlbmRFbGVtZW50SW1wbCA6IHB1YmxpYyBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxMZWdlbmRFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwot
ICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBib29s
IGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBraHRtbDo6UmVuZGVyT2Jq
ZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVyU3R5bGUgKik7
Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAg
ICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRoZSBsZWdlbmQncyBmaWVsZHNldCAKLSAg
ICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIERPTVN0cmluZyBh
Y2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNv
bnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lkIGZvY3VzKCk7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVy
U2VsZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBI
VE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgfkhUTUxTZWxlY3RFbGVtZW50SW1wbCgp
OwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25z
dCB7IHJldHVybiA2OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBs
KiBuZXdDaGlsZCk7Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotCi0gICAgdmlydHVh
bCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSApOwotCi0gICAgaW50IHNlbGVjdGVkSW5k
ZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoIGludCBpbmRleCApOwotCi0g
ICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQot
Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgaW50IG1pbldpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV9taW53aWR0aDsgfQotCi0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3Np
emU7IH0KLQotICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211bHRpcGxlOyB9
Ci0KLSAgICB2b2lkIGFkZCAoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJ
bXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZvaWQgcmVtb3ZlICggaW50
IGluZGV4ICk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICpv
cHRpb25zKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gb3B0aW9uc0hUTUxDb2xs
ZWN0aW9uKCk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBhbmQgbWlncmF0ZSB0byBvcHRpb25zKCku
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0cnVlOyB9Ci0g
ICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0
ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAo
IE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3
Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmly
dHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhj
ZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUlt
cGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBs
ICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hp
bGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJP
YmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAq
KTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCk7
Ci0KLSAgICAvLyBnZXQgdGhlIGFjdHVhbCBsaXN0Ym94IGluZGV4IG9mIHRoZSBvcHRpb25JbmRl
eHRoIG9wdGlvbgotICAgIGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNv
bnN0OwotICAgIC8vIHJldmVyc2Ugb2Ygb3B0aW9uVG9MaXN0SW5kZXggLSBnZXQgb3B0aW9uSW5k
ZXggZnJvbSBsaXN0Ym94SW5kZXgKLSAgICBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJ
bmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgUU1l
bUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGxpc3RJdGVtcygpIGNvbnN0Ci0gICAgIHsKLSAgICAg
ICAgIGlmIChtX3JlY2FsY0xpc3RJdGVtcykgY29uc3RfY2FzdDxIVE1MU2VsZWN0RWxlbWVudElt
cGwqPih0aGlzKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgICByZXR1cm4gbV9saXN0SXRl
bXM7Ci0gICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIG5vdGlmeU9w
dGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24sIGJvb2wg
c2VsZWN0ZWQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9B
bnlFbGVtZW50KTsKLQotICAgIHZvaWQgc2V0TXVsdGlwbGUoYm9vbCk7Ci0KLSAgICB2b2lkIHNl
dFNpemUoaW50KTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlY2FsY0xpc3RJdGVtcygpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgbXV0YWJsZSBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gbV9saXN0
SXRlbXM7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqbV9vcHRpb25zOwotICAgIHNo
b3J0IG1fbWlud2lkdGg7Ci0gICAgc2hvcnQgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0aXBsZTsK
LSAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MS2V5Z2VuRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAq
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29u
c3Q7Ci0KLSAgICAvLyAjIyMgdGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MKLSAgICB2aXJ0dWFs
IGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmly
dHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIp
OwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsK
LXByb3RlY3RlZDoKLSAgICBBdG9taWNTdHJpbmcgbV9jaGFsbGVuZ2U7Ci0gICAgQXRvbWljU3Ry
aW5nIG1fa2V5VHlwZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9w
dEdyb3VwRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsK
LXB1YmxpYzoKLSAgICBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywg
SFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwq
IG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Om9wdGlv
blRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpoclRhZyk7IH0KLQotICAg
IERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUo
KSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRCZWZvcmUgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxk
LCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpu
ZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYWRk
Q2hpbGQoIE5vZGVJbXBsKiBuZXdDaGlsZCApOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2b2lkIHJlY2FsY1Nl
bGVjdE9wdGlvbnMoKTsKLQotICAgIERPTVN0cmluZyBsYWJlbCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICYpOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0g
ICAgZnJpZW5kIGNsYXNzIERPTTo6SFRNTFNlbGVjdEVsZW1lbnRJbXBsOwotCi1wdWJsaWM6Ci0g
ICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWly
ZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwg
aW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMjsgfQotICAgIHZpcnR1YWwgYm9vbCBj
aGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5pc1Rl
eHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3JpcHRUYWcpOyB9
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLQotICAgIERPTVN0cmlu
ZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgdGV4dCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VGV4dChjb25zdCBET01TdHJpbmcgJiwgaW50ICZleGNlcHRpb24pOwotCi0gICAgaW50IGlu
ZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRJbmRleChpbnQsIGludCAmZXhjZXB0aW9uKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAq
YXR0cik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldFZhbHVl
KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIGJvb2wgc2VsZWN0ZWQoKSBjb25zdCB7IHJldHVy
biBtX3NlbGVjdGVkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3RlZChib29sIF9zZWxlY3RlZCk7Ci0K
LSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKmdldFNlbGVjdCgpIGNvbnN0OwotCi0gICAgdmly
dHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgYm9vbCBkZWZhdWx0U2VsZWN0ZWQo
KSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRTZWxlY3RlZCggYm9vbCApOwotCi0gICAgRE9N
U3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbCggY29uc3QgRE9NU3RyaW5n
ICYgKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGJvb2wgbV9z
ZWxlY3RlZDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBjbGFzcyBIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAogewogICAg
IGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4dEFyZWE7CkBAIC03OTEsNDMgKzEwOSw2IEBA
IHByb3RlY3RlZDoKICAgICBib29sIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7CiB9OwogCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxJc0luZGV4RWxlbWVudEltcGwgOiBwdWJsaWMg
SFRNTElucHV0RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MSXNJbmRleEVsZW1lbnRJ
bXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAg
ICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVy
biBUYWdTdGF0dXNGb3JiaWRkZW47IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIERPTVN0cmluZyBwcm9tcHQoKSBj
b25zdDsKLSAgICB2b2lkIHNldFByb21wdChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBET01TdHJpbmcgbV9wcm9tcHQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgOiBwdWJsaWMga2h0bWw6OlNoYXJlZDxI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsPgotewotcHVibGljOgotICAgIEhUTUxPcHRpb25zQ29s
bGVjdGlvbkltcGwoSFRNTFNlbGVjdEVsZW1lbnRJbXBsICppbXBsKSA6IG1fc2VsZWN0KGltcGwp
IHsgfQotCi0gICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMZW5ndGgo
dW5zaWduZWQpOwotICAgIE5vZGVJbXBsICppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKLSAg
ICBOb2RlSW1wbCAqbmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3Q7Ci0KLSAg
ICB2b2lkIGRldGFjaCgpIHsgbV9zZWxlY3QgPSAwOyB9Ci0KLXByaXZhdGU6Ci0gICAgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsICptX3NlbGVjdDsKLX07Ci0KIH0gLy9uYW1lc3BhY2UKIAogI2VuZGlm
CkluZGV4OiBraHRtbC9odG1sL0hUTUxTZWxlY3RFbGVtZW50SW1wbC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGtodG1sL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnRJbXBsLmgJKHJldmlzaW9uIDExOTc2KQorKysg
a2h0bWwvaHRtbC9IVE1MU2VsZWN0RWxlbWVudEltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNCw3
ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3Jn
KQogICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3Jn
KQogICogICAgICAgICAgIChDKSAyMDAwIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQot
ICogQ29weXJpZ2h0IChDKSAyMDA0IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAg
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYwpAQCAtMjIsNTEyICsyMiwyMiBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0Eu
CiAgKgogICovCi0jaWZuZGVmIEhUTUxfRk9STUlNUExfSAotI2RlZmluZSBIVE1MX0ZPUk1JTVBM
X0gKKyNpZm5kZWYgSFRNTF9IVE1MU2VsZWN0RWxlbWVudEltcGxfSAorI2RlZmluZSBIVE1MX0hU
TUxTZWxlY3RFbGVtZW50SW1wbF9ICiAKLSNpbmNsdWRlICJodG1sL2h0bWxfZWxlbWVudGltcGwu
aCIKLSNpbmNsdWRlICJodG1sL2h0bWxfbWlzY2ltcGwuaCIKKyNpbmNsdWRlICJIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbC5oIgogCi0jaW5jbHVkZSA8cXB0cnZlY3Rvci5oPgogI2luY2x1ZGUg
PHFtZW1hcnJheS5oPgotI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hNYXAuaD4KIAotY2xhc3MgS0hU
TUxWaWV3OwotY2xhc3MgUVRleHRDb2RlYzsKLQotbmFtZXNwYWNlIGtodG1sCi17Ci0gICAgY2xh
c3MgRm9ybURhdGE7Ci0gICAgY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQ7Ci0gICAgY2xhc3MgUmVu
ZGVyVGV4dEFyZWE7CituYW1lc3BhY2Uga2h0bWwgewogICAgIGNsYXNzIFJlbmRlclNlbGVjdDsK
LSAgICBjbGFzcyBSZW5kZXJMaW5lRWRpdDsKLSAgICBjbGFzcyBSZW5kZXJGaWxlQnV0dG9uOwot
ICAgIGNsYXNzIFJlbmRlclNsaWRlcjsKLX0KK307CiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFz
cyBET01TdHJpbmc7Ci1jbGFzcyBGb3JtRGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7
Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOwotY2xhc3MgSFRNTEltYWdlRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2Fk
ZXI7CiBjbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGw7CiBjbGFzcyBIVE1MT3B0aW9uc0NvbGxl
Y3Rpb25JbXBsOwogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVu
dEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1F
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVt
ZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50
KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0
YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRh
Y2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVj
dGlvbkltcGw+IGVsZW1lbnRzKCk7Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9N
U3RyaW5nIGVuY3R5cGUoKSBjb25zdCB7IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNl
dEVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkg
Y29uc3QgeyByZXR1cm4gbV9ib3VuZGFyeTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBt
X2F1dG9jb21wbGV0ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVt
ZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVs
ZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3Rlcklt
Z0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVt
ZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7
Ci0gICAgdm9pZCBzdWJtaXQoYm9vbCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAg
ICB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkg
eyBtX21hbGZvcm1lZCA9IG1hbGZvcm1lZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1l
ZCgpIHsgcmV0dXJuIG1fbWFsZm9ybWVkOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJM
QXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3Vi
bWl0Q2xpY2soKTsKLSAgICBib29sIGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0
IERPTVN0cmluZyAmdXJsKTsKLQotICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFy
c2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAm
KTsKLQotICAgIERPTVN0cmluZyBhY3Rpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdl
dCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IHN0YXRpYyB2b2lkIGkxOG5EYXRhKCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVt
ZW50OwotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRN
TENvbGxlY3Rpb25JbXBsOjpDb2xsZWN0aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBR
UHRyVmVjdG9yPEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAg
UVB0clZlY3RvcjxIVE1MSW1hZ2VFbGVtZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3Ry
aW5nIG1fdXJsOwotICAgIERPTVN0cmluZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0
eXBlOwotICAgIERPTVN0cmluZyBtX2JvdW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNo
YXJzZXQ7Ci0gICAgYm9vbCBtX3Bvc3QgOiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwot
ICAgIGJvb2wgbV9hdXRvY29tcGxldGUgOiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0g
ICAgYm9vbCBtX2RvaW5nc3VibWl0IDogMTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAg
Ym9vbCBtX21hbGZvcm1lZCA6IDE7Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0
eXBlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0
YSAmKSBjb25zdDsKLQotICAgIHVuc2lnbmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwgKik7Ci0KLSAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDog
cHVibGljIEhUTUxFbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1l
bnRJbXBsOwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1
YmxpYzoKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDAp
OwotICAgIHZpcnR1YWwgfkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0
dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdT
dGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyBy
ZXR1cm4gMTsgfQotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1f
Zm9ybTsgfQotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAg
IHZpcnR1YWwgYm9vbCBpc0NvbnRyb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmly
dHVhbCBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAq
YXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNl
cnRlZEludG9UcmVlKGJvb2wgZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJl
ZShib29sIGRlZXApOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQg
b25TZWxlY3QoKTsKLSAgICB2b2lkIG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXREaXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2Fy
ZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KLQotICAgIGJvb2wgcmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5
OyB9Ci0gICAgdm9pZCBzZXRSZWFkT25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmlu
ZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotCi0gICAgLyoKLSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMg
dG8gZ2V0IHRoZSBlbmNvZGVkIG5hbWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5n
Ci0gICAgICogcmV0dXJuIHRydWUgZm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQt
MTcuMTMuMikKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURh
dGFMaXN0JiwgYm9vbCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0Vk
aXRhYmxlKCk7Ci0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZp
bmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29s
IGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAg
ICBpbnQgdGFiSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXBy
b3RlY3RlZDoKLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAg
ICBIVE1MRm9ybUVsZW1lbnRJbXBsICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsK
LSAgICBib29sIG1fcmVhZE9ubHk6IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1Ymxp
YyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25F
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDAp
OwotICAgIHZpcnR1YWwgfkhUTUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBl
RW51bSB7Ci0gICAgICAgIFNVQk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgot
ICAgIH07Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0
dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0
bWw6OlJlbmRlclN0eWxlKik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRF
dmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3Jt
RGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0
YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNj
ZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVk
U3VibWl0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29s
IGZsYWcpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0Fu
eUVsZW1lbnQpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJv
dGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1
ZTsKLSAgICB0eXBlRW51bSAgbV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7
Ci0gICAgYm9vbCAgICAgIG1fYWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotY2xhc3MgSFRNTEZpZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZp
cnR1YWwgfkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQg
dGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNr
RFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNy
ZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAg
IHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0Owot
ICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBj
bGFzcyBIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5k
ZXJTbGlkZXI7Ci0KLXB1YmxpYzoKLSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAg
ICBlbnVtIHR5cGVFbnVtIHsKLSAgICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAg
ICAgIElTSU5ERVgsCi0gICAgICAgIENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAg
U1VCTUlULAotICAgICAgICBSRVNFVCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAot
ICAgICAgICBJTUFHRSwKLSAgICAgICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAg
IFJBTkdFCi0gICAgfTsKLQotICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAq
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudElt
cGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1w
bCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRh
Z1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBp
c0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0K
LSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21w
bGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBi
b29sIGlzSW5kZXRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQot
Ci0gICAgYm9vbCBpc1RleHRCdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlU
IHx8IG1fdHlwZSA9PSBSRVNFVCB8fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBi
b29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQot
ICAgIGJvb2wgY2hlY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQg
c2V0Q2hlY2tlZChib29sKTsKLSAgICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVy
biBtX2luZGV0ZXJtaW5hdGU7IH0KLSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0g
ICAgaW50IG1heExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNp
emUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0
OwotICAgIHZvaWQgc2V0VHlwZShjb25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5n
IHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0K
LSAgICBET01TdHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRW
YWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNo
ZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAg
ICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
ID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4g
bV90eXBlICE9IFBBU1NXT1JEOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAg
dmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2Fu
SGF2ZVNlbGVjdGlvbigpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNl
bGVjdGlvbkVuZCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lk
IHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNl
dFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2so
Ym9vbCBzZW5kTW91c2VFdmVudHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVl
KTsKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVu
dCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBh
dHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVh
bCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwot
Ci0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1l
bnRJbXBsICpzb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1
YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0
dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGto
dG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmly
dHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmly
dHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwg
Ym9vbCBpc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3Rp
dmF0ZWRTdWJtaXQoYm9vbCBmbGFnKTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZTsgfQotICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmlu
ZyYgdmFsdWUpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGlu
IGNhc2UgaW5wdXQgdHlwZT1pbWFnZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29u
c3QgeyByZXR1cm4geFBvczsgfQotICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9z
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1w
bCAqZXZ0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFu
ZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQot
ICAgIERPTVN0cmluZyBhbHRUZXh0KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlz
VVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJl
c3VsdHMoKSBjb25zdCB7IHJldHVybiBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBk
ZWZhdWx0VmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01T
dHJpbmcgJik7Ci0gICAgCi0gICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3Ry
aW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0
cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxp
Z24oY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0QWx0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNp
Z25lZCk7Ci0KLSAgICBET01TdHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29u
c3QgRE9NU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERP
TVN0cmluZyB1c2VNYXAoKSBjb25zdDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJp
bmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0
cmlidXRlKCkgY29uc3Q7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmlu
ZyBtX3ZhbHVlOwotICAgIGludCAgICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsK
LSAgICBzaG9ydCAgICAgbV9zaXplOwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQg
ICAgIG1fbWF4UmVzdWx0czsKLQotICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsK
LQotICAgIHR5cGVFbnVtIG1fdHlwZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAg
IGJvb2wgbV9kZWZhdWx0Q2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2Vk
IDogMTsKLSAgICBib29sIG1faW5kZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBl
IDogMTsKLSAgICBib29sIG1fYWN0aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBs
ZXRlIDogMTsKLSAgICBib29sIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBI
VE1MRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAg
dmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAv
KioKLSAgICAgKiB0aGUgZm9ybSBlbGVtZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4K
LSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmZvcm0oKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsK
LSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJp
bmcgaHRtbEZvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICB2b2lkIGZvY3VzKCk7Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zv
cm1FbGVtZW50SUQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdl
bmRFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVi
bGljOgotICAgIEhUTUxMZWdlbmRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1w
bCgpOwotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAg
dmlydHVhbCBraHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAq
LCBraHRtbDo6UmVuZGVyU3R5bGUgKik7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55
RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRo
ZSBsZWdlbmQncyBmaWVsZHNldCAKLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1l
bnQoKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFj
Y2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25z
dDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lk
IGZvY3VzKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIGNsYXNzIEhUTUxTZWxlY3RF
bGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAogewogICAgIGZy
aWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyU2VsZWN0OwpAQCAtNjE4LDIxNiArMTI4LDYgQEAgcHJv
dGVjdGVkOgogICAgIGJvb2wgbV9yZWNhbGNMaXN0SXRlbXM7CiB9OwogCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLWNsYXNzIEhUTUxLZXlnZW5FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MU2VsZWN0
RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVudEltcGwoRG9jdW1l
bnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwg
aW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgRE9NU3RyaW5nIHR5
cGUoKSBjb25zdDsKLQotICAgIC8vICMjIyB0aGlzIGlzIGp1c3QgYSByb3VnaCBndWVzcwotICAg
IHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1w
bCAqYXR0cik7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYs
IGJvb2wpOwotcHJvdGVjdGVkOgotICAgIEF0b21pY1N0cmluZyBtX2NoYWxsZW5nZTsKLSAgICBB
dG9taWNTdHJpbmcgbV9rZXlUeXBlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbAotewotcHVibGljOgotICAgIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTE9w
dEdyb3VwRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBO
b2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6b3B0aW9uVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmhyVGFnKTsg
fQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0Zv
Y3VzYWJsZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9y
ZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAq
bmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAg
dmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9k
ZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJ
bXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAgIHZvaWQg
cmVjYWxjU2VsZWN0T3B0aW9ucygpOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJik7Ci19OwotCi0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlclNl
bGVjdDsKLSAgICBmcmllbmQgY2xhc3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0KLXB1
YmxpYzoKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRU
YWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAyOyB9Ci0gICAgdmlydHVh
bCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyByZXR1cm4gbmV3Q2hp
bGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNjcmlw
dFRhZyk7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotCi0gICAg
RE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIERPTVN0cmluZyB0ZXh0KCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmLCBpbnQgJmV4Y2VwdGlvbik7Ci0KLSAg
ICBpbnQgaW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldEluZGV4KGludCwgaW50ICZleGNlcHRp
b24pOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBzZWxlY3RlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fc2VsZWN0ZWQ7IH0KLSAgICB2b2lkIHNldFNlbGVjdGVkKGJvb2wgX3NlbGVj
dGVkKTsKLQotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0KCkgY29uc3Q7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBib29sIGRlZmF1bHRT
ZWxlY3RlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKCBib29sICk7Ci0K
LSAgICBET01TdHJpbmcgbGFiZWwoKSBjb25zdDsKLSAgICB2b2lkIHNldExhYmVsKCBjb25zdCBE
T01TdHJpbmcgJiApOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAg
Ym9vbCBtX3NlbGVjdGVkOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhU
TUxUZXh0QXJlYUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
Ci17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJUZXh0QXJlYTsKLQotcHVibGljOgot
ICAgIGVudW0gV3JhcE1ldGhvZCB7Ci0gICAgICAgIHRhX05vV3JhcCwKLSAgICAgICAgdGFfVmly
dHVhbCwKLSAgICAgICAgdGFfUGh5c2ljYWwKLSAgICB9OwotCi0gICAgSFRNTFRleHRBcmVhRWxl
bWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsK
LSAgICB+SFRNTFRleHRBcmVhRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVj
a0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHRO
b2RlKCk7IH0KLQotICAgIGludCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9Ci0gICAg
aW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KLQotICAgIFdyYXBNZXRob2Qgd3Jh
cCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JhcDsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVy
YXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBj
b25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7
IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9y
ZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAg
aW50IHNlbGVjdGlvbkVuZCgpOwotCi0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwot
ICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCAoICApOwot
ICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi0gICAgdmlydHVhbCB2b2lk
IGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJP
YmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAq
KTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgp
OwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsK
LSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2
b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIERPTVN0cmluZyBkZWZh
dWx0VmFsdWUoKTsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZh
bHVlKTsKLQotICAgIHZvaWQgaW52YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVlSXNWYWxpZCA9IGZh
bHNlOyB9Ci0gICAgdm9pZCB1cGRhdGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2YWx1ZU1hdGNoZXNS
ZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2
b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0g
dHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0gICAgCi0g
ICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0Q29scyhpbnQpOwotCi0gICAgdm9pZCBz
ZXRSb3dzKGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQgbV9yb3dzOwotICAgIGludCBtX2Nv
bHM7Ci0gICAgV3JhcE1ldGhvZCBtX3dyYXA7Ci0gICAgUVN0cmluZyBtX3ZhbHVlOwotICAgIGJv
b2wgbV92YWx1ZUlzVmFsaWQ7Ci0gICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOwotfTsK
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSXNJbmRleEVsZW1lbnRJbXBsIDog
cHVibGljIEhUTUxJbnB1dEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTElzSW5kZXhF
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDAp
OwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3Qg
eyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgcHJv
bXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fcHJvbXB0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsIDogcHVibGljIGtodG1sOjpT
aGFyZWQ8SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0
aW9uc0NvbGxlY3Rpb25JbXBsKEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqaW1wbCkgOiBtX3NlbGVj
dChpbXBsKSB7IH0KLQotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
TGVuZ3RoKHVuc2lnbmVkKTsKLSAgICBOb2RlSW1wbCAqaXRlbSh1bnNpZ25lZCBpbmRleCkgY29u
c3Q7Ci0gICAgTm9kZUltcGwgKm5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUpIGNvbnN0
OwotCi0gICAgdm9pZCBkZXRhY2goKSB7IG1fc2VsZWN0ID0gMDsgfQotCi1wcml2YXRlOgotICAg
IEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqbV9zZWxlY3Q7Ci19OwotCiB9IC8vbmFtZXNwYWNlCiAK
ICNlbmRpZgpJbmRleDoga2h0bWwvaHRtbC9IVE1MS2V5Z2VuRWxlbWVudEltcGwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBraHRtbC9odG1sL0hUTUxLZXlnZW5FbGVtZW50SW1wbC5oCShyZXZpc2lvbiAxMTk3
NikKKysrIGtodG1sL2h0bWwvSFRNTEtleWdlbkVsZW1lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxA
a2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9A
a2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2Rl
Lm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29w
eXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKQEAgLTIyLDYwMyArMjIsMTUgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMw
NywgVVNBLgogICoKICAqLwotI2lmbmRlZiBIVE1MX0ZPUk1JTVBMX0gKLSNkZWZpbmUgSFRNTF9G
T1JNSU1QTF9ICisjaWZuZGVmIEhUTUxfSFRNTEtleWdlbkVsZW1lbnRJbXBsX0gKKyNkZWZpbmUg
SFRNTF9IVE1MS2V5Z2VuRWxlbWVudEltcGxfSAogCi0jaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1l
bnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX21pc2NpbXBsLmgiCi0KLSNpbmNsdWRlIDxx
cHRydmVjdG9yLmg+Ci0jaW5jbHVkZSA8cW1lbWFycmF5Lmg+Ci0jaW5jbHVkZSA8a3htbGNvcmUv
SGFzaE1hcC5oPgotCi1jbGFzcyBLSFRNTFZpZXc7Ci1jbGFzcyBRVGV4dENvZGVjOwotCi1uYW1l
c3BhY2Uga2h0bWwKLXsKLSAgICBjbGFzcyBGb3JtRGF0YTsKLSAgICBjbGFzcyBSZW5kZXJGb3Jt
RWxlbWVudDsKLSAgICBjbGFzcyBSZW5kZXJUZXh0QXJlYTsKLSAgICBjbGFzcyBSZW5kZXJTZWxl
Y3Q7Ci0gICAgY2xhc3MgUmVuZGVyTGluZUVkaXQ7Ci0gICAgY2xhc3MgUmVuZGVyRmlsZUJ1dHRv
bjsKLSAgICBjbGFzcyBSZW5kZXJTbGlkZXI7Ci19CisjaW5jbHVkZSAiSFRNTFNlbGVjdEVsZW1l
bnRJbXBsLmgiCiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7CiBjbGFzcyBG
b3JtRGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTElt
YWdlRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1MT3B0aW9u
RWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVs
ZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudElt
cGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0gICAgdmly
dHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFn
U3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsg
cmV0dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIHZv
aWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21E
b2N1bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1lbnRzKCk7
Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUoKSBjb25z
dCB7IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3QgRE9NU3Ry
aW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4gbV9ib3Vu
ZGFyeTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAg
Ym9vbCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsgfQotCi0g
ICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwg
KmF0dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxl
bWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJ
bXBsICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJtaXQoYm9v
bCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAg
ICB2b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9IG1hbGZv
cm1lZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1fbWFsZm9y
bWVkOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUlt
cGwgKmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAgICBib29s
IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKTsKLQot
ICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0
cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBh
Y3Rpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJik7Ci0K
LSAgICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2QoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkxOG5EYXRh
KCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVuZCBjbGFz
cyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBsOjpDb2xs
ZWN0aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1MSW1hZ2VF
bGVtZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAgIERPTVN0
cmluZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0cmluZyBt
X2JvdW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9vbCBtX3Bv
c3QgOiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRvY29tcGxl
dGUgOiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5nc3VibWl0
IDogMTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1lZCA6IDE7
Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmluZyAm
KTsKLSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQotICAgIHVu
c2lnbmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0K
LSAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1w
bAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZyaWVuZCBj
bGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5k
VGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAg
IHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgSFRN
TEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAgdmlydHVh
bCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRy
b2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5hYmxlZCgp
IGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2
b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wgZGVl
cCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0gICAg
dmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAgICB2b2lk
IG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRE
aXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUo
KSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBi
b29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGJvb2wg
cmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBzZXRSZWFk
T25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0
eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wg
aXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVh
bCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLyoK
LSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNvZGVkIG5h
bWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJuIHRydWUg
Zm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAgKi8KLSAg
ICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkgeyByZXR1
cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAgICB2aXJ0
dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRlKFFTdHJp
bmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1
dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZh
dGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0
QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgoKSBjb25z
dDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1MRm9y
bUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBs
ICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVhZE9ubHk6
IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxC
dXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAgIFNVQk1J
VCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBET01TdHJp
bmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmpl
Y3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxlKik7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1w
bCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBs
ICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBi
b29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0gICAg
dmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdmlydHVh
bCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgRE9N
U3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERP
TVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0
VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERPTVN0cmlu
ZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51bSAgbV90
eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAgIG1fYWN0
aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEZp
ZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsK
LXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywg
SFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVsZFNldEVs
ZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7
IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBu
ZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAK
LSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFy
ZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5
cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElucHV0
RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBm
cmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFzcyBraHRt
bDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0RWxlbWVu
dEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1YmxpYzoK
LSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVtIHsKLSAg
ICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0gICAgICAg
IENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAgICBSRVNF
VCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwKLSAgICAg
ICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsKLQotICAg
IEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFt
ZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAw
KTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgp
OwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3Qg
eyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZv
Y3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0
IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmlu
ZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29uc3Qg
eyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0ZSgp
IGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHRCdXR0
b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCB8
fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBj
b25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tlZCgpIGNv
bnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29sKTsKLSAg
ICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5hdGU7IH0K
LSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0aCgpIGNv
bnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBt
X3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VHlwZShj
b25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWVX
aXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25z
dCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hl
c1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmly
dHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NXT1JEOyB9
Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVT
dGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigpOwotCi0g
ICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAgIHZv
aWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQp
OwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwg
aW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMg
PSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZvaWQg
YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmli
dXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGNv
cHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpOwotCi0g
ICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVl
ZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmpl
Y3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1E
YXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRlZFN1Ym1p
dCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFn
KTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQot
ICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0gICAgdmly
dHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlwZT1pbWFn
ZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBvczsgfQot
ICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0dWFsIHZv
aWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFs
IHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRh
KTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7
Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBhbHRUZXh0
KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0
ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7IHJldHVy
biBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBjb25zdDsK
LSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAgCi0gICAg
Ym9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQo
Ym9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2Nl
cHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0
OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0
cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYp
OwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNvbnN0IERP
TVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBET01TdHJp
bmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYpOwotCi0g
ICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAoKSBjb25z
dDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoK
LSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7Ci0KLSAg
ICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGludCAg
ICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAgbV9zaXpl
OwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0czsKLQot
ICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVtIG1fdHlw
ZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0Q2hlY2tl
ZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1faW5k
ZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29sIG1fYWN0
aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBib29sIG1f
dmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsKLXB1
YmxpYzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAg
dmlydHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1By
aW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNh
YmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFw
cGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0
aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZm9ybSBl
bGVtZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8KLSAgICBFbGVtZW50
SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0oKTsK
LQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tl
eShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZvcigpIGNvbnN0Owot
ICAgIHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIGZvY3Vz
KCk7Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50SUQ7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdlbmRFbGVtZW50SW1wbCA6IHB1Ymxp
YyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxMZWdlbmRF
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDAp
OwotICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBi
b29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBraHRtbDo6UmVuZGVy
T2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVyU3R5bGUg
Kik7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioK
LSAgICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRoZSBsZWdlbmQncyBmaWVsZHNldCAK
LSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIERPTVN0cmlu
ZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJp
bmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWdu
KGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lkIGZvY3VzKCk7Ci19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbCA6IHB1YmxpYyBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVu
ZGVyU2VsZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9j
LCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgfkhUTUxTZWxlY3RFbGVtZW50SW1w
bCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBj
b25zdCB7IHJldHVybiA2OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJ
bXBsKiBuZXdDaGlsZCk7Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotCi0gICAgdmly
dHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSApOwotCi0gICAgaW50IHNlbGVjdGVk
SW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoIGludCBpbmRleCApOwot
Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQotCi0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgaW50IG1pbldpZHRoKCkgY29uc3Qg
eyByZXR1cm4gbV9taW53aWR0aDsgfQotCi0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBt
X3NpemU7IH0KLQotICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211bHRpcGxl
OyB9Ci0KLSAgICB2b2lkIGFkZCAoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1l
bnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZvaWQgcmVtb3ZlICgg
aW50IGluZGV4ICk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZhbHVl
KGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBs
ICpvcHRpb25zKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gb3B0aW9uc0hUTUxD
b2xsZWN0aW9uKCk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBhbmQgbWlncmF0ZSB0byBvcHRpb25z
KCkuCi0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0cnVlOyB9
Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVT
dGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9y
ZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAq
bmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAg
dmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9k
ZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJ
bXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5k
ZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHls
ZSAqKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9v
bCk7Ci0KLSAgICAvLyBnZXQgdGhlIGFjdHVhbCBsaXN0Ym94IGluZGV4IG9mIHRoZSBvcHRpb25J
bmRleHRoIG9wdGlvbgotICAgIGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgp
IGNvbnN0OwotICAgIC8vIHJldmVyc2Ugb2Ygb3B0aW9uVG9MaXN0SW5kZXggLSBnZXQgb3B0aW9u
SW5kZXggZnJvbSBsaXN0Ym94SW5kZXgKLSAgICBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoaW50IGxp
c3RJbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAg
UU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGxpc3RJdGVtcygpIGNvbnN0Ci0gICAgIHsKLSAg
ICAgICAgIGlmIChtX3JlY2FsY0xpc3RJdGVtcykgY29uc3RfY2FzdDxIVE1MU2VsZWN0RWxlbWVu
dEltcGwqPih0aGlzKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgICByZXR1cm4gbV9saXN0
SXRlbXM7Ci0gICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIG5vdGlm
eU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24sIGJv
b2wgc2VsZWN0ZWQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZl
bnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5k
VG9BbnlFbGVtZW50KTsKLQotICAgIHZvaWQgc2V0TXVsdGlwbGUoYm9vbCk7Ci0KLSAgICB2b2lk
IHNldFNpemUoaW50KTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlY2FsY0xpc3RJdGVtcygpOwot
Ci1wcm90ZWN0ZWQ6Ci0gICAgbXV0YWJsZSBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gbV9s
aXN0SXRlbXM7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqbV9vcHRpb25zOwotICAg
IHNob3J0IG1fbWlud2lkdGg7Ci0gICAgc2hvcnQgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0aXBs
ZTsKLSAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQorY2xhc3MgTWFwcGVkQXR0cmlidXRlSW1wbDsKIAogY2xhc3MgSFRNTEtleWdlbkVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxTZWxlY3RFbGVtZW50SW1wbAogewpAQCAtNjM5LDE5NSArNTEsNiBA
QCBwcm90ZWN0ZWQ6CiAgICAgQXRvbWljU3RyaW5nIG1fa2V5VHlwZTsKIH07CiAKLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdEdyb3VwRWxlbWVudEltcGwgOiBwdWJsaWMgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwot
ICAgIHZpcnR1YWwgfkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+
aGFzVGFnTmFtZShIVE1MTmFtZXM6Om9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
SFRNTE5hbWVzOjpoclRhZyk7IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIE5v
ZGVJbXBsICppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFj
ZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhj
ZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUlt
cGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBs
ICphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYWRkQ2hpbGQoIE5vZGVJbXBsKiBuZXdDaGlsZCApOwot
ICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBs
ICphdHRyKTsKLSAgICB2b2lkIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIERPTVN0cmlu
ZyBsYWJlbCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICYpOwot
fTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNs
YXNzIGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0gICAgZnJpZW5kIGNsYXNzIERPTTo6SFRNTFNlbGVj
dEVsZW1lbnRJbXBsOwotCi1wdWJsaWM6Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFs
IEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0
dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1
cm4gMjsgfQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hp
bGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05h
bWUoSFRNTE5hbWVzOjpzY3JpcHRUYWcpOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2Fi
bGUoKSBjb25zdDsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICBET01TdHJp
bmcgdGV4dCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGV4dChjb25zdCBET01TdHJpbmcgJiwgaW50
ICZleGNlcHRpb24pOwotCi0gICAgaW50IGluZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRJbmRl
eChpbnQsIGludCAmZXhjZXB0aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUo
KSBjb25zdDsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIGJv
b2wgc2VsZWN0ZWQoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkOyB9Ci0gICAgdm9pZCBzZXRT
ZWxlY3RlZChib29sIF9zZWxlY3RlZCk7Ci0KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKmdl
dFNlbGVjdCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwot
Ci0gICAgYm9vbCBkZWZhdWx0U2VsZWN0ZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRT
ZWxlY3RlZCggYm9vbCApOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRMYWJlbCggY29uc3QgRE9NU3RyaW5nICYgKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0
cmluZyBtX3ZhbHVlOwotICAgIGJvb2wgbV9zZWxlY3RlZDsKLX07Ci0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1jbGFzcyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4
dEFyZWE7Ci0KLXB1YmxpYzoKLSAgICBlbnVtIFdyYXBNZXRob2QgewotICAgICAgICB0YV9Ob1dy
YXAsCi0gICAgICAgIHRhX1ZpcnR1YWwsCi0gICAgICAgIHRhX1BoeXNpY2FsCi0gICAgfTsKLQot
ICAgIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgfkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVy
biBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpOyB9Ci0KLSAgICBpbnQgY29scygpIGNvbnN0IHsgcmV0
dXJuIG1fY29sczsgfQotICAgIGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9Ci0K
LSAgICBXcmFwTWV0aG9kIHdyYXAoKSBjb25zdCB7IHJldHVybiBtX3dyYXA7IH0KLQotICAgIHZp
cnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAg
IERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3Rh
dGUoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAg
dmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGludCBzZWxl
Y3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLQotICAgIHZvaWQgc2V0U2Vs
ZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAg
dm9pZCBzZWxlY3QgKCAgKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsK
LQotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmly
dHVhbCBraHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBr
aHRtbDo6UmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZp
cnR1YWwgdm9pZCBkZXRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9y
bURhdGFMaXN0JiwgYm9vbCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0gICAgRE9NU3Ry
aW5nIHZhbHVlKCk7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsK
LSAgICBET01TdHJpbmcgZGVmYXVsdFZhbHVlKCk7Ci0gICAgdm9pZCBzZXREZWZhdWx0VmFsdWUo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSk7Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsg
bV92YWx1ZUlzVmFsaWQgPSBmYWxzZTsgfQotICAgIHZvaWQgdXBkYXRlVmFsdWUoKTsKLQotICAg
IGJvb2wgdmFsdWVNYXRjaGVzUmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlTWF0Y2hl
c1JlbmRlcmVyOyB9Ci0gICAgdm9pZCBzZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpIHsgbV92YWx1
ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxl
KCk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0Fu
eUVsZW1lbnQpOwotICAgIAotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2
b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldENvbHMo
aW50KTsKLQotICAgIHZvaWQgc2V0Um93cyhpbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1f
cm93czsKLSAgICBpbnQgbV9jb2xzOwotICAgIFdyYXBNZXRob2QgbV93cmFwOwotICAgIFFTdHJp
bmcgbV92YWx1ZTsKLSAgICBib29sIG1fdmFsdWVJc1ZhbGlkOwotICAgIGJvb2wgbV92YWx1ZU1h
dGNoZXNSZW5kZXJlcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElz
SW5kZXhFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MSW5wdXRFbGVtZW50SW1wbAotewotcHVibGlj
OgotICAgIEhUTUxJc0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdS
ZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVh
bCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwot
Ci0gICAgRE9NU3RyaW5nIHByb21wdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJvbXB0KGNvbnN0
IERPTVN0cmluZyAmKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3Byb21wdDsKLX07
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1w
bCA6IHB1YmxpYyBraHRtbDo6U2hhcmVkPEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw+Ci17Ci1w
dWJsaWM6Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbChIVE1MU2VsZWN0RWxlbWVudElt
cGwgKmltcGwpIDogbV9zZWxlY3QoaW1wbCkgeyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBj
b25zdDsKLSAgICB2b2lkIHNldExlbmd0aCh1bnNpZ25lZCk7Ci0gICAgTm9kZUltcGwgKml0ZW0o
dW5zaWduZWQgaW5kZXgpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuYW1lZEl0ZW0oY29uc3QgRE9N
U3RyaW5nICZuYW1lKSBjb25zdDsKLQotICAgIHZvaWQgZGV0YWNoKCkgeyBtX3NlbGVjdCA9IDA7
IH0KLQotcHJpdmF0ZToKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKm1fc2VsZWN0OwotfTsK
LQogfSAvL25hbWVzcGFjZQogCiAjZW5kaWYKSW5kZXg6IGtodG1sL2h0bWwvSFRNTExlZ2VuZEVs
ZW1lbnRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9odG1sL0hUTUxMZWdlbmRFbGVtZW50
SW1wbC5jcHAJKHJldmlzaW9uIDExOTc2KQorKysga2h0bWwvaHRtbC9IVE1MTGVnZW5kRWxlbWVu
dEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChD
KSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkg
QW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDIwMDEg
RGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIw
MDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAw
NiBBcHBsZSBDb21wdXRlciwgSW5jLgogICogICAgICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9z
a3VyeWFrb3YgKGFwQG55cG9wLmNvbSkKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNCwzNTQ1ICsyNCw5NCBA
QAogICoKICAqLwogCi0jdW5kZWYgRk9STVNfREVCVUcKLS8vI2RlZmluZSBGT1JNU19ERUJVRwot
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCi0K
LSNpbmNsdWRlICJraHRtbHZpZXcuaCIKLSNpbmNsdWRlICJNYWNGcmFtZS5oIgotI2luY2x1ZGUg
Imh0bWwvaHRtbF9kb2N1bWVudGltcGwuaCIKLSNpbmNsdWRlICJodG1sX2ltYWdlaW1wbC5oIgot
I2luY2x1ZGUgImtodG1sX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAibWlzYy9mb3JtZGF0YS5oIgot
Ci0jaW5jbHVkZSAiZG9tL2RvbV9leGNlcHRpb24uaCIKLSNpbmNsdWRlICJjc3MvY3Nzc3R5bGVz
ZWxlY3Rvci5oIgotI2luY2x1ZGUgImNzc3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJjc3NoZWxw
ZXIuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJf
ZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAia2h0
bWxfZXh0LmgiCisjaW5jbHVkZSAiSFRNTExlZ2VuZEVsZW1lbnRJbXBsLmgiCiAKICNpbmNsdWRl
ICJyZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaCIKLSNpbmNsdWRlICJyZW5kZXJfYnV0dG9uLmgiCi0j
aW5jbHVkZSAicmVuZGVyX3RoZW1lLmgiCi0KLSNpbmNsdWRlIDxrbG9jYWxlLmg+Ci0jaW5jbHVk
ZSA8cWZpbGUuaD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+Ci0KLS8vIGZvciBrZXlnZW4KLSNp
bmNsdWRlIDxxc3RyaW5nLmg+Ci0jaW5jbHVkZSA8a3NzbGtleWdlbi5oPgotCi0jaW5jbHVkZSA8
YXNzZXJ0Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBraHRtbDsKIAogbmFtZXNwYWNlIERPTSB7CiAK
LXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsK
IAotc3RydWN0IEZvcm1EYXRhTGlzdEl0ZW0gewotICAgIEZvcm1EYXRhTGlzdEl0ZW0oY29uc3Qg
UUNTdHJpbmcgJmRhdGEpIDogbV9kYXRhKGRhdGEpIHsgfQotICAgIEZvcm1EYXRhTGlzdEl0ZW0o
Y29uc3QgUVN0cmluZyAmcGF0aCkgOiBtX3BhdGgocGF0aCkgeyB9Ci0KLSAgICBRU3RyaW5nIG1f
cGF0aDsKLSAgICBRQ1N0cmluZyBtX2RhdGE7Ci19OwotCi1jbGFzcyBGb3JtRGF0YUxpc3Qgewot
cHVibGljOgotICAgIEZvcm1EYXRhTGlzdChRVGV4dENvZGVjICopOwotCi0gICAgdm9pZCBhcHBl
bmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01TdHJpbmcgJnZhbHVlKQotICAg
ICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlLnFz
dHJpbmcoKSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNv
bnN0IFFTdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygp
KTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsgfQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01T
dHJpbmcgJmtleSwgY29uc3QgUUNTdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmlu
ZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsgfQotICAgIHZvaWQgYXBwZW5k
RGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgaW50IHZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0
cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKFFTdHJpbmc6Om51bWJlcih2YWx1ZSkp
OyB9Ci0gICAgdm9pZCBhcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01T
dHJpbmcgJmZpbGVuYW1lKTsKLQotICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRh
TGlzdEl0ZW0+IGJlZ2luKCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gbV9saXN0LmJlZ2luKCk7
IH0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBlbmQoKSBj
b25zdAotICAgICAgICB7IHJldHVybiBtX2xpc3QuZW5kKCk7IH0KLQotcHJpdmF0ZToKLSAgICB2
b2lkIGFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcyk7Ci0gICAgdm9pZCBhcHBlbmRTdHJp
bmcoY29uc3QgUVN0cmluZyAmcyk7Ci0KLSAgICBRVGV4dENvZGVjICptX2NvZGVjOwotICAgIFFW
YWx1ZUxpc3Q8Rm9ybURhdGFMaXN0SXRlbT4gbV9saXN0OwotfTsKLQotSFRNTEZvcm1FbGVtZW50
SW1wbDo6SFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhUTUxF
bGVtZW50SW1wbChmb3JtVGFnLCBkb2MpCi17Ci0gICAgY29sbGVjdGlvbkluZm8gPSAwOwotICAg
IG1fcG9zdCA9IGZhbHNlOwotICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgbV9hdXRvY29t
cGxldGUgPSB0cnVlOwotICAgIG1faW5zdWJtaXQgPSBmYWxzZTsKLSAgICBtX2RvaW5nc3VibWl0
ID0gZmFsc2U7Ci0gICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgbV9lbmN0eXBlID0gImFwcGxp
Y2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgbV9ib3VuZGFyeSA9ICItLS0tLS0t
LS0tMHhLaFRtTGJPdU5kQXJZIjsKLSAgICBtX2FjY2VwdGNoYXJzZXQgPSAiVU5LTk9XTiI7Ci0g
ICAgbV9tYWxmb3JtZWQgPSBmYWxzZTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbDo6fkhUTUxG
b3JtRWxlbWVudEltcGwoKQotewotICAgIGRlbGV0ZSBjb2xsZWN0aW9uSW5mbzsKLSAgICAKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkKLSAg
ICAgICAgZm9ybUVsZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBpbWdFbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGltZ0VsZW1lbnRzW2ld
LT5tX2Zvcm0gPSAwOwotfQotCi0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6Zm9ybVdvdWxk
SGF2ZVNlY3VyZVN1Ym1pc3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwpCi17Ci0gICAgaWYgKHVy
bC5pc051bGwoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBn
ZXREb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKS5zdGFydHNXaXRoKCJodHRw
czoiLCBmYWxzZSk7Ci19Ci0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKQot
ewotICAgIEhUTUxFbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0
IGRlYWwgd2l0aCBjYWxsaW5nIHNlY3VyZUZvcm1SZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNl
IHRoZSB0aW1pbmcKLSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRv
byBlYXJseQotICAgIGlmIChmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCkpCi0g
ICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotfQotCi12b2lkIEhUTUxG
b3JtRWxlbWVudEltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBpZiAoZ2V0RG9j
dW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotCUhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50
ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAqPihnZXREb2N1bWVudCgpKTsKLQlkb2N1
bWVudC0+YWRkTmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVu
dEltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50
SW1wbDo6cmVtb3ZlZEZyb21Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmlz
SFRNTERvY3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19j
YXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1lbnQtPnJlbW92
ZU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotICAgCi0gICAgSFRNTEVsZW1lbnRJbXBs
OjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0KLWludCBIVE1MRm9ybUVsZW1lbnRJbXBsOjps
ZW5ndGgoKSBjb25zdAotewotICAgIGludCBsZW4gPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotCWlmIChmb3JtRWxlbWVudHNbaV0t
PmlzRW51bWVyYXRhYmxlKCkpCi0JICAgICsrbGVuOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQot
Ci12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnN1Ym1pdENsaWNrKCkKLXsKLSAgICBib29sIHN1
Ym1pdEZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVt
ZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgaWYgKGZvcm1FbGVtZW50c1tpXS0+aGFzTG9j
YWxOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwgKmVs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihmb3JtRWxlbWVudHNb
aV0pOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigp
ICYmIGVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgICAgICAgICBzdWJtaXRGb3VuZCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC0+Y2xpY2soZmFsc2UpOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgh
c3VibWl0Rm91bmQpIC8vIHN1Ym1pdCB0aGUgZm9ybSB3aXRob3V0IGEgc3VibWl0IG9yIGltYWdl
IGlucHV0Ci0gICAgICAgIHByZXBhcmVTdWJtaXQoKTsKLX0KLQotCi1zdGF0aWMgUUNTdHJpbmcg
ZW5jb2RlQ1N0cmluZyhjb25zdCBRQ1N0cmluZyYgZSkKLXsKLSAgICAvLyBodHRwOi8vd3d3Lncz
Lm9yZy9UUi9odG1sNC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNC4xCi0gICAgLy8gc2Fm
ZSBjaGFyYWN0ZXJzIGxpa2UgTlMgaGFuZGxlcyB0aGVtIGZvciBjb21wYXRpYmlsaXR5Ci0gICAg
c3RhdGljIGNvbnN0IGNoYXIgKnNhZmUgPSAiLS5fKiI7Ci0gICAgaW50IGVsZW4gPSBlLmxlbmd0
aCgpOwotICAgIFFDU3RyaW5nIGVuY29kZWQoKCBlbGVuK2UuY29udGFpbnMoICdcbicgKSApKjMr
MSk7Ci0gICAgaW50IGVuY2xlbiA9IDA7Ci0KLSAgICAvL1FDU3RyaW5nIG9yaWcoZS5kYXRhKCks
IGUuc2l6ZSgpKTsKLQotICAgIGZvcihpbnQgcG9zID0gMDsgcG9zIDwgZWxlbjsgcG9zKyspIHsK
LSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gZVtwb3NdOwotCi0gICAgICAgIGlmICggKCggYyA+
PSAnQScpICYmICggYyA8PSAnWicpKSB8fAotICAgICAgICAgICAgICgoIGMgPj0gJ2EnKSAmJiAo
IGMgPD0gJ3onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49ICcwJykgJiYgKCBjIDw9ICc5Jykp
IHx8Ci0gICAgICAgICAgICAgKHN0cmNocihzYWZlLCBjKSkKLSAgICAgICAgICAgICkKLSAgICAg
ICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gYzsKLSAgICAgICAgZWxzZSBpZiAoIGMgPT0gJyAn
ICkKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJysnOwotICAgICAgICBlbHNlIGlm
ICggYyA9PSAnXG4nIHx8ICggYyA9PSAnXHInICYmIGVbcG9zKzFdICE9ICdcbicgKSApCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAg
ZW5jb2RlZFtlbmNsZW4rK10gPSAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9
ICdEJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAg
ZW5jb2RlZFtlbmNsZW4rK10gPSAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9
ICdBJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggYyAhPSAnXHInICkKLSAgICAgICAg
ewotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAgICAgICB1bnNp
Z25lZCBpbnQgaCA9IGMgLyAxNjsKLSAgICAgICAgICAgIGggKz0gKGggPiA5KSA/ICgnQScgLSAx
MCkgOiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGg7Ci0KLSAgICAgICAg
ICAgIHVuc2lnbmVkIGludCBsID0gYyAlIDE2OwotICAgICAgICAgICAgbCArPSAobCA+IDkpID8g
KCdBJyAtIDEwKSA6ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gbDsKLSAg
ICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICdcMCc7Ci0gICAgZW5jb2Rl
ZC50cnVuY2F0ZShlbmNsZW4pOwotCi0gICAgcmV0dXJuIGVuY29kZWQ7Ci19Ci0KLS8vIENoYW5n
ZSBwbGFpbiBDUiBhbmQgcGxhaW4gTEYgdG8gQ1JMRiBwYWlycy4KLXN0YXRpYyBRQ1N0cmluZyBm
aXhMaW5lQnJlYWtzKGNvbnN0IFFDU3RyaW5nICZzKQotewotICAgIC8vIENvbXB1dGUgdGhlIGxl
bmd0aC4KLSAgICB1bnNpZ25lZCBuZXdMZW4gPSAwOwotICAgIGNvbnN0IGNoYXIgKnAgPSBzLmRh
dGEoKTsKLSAgICB3aGlsZSAoY2hhciBjID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHIn
KSB7Ci0gICAgICAgICAgICAvLyBTYWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGlu
ZyAnXDAnLgotICAgICAgICAgICAgaWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAv
LyBUdXJuIENSIGludG8gQ1JMRi4KLSAgICAgICAgICAgICAgICBuZXdMZW4gKz0gMjsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8v
IFR1cm4gTEYgaW50byBDUkxGLgotICAgICAgICAgICAgbmV3TGVuICs9IDI7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBvdGhlciBjaGFyYWN0ZXJzIGFsb25lLgotICAg
ICAgICAgICAgbmV3TGVuICs9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5ld0xlbiA9
PSBzLmxlbmd0aCgpKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICAKLSAgICAvLyBN
YWtlIGEgY29weSBvZiB0aGUgc3RyaW5nLgotICAgIHAgPSBzLmRhdGEoKTsKLSAgICBRQ1N0cmlu
ZyByZXN1bHQobmV3TGVuICsgMSk7Ci0gICAgY2hhciAqcSA9IHJlc3VsdC5kYXRhKCk7Ci0gICAg
d2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKLSAgICAgICAgaWYgKGMgPT0gJ1xyJykgewotICAgICAg
ICAgICAgLy8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2YgdHJhaWxpbmcgJ1wwJy4KLSAg
ICAgICAgICAgIGlmICgqcCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHVybiBDUiBp
bnRvIENSTEYuCi0gICAgICAgICAgICAgICAgKnErKyA9ICdccic7Ci0gICAgICAgICAgICAgICAg
KnErKyA9ICdcbic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4n
KSB7Ci0gICAgICAgICAgICAvLyBUdXJuIExGIGludG8gQ1JMRi4KLSAgICAgICAgICAgICpxKysg
PSAnXHInOwotICAgICAgICAgICAgKnErKyA9ICdcbic7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAvLyBMZWF2ZSBvdGhlciBjaGFyYWN0ZXJzIGFsb25lLgotICAgICAgICAgICAgKnEr
KyA9IGM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1ib29s
IEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1EYXRhKEZvcm1EYXRhICZmb3JtX2RhdGEpIGNvbnN0
Ci17Ci0gICAgUUNTdHJpbmcgZW5jX3N0cmluZyA9ICIiOyAvLyB1c2VkIGZvciBub24tbXVsdGlw
YXJ0IGRhdGEKLQotICAgIC8vIGZpbmQgb3V0IHRoZSBRVGV4dGNvZGVjIHRvIHVzZQotICAgIFFT
dHJpbmcgc3RyID0gbV9hY2NlcHRjaGFyc2V0LnFzdHJpbmcoKTsKLSAgICBzdHIucmVwbGFjZSgn
LCcsICcgJyk7Ci0gICAgUVN0cmluZ0xpc3QgY2hhcnNldHMgPSBRU3RyaW5nTGlzdDo6c3BsaXQo
JyAnLCBzdHIpOwotICAgIFFUZXh0Q29kZWMqIGNvZGVjID0gMDsKLSAgICBGcmFtZSAqZnJhbWUg
PSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9y
IGl0ID0gY2hhcnNldHMuYmVnaW4oKTsgaXQgIT0gY2hhcnNldHMuZW5kKCk7ICsraXQpIHsKLSAg
ICAgICAgUVN0cmluZyBlbmMgPSAoKml0KTsKLSAgICAgICAgaWYgKGVuYy5jb250YWlucygiVU5L
Tk9XTiIpKSB7Ci0gICAgICAgICAgICAvLyB1c2Ugc3RhbmRhcmQgZG9jdW1lbnQgZW5jb2RpbmcK
LSAgICAgICAgICAgIGVuYyA9ICJJU08tODg1OS0xIjsKLSAgICAgICAgICAgIGlmIChmcmFtZSkK
LSAgICAgICAgICAgICAgICBlbmMgPSBmcmFtZS0+ZW5jb2RpbmcoKTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoKGNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGVuYy5sYXRpbjEoKSkp
KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFjb2RlYykKLSAgICAgICAg
Y29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0ZvckxvY2FsZSgpOwotCi0KLSAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkgewotICAgICAgICBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogY3VycmVudCA9IGZvcm1FbGVtZW50c1tpXTsKLSAgICAg
ICAgRm9ybURhdGFMaXN0IGxzdChjb2RlYyk7Ci0KLSAgICAgICAgaWYgKCFjdXJyZW50LT5kaXNh
YmxlZCgpICYmIGN1cnJlbnQtPmFwcGVuZEZvcm1EYXRhKGxzdCwgbV9tdWx0aXBhcnQpKSB7Ci0g
ICAgICAgICAgICBmb3IgKFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+
IGl0ID0gbHN0LmJlZ2luKCk7IGl0ICE9IGxzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAg
ICAgIGlmICghbV9tdWx0aXBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIElT
SU5ERVggLyA8aW5wdXQgbmFtZT1pc2luZGV4PiBzcGVjaWFsCi0gICAgICAgICAgICAgICAgICAg
IC8vIGJ1dCBvbmx5IGlmIGl0cyB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgICAgICAgICAg
aWYgKCBlbmNfc3RyaW5nLmlzRW1wdHkoKSAmJiAoKml0KS5tX2RhdGEgPT0gImlzaW5kZXgiICkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZyggKCppdCkubV9kYXRhICk7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZighZW5jX3N0cmluZy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZW5jX3N0cmluZyArPSAnJic7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19z
dHJpbmcgKz0gZW5jb2RlQ1N0cmluZygoKml0KS5tX2RhdGEpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgZW5jX3N0cmluZyArPSAiPSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2l0Owot
ICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVDU3RyaW5nKCgqaXQp
Lm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAg
UUNTdHJpbmcgaHN0cigiLS0iKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSBtX2JvdW5k
YXJ5LnFzdHJpbmcoKS5sYXRpbjEoKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXHJc
biI7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIkNvbnRlbnQtRGlzcG9zaXRpb246IGZv
cm0tZGF0YTsgbmFtZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gKCppdCkubV9k
YXRhLmRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwotCi0gICAgICAg
ICAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IHR5cGUgaXMgRklMRSwgdGhlbiB3ZSBhbHNv
IG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgZmlsZW5hbWUKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmhhc0xvY2FsTmFtZShpbnB1dFRhZykgJiYK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBs
Kj4oY3VycmVudCktPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpGSUxFKQot
ICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIHBh
dGggPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQpLT52YWx1ZSgp
LnFzdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgd29u
J3Qgd29yayBpZiB0aGUgZmlsZW5hbWUgaW5jbHVkZXMgYSAiIG1hcmssCi0gICAgICAgICAgICAg
ICAgICAgICAgICAvLyBvciBjb250cm9sIGNoYXJhY3RlcnMgbGlrZSBDUiBvciBMRi4gVGhpcyBh
bHNvIGRvZXMgc3RyYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpbmdzIGlmIHRo
ZSBmaWxlbmFtZSBpbmNsdWRlcyBjaGFyYWN0ZXJzIHlvdSBjYW4ndCBlbmNvZGUKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGluIHRoZSB3ZWJzaXRlJ3MgY2hhcmFjdGVyIHNldC4KLSAgICAg
ICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIjsgZmlsZW5hbWU9XCIiOwotICAgICAgICAgICAg
ICAgICAgICAgICAgaHN0ciArPSBjb2RlYy0+ZnJvbVVuaWNvZGUocGF0aC5taWQocGF0aC5maW5k
UmV2KCcvJykgKyAxKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJc
IiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50SW1wbCo+KGN1cnJlbnQpLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIG1pbWVUeXBl
ID0gZnJhbWUgPyBNYWMoZnJhbWUpLT5taW1lVHlwZUZvckZpbGVOYW1lKHBhdGgpIDogUVN0cmlu
ZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWltZVR5cGUuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG5Db250ZW50
LVR5cGU6ICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gbWltZVR5
cGUuYXNjaWkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAg
ICBoc3RyICs9ICJcclxuXHJcbiI7Ci0gICAgICAgICAgICAgICAgICAgICsraXQ7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgLy8gYXBwZW5kIGJvZHkKLSAgICAgICAgICAgICAgICAgICAgZm9ybV9k
YXRhLmFwcGVuZERhdGEoaHN0ci5kYXRhKCksIGhzdHIubGVuZ3RoKCkpOwotICAgICAgICAgICAg
ICAgICAgICBjb25zdCBGb3JtRGF0YUxpc3RJdGVtICZpdGVtID0gKml0OwotICAgICAgICAgICAg
ICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBpdGVtLm1fZGF0YS5zaXplKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmIChkYXRhU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9y
bV9kYXRhLmFwcGVuZERhdGEoaXRlbS5tX2RhdGEsIGRhdGFTaXplIC0gMSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKCFpdGVtLm1fcGF0aC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRmlsZShpdGVtLm1fcGF0aCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKCJcclxuIiwgMik7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpZiAobV9tdWx0
aXBhcnQpCi0gICAgICAgIGVuY19zdHJpbmcgPSAoIi0tIiArIG1fYm91bmRhcnkucXN0cmluZygp
ICsgIi0tXHJcbiIpLmFzY2lpKCk7Ci0KLSAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShlbmNfc3Ry
aW5nLmRhdGEoKSwgZW5jX3N0cmluZy5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmluZyYg
dHlwZSkKLXsKLSAgICBpZih0eXBlLmNvbnRhaW5zKCJtdWx0aXBhcnQiLCBmYWxzZSkgfHwgdHlw
ZS5jb250YWlucygiZm9ybS1kYXRhIiwgZmFsc2UpKSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJt
dWx0aXBhcnQvZm9ybS1kYXRhIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSB0cnVlOwotICAgIH0g
ZWxzZSBpZiAodHlwZS5jb250YWlucygidGV4dCIsIGZhbHNlKSB8fCB0eXBlLmNvbnRhaW5zKCJw
bGFpbiIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAidGV4dC9wbGFpbiI7Ci0gICAg
ICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9lbmN0eXBl
ID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgICAgIG1fbXVsdGlw
YXJ0ID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEJv
dW5kYXJ5KCBjb25zdCBET01TdHJpbmcmIGJvdW5kICkKLXsKLSAgICBtX2JvdW5kYXJ5ID0gYm91
bmQ7Ci19Ci0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6cHJlcGFyZVN1Ym1pdCgpCi17Ci0g
ICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2luc3Vi
bWl0IHx8ICFmcmFtZSB8fCBmcmFtZS0+b25seUxvY2FsUmVmZXJlbmNlcygpKQotICAgICAgICBy
ZXR1cm4gbV9pbnN1Ym1pdDsKLQotICAgIG1faW5zdWJtaXQgPSB0cnVlOwotICAgIG1fZG9pbmdz
dWJtaXQgPSBmYWxzZTsKLQotICAgIGlmICggZGlzcGF0Y2hIVE1MRXZlbnQoc3VibWl0RXZlbnQs
ZmFsc2UsdHJ1ZSkgJiYgIW1fZG9pbmdzdWJtaXQgKQotICAgICAgICBtX2RvaW5nc3VibWl0ID0g
dHJ1ZTsKLQotICAgIG1faW5zdWJtaXQgPSBmYWxzZTsKLQotICAgIGlmICggbV9kb2luZ3N1Ym1p
dCApCi0gICAgICAgIHN1Ym1pdCh0cnVlKTsKLQotICAgIHJldHVybiBtX2RvaW5nc3VibWl0Owot
fQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnN1Ym1pdCggYm9vbCBhY3RpdmF0ZVN1Ym1p
dEJ1dHRvbiApCi17Ci0gICAgS0hUTUxWaWV3ICp2aWV3ID0gZ2V0RG9jdW1lbnQoKS0+dmlldygp
OwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYgKCF2
aWV3IHx8ICFmcmFtZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBtX2lu
c3VibWl0ICkgewotICAgICAgICBtX2RvaW5nc3VibWl0ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIG1faW5zdWJtaXQgPSB0cnVlOwotCi0gICAgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwqIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IDA7Ci0gICAgYm9vbCBu
ZWVkQnV0dG9uQWN0aXZhdGlvbiA9IGFjdGl2YXRlU3VibWl0QnV0dG9uOwkvLyBkbyB3ZSBuZWVk
IHRvIGFjdGl2YXRlIGEgc3VibWl0IGJ1dHRvbj8KLSAgICAKLSAgICBNYWMoZnJhbWUpLT5jbGVh
clJlY29yZGVkRm9ybVZhbHVlcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3Jt
RWxlbWVudHMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKiBjdXJyZW50ID0gZm9ybUVsZW1lbnRzW2ldOwotICAgICAgICAvLyBPdXIgYXBwIG5lZWRz
IHRvIGdldCBmb3JtIHZhbHVlcyBmb3IgcGFzc3dvcmQgZmllbGRzIGZvciBkb2luZyBwYXNzd29y
ZCBhdXRvY29tcGxldGUsCi0gICAgICAgIC8vIHNvIHdlIGFyZSBtb3JlIGxlbmllbnQgaW4gcHVz
aGluZyB2YWx1ZXMsIGFuZCBsZXQgdGhlIGFwcCBkZWNpZGUgd2hhdCB0byBzYXZlIHdoZW4uCi0g
ICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAg
ICBIVE1MSW5wdXRFbGVtZW50SW1wbCAqaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKGlucHV0LT5pbnB1dFR5cGUoKSA9
PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6VEVYVAotICAgICAgICAgICAgICAgIHx8IGlucHV0LT5p
bnB1dFR5cGUoKSA9PSAgSFRNTElucHV0RWxlbWVudEltcGw6OlBBU1NXT1JECi0gICAgICAgICAg
ICAgICAgfHwgaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpTRUFS
Q0gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWFjKGZyYW1lKS0+cmVjb3JkRm9y
bVZhbHVlKGlucHV0LT5uYW1lKCkucXN0cmluZygpLCBpbnB1dC0+dmFsdWUoKS5xc3RyaW5nKCks
IHRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+cmVuZGVyZXIoKSAmJiBpbnB1dC0+
aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQqPihpbnB1dC0+cmVuZGVyZXIoKSkt
PmFkZFNlYXJjaFJlc3VsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+aXNB
Y3RpdmF0ZWRTdWJtaXQoKSkgewotICAgICAgICAgICAgICAgIG5lZWRCdXR0b25BY3RpdmF0aW9u
ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1
dHRvbiA9PSAwICYmIGN1cnJlbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpKSB7Ci0gICAg
ICAgICAgICAgICAgZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gY3VycmVudDsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZWVkQnV0dG9uQWN0aXZhdGlv
biAmJiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsKLSAgICAgICAgZmlyc3RTdWNjZXNz
ZnVsU3VibWl0QnV0dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQodHJ1ZSk7Ci0gICAgfQotCi0gICAg
aWYgKCFtX3Bvc3QpCi0gICAgICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgCi0gICAgRm9y
bURhdGEgZm9ybV9kYXRhOwotICAgIGlmIChmb3JtRGF0YShmb3JtX2RhdGEpKSB7Ci0gICAgICAg
IGlmKG1fcG9zdCkgewotICAgICAgICAgICAgZnJhbWUtPnN1Ym1pdEZvcm0oICJwb3N0IiwgbV91
cmwucXN0cmluZygpLCBmb3JtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fdGFyZ2V0LnFzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZW5jdHlwZSgpLnFzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm91bmRhcnkoKS5xc3RyaW5nKCkgKTsKLSAgICAgICAgfQotICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAiZ2V0IiwgbV91cmwucXN0cmlu
ZygpLCBmb3JtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
dGFyZ2V0LnFzdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0
b25BY3RpdmF0aW9uICYmIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBm
aXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24tPnNldEFjdGl2YXRlZFN1Ym1pdChmYWxzZSk7Ci0g
ICAgfQotICAgIAotICAgIG1fZG9pbmdzdWJtaXQgPSBtX2luc3VibWl0ID0gZmFsc2U7Ci19Ci0K
LXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVzZXQoICApCi17Ci0gICAgRnJhbWUgKmZyYW1l
ID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2lucmVzZXQgfHwgIWZyYW1lKSBy
ZXR1cm47Ci0KLSAgICBtX2lucmVzZXQgPSB0cnVlOwotCi0gICAgLy8gIyMjIERPTTIgbGFiZWxz
IHRoaXMgZXZlbnQgYXMgbm90IGNhbmNlbGFibGUsIGhvd2V2ZXIKLSAgICAvLyBjb21tb24gYnJv
d3NlcnMoIHNpY2shICkgYWxsb3cgaXQgYmUgY2FuY2VsbGVkLgotICAgIGlmICggIWRpc3BhdGNo
SFRNTEV2ZW50KHJlc2V0RXZlbnQsdHJ1ZSwgdHJ1ZSkgKSB7Ci0gICAgICAgIG1faW5yZXNldCA9
IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZvcm1FbGVtZW50c1tp
XS0+cmVzZXQoKTsKLQotICAgIG1faW5yZXNldCA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxGb3Jt
RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0
dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyKSAKLSAgICB7Ci0gICAg
ICAgIGJvb2wgb2xkVVJMV2FzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24o
bV91cmwpOwotICAgICAgICBtX3VybCA9IGtodG1sOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsK
LSAgICAgICAgYm9vbCBuZXdVUkxJc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNz
aW9uKG1fdXJsKTsKLQotICAgICAgICBpZiAobV9hdHRhY2hlZCAmJiAob2xkVVJMV2FzU2VjdXJl
ICE9IG5ld1VSTElzU2VjdXJlKSkKLSAgICAgICAgICAgIGlmIChuZXdVUkxJc1NlY3VyZSkKLSAg
ICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsKLSAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtUmVtb3Zl
ZCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdGFyZ2V0QXR0cikgewot
ICAgICAgICBtX3RhcmdldCA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gbWV0aG9kQXR0cikgewotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0
ci0+dmFsdWUoKSwgInBvc3QiKSkKLSAgICAgICAgICAgIG1fcG9zdCA9IHRydWU7Ci0gICAgICAg
IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJnZXQiKSkKLSAgICAg
ICAgICAgIG1fcG9zdCA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGVu
Y3R5cGVBdHRyKSB7Ci0gICAgICAgIHBhcnNlRW5jdHlwZShhdHRyLT52YWx1ZSgpKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2NlcHRfY2hhcnNldEF0dHIpIHsKLSAgICAgICAg
Ly8gc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcnNldHMgdGhlIHNlcnZlcgotICAgICAgICAv
LyBhY2NlcHRzIC0gc2VlIHJmYzIwNDUKLSAgICAgICAgbV9hY2NlcHRjaGFyc2V0ID0gYXR0ci0+
dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2NlcHRBdHRyKSB7Ci0g
ICAgICAgIC8vIGlnbm9yZSB0aGlzIG9uZSBmb3IgdGhlIG1vbWVudC4uLgotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAgbV9hdXRvY29t
cGxldGUgPSAhZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc3VibWl0QXR0cikgewotICAgICAgICBzZXRIVE1M
RXZlbnRMaXN0ZW5lcihzdWJtaXRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25yZXNldEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIocmVz
ZXRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIp
IHsKLSAgICAgICAgRE9NU3RyaW5nIG5ld05hbWVBdHRyID0gYXR0ci0+dmFsdWUoKTsKLSAgICAg
ICAgaWYgKGluRG9jdW1lbnQoKSAmJiBnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7
Ci0gICAgICAgICAgICBIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19jYXN0PEhU
TUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBkb2N1bWVudC0+
cmVtb3ZlTmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICAgICAgICAgIGRvY3VtZW50LT5hZGRO
YW1lZEl0ZW0obmV3TmFtZUF0dHIpOwotICAgICAgICB9Ci0gICAgICAgIG9sZE5hbWVBdHRyID0g
bmV3TmFtZUF0dHI7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lk
IGluc2VydEludG9WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCB1bnNpZ25lZCBwb3MsIFQqIGl0
ZW0pCi17Ci0gICAgdW5zaWduZWQgc2l6ZSA9IHZlYy5zaXplKCk7Ci0gICAgdW5zaWduZWQgY291
bnQgPSB2ZWMuY291bnQoKTsKLSAgICBhc3NlcnQocG9zIDw9IGNvdW50KTsKLSAgICBpZiAoc2l6
ZSA9PSBjb3VudCkKLSAgICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6ZSAqIDMg
LyAyKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBjb3VudDsgaSA+IHBvczsgLS1pKQotICAgICAg
ICB2ZWMuaW5zZXJ0KGksIHZlY1tpIC0gMV0pOyAgICAKLSAgICB2ZWMuaW5zZXJ0KHBvcywgaXRl
bSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGFwcGVuZFRvVmVjdG9yKFFQ
dHJWZWN0b3I8VD4gJnZlYywgVCAqaXRlbSkKLXsKLSAgICB1bnNpZ25lZCBzaXplID0gdmVjLnNp
emUoKTsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwotICAgIGlmIChzaXplID09
IGNvdW50KQotICAgICAgICB2ZWMucmVzaXplKHNpemUgPT0gMCA/IDggOiBzaXplICogMyAvIDIp
OwotICAgIHZlYy5pbnNlcnQoY291bnQsIGl0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBz
dGF0aWMgdm9pZCByZW1vdmVGcm9tVmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgVCAqaXRlbSkK
LXsKLSAgICBpbnQgcG9zID0gdmVjLmZpbmRSZWYoaXRlbSk7Ci0gICAgaWYgKHBvcyA8IDApCi0g
ICAgICAgIHJldHVybjsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IHBvczsgaSA8IGNvdW50IC0gMTsgKytpKQotICAgICAgICB2ZWMuaW5z
ZXJ0KGksIHZlY1tpICsgMV0pOwotICAgIHZlYy5yZW1vdmUoY291bnQgLSAxKTsKLX0KLQotdW5z
aWduZWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6Zm9ybUVsZW1lbnRJbmRleChIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICAvLyBDaGVjayBmb3IgdGhlIHNwZWNpYWwgY2FzZSB3
aGVyZSB0aGlzIGVsZW1lbnQgaXMgdGhlIHZlcnkgbGFzdCB0aGluZyBpbgotICAgIC8vIHRoZSBm
b3JtJ3MgdHJlZSBvZiBjaGlsZHJlbjsgd2UgZG9uJ3Qgd2FudCB0byB3YWxrIHRoZSBlbnRpcmUg
dHJlZSBpbiB0aGF0Ci0gICAgLy8gY29tbW9uIGNhc2UgdGhhdCBvY2N1cnMgZHVyaW5nIHBhcnNp
bmc7IGluc3RlYWQgd2UnbGwganVzdCByZXR1cm4gYSB2YWx1ZQotICAgIC8vIHRoYXQgc2F5cyAi
YWRkIHRoaXMgZm9ybSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5Ii4KLSAgICBpZiAo
ZS0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKSkgewotICAgICAgICB1bnNpZ25lZCBpID0gMDsKLSAg
ICAgICAgZm9yIChOb2RlSW1wbCAqbm9kZSA9IHRoaXM7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2
ZXJzZU5leHROb2RlKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZSA9PSBlKQotICAgICAg
ICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQo
KQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwgKj4o
bm9kZSktPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgc3Rh
dGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKj4obm9kZSktPmZvcm0oKSA9PSB0
aGlzKQotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4g
Zm9ybUVsZW1lbnRzLmNvdW50KCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVn
aXN0ZXJGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICBE
b2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvYyAmJiBlLT5pc1Jh
ZGlvQnV0dG9uKCkgJiYgIWUtPm5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnRDaGVja2VkUmFkaW8gPSBkb2MtPmNoZWNrZWRSYWRp
b0J1dHRvbkZvckdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIChIVE1MRm9ybUVsZW1lbnRJbXBsKikg
MCk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvID09IGUpCi0gICAgICAgICAgICBk
b2MtPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxl
bWVudEltcGwqKSAwKTsKLSAgICAgICAgaWYgKGUtPmlzQ2hlY2tlZCgpKQotICAgICAgICAgICAg
ZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJbXBsKikgZSwgdGhpcyk7
Ci0gICAgfQotICAgIGluc2VydEludG9WZWN0b3IoZm9ybUVsZW1lbnRzLCBmb3JtRWxlbWVudElu
ZGV4KGUpLCBlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVGb3JtRWxl
bWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICBpZiAoIWUtPm5hbWUo
KS5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbCogY3VycmVudENoZWNrZWRSYWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNrZWRS
YWRpb0J1dHRvbkZvckdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAgICAgICBpZiAo
Y3VycmVudENoZWNrZWRSYWRpbyA9PSBlKQotICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVt
b3ZlUmFkaW9CdXR0b25Hcm91cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAgICB9Ci0gICAg
cmVtb3ZlRnJvbVZlY3Rvcihmb3JtRWxlbWVudHMsIGUpOwotfQotCi1ib29sIEhUTUxGb3JtRWxl
bWVudEltcGw6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyOwotfQotCi12b2lkIEhUTUxGb3Jt
RWxlbWVudEltcGw6OnJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1wbCAqZSkK
LXsKLSAgICBhcHBlbmRUb1ZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6cmVtb3ZlSW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1wbCAqZSkK
LXsKLSAgICByZW1vdmVGcm9tVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQotUmVmUHRyPEhU
TUxDb2xsZWN0aW9uSW1wbD4gSFRNTEZvcm1FbGVtZW50SW1wbDo6ZWxlbWVudHMoKQotewotICAg
IHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTEZvcm1Db2xsZWN0aW9u
SW1wbCh0aGlzKSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjpuYW1lKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLX0KLQotdm9pZCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9y
bUVsZW1lbnRJbXBsOjphY2NlcHRDaGFyc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGFjY2VwdF9jaGFyc2V0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1w
bDo6c2V0QWNjZXB0Q2hhcnNldChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShhY2NlcHRfY2hhcnNldEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxG
b3JtRWxlbWVudEltcGw6OmFjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShhY3Rpb25BdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRBY3Rpb24o
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWN0aW9uQXR0ciwg
dmFsdWUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEVuY3R5cGUoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKK0hUTUxMZWdlbmRFbGVtZW50SW1wbDo6SFRNTExlZ2VuZEVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQorOiBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbChsZWdlbmRUYWcsIGRvYywgZikKIHsKLSAgICBzZXRBdHRy
aWJ1dGUoZW5jdHlwZUF0dHIsIHZhbHVlKTsKIH0KIAotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVu
dEltcGw6Om1ldGhvZCgpIGNvbnN0CitIVE1MTGVnZW5kRWxlbWVudEltcGw6On5IVE1MTGVnZW5k
RWxlbWVudEltcGwoKQogewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobWV0aG9kQXR0cik7CiB9
CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0TWV0aG9kKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCitib29sIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAog
ewotICAgIHNldEF0dHJpYnV0ZShtZXRob2RBdHRyLCB2YWx1ZSk7CisgICAgcmV0dXJuIGZhbHNl
OwogfQogCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6dGFyZ2V0KCkgY29uc3QKK1Jl
bmRlck9iamVjdCogSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJB
cmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKIHsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKHRhcmdldEF0dHIpOworICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMZWdlbmQodGhp
cyk7CiB9CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0VGFyZ2V0KGNvbnN0IERPTVN0
cmluZyAmdmFsdWUpCitET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjp0eXBlKCkgY29u
c3QKIHsKLSAgICBzZXRBdHRyaWJ1dGUodGFyZ2V0QXR0ciwgdmFsdWUpOworICAgIHJldHVybiAi
bGVnZW5kIjsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYg
dGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAg
OiBIVE1MRWxlbWVudEltcGwodGFnTmFtZSwgZG9jKQorRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVt
ZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKIHsKLSAgICBtX2Rpc2FibGVkID0gbV9yZWFkT25s
eSA9IGZhbHNlOwotCi0gICAgaWYgKGYpCi0JbV9mb3JtID0gZjsKLSAgICBlbHNlCi0JbV9mb3Jt
ID0gZ2V0Rm9ybSgpOwotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9ybS0+cmVnaXN0ZXJG
b3JtRWxlbWVudCh0aGlzKTsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIp
OwogfQogCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6fkhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKCkKK3ZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKIHsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJl
bW92ZUZvcm1FbGVtZW50KHRoaXMpOworICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2
YWx1ZSk7CiB9CiAKLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCitET01TdHJpbmcgSFRNTExlZ2Vu
ZEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0CiB7Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBu
YW1lQXR0cikgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGRpc2FibGVkQXR0cikgewotICAgICAgICBib29sIG9sZERpc2FibGVkID0gbV9k
aXNhYmxlZDsKLSAgICAgICAgbV9kaXNhYmxlZCA9ICFhdHRyLT5pc051bGwoKTsKLSAgICAgICAg
aWYgKG9sZERpc2FibGVkICE9IG1fZGlzYWJsZWQpIHsKLSAgICAgICAgICAgIHNldENoYW5nZWQo
KTsKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhh
c0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVu
ZGVyZXIoKSwgRW5hYmxlZFN0YXRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IHJlYWRvbmx5QXR0cikgewotICAgICAgICBib29sIG9sZFJlYWRPbmx5ID0gbV9y
ZWFkT25seTsKLSAgICAgICAgbV9yZWFkT25seSA9ICFhdHRyLT5pc051bGwoKTsKLSAgICAgICAg
aWYgKG9sZFJlYWRPbmx5ICE9IG1fcmVhZE9ubHkpIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKKyAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7CiB9CiAKLXZvaWQgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCit2b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0
QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKIHsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkp
OwotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIC8vIFRoZSBjYWxsIHRv
IHVwZGF0ZUZyb21FbGVtZW50KCkgbmVlZHMgdG8gZ28gYWZ0ZXIgdGhlIGNhbGwgdGhyb3VnaAot
ICAgIC8vIHRvIHRoZSBiYXNlIGNsYXNzJ3MgYXR0YWNoKCkgYmVjYXVzZSB0aGF0IGNhbiBzb21l
dGltZXMgZG8gYSBjbG9zZQotICAgIC8vIG9uIHRoZSByZW5kZXJlci4KLSAgICBpZiAobV9yZW5k
ZXIpIHsKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgCi0gICAg
ICAgIC8vIERlbGF5ZWQgYXR0YWNobWVudCBpbiBvcmRlciB0byBwcmV2ZW50IEZPVUMgY2FuIHJl
c3VsdCBpbiBhbiBvYmplY3QgYmVpbmcKLSAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBmb2N1
c2VkIGJlZm9yZSBpdCBoYXMgYSByZW5kZXIgb2JqZWN0LiAgSWYgd2UgaGF2ZSBiZWVuIGZvY3Vz
ZWQKLSAgICAgICAgLy8gKGkuZS4sIGlmIHdlIGFyZSB0aGUgZm9jdXNOb2RlKSB0aGVuIGdvIGFo
ZWFkIGFuZCBmb2N1cyBvdXIgY29ycmVzcG9uZGluZyBuYXRpdmUgd2lkZ2V0LgotICAgICAgICAv
LyAoQXR0YWNoL2RldGFjaCBjYW4gYWxzbyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgZGlzcGxheSB0
eXBlIGNoYW5nZXMsIGUuZy4sIG1ha2luZyBhIHdpZGdldAotICAgICAgICAvLyBibG9jayBpbnN0
ZWFkIG9mIGlubGluZSwgYW5kIGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZCBpbiB0aGF0IGNhc2Ug
YXMgd2VsbC4pCi0gICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKSA9PSB0aGlz
ICYmIG1fcmVuZGVyLT5pc1dpZGdldCgpICYmIAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyV2lkZ2V0Kj4ocmVuZGVyZXIoKSktPndpZGdldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVyZXIoKSktPndpZGdldCgpLT5zZXRGb2N1cygpOwotICAg
IH0KKyAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7CiB9CiAKLXZvaWQgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQorRWxlbWVu
dEltcGwgKkhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Zm9ybUVsZW1lbnQoKQogewotICAgIGlmICgh
bV9mb3JtKSB7Ci0gICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBmb3Jt
IGVsZW1lbnQgYmVpbmcgY3JlYXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBpbnNl
cnRlZCBpbnNpZGUgYSBmb3JtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAgICAv
LyBzZXR0aW5nIGEgZm9ybSwgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1ZSBm
b3IgbV9mb3JtLCAKLSAgICAgICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhp
bmcuCi0gICAgICAgIG1fZm9ybSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBtX2Zv
cm0tPnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRv
YyAmJiBpc1JhZGlvQnV0dG9uKCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2VkKCkp
Ci0gICAgICAgICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1l
bnRJbXBsKil0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEVsZW1l
bnRJbXBsOjppbnNlcnRlZEludG9UcmVlKGRlZXApOwotfQorICAgIC8vIENoZWNrIGlmIHRoZXJl
J3MgYSBmaWVsZHNldCBiZWxvbmdpbmcgdG8gdGhpcyBsZWdlbmQuCisgICAgTm9kZUltcGwgKmZp
ZWxkc2V0ID0gcGFyZW50Tm9kZSgpOworICAgIHdoaWxlIChmaWVsZHNldCAmJiAhZmllbGRzZXQt
Pmhhc1RhZ05hbWUoZmllbGRzZXRUYWcpKQorICAgICAgICBmaWVsZHNldCA9IGZpZWxkc2V0LT5w
YXJlbnROb2RlKCk7CisgICAgaWYgKCFmaWVsZHNldCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLXZv
aWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXAp
Ci17Ci0gICAgLy8gV2hlbiBiZWluZyByZW1vdmVkIHdlIGhhdmUgdG8gcG9zc2libHkgbnVsbCBv
dXQgb3VyIGZvcm0gYW5kIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbQotICAgIC8vIHRoZSBmb3JtJ3Mg
bGlzdCBvZiBlbGVtZW50cy4KLSAgICBpZiAobV9mb3JtKSB7Ci0gICAgICAgIC8vIEF0dGVtcHQg
dG8gcmUtYWNxdWlyZSB0aGUgZm9ybS4gIElmIHdlIGNhbid0IHJlLWFjcXVpcmUsIHRoZW4KLSAg
ICAgICAgLy8gcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBmb3JtLgotICAgICAgICBOb2RlSW1w
bCogZm9ybSA9IHBhcmVudE5vZGUoKTsKLSAgICAgICAgTm9kZUltcGwqIHJvb3QgPSB0aGlzOwot
ICAgICAgICB3aGlsZSAoZm9ybSkgewotICAgICAgICAgICAgaWYgKGZvcm0tPmhhc1RhZ05hbWUo
Zm9ybVRhZykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByb290ID0gZm9y
bTsKLSAgICAgICAgICAgIGZvcm0gPSBmb3JtLT5wYXJlbnROb2RlKCk7CisgICAgLy8gRmluZCBm
aXJzdCBmb3JtIGVsZW1lbnQgaW5zaWRlIHRoZSBmaWVsZHNldC4KKyAgICAvLyBGSVhNRTogU2hv
dWxkIHdlIGNhcmUgYWJvdXQgdGFiaW5kZXg/CisgICAgTm9kZUltcGwgKm5vZGUgPSBmaWVsZHNl
dDsKKyAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKGZpZWxkc2V0KSkp
IHsKKyAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICAgICAgSFRN
TEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5v
ZGUpOworICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5oYXNMb2NhbE5hbWUobGVnZW5kVGFnKSAm
JiBlbGVtZW50LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQorICAgICAgICAgICAgICAgIHJldHVy
biBlbGVtZW50OwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgZm9ybSBo
YXMgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiwgdGhlbiB3ZSB3b24ndCBmaW5kIGl0IGFzIGFuIGFu
Y2VzdG9yLgotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJvb3Qgbm9kZSBvZiBvdXIg
Y3VycmVudCBmb3JtIGFuZCBvdXIgcm9vdCBub2RlCi0gICAgICAgIC8vIG1hdGNoLiAgSWYgc28s
IHByZXNlcnZlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBmb3JtLgotICAgICAgICBpZiAoIWZvcm0p
IHsKLSAgICAgICAgICAgIE5vZGVJbXBsKiBmb3JtUm9vdCA9IG1fZm9ybTsKLSAgICAgICAgICAg
IHdoaWxlIChmb3JtUm9vdC0+cGFyZW50KCkpIGZvcm1Sb290ID0gZm9ybVJvb3QtPnBhcmVudCgp
OwotICAgICAgICAgICAgaWYgKGZvcm1Sb290ID09IHJvb3QpCi0gICAgICAgICAgICAgICAgZm9y
bSA9IG1fZm9ybTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmICghZm9ybSkgewot
ICAgICAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgICAg
IG1fZm9ybSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYXNzZXJ0KGZvcm0gPT0g
bV9mb3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVkIGZvcm0gc2hvdWxkIGJlIHRoZSBzYW1lLiBJZiBu
b3QsIHNvbWV0aGluZyByZWFsbHkgc3RyYW5nZSBoYXBwZW5lZC4KICAgICB9Ci0gICAKLSAgICBI
VE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsKLX0KIAotSFRNTEZvcm1FbGVt
ZW50SW1wbCAqSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmdldEZvcm0oKSBjb25zdAotewot
ICAgIE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlKHApIHsKLSAgICAgICAg
aWYgKHAtPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8SFRNTEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAgICAgICAgcCA9IHAtPnBhcmVudE5vZGUo
KTsKLSAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKLURPTVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIG4gPSBnZXRBdHRyaWJ1
dGUobmFtZUF0dHIpOwotICAgIHJldHVybiBuLmlzTnVsbCgpID8gIiIgOiBuOwotfQotCi12b2lk
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uU2VsZWN0KCkKK3ZvaWQgSFRNTExlZ2VuZEVsZW1l
bnRJbXBsOjpmb2N1cygpCiB7Ci0gICAgLy8gIyMjIG1ha2UgdGhpcyB3b3JrIHdpdGggbmV3IGZv
cm0gZXZlbnRzIGFyY2hpdGVjdHVyZQotICAgIGRpc3BhdGNoSFRNTEV2ZW50KHNlbGVjdEV2ZW50
LHRydWUsZmFsc2UpOworICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50
KCkpCisgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CiB9CiAKLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6Om9uQ2hhbmdlKCkKK3ZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nl
c3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQogewotICAgIC8vICMjIyBtYWtlIHRo
aXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUKLSAgICBkaXNwYXRjaEhU
TUxFdmVudChjaGFuZ2VFdmVudCx0cnVlLGZhbHNlKTsKKyAgICBpZiAoRWxlbWVudEltcGwgKmVs
ZW1lbnQgPSBmb3JtRWxlbWVudCgpKQorICAgICAgICBlbGVtZW50LT5hY2Nlc3NLZXlBY3Rpb24o
c2VuZFRvQW55RWxlbWVudCk7CiB9Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kaXNhYmxlZDsKLX0KLQotdm9pZCBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0RGlzYWJsZWQoYm9vbCBiKQotewotICAgIHNl
dEF0dHJpYnV0ZShkaXNhYmxlZEF0dHIsIGIgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpzZXRSZWFkT25seShib29sIGIpCi17Ci0gICAgc2V0QXR0cmli
dXRlKHJlYWRvbmx5QXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgLy9ib29s
IGNoYW5nZWQgPSBjaGFuZ2VkKCk7Ci0gICAgSFRNTEVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSgg
Y2ggKTsKLQotICAgIGlmIChtX3JlbmRlciAvKiYmIGNoYW5nZWQqLykKLSAgICAgICAgbV9yZW5k
ZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoZGlzYWJsZWQoKSB8fCAhbV9y
ZW5kZXIgfHwgCi0gICAgICAgIChtX3JlbmRlci0+c3R5bGUoKSAmJiBtX3JlbmRlci0+c3R5bGUo
KS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHx8IAotICAgICAgICBtX3JlbmRlci0+d2lkdGgo
KSA9PSAwIHx8IG1fcmVuZGVyLT5oZWlnaHQoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7
Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewotICAgICAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCkgJiYKLSAgICAg
ICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQo
KS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OlRhYkZvY3VzKTsKLSAgICAgICAgfQotCWlmIChn
ZXREb2N1bWVudCgpLT5mcmFtZSgpKQotCSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUo
KS0+dGFic1RvQWxsQ29udHJvbHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc01vdXNlRm9jdXNhYmxlKCkgY29uc3QK
LXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAgICBpZiAobV9yZW5kZXItPmlzV2lk
Z2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPiht
X3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PFJlbmRl
cldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3VzUG9saWN5KCkgJiBRV2lkZ2V0OjpD
bGlja0ZvY3VzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBGb3IgPGlucHV0IHR5cGU9aW1hZ2U+
IGFuZCA8YnV0dG9uPiwgd2Ugd2lsbCBhc3N1bWUgbm8gbW91c2UgZm9jdXNhYmlsaXR5LiAgVGhp
cyBpcwotICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggT1MgWCBiZWhhdmlvciBmb3IgYnV0dG9u
cy4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQotewotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotLy8gU3BlY2lhbCBjaGFycyB1c2VkIHRvIGVuY29kZSBmb3JtIHN0
YXRlIHN0cmluZ3MuCi0vLyBXZSBwaWNrIGNoYXJzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGJlIHVz
ZWQgaW4gYW4gSFRNTCBhdHRyLCBzbyB3ZSByYXJlbHkgaGF2ZSB0byByZWFsbHkgZW5jb2RlLgot
Y29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvciA9ICcmJzsKLWNvbnN0IGNoYXIgc3RhdGVFc2NhcGUg
PSAnPCc7Ci1zdGF0aWMgY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvck1hcmtlcltdID0gIjxBIjsK
LXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlRXNjYXBlTWFya2VyW10gPSAiPDwiOwotCi0vLyBFbmNv
ZGUgYW4gZWxlbWVudCBuYW1lIHNvIHdlIGNhbiBwdXQgaXQgaW4gYSBzdGF0ZSBzdHJpbmcgd2l0
aG91dCBjb2xsaWRpbmcKLS8vIHdpdGggb3VyIHNlcGFyYXRvciBjaGFyLgotc3RhdGljIFFTdHJp
bmcgZW5jb2RlZEVsZW1lbnROYW1lKFFTdHJpbmcgc3RyKQotewotICAgIGludCBzZXBMb2MgPSBz
dHIuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaW50IGVzY0xvYyA9IHN0ci5maW5kKHN0YXRl
U2VwYXJhdG9yKTsKLSAgICBpZiAoc2VwTG9jID49IDAgfHwgZXNjTG9jID49IDApIHsKLSAgICAg
ICAgUVN0cmluZyBuZXdTdHIgPSBzdHI7Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiPCIgd2l0aCAi
PDwiCi0gICAgICAgIHdoaWxlIChlc2NMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3RyLnJl
cGxhY2UoZXNjTG9jLCAxLCBzdGF0ZUVzY2FwZU1hcmtlcik7Ci0gICAgICAgICAgICBlc2NMb2Mg
PSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgZXNjTG9jKzEpOwotICAgICAgICB9Ci0gICAgICAg
IC8vICAgcmVwbGFjZSAiJiIgd2l0aCAiPEEiCi0gICAgICAgIHdoaWxlIChzZXBMb2MgPj0gMCkg
ewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2Uoc2VwTG9jLCAxLCBzdGF0ZVNlcGFyYXRvck1h
cmtlcik7Ci0gICAgICAgICAgICBzZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgc2Vw
TG9jKzEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdTdHI7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gQnVpbGQgYSBzdHJpbmcgdGhhdCBjb250
YWlucyBFbGVtZW50TmFtZSZFbGVtZW50VHlwZSYKLSAgICByZXR1cm4gZW5jb2RlZEVsZW1lbnRO
YW1lKG5hbWUoKS5xc3RyaW5nKCkpICsgc3RhdGVTZXBhcmF0b3IgKyB0eXBlKCkucXN0cmluZygp
ICsgc3RhdGVTZXBhcmF0b3I7Ci19Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgUVN0cmlu
ZyBlbmNOYW1lID0gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpOwotICAgIFFT
dHJpbmcgdHlwZVN0ciA9IHR5cGUoKS5xc3RyaW5nKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6
SXRlcmF0b3IgaXQgPSBzdGF0ZXMuYmVnaW4oKTsgaXQgIT0gc3RhdGVzLmVuZCgpOyArK2l0KSB7
Ci0gICAgICAgIFFTdHJpbmcgc3RhdGUgPSAqaXQ7Ci0gICAgICAgIGludCBzZXAxID0gc3RhdGUu
ZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgICAgIGludCBzZXAyID0gc3RhdGUuZmluZChzdGF0
ZVNlcGFyYXRvciwgc2VwMSsxKTsKLSAgICAgICAgYXNzZXJ0KHNlcDEgPj0gMCk7Ci0gICAgICAg
IGFzc2VydChzZXAyID49IDApOwotCi0gICAgICAgIFFTdHJpbmcgbmFtZUFuZFR5cGUgPSBzdGF0
ZS5sZWZ0KHNlcDIpOwotICAgICAgICBpZiAoZW5jTmFtZS5sZW5ndGgoKSArIHR5cGVTdHIubGVu
Z3RoKCkgKyAxID09ICh1aW50KXNlcDIKLSAgICAgICAgICAgICYmIG5hbWVBbmRUeXBlLnN0YXJ0
c1dpdGgoZW5jTmFtZSkKLSAgICAgICAgICAgICYmIG5hbWVBbmRUeXBlLmVuZHNXaXRoKHR5cGVT
dHIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZXMucmVtb3ZlKGl0KTsKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0ZS5taWQoc2VwMisxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1
cm4gUVN0cmluZzo6bnVsbDsKLX0KLQotaW50IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp0
YWJJbmRleCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0YWJpbmRleEF0dHIp
LnRvSW50KCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFRhYklu
ZGV4KGludCB2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFiaW5kZXhBdHRyLCBRU3RyaW5n
OjpudW1iZXIodmFsdWUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MQnV0dG9u
RWxlbWVudEltcGw6OkhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRN
TEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGJ1
dHRvblRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAgICBtX2RpcnR5ID0g
dHJ1ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotfQotCi1IVE1MQnV0dG9uRWxlbWVu
dEltcGw6On5IVE1MQnV0dG9uRWxlbWVudEltcGwoKQotewotfQotCi1SZW5kZXJPYmplY3QqIEhU
TUxCdXR0b25FbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBS
ZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRv
bih0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dHlwZSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0eXBlQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TEJ1dHRvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJ
bXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gIHR5cGVBdHRyKSB7Ci0gICAg
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAic3VibWl0IikpCi0gICAg
ICAgICAgICBtX3R5cGUgPSBTVUJNSVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKGF0dHItPnZhbHVlKCksICJyZXNldCIpKQotICAgICAgICAgICAgbV90eXBlID0gUkVTRVQ7
Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJidXR0
b24iKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IEJVVFRPTjsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKLSAgICAgICAgbV92YWx1ZSA9IGF0dHItPnZhbHVlKCk7
Ci0gICAgICAgIG1fY3VyclZhbHVlID0gbV92YWx1ZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2
ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZl
bnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1l
bnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlmICht
X3R5cGUgIT0gQlVUVE9OICYmIChldnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSkgewot
Ci0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gU1VCTUlUKSB7Ci0gICAgICAgICAgICBt
X2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAgICBtX2Zvcm0tPnByZXBhcmVTdWJtaXQo
KTsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7IC8vIGluIGNhc2Ugd2Ugd2Vy
ZSBjYW5jZWxlZAotICAgICAgICB9Ci0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gUkVT
RVQpIG1fZm9ybS0+cmVzZXQoKTsKLSAgICB9Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVu
dEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBz
cGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNvbnNp
ZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBub3Qg
aW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZm
ZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBh
dXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBjb25zdHJhaW50IGZvciBu
b3cuCi0gICAgLy8gV2FzOiBtX3R5cGUgPT0gU1VCTUlUICYmICFtX2Rpc2FibGVkICYmICFuYW1l
KCkuaXNFbXB0eSgpCi0gICAgcmV0dXJuIG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJsZWQ7
Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjppc0FjdGl2YXRlZFN1Ym1pdCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0OwotfQotCi12b2lkIEhUTUxCdXR0b25F
bGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAgICBtX2FjdGl2
ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphcHBlbmRG
b3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29sIC8qbXVsdGlwYXJ0Ki8pCi17Ci0g
ICAgaWYgKG1fdHlwZSAhPSBTVUJNSVQgfHwgbmFtZSgpLmlzRW1wdHkoKSB8fCAhbV9hY3RpdmVT
dWJtaXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5h
bWUoKSwgbV9jdXJyVmFsdWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxCdXR0
b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsg
ICAKLSAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAvLyBj
YWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAgICBjbGljayhzZW5kVG9BbnlFbGVt
ZW50KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12
b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQot
RE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVu
dEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxG
aWVsZFNldEVsZW1lbnRJbXBsOjpIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwoZmllbGRzZXRUYWcsIGRvYywgZikKLXsKLX0KLQotSFRNTEZpZWxkU2V0RWxlbWVudElt
cGw6On5IVE1MRmllbGRTZXRFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTEZpZWxkU2V0
RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBy
ZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSB8fCBIVE1MRWxlbWVudEltcGw6
OmNoZWNrRFREKG5ld0NoaWxkKTsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6
aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9NU3RyaW5n
IEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gImZp
ZWxkc2V0IjsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y3Jl
YXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0g
ICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpZWxkc2V0KHRoaXMpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpIVE1MSW5wdXRFbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsKGlucHV0VGFnLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwot
fQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVh
bGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudElt
cGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCh0YWdOYW1lLCBkb2MsIGYp
Ci17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppbml0KCkK
LXsKLSAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0g
ZmFsc2U7Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX21heExlbiA9IC0xOwotICAgIG1fc2l6
ZSA9IDIwOwotICAgIG1fY2hlY2tlZCA9IGZhbHNlOwotICAgIG1fZGVmYXVsdENoZWNrZWQgPSBm
YWxzZTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLSAgICBtX2luZGV0ZXJtaW5h
dGUgPSBmYWxzZTsKLQotICAgIG1faGF2ZVR5cGUgPSBmYWxzZTsKLSAgICBtX2FjdGl2ZVN1Ym1p
dCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAgICBtX2luaXRlZCA9IGZh
bHNlOwotCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7Ci0KLSAgICBtX21heFJlc3VsdHMg
PSAtMTsKLQotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gbV9mb3Jt
LT5hdXRvQ29tcGxldGUoKTsKLX0KLQotSFRNTElucHV0RWxlbWVudEltcGw6On5IVE1MSW5wdXRF
bGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRl
cmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsK
LX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBtX25hbWU7Ci19Ci0KLWJvb2wgSFRNTElu
cHV0RWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIC8vIElm
IHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3QgYmUgZm9jdXNlZCwgdGhlbiB3ZSBjYW4gc3Rv
cCBub3cuCi0gICAgaWYgKCFIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2FyZEZv
Y3VzYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV90eXBlID09IFJB
RElPKSB7Ci0gICAgICAgIC8vIFVubmFtZWQgcmFkaW8gYnV0dG9ucyBhcmUgbmV2ZXIgZm9jdXNh
YmxlIChtYXRjaGVzIFdpbklFKS4KLSAgICAgICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gTmV2ZXIgYWxsb3cga2V5Ym9hcmQg
dGFiYmluZyB0byBsZWF2ZSB5b3UgaW4gdGhlIHNhbWUgcmFkaW8gZ3JvdXAuICBBbHdheXMKLSAg
ICAgICAgLy8gc2tpcCBhbnkgb3RoZXIgZWxlbWVudHMgaW4gdGhlIGdyb3VwLgotICAgICAgICBO
b2RlSW1wbCogY3VycmVudEZvY3VzTm9kZSA9IGdldERvY3VtZW50KCktPmZvY3VzTm9kZSgpOwot
ICAgICAgICBpZiAoY3VycmVudEZvY3VzTm9kZSAmJiBjdXJyZW50Rm9jdXNOb2RlLT5oYXNUYWdO
YW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGZvY3Vz
ZWRJbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudEZvY3Vz
Tm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNlZElucHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJ
TyAmJiBmb2N1c2VkSW5wdXQtPmZvcm0oKSA9PSBtX2Zvcm0gJiYKLSAgICAgICAgICAgICAgICBm
b2N1c2VkSW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvdyBrZXlib2FyZCBmb2N1
cyBpZiB3ZSdyZSBjaGVja2VkIG9yIGlmIG5vdGhpbmcgaW4gdGhlIGdyb3VwIGlzIGNoZWNrZWQu
Ci0gICAgICAgIHJldHVybiBjaGVja2VkKCkgfHwgIWdldERvY3VtZW50KCktPmNoZWNrZWRSYWRp
b0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgfQotICAgIAotICAg
IHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRUeXBlKGNv
bnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICBpZiAodC5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50
IGV4Y2NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh0eXBlQXR0ciwgZXhjY29kZSk7Ci0g
ICAgfQotICAgIGVsc2UKLSAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0KTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYg
dCkKLXsKLSAgICB0eXBlRW51bSBuZXdUeXBlOwotICAgIAotICAgIGlmIChlcXVhbElnbm9yaW5n
Q2FzZSh0LCAicGFzc3dvcmQiKSkKLSAgICAgICAgbmV3VHlwZSA9IFBBU1NXT1JEOwotICAgIGVs
c2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJjaGVja2JveCIpKQotICAgICAgICBuZXdUeXBl
ID0gQ0hFQ0tCT1g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhZGlvIikp
Ci0gICAgICAgIG5ld1R5cGUgPSBSQURJTzsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZSh0LCAic3VibWl0IikpCi0gICAgICAgIG5ld1R5cGUgPSBTVUJNSVQ7Ci0gICAgZWxzZSBpZiAo
ZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJlc2V0IikpCi0gICAgICAgIG5ld1R5cGUgPSBSRVNFVDsK
LSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiZmlsZSIpKQotICAgICAgICBuZXdU
eXBlID0gRklMRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaGlkZGVuIikp
Ci0gICAgICAgIG5ld1R5cGUgPSBISURERU47Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UodCwgImltYWdlIikpCi0gICAgICAgIG5ld1R5cGUgPSBJTUFHRTsKLSAgICBlbHNlIGlmIChl
cXVhbElnbm9yaW5nQ2FzZSh0LCAiYnV0dG9uIikpCi0gICAgICAgIG5ld1R5cGUgPSBCVVRUT047
Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImtodG1sX2lzaW5kZXgiKSkKLSAg
ICAgICAgbmV3VHlwZSA9IElTSU5ERVg7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
dCwgInNlYXJjaCIpKQotICAgICAgICBuZXdUeXBlID0gU0VBUkNIOwotICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHQsICJyYW5nZSIpKQotICAgICAgICBuZXdUeXBlID0gUkFOR0U7Ci0g
ICAgZWxzZQotICAgICAgICBuZXdUeXBlID0gVEVYVDsKLQotICAgIC8vICMjIyBJTVBPUlRBTlQ6
IERvbid0IGFsbG93IHRoZSB0eXBlIHRvIGJlIGNoYW5nZWQgdG8gRklMRSBhZnRlciB0aGUgZmly
c3QKLSAgICAvLyB0eXBlIGNoYW5nZSwgb3RoZXJ3aXNlIGEgSmF2YVNjcmlwdCBwcm9ncmFtbWVy
IHdvdWxkIGJlIGFibGUgdG8gc2V0IGEgdGV4dAotICAgIC8vIGZpZWxkJ3MgdmFsdWUgdG8gc29t
ZXRoaW5nIGxpa2UgL2V0Yy9wYXNzd2QgYW5kIHRoZW4gY2hhbmdlIGl0IHRvIGEgZmlsZSBmaWVs
ZC4KLSAgICBpZiAobV90eXBlICE9IG5ld1R5cGUpIHsKLSAgICAgICAgaWYgKG5ld1R5cGUgPT0g
RklMRSAmJiBtX2hhdmVUeXBlKSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGF0dHJpYnV0ZSBi
YWNrIHRvIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAgICAvLyBVc2VmdWwgaW4gY2FzZSB3ZSB3
ZXJlIGNhbGxlZCBmcm9tIGluc2lkZSBwYXJzZU1hcHBlZEF0dHJpYnV0ZS4KLSAgICAgICAgICAg
IHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAo
bmFtZSgpLmltcGwoKSwgbV9mb3JtKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBnZXRE
b2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdhc0F0dGFjaGVkID0gbV9hdHRhY2hl
ZDsKLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBkZXRhY2go
KTsKLSAgICAgICAgICAgIGJvb2wgZGlkU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJhdGVG
cm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBtX3R5cGUgPSBuZXdUeXBlOwotICAgICAgICAg
ICAgYm9vbCB3aWxsU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRl
KCk7Ci0gICAgICAgICAgICBpZiAoZGlkU3RvcmVWYWx1ZSAmJiAhd2lsbFN0b3JlVmFsdWUgJiYg
IW1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVB
dHRyLCBtX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gRE9NU3RyaW5nKCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpZFN0b3JlVmFsdWUgJiYgd2lsbFN0b3Jl
VmFsdWUpIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0
cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2FzQXR0YWNoZWQpCi0gICAgICAg
ICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiBv
dXIgdHlwZSBtb3JwaHMgaW50byBhIHJhZGlvIGJ1dHRvbiBhbmQgd2UgYXJlIGNoZWNrZWQsIHRo
ZW4gZ28gYWhlYWQKLSAgICAgICAgICAgIC8vIGFuZCBzaWduYWwgdGhpcyB0byB0aGUgZm9ybS4K
LSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpKQotICAgICAgICAg
ICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwot
ICAgICAgICB9Ci0gICAgfQotICAgIG1faGF2ZVR5cGUgPSB0cnVlOwotICAgIAotICAgIGlmICht
X3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikgewotICAgICAgICBkZWxldGUgbV9pbWFn
ZUxvYWRlcjsKLSAgICAgICAgbV9pbWFnZUxvYWRlciA9IDA7Ci0gICAgfQotfQotCi1ET01TdHJp
bmcgSFRNTElucHV0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIC8vIG5lZWRzIHRv
IGJlIGxvd2VyY2FzZSBhY2NvcmRpbmcgdG8gRE9NIHNwZWMKLSAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgIGNhc2UgVEVYVDogcmV0dXJuICJ0ZXh0IjsKLSAgICBjYXNlIFBBU1NXT1JEOiByZXR1
cm4gInBhc3N3b3JkIjsKLSAgICBjYXNlIENIRUNLQk9YOiByZXR1cm4gImNoZWNrYm94IjsKLSAg
ICBjYXNlIFJBRElPOiByZXR1cm4gInJhZGlvIjsKLSAgICBjYXNlIFNVQk1JVDogcmV0dXJuICJz
dWJtaXQiOwotICAgIGNhc2UgUkVTRVQ6IHJldHVybiAicmVzZXQiOwotICAgIGNhc2UgRklMRTog
cmV0dXJuICJmaWxlIjsKLSAgICBjYXNlIEhJRERFTjogcmV0dXJuICJoaWRkZW4iOwotICAgIGNh
c2UgSU1BR0U6IHJldHVybiAiaW1hZ2UiOwotICAgIGNhc2UgQlVUVE9OOiByZXR1cm4gImJ1dHRv
biI7Ci0gICAgY2FzZSBTRUFSQ0g6IHJldHVybiAic2VhcmNoIjsKLSAgICBjYXNlIFJBTkdFOiBy
ZXR1cm4gInJhbmdlIjsKLSAgICBjYXNlIElTSU5ERVg6IHJldHVybiAiIjsKLSAgICB9Ci0gICAg
cmV0dXJuICIiOwotfQotCi1RU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzdGF0ZSggKQot
ewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUv
cmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKTsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsgKGNo
ZWNrZWQoKSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHN0
YXRlICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOyAvLyBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBu
b3QgZW1wdHkhCi0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZXN0b3Jl
U3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBhc3NlcnQobV90eXBlICE9IFBBU1NX
T1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFzc3dvcmQgZmllbGRzCi0gICAg
Ci0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0
Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJuOwotCi0g
ICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86
Ci0gICAgICAgIHNldENoZWNrZWQoKHN0YXRlID09ICJvbiIpKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgZGVmYXVsdDoKLSAgICAgICAgc2V0VmFsdWUoRE9NU3RyaW5nKHN0YXRlLmxlZnQoc3RhdGUu
bGVuZ3RoKCktMSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpjYW5IYXZlU2VsZWN0aW9uKCkKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNh
c2UgU0VBUkNIOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgSFRN
TElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBpZiAoIW1fcmVuZGVy
KSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2Vs
ZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAg
IH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZWxlY3Rp
b25FbmQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3aXRj
aCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNI
OgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVu
ZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAg
IGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAg
ICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBU
RVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIp
LT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17Ci0gICAgaWYgKCFtX3JlbmRl
cikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFT
U1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlv
bkVuZChlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVj
dCggICkKLXsKLSAgICBpZighbV9yZW5kZXIpIHJldHVybjsKLQotICAgIHN3aXRjaCAobV90eXBl
KSB7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZp
bGVCdXR0b24qPihtX3JlbmRlciktPnNlbGVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRF
WFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCo+KG1fcmVuZGVyKS0+
c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAg
ICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICBjYXNlIElN
QUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAg
IGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaWYgKCFtX3Jl
bmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAg
ICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVj
dGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzLCBib29sIHNob3dQcmVzc2VkTG9vaykK
LXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAg
ICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgQlVU
VE9OOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNlbmRN
b3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24gKj4ocmVuZGVyZXIoKSktPmNsaWNrKHNl
bmRNb3VzZUV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZl
bnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
Q0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAg
ICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBT
RUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAg
ICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNo
b3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQp
Ci17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAg
ICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlwZQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBT
RUFSQ0g6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgIGZvY3VzKCk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJ
TzoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNh
c2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIEZJTEU6Ci0gICAg
ICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAvLyBmb2N1cwotICAgICAgICAgICAgZm9jdXMo
KTsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgbW91c2UgYnV0dG9uIGV2ZW50cyBpZmYgdGhl
Ci0gICAgICAgICAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAgICAg
ICAgICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
fQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGNvbnN0IFF1YWxp
ZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAot
ewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0g
aGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2c3BhY2VBdHRyIHx8Ci0gICAgICAg
IGF0dHJOYW1lID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09
IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlUmVwbGFjZWQ7IC8vIFNoYXJlIHdpdGgg
PGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gSFRNTEVsZW1lbnRJbXBsOjpt
YXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewot
ICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgaWYgKG1fdHlwZSA9
PSBSQURJTyAmJiBjaGVja2VkKCkgJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUg
dGhlIHJhZGlvIGZyb20gaXRzIG9sZCBncm91cC4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0g
UkFESU8gJiYgIW1fbmFtZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQo
KS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChtX25hbWUuaW1wbCgpLCBtX2Zvcm0pOwotICAgICAg
ICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUgb3VyIGNhY2hlZCByZWZlcmVuY2UgdG8g
dGhlIG5hbWUuCi0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIAotICAg
ICAgICAvLyBBZGQgaXQgdG8gaXRzIG5ldyBncm91cC4KLSAgICAgICAgaWYgKG1fdHlwZSA9PSBS
QURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRv
bkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBh
dXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gIWVxdWFsSWdub3Jp
bmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgc2V0SW5wdXRUeXBlKGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAgICAgICAvLyBX
ZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9ybSBpcyBsb29raW5nIGF0IHRoZSBk
ZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KLSAgICAgICAgaWYgKG1fdmFsdWUuaXNOdWxsKCkpCi0g
ICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIg
PSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGVja2VkQXR0cikgewot
ICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICBpZiAo
bV91c2VEZWZhdWx0Q2hlY2tlZCkgewotICAgICAgICAgICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRD
aGVja2VkKTsKLSAgICAgICAgICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikgewotICAg
ICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6
IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+
dmFsdWUoKS50b0ludCgpIDogMjA7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWx0
QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90eXBlID09IElNQUdFKQotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3JlbmRlciktPnVwZGF0ZUFsdFRleHQo
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7Ci0gICAgICAgIGlm
IChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsKLSAgICAgICAgICAgIGlmICghbV9pbWFn
ZUxvYWRlcikKLSAgICAgICAgICAgICAgICBtX2ltYWdlTG9hZGVyID0gbmV3IEhUTUxJbWFnZUxv
YWRlcih0aGlzKTsKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVtZW50
KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB1c2VtYXBBdHRy
IHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAg
ICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChh
dHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChh
dHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENT
U0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBhZGRIVE1M
QWxpZ25tZW50KGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0
cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZh
bHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAg
ICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAg
c2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc2Vs
ZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWxlY3RFdmVudCwgYXR0
cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0gICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBvbmlucHV0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRM
aXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRyKTsKLSAgICB9Ci0gICAgLy8gU2VhcmNoIGZpZWxkIGFu
ZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwganVzdCBjYXVzZSB1cGRhdGVGcm9tRWxlbWVudCB0byBi
ZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQotICAgIC8vIHJlY2FsY2luZy4KLSAgICBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gb25zZWFyY2hBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3Rl
bmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBy
ZXN1bHRzQXR0cikgewotICAgICAgICBtX21heFJlc3VsdHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBh
dHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0ciB8fAotICAgICAgICAgICAgICAg
YXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+
bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgp
ID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtYXhBdHRyIHx8
Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9uQXR0cikgewotICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAg
c3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBURVhUOgotICAgIGNhc2UgUEFTU1dPUkQ6
Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBSQU5HRToKLSAgICBjYXNlIElTSU5ERVg6Ci0g
ICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgIGNhc2UgU1VCTUlUOgotICAg
IGNhc2UgSU1BR0U6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEZJTEU6Ci0gICAgY2FzZSBC
VVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVl
ZGVkKHN0eWxlKTsKLSAgICBjYXNlIEhJRERFTjogICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAg
IGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJPYmplY3QgKkhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJl
bmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBjYXNl
IFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNlIElT
SU5ERVg6ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyTGluZUVkaXQodGhpcyk7Ci0gICAgY2Fz
ZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICByZXR1cm4gUmVuZGVyT2JqZWN0
OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotICAgIGNhc2UgU1VCTUlUOgotICAgIGNhc2Ug
UkVTRVQ6Ci0gICAgY2FzZSBCVVRUT046Ci0gICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5k
ZXJCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBJTUFHRTogICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJl
bmRlckltYWdlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgRklMRTogICAgIHJldHVybiBuZXcgKGFy
ZW5hKSBSZW5kZXJGaWxlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgUkFOR0U6ICAgIHJldHVybiBu
ZXcgKGFyZW5hKSBSZW5kZXJTbGlkZXIodGhpcyk7Ci0gICAgY2FzZSBISURERU46ICAgYnJlYWs7
Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgaWYgKCFtX2luaXRlZCkgewotICAg
ICAgICBpZiAoIW1faGF2ZVR5cGUpCi0gICAgICAgICAgICBzZXRJbnB1dFR5cGUoZ2V0QXR0cmli
dXRlKHR5cGVBdHRyKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgZHlu
YW1pYywgZG9lc24ndCBpdCwgc2luY2Ugc29tZW9uZSBjb3VsZCBzZXQgdGhpcwotICAgICAgICAv
LyBhZnRlciBhdHRhY2htZW50PwotICAgICAgICBET01TdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRl
KHZhbHVlQXR0cik7Ci0gICAgICAgIGlmICgodWludCkgbV90eXBlIDw9IElTSU5ERVggJiYgIXZh
bC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIHN0dWZmLi4KLSAg
ICAgICAgICAgIFFTdHJpbmcgbnZhbHVlOwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQg
aSA9IDA7IGkgPCB2YWwubGVuZ3RoKCk7ICsraSkKLSAgICAgICAgICAgICAgICBpZiAodmFsW2ld
ID49ICcgJykKLSAgICAgICAgICAgICAgICAgICAgbnZhbHVlICs9IHZhbFtpXTsKLQotICAgICAg
ICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSBudmFsdWUubGVuZ3RoKCkpCi0gICAgICAgICAgICAg
ICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbnZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAg
IG1faW5pdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBEaXNhbGxvdyB0aGUgd2lkdGggYXR0
cmlidXRlIG9uIGlucHV0cyBvdGhlciB0aGFuIEhJRERFTiBhbmQgSU1BR0UuCi0gICAgLy8gRHVt
YiBXZWIgc2l0ZXMgd2lsbCB0cnkgdG8gc2V0IHRoZSB3aWR0aCBhcyBhbiBhdHRyaWJ1dGUgb24g
Zm9ybSBjb250cm9scyB0aGF0IGFyZW4ndAotICAgIC8vIGltYWdlcyBvciBoaWRkZW4uCi0gICAg
aWYgKGhhc01hcHBlZEF0dHJpYnV0ZXMoKSAmJiBtX3R5cGUgIT0gSElEREVOICYmIG1fdHlwZSAh
PSBJTUFHRSAmJiAhZ2V0QXR0cmlidXRlKHdpZHRoQXR0cikuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IGludCBleGNDb2RlOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUod2lkdGhBdHRyLCBleGNDb2Rl
KTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0K
LSAgICBpZiAobV90eXBlID09IElNQUdFKSB7Ci0gICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikK
LSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMpOwot
ICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAgICBpZiAo
cmVuZGVyZXIoKSkgewotICAgICAgICAgICAgUmVuZGVySW1hZ2UqIGltYWdlT2JqID0gc3RhdGlj
X2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJlcigpKTsKLSAgICAgICAgICAgIGltYWdlT2JqLT5z
ZXRJbWFnZShtX2ltYWdlTG9hZGVyLT5pbWFnZSgpKTsgICAgCi0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5nIHBhc3N3b3JkRmllbGRSZW1v
dmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcKLSAgICAvLyB3YXMgc3VjaCB0aGF0
IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAgIGlmIChtX3R5cGUgPT0gUEFTU1dP
UkQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnBhc3N3b3JkRmllbGRBZGRlZCgpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZXRhY2goKQotewotICAgIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFs
c2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWx0VGV4dCgpIGNvbnN0
Ci17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0
L2FwcGVuZGl4L25vdGVzLmh0bWwjYWx0Z2VuCi0gICAgLy8gYWxzbyBoZWF2aWx5IGRpc2N1c3Nl
ZCBieSBIaXhpZSBvbiBidWd6aWxsYQotICAgIC8vIG5vdGUgdGhpcyBpcyBpbnRlbnRpb25hbGx5
IGRpZmZlcmVudCB0byBIVE1MSW1hZ2VFbGVtZW50SW1wbDo6YWx0VGV4dCgpCi0gICAgRE9NU3Ry
aW5nIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLSAgICAvLyBmYWxsIGJhY2sgdG8gdGl0
bGUgYXR0cmlidXRlCi0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0
cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAgICAgICAgYWx0ID0g
Z2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgaWYgKGFsdC5pc0VtcHR5KCkpCi0gICAgICAg
IGFsdCA9IGlucHV0RWxlbWVudEFsdFRleHQoKTsKLQotICAgIHJldHVybiBhbHQ7Ci19Ci0KLWJv
b2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0
Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1lcwot
ICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJvd3Nl
cnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3ZSBi
ZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9ucyB0
aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFdhczogKG1fdHlwZSA9
PSBTVUJNSVQgJiYgIW5hbWUoKS5pc0VtcHR5KCkpCi0gICAgcmV0dXJuICFtX2Rpc2FibGVkICYm
IChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCk7Ci19Ci0KLWJvb2wgSFRNTElu
cHV0RWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjdGl2
YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmbGFnOwotfQot
Ci1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3Qg
JmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKLXsKLSAgICAvLyBpbWFnZSBnZW5lcmF0ZXMgaXRz
IG93biBuYW1lcwotICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpICYmIG1fdHlwZSAhPSBJTUFHRSkg
cmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBISURE
RU46Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNh
c2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAvLyBhbHdheXMg
c3VjY2Vzc2Z1bAotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVl
KCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgY2FzZSBDSEVDS0JPWDoK
LSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGlmIChjaGVja2VkKCkpIHsKLSAgICAg
ICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsK
LQotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAg
IC8vIHRob3NlIGJ1dHRvbnMgYXJlIG5ldmVyIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgaWYgKG1fYWN0aXZl
U3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNF
bXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBjbGlja1goKSk7Ci0gICAgICAgICAgICAg
ICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gInkiIDogKG5hbWUoKSAr
ICIueSIpLCBjbGlja1koKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFuYW1lKCkuaXNFbXB0eSgp
ICYmICF2YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBw
ZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVUJNSVQ6
Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBET01T
dHJpbmcgZW5jX3N0ciA9IHZhbHVlV2l0aERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICBpZiAo
IWVuY19zdHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVu
ZERhdGEobmFtZSgpLCBlbmNfc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBzdWJt
aXQgZmlsZSBvbiBHRVQKLSAgICAgICAgICAgIC8vIGRvbid0IHN1Ym1pdCBpZiBkaXNwbGF5OiBu
b25lIG9yIGRpc3BsYXk6IGhpZGRlbgotICAgICAgICAgICAgaWYoIW11bHRpcGFydCB8fCAhcmVu
ZGVyZXIoKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0ga2h0bWw6OlZJ
U0lCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAvLyBp
ZiBubyBmaWxlbmFtZSBhdCBhbGwgaXMgZW50ZXJlZCwgcmV0dXJuIHN1Y2Nlc3NmdWwsIGhvd2V2
ZXIgZW1wdHkKLSAgICAgICAgICAgIC8vIG51bGwgd291bGQgYmUgbW9yZSBsb2dpY2FsIGJ1dCBu
ZXRzY2FwZSBwb3N0cyBhbiBlbXB0eSBmaWxlLiBhcmdoLgotICAgICAgICAgICAgaWYgKHZhbHVl
KCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1l
KCksIFFTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRmlsZShuYW1lKCksIHZhbHVlKCkp
OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJU0lO
REVYOgotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIGlmIChzdG9yZXNWYWx1
ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKQotICAgICAgICBzZXRWYWx1ZShET01TdHJpbmcoKSk7
Ci0gICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICBtX3VzZURlZmF1bHRDaGVj
a2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0Q2hlY2tlZChi
b29sIF9jaGVja2VkKQotewotICAgIC8vIFdpbklFIGRvZXMgbm90IGFsbG93IHVubmFtZWQgcmFk
aW8gYnV0dG9ucyB0byBldmVuIGJlIGNoZWNrZWQuCi0gICAgaWYgKGNoZWNrZWQoKSA9PSBfY2hl
Y2tlZCB8fCAobV90eXBlID09IFJBRElPICYmIG5hbWUoKS5pc0VtcHR5KCkpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPICYmIF9jaGVja2VkKQotICAgICAgICBn
ZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLQotICAgIG1f
dXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2NoZWNrZWQgPSBfY2hlY2tlZDsKLSAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUo
KS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVy
ZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLSAgICBvbkNoYW5nZSgpOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJvb2wgX2luZGV0ZXJtaW5hdGUpCi17Ci0g
ICAgLy8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0ZXJtaW5hdGUuCi0gICAgaWYgKG1fdHlw
ZSAhPSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkgPT0gX2luZGV0ZXJtaW5hdGUpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1faW5kZXRlcm1pbmF0ZSA9IF9pbmRldGVybWluYXRlOwotCi0g
ICAgc2V0Q2hhbmdlZCgpOwotCi0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5
bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVu
ZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudEltcGwgKnNvdXJjZSkKLXsK
LSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAqc291cmNlRWxlbSA9IHN0YXRpY19jYXN0
PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KHNvdXJjZSk7Ci0KLSAgICBtX3ZhbHVlID0g
c291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQgPSBzb3VyY2VFbGVtLT5tX2NoZWNr
ZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0gc291cmNlRWxlbS0+bV9pbmRldGVybWluYXRlOwot
fQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnZhbHVlKCkgY29uc3QKLXsKLSAg
ICBET01TdHJpbmcgdmFsdWUgPSBtX3ZhbHVlOwotCi0gICAgLy8gSXQncyBpbXBvcnRhbnQgKm5v
dCogdG8gZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIGZpbGUgaW5wdXRzLAot
ICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBhIG1hbGljaW91cyB3ZWIgcGFnZSB0byB1
cGxvYWQgZmlsZXMgYnkgc2V0dGluZyB0aGUKLSAgICAvLyB2YWx1ZSBhdHRyaWJ1dGUgaW4gbWFy
a3VwLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiBtX3R5cGUgIT0gRklMRSkKLSAgICAgICAg
dmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLQotICAgIC8vIElmIG5vIGF0dHJpYnV0
ZSBleGlzdHMsIHRoZW4ganVzdCB1c2UgIm9uIiBvciAiIiBiYXNlZCBvZmYgdGhlIGNoZWNrZWQo
KSBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLSAgICBpZiAodmFsdWUuaXNOdWxsKCkgJiYgKG1fdHlw
ZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pKQotICAgICAgICByZXR1cm4gRE9NU3Ry
aW5nKGNoZWNrZWQoKSA/ICJvbiIgOiAiIik7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLURP
TVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0Ci17
Ci0gICAgRE9NU3RyaW5nIHYgPSB2YWx1ZSgpOwotICAgIGlmICh2LmlzRW1wdHkoKSkgewotICAg
ICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAg
ICAgICAgICB2ID0gcmVzZXRCdXR0b25EZWZhdWx0TGFiZWwoKTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgdiA9IHN1
Ym1pdEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAg
ICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAg
ICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIGNh
c2UgSU1BR0U6Ci0gICAgICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGNhc2UgUkFOR0U6
Ci0gICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdjsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBpZiAobV90eXBlID09IEZJTEUpIHJldHVybjsKLQotICAgIG1fdmFsdWVNYXRj
aGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRy
aWJ1dGUoKSkgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGlmIChtX3JlbmRl
cikKLSAgICAgICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAgICBz
ZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0
ciwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFs
dWVGcm9tUmVuZGVyZXIoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBtX3ZhbHVlID0g
dmFsdWU7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7Ci0gICAgCi0gICAgLy8g
RmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoaW5wdXRF
dmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzdG9y
ZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX3R5
cGUpIHsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAg
ICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgSU1BR0U6
Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2Ug
UkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNh
c2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkKiBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgLy8gcHJl
dmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJlIHVzZWQgdG8gcmV2ZXJzZSB0aGUgYXV0
b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJlLgotICAgIC8vIFRoaXMgcmVzdWx0
IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhlICJ1bmRvIiBpbiBwb3N0RGlzcGF0
Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCi0gICAgdm9pZCogcmVzdWx0ID0gMDsgCi0g
ICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSAmJiBldnQtPmlz
TW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0
YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAg
ICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAgICAvLyBBcyBhIHdheSB0byBz
dG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdlIHdlcmUgdW5jaGVja2VkLCAxIGlmIHdl
IHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCi0gICAgICAgICAgICAvLyBpbmRldGVybWluYXRlLgot
ICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkgewotICAgICAgICAgICAgICAgIHJlc3Vs
dCA9ICh2b2lkKikweDI7Ci0gICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZShmYWxzZSk7
Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKCkpCi0g
ICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDE7Ci0gICAgICAgICAgICAgICAg
c2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBzdG9yZSB0aGUgY3VycmVudCBzZWxl
Y3RlZCByYWRpbyBvYmplY3QuCi0gICAgICAgICAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSB8fCBj
aGVja2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIFVubmFtZWQgcmFkaW8gYnV0
dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1dHRvbnMganVzdCBzdGF5IGNoZWNrZWQu
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBOZWVkIHRvIGxlYXJuIHRvIHdv
cmsgd2l0aG91dCBhIGZvcm0uCi0KLSAgICAgICAgICAgIC8vIFdlIHJlYWxseSB3YW50IHJhZGlv
IGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGkuZS4sIHRvIGhhdmUgc29tZXRoaW5n
IGNoZWNrZWQuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgbm90aGluZyBpcyBjdXJyZW50
bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMgYWN0aW9uIHRvIGJlICJ1bmRvbmUiLCBz
aW5jZQotICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21lIG9iamVjdCBpbiB0aGUgcmFkaW8gZ3Jv
dXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVu
dEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdy
b3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICBpZiAoY3VyclJhZGlvKSB7
Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlvIGJ1dHRvbiBzZWxlY3RlZCB0aGF0
IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1bHQgZmllbGQgYW5kIHJlZiBpdCBzbwot
ICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUgZGVzdHJveWVkLgotICAgICAgICAg
ICAgICAgIGN1cnJSYWRpby0+cmVmKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VyclJh
ZGlvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQqIGRh
dGEpCi17Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSAm
JiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgCi0g
ICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkg
ewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAgICAvLyBSZXZl
cnNlIHRoZSBjaGVja2luZyB3ZSBkaWQgaW4gcHJlRGlzcGF0Y2guCi0gICAgICAgICAgICBpZiAo
ZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZhdWx0SGFuZGxlZCgpKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKGRhdGEgPT0gKHZvaWQqKTB4MikKLSAgICAgICAgICAgICAgICAgICAg
c2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIHNldENoZWNrZWQoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZSBpZiAoZGF0YSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0ID0g
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihkYXRhKTsKLSAgICAgICAgICAgIGlm
IChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRlZmF1bHRIYW5kbGVkKCkpIHsKLSAg
ICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzZWxlY3RlZCByYWRpbyBidXR0
b24gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGlzIHN0aWxs
IGEgcmFkaW8gYnV0dG9uIGFuZCBvbmx5IGRvIHRoZSByZXN0b3JhdGlvbiBpZiBpdCBzdGlsbAot
ICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gb3VyIGdyb3VwLgotICAgICAgICAgICAgICAg
IGlmIChpbnB1dC0+Zm9ybSgpID09IGZvcm0oKSAmJiBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gUkFE
SU8gJiYgaW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
T2ssIHRoZSBvbGQgcmFkaW8gYnV0dG9uIGlzIHN0aWxsIGluIG91ciBmb3JtIGFuZCBpbiBvdXIg
Z3JvdXAgYW5kIGlzIHN0aWxsIGEgCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhZGlvIGJ1dHRv
biwgc28gaXQncyBzYWZlIHRvIHJlc3RvcmUgc2VsZWN0aW9uIHRvIGl0LgotICAgICAgICAgICAg
ICAgICAgICBpbnB1dC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC0+ZGVyZWYoKTsKLSAgICAgICAgfQotICAgIH0K
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVu
dEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlID09IElNQUdFICYmIGV2dC0+aXNNb3VzZUV2
ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiBtX3JlbmRlcikgewotICAgICAg
ICAvLyByZWNvcmQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB3aGVuIHdlIGdldCB0aGUgRE9NQWN0
aXZhdGUgZXZlbnQKLSAgICAgICAgTW91c2VFdmVudEltcGwgKm1lID0gc3RhdGljX2Nhc3Q8TW91
c2VFdmVudEltcGwqPihldnQpOwotICAgICAgICBpbnQgb2Zmc2V0WCwgb2Zmc2V0WTsKLSAgICAg
ICAgbV9yZW5kZXItPmFic29sdXRlUG9zaXRpb24ob2Zmc2V0WCxvZmZzZXRZKTsKLSAgICAgICAg
eFBvcyA9IG1lLT5jbGllbnRYKCktb2Zmc2V0WDsKLSAgICAgICAgeVBvcyA9IG1lLT5jbGllbnRZ
KCktb2Zmc2V0WTsKLQotCW1lLT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0KLQotICAgIC8v
IERPTUFjdGl2YXRlIGV2ZW50cyBjYXVzZSB0aGUgaW5wdXQgdG8gYmUgImFjdGl2YXRlZCIgLSBp
biB0aGUgY2FzZSBvZiBpbWFnZSBhbmQgc3VibWl0IGlucHV0cywgdGhpcyBtZWFucwotICAgIC8v
IGFjdHVhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm0uIEZvciByZXNldCBpbnB1dHMsIHRoZSBmb3Jt
IGlzIHJlc2V0LiBUaGVzZSBldmVudHMgYXJlIHNlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MKLSAg
ICAvLyBvbiB0aGUgZWxlbWVudCwgb3IgcHJlc3NlcyBlbnRlciB3aGlsZSBpdCBpcyB0aGUgYWN0
aXZlIGVsZW1lbnQuIEphdmFjc3JpcHQgY29kZSB3aXNoaW5nIHRvIGFjdGl2YXRlIHRoZSBlbGVt
ZW50Ci0gICAgLy8gbXVzdCBkaXNwYXRjaCBhIERPTUFjdGl2YXRlIGV2ZW50IC0gYSBjbGljayBl
dmVudCB3aWxsIG5vdCBkbyB0aGUgam9iLgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBET01BY3Rp
dmF0ZUV2ZW50KSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNV
Qk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQpIHsKLSAgICAgICAgICAgIGlmICghbV9mb3JtKQotICAg
ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkVTRVQpCi0g
ICAgICAgICAgICAgICAgbV9mb3JtLT5yZXNldCgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICgh
bV9mb3JtLT5wcmVwYXJlU3VibWl0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgeFBvcyA9IDA7
Ci0gICAgICAgICAgICAgICAgICAgIHlQb3MgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IAotICAgIH0KLQotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5k
aW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhl
IHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlw
ZSgpID09IGtleXByZXNzRXZlbnQgJiYgZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkgewotICAgICAg
ICBib29sIGNsaWNrRWxlbWVudCA9IGZhbHNlOwotICAgICAgICBib29sIGNsaWNrRGVmYXVsdEZv
cm1CdXR0b24gPSBmYWxzZTsKLQotICAgICAgICBET01TdHJpbmcga2V5ID0gc3RhdGljX2Nhc3Q8
S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRpZmllcigpOwotCi0gICAgICAgIGlm
IChrZXkgPT0gIlUrMDAwMDIwIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAg
ICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNLQk9Y
OgotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgICAgICBjYXNlIElNQUdF
OgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVUJN
SVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIGZvciBzcGFj
ZWJhciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgIC8v
IFRoZSBBcHBLaXQgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHNvbWUsIGJ1dCBub3QgYWxsLCBvZiB0
aGVtLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAg
ICAgICAgICAgICAvLyBJZiBhbiB1bnNlbGVjdGVkIHJhZGlvIGlzIHRhYmJlZCBpbnRvIChiZWNh
dXNlIHRoZSBlbnRpcmUgZ3JvdXAgaGFzIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8g
Y2hlY2tlZCwgb3IgYmVjYXVzZSBvZiBzb21lIGV4cGxpY2l0IC5mb2N1cygpIGNhbGwpLCB0aGVu
IGFsbG93IHNwYWNlIHRvIGNoZWNrIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNr
ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrRWxlbWVudCA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAg
ICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JE
OgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUFS
Q0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChrZXkgPT0gIkVudGVy
IikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNl
IEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgICAg
IGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAg
ICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBvbiB0aGUgZGVmYXVsdCBmb3Jt
IGJ1dHRvbiBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAgICAgICAg
ICAgICAgICAgICBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgICAg
IGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAg
ICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbW91c2UgY2xp
Y2sgZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAg
ICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8v
IERvbid0IGRvIGFueXRoaW5nIGZvciBlbnRlciBvbiBhIHJhZGlvIGJ1dHRvbi4KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgKGtleSA9
PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09ICJMZWZ0IiB8fCBrZXkgPT0gIlJpZ2h0
IikpIHsKLSAgICAgICAgICAgIC8vIExlZnQgYW5kIHVwIG1lYW4gInByZXZpb3VzIHJhZGlvIGJ1
dHRvbiIuCi0gICAgICAgICAgICAvLyBSaWdodCBhbmQgZG93biBtZWFuICJuZXh0IHJhZGlvIGJ1
dHRvbiIuCi0gICAgICAgICAgICAvLyBUZXN0ZWQgaW4gV2luSUUsIGFuZCBldmVuIGZvciBSVEws
IGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0dG9uIChhbmQgc28gbW92ZXMKLSAg
ICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVtcyBzdHJhbmdlLCBidXQgd2UnbGwgbWF0
Y2ggaXQuCi0gICAgICAgICAgICBib29sIGZvcndhcmQgPSAoa2V5ID09ICJEb3duIiB8fCBrZXkg
PT0gIlJpZ2h0Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IHN0
YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhlIGZvcm0gaGFzbid0IGJlZW4gZGVt
b3RlZCB0byBhIGxlYWYgYmVjYXVzZQotICAgICAgICAgICAgLy8gb2YgbWFsZm9ybWVkIEhUTUwu
Ci0gICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7Ci0gICAgICAgICAgICB3aGlsZSAoKG4g
PSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6IG4tPnRyYXZlcnNlUHJldmlvdXNO
b2RlKCkpKSkgewotICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UgZW5jb3VudGVyIGEgZm9ybSBl
bGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhh
c1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBtb3JlIHJhZGlvIGJ1dHRv
bnMuCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBlbHQgPSBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWx0LT5m
b3JtKCkgIT0gbV9mb3JtKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0RWx0ID0gc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChp
bnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXRFbHQtPm5hbWUoKSA9PSBuYW1l
KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+aXNGb2N1c2FibGUo
KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5zZXRDaGVja2VkKHRy
dWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNldEZvY3Vz
Tm9kZShpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQtPmNs
aWNrKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5zZXRE
ZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsaWNrRWxl
bWVudCkgewotICAgICAgICAgICAgY2xpY2soZmFsc2UpOwotICAgICAgICAgICAgZXZ0LT5zZXRE
ZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNsaWNrRGVmYXVsdEZvcm1CdXR0
b24gJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnN1Ym1pdENsaWNrKCk7Ci0gICAg
ICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwot
fQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0VkaXRhYmxlKCkKLXsKLSAgICByZXR1
cm4gKChtX3R5cGUgPT0gVEVYVCkgfHwgKG1fdHlwZSA9PSBQQVNTV09SRCkgfHwKLSAgICAgICAg
ICAgIChtX3R5cGUgPT0gU0VBUkNIKSB8fCAobV90eXBlID09IElTSU5ERVgpIHx8IChtX3R5cGUg
PT0gRklMRSkpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc1VSTEF0dHJpYnV0
ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAgIHJldHVybiAoYXR0ci0+bmFtZSgp
ID09IHNyY0F0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1
bHRWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9N
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19
Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRDaGVja2VkKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShjaGVja2VkQXR0cikuaXNOdWxsKCk7Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRDaGVja2VkKGJvb2wgZGVmYXVsdENo
ZWNrZWQpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoZWNrZWRBdHRyLCBkZWZhdWx0Q2hlY2tlZCA/
ICIiIDogMCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXB0KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2VwdEF0dHIpOwotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcg
SFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0
dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBbGlnbihjb25zdCBET01T
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0K
LQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHQoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OnNldEFsdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShh
bHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldE1heExl
bmd0aChpbnQgX21heExlbmd0aCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobWF4bGVuZ3RoQXR0ciwg
UVN0cmluZzo6bnVtYmVyKF9tYXhMZW5ndGgpKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2l6ZUF0
dHIsIFFTdHJpbmc6Om51bWJlcihfc2l6ZSkpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxl
bWVudEltcGw6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmNvbXBs
ZXRlVVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShzcmNBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
dXNlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHVzZW1hcEF0dHIpOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRVc2VNYXAoY29uc3QgRE9NU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodXNlbWFwQXR0ciwgdmFsdWUpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMYWJlbEVsZW1lbnRJbXBsOjpIVE1MTGFiZWxFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50SW1wbChsYWJlbFRh
ZywgZG9jKQotewotfQotCi1IVE1MTGFiZWxFbGVtZW50SW1wbDo6fkhUTUxMYWJlbEVsZW1lbnRJ
bXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBj
b25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAg
ICBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVu
dExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRWxlbWVudEltcGwgKkhUTUxMYWJlbEVsZW1lbnRJbXBs
Ojpmb3JtRWxlbWVudCgpCi17Ci0gICAgRE9NU3RyaW5nIGZvcm1FbGVtZW50SWQgPSBnZXRBdHRy
aWJ1dGUoZm9yQXR0cik7Ci0gICAgaWYgKGZvcm1FbGVtZW50SWQuaXNOdWxsKCkpIHsKLSAgICAg
ICAgLy8gU2VhcmNoIGNoaWxkcmVuIG9mIHRoZSBsYWJlbCBlbGVtZW50IGZvciBhIGZvcm0gZWxl
bWVudC4KLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSB0aGlzOwotICAgICAgICB3aGlsZSAoKG5v
ZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSkgewotICAgICAgICAgICAgaWYgKG5v
ZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAq
ZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAg
ICAgICAgICBpZiAoZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3JtRWxlbWVudElkLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmdldEVsZW1lbnRCeUlk
KGZvcm1FbGVtZW50SWQpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb2N1cygp
Ci17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAg
ICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6YWNj
ZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBFbGVtZW50SW1wbCAq
ZWxlbWVudCA9IGZvcm1FbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQpCi0gICAgICAgIGVsZW1l
bnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotSFRNTEZvcm1FbGVt
ZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm0oKQotewotICAgIGZvciAoTm9kZUlt
cGwgKnAgPSBwYXJlbnROb2RlKCk7IHAgIT0gMDsgcCA9IHAtPnBhcmVudE5vZGUoKSkgewotICAg
ICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZv
aWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURP
TVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aHRtbEZvcigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1w
bDo6c2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShmb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExlZ2Vu
ZEVsZW1lbnRJbXBsOjpIVE1MTGVnZW5kRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmYpCi06IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGxlZ2Vu
ZFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MTGVnZW5kRWxlbWVudEltcGw6On5IVE1MTGVnZW5k
RWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6aXNGb2N1
c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmVuZGVyT2JqZWN0KiBI
VE1MTGVnZW5kRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVuYSwg
UmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMZWdl
bmQodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnR5cGUoKSBj
b25zdAotewotICAgIHJldHVybiAibGVnZW5kIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0QWNj
ZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6
YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0K
LQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1FbGVt
ZW50SW1wbCAqSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgLy8g
Q2hlY2sgaWYgdGhlcmUncyBhIGZpZWxkc2V0IGJlbG9uZ2luZyB0byB0aGlzIGxlZ2VuZC4KLSAg
ICBOb2RlSW1wbCAqZmllbGRzZXQgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKGZpZWxkc2V0
ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNldFRhZykpCi0gICAgICAgIGZpZWxkc2V0
ID0gZmllbGRzZXQtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoIWZpZWxkc2V0KQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgZmlyc3QgZm9ybSBlbGVtZW50IGluc2lkZSB0aGUgZmll
bGRzZXQuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBjYXJlIGFib3V0IHRhYmluZGV4PwotICAg
IE5vZGVJbXBsICpub2RlID0gZmllbGRzZXQ7Ci0gICAgd2hpbGUgKChub2RlID0gbm9kZS0+dHJh
dmVyc2VOZXh0Tm9kZShmaWVsZHNldCkpKSB7Ci0gICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVt
ZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19j
YXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgICAgIGlmICghZWxlbWVudC0+
aGFzTG9jYWxOYW1lKGxlZ2VuZFRhZykgJiYgZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1lbnQo
KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Zm9jdXMoKQot
ewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAg
IGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nl
c3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGlmIChFbGVtZW50SW1w
bCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFj
dGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1M
U2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKHNlbGVjdFRhZywgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgpOwotfQot
Ci1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1wbChjb25zdCBRdWFs
aWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1w
bCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywgZiks
IG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmluaXQoKQotewotICAgIG1fb3B0aW9ucyA9IDA7Ci0gICAgbV9tdWx0aXBsZSA9IGZh
bHNlOwotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci0gICAgLy8gMCBtZWFucyBpbnZh
bGlkIChpLmUuIG5vdCBzZXQpCi0gICAgbV9zaXplID0gMDsKLSAgICBtX21pbndpZHRoID0gMDsK
LX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp+SFRNTFNlbGVjdEVsZW1lbnRJbXBsKCkKLXsK
LSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWlu
c1N0YXRlKHRoaXMpOwotICAgIGlmIChtX29wdGlvbnMpIHsKLSAgICAgICAgbV9vcHRpb25zLT5k
ZXRhY2goKTsKLSAgICAgICAgbV9vcHRpb25zLT5kZXJlZigpOwotICAgIH0KLX0KLQotYm9vbCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkK
LXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFn
TmFtZShvcHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSB8fCBu
ZXdDaGlsZC0+aGFzVGFnTmFtZShoclRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1Rh
Z05hbWUoc2NyaXB0VGFnKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlY2Fs
Y1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGhhc0NoYW5nZWRDaGlsZCgpICYm
IG1fcmVuZGVyKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PGtodG1sOjpSZW5kZXJTZWxlY3QqPiht
X3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgIH0KLQotICAgIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLX0KLQotCi1ET01TdHJpbmcg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG1fbXVs
dGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qtb25lIik7Ci19Ci0KLWludCBIVE1M
U2VsZWN0RWxlbWVudEltcGw6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAotewotICAgIC8vIHJldHVy
biB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0ZWQKLSAgICB1aW50IG8gPSAw
OwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwot
ICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAg
ICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAg
ICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2Vs
ZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgIG8rKzsKLSAg
ICAgICAgfQotICAgIH0KLSAgICBRX0FTU0VSVChtX211bHRpcGxlKTsKLSAgICByZXR1cm4gLTE7
Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRTZWxlY3RlZEluZGV4KCBpbnQg
IGluZGV4ICkKLXsKLSAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucyBhbmQgc2VsZWN0
IG9ubHkgdGhlIG5ldyBvbmUKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMg
PSBsaXN0SXRlbXMoKTsKLSAgICBpbnQgbGlzdEluZGV4OwotICAgIGZvciAobGlzdEluZGV4ID0g
MDsgbGlzdEluZGV4IDwgaW50KGl0ZW1zLnNpemUoKSk7IGxpc3RJbmRleCsrKSB7Ci0gICAgICAg
IGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJbmRleF0p
LT5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgfQotICAgIGxpc3RJbmRleCA9IG9wdGlvblRvTGlz
dEluZGV4KGluZGV4KTsKLSAgICBpZiAobGlzdEluZGV4ID49IDApCi0gICAgICAgIHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3Rl
ZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgdWludCBp
OwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwot
ICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRl
bXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgbGVuKys7Ci0gICAg
fQotICAgIHJldHVybiBsZW47Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphZGQo
IEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJbXBsICpiZWZvcmUsIGludCAm
ZXhjZXB0aW9uY29kZSApCi17Ci0gICAgUmVmUHRyPEhUTUxFbGVtZW50SW1wbD4gcHJvdGVjdE5l
d0NoaWxkKGVsZW1lbnQpOyAvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgcmVmJ2QgYW5kIGRl
cmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYgKCFlbGVtZW50IHx8ICEoZWxlbWVu
dC0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzTG9jYWxOYW1lKGhyVGFn
KSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGluc2VydEJlZm9yZShlbGVtZW50LCBiZWZvcmUs
IGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAgc2V0UmVj
YWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmUo
IGludCBpbmRleCApCi17Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIGludCBsaXN0
SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVs
ZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZihsaXN0SW5kZXggPCAwIHx8
IGluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAgICAgICByZXR1cm47IC8vICMjIyB3aGF0
IHNob3VsZCB3ZSBkbyA/IHJlbW92ZSB0aGUgbGFzdCBpdGVtPwotCi0gICAgTm9kZUltcGwgKml0
ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgIGl0ZW0tPnJlZigpOwotICAgIHJlbW92ZUNoaWxk
KGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOwotICAgIGl0ZW0tPmRlcmVmKCk7Ci0gICAgaWYoICFleGNl
cHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1aW50IGk7Ci0gICAgUU1l
bUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChp
ID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBs
Kj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+dmFsdWUoKTsKLSAgICB9Ci0gICAg
cmV0dXJuIERPTVN0cmluZygiIik7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpz
ZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIGlmICh2YWx1ZS5pc051bGwo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIGZpbmQgdGhlIG9wdGlvbiB3aXRoIHZhbHVlKCkg
bWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcgotICAgIC8vIGFuZCBtYWtlIGl0IHRoZSBjdXJy
ZW50IHNlbGVjdGlvbi4KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBs
aXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBp
KyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3Rh
dGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT52YWx1ZSgpID09IHZh
bHVlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihp
dGVtc1tpXSktPnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICB9Ci19Ci0KLVFTdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzdGF0ZSgpCi17Ci0gICAg
UU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBp
bnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0KLSAgICBRQ2hhciBzdGF0ZUNoYXJzW2xdOwotICAgIAot
ICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspCi0gICAgICAgIGlmKGl0ZW1zW2ldLT5oYXNM
b2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICBzdGF0ZUNoYXJzW2ldID0gJ1gn
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZUNoYXJzW2ldID0gJy4nOwotICAgIFFT
dHJpbmcgc3RhdGUoc3RhdGVDaGFycywgbCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnN0YXRlKCkgKyBzdGF0ZTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmX3N0YXRlcykKLXsKLSAgICBRU3RyaW5n
IF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShf
c3RhdGVzKTsKLSAgICBpZiAoX3N0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICByZWNhbGNM
aXN0SXRlbXMoKTsKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBfc3RhdGU7Ci0gICAgaWYoIXN0YXRl
LmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gnKSAmJiAhbV9tdWx0aXBsZSkgewotICAg
ICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4gaW4gcmVzdG9yZVN0YXRlISIpOwotICAg
ICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLiBTaG91bGQg
bmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgotICAgICAgICAvL3N0YXRlWzBdID0gJ1gnOwotICAgIH0K
LQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwot
Ci0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBp
KyspIHsKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0g
ICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG9lID0gc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgb2UtPnNldFNlbGVjdGVk
KHN0YXRlW2ldID09ICdYJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0Q2hhbmdlZCh0cnVl
KTsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICgg
Tm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUgKTsKLSAgICBp
ZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlcGxh
Y2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENoaWxkLCBleGNlcHRpb25jb2Rl
KTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMo
KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlv
bmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZCAoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAq
cmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFwcGVuZENoaWxkKG5ld0NoaWxk
LCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRS
ZWNhbGNMaXN0SXRlbXMoKTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJ
bXBsKiBuZXdDaGlsZCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4g
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewot
ICAgICAgICBtX3NpemUgPSBrTWF4KGF0dHItPnZhbHVlKCkudG9JbnQoKSwgMSk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIG1fbWlud2lkdGgg
PSBrTWF4KCBhdHRyLT52YWx1ZSgpLnRvSW50KCksIDAgKTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpIHsKLSAgICAgICAgbV9tdWx0aXBsZSA9ICghYXR0ci0+
aXNOdWxsKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIp
IHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBh
dHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAg
ICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpjcmVh
dGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAg
ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2VsZWN0KHRoaXMpOwotfQotCi1ib29sIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGVkX3Zh
bHVlcywgYm9vbCkKLXsKLSAgICBib29sIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICBRTWVtQXJy
YXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIHVpbnQgaTsK
LSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0
ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgSFRNTE9wdGlv
bkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3RlZCgpKSB7Ci0gICAg
ICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dmFs
dWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAjIyMgdGhpcyBjYXNlIHNob3VsZCBub3QgaGFw
cGVuLiBtYWtlIHN1cmUgdGhhdCB3ZSBzZWxlY3QgdGhlIGZpcnN0IG9wdGlvbgotICAgIC8vIGlu
IGFueSBjYXNlLiBvdGhlcndpc2Ugd2UgaGF2ZSBubyBjb25zaXN0ZW5jeSB3aXRoIHRoZSBET00g
aW50ZXJmYWNlLiBGSVhNRSEKLSAgICAvLyB3ZSByZXR1cm4gdGhlIGZpcnN0IG9uZSBpZiBpdCB3
YXMgYSBjb21ib2JveCBzZWxlY3QKLSAgICBpZiAoIXN1Y2Nlc3NmdWwgJiYgIW1fbXVsdGlwbGUg
JiYgbV9zaXplIDw9IDEgJiYgaXRlbXMuc2l6ZSgpICYmCi0gICAgICAgIChpdGVtc1swXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykpKSB7Ci0gICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCAq
b3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbMF0pOwot
ICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVsbCgpKQotICAgICAgICAgICAgZW5jb2Rl
ZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dGV4dCgpLnFzdHJpbmcoKS5zdHJp
cFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVuY29kZWRfdmFsdWVz
LmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwotICAgICAgICBzdWNjZXNzZnVs
ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKLX0KLQotaW50IEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5kZXgoaW50IG9wdGlvbkluZGV4KSBjb25z
dAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5kZXggPj0gaW50KGl0ZW1zLnNp
emUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGludCBsaXN0SW5kZXggPSAwOwotICAg
IGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAoOwotICAgICAgICAgb3B0aW9uSW5kZXgy
IDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5kZXgyIDw9IG9wdGlvbkluZGV4OwotICAg
ICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlwbyEKLSAgICAgICAgaWYgKGl0ZW1zW2xp
c3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgb3B0aW9uSW5k
ZXgyKys7Ci0gICAgfQotICAgIGxpc3RJbmRleC0tOwotICAgIHJldHVybiBsaXN0SW5kZXg7Ci19
Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxpc3RUb09wdGlvbkluZGV4KGludCBsaXN0
SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0g
bGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAgfHwgbGlzdEluZGV4ID49IGludChp
dGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IG9wdGlvbkluZGV4ID0g
MDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291bnRpbmcgT1BUR1JPVVAgZW50cmll
cyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxp
c3RJbmRleDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25U
YWcpKQotICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICByZXR1cm4gb3B0aW9uSW5kZXg7
Ci19Ci0KLS8vIEZJWE1FIDQxOTc5OTc6IHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHB1Ymxp
YyBBUEkgLVtET01IVE1MU2VsZWN0RWxlbWVudCBvcHRpb25zXSwgYnV0IGFsd2F5cyByZXR1cm5z
Ci0vLyBhbiBlbXB0eSBsaXN0LgotSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpvcHRpb25zKCkKLXsKLSAgICBpZiAoIW1fb3B0aW9ucykgewotICAgICAg
ICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCh0aGlzKTsKLSAgICAg
ICAgbV9vcHRpb25zLT5yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fb3B0aW9uczsKLX0KLQot
Ly8gRklYTUU6IERlbGV0ZSBvbmNlIHRoZSBhYm92ZSBmdW5jdGlvbiBpcyB3b3JraW5nIHdlbGwg
ZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uc0hUTUxDb2xsZWN0aW9uKCkKLXsKLSAgICByZXR1cm4g
UmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9uSW1wbCh0aGlzLCBI
VE1MQ29sbGVjdGlvbkltcGw6OlNFTEVDVF9PUFRJT05TKSk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpyZWNhbGNMaXN0SXRlbXMoKQotewotICAgIE5vZGVJbXBsKiBjdXJyZW50
ID0gZmlyc3RDaGlsZCgpOwotICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZSgwKTsKLSAgICBIVE1MT3B0
aW9uRWxlbWVudEltcGwqIGZvdW5kU2VsZWN0ZWQgPSAwOwotICAgIHdoaWxlKGN1cnJlbnQpIHsK
LSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpICYmIGN1cnJlbnQt
PmZpcnN0Q2hpbGQoKSkgewotICAgICAgICAgICAgLy8gIyMjIHdoYXQgaWYgb3B0Z3JvdXAgY29u
dGFpbnMganVzdCBjb21tZW50cz8gZG9uJ3Qgd2FudCBvbmUgb2Ygbm8gb3B0aW9ucyBpbiBpdC4u
LgotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsK
LSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19j
YXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgY3VycmVudCA9IGN1
cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudC0+aGFz
VGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtcy5yZXNpemUobV9s
aXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9saXN0SXRlbXMu
c2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAg
ICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUgJiYgbV9zaXplIDw9IDEp
IHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlv
bkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+
bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChm
b3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVt
ZW50SW1wbCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRT
ZWxlY3RlZC0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0
ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShoclRh
ZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkr
MSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0
aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgfQotICAgICAgICBO
b2RlSW1wbCAqcGFyZW50ID0gY3VycmVudC0+cGFyZW50Tm9kZSgpOwotICAgICAgICBjdXJyZW50
ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgaWYgKCFjdXJyZW50KSB7Ci0gICAg
ICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMpCi0gICAgICAgICAgICAgICAgY3VycmVudCA9IHBh
cmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3JlY2FsY0xpc3RJ
dGVtcyA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hpbGRyZW5D
aGFuZ2VkKCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLQotICAgIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygpCi17Ci0gICAgbV9yZWNhbGNMaXN0SXRl
bXMgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8a2h0bWw6
OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7Ci0gICAg
c2V0Q2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVzZXQoKQot
ewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwot
ICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAg
ICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAg
ICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBib29sIHNlbGVjdGVkID0gKCFv
cHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVsbCgpKTsKLSAgICAgICAgICAg
IG9wdGlvbi0+c2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlm
ICggbV9yZW5kZXIgKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRl
ciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0gICAgc2V0Q2hhbmdlZCggdHJ1ZSApOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bm90aWZ5T3B0aW9uU2VsZWN0ZWQoSFRN
TE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCkKLXsKLSAg
ICBpZiAoc2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUpIHsKLSAgICAgICAgLy8gZGVzZWxlY3QgYWxs
IG90aGVyIG9wdGlvbnMKLSAgICAgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1z
ID0gbGlzdEl0ZW1zKCk7Ci0gICAgICAgIHVpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8
IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9IChpdGVtc1tpXSA9PSBzZWxlY3Rl
ZE9wdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBz
dGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkNoYW5nZWQo
dHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICAvLyBV
c2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGluZyBzaW11bGF0ZWQgbW91c2UgZXZl
bnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBwcm9wZXIgc2VuZGluZyBvZiB0aGUg
a2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBrZXlwcmVzc0V2ZW50KSB7
Ci0gICAgCi0gICAgICAgIGlmICghbV9mb3JtIHx8ICFtX3JlbmRlciB8fCAhZXZ0LT5pc0tleWJv
YXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIERPTVN0
cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpLT5rZXlJZGVu
dGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoa2V5ID09ICJFbnRlciIpIHsKLSAgICAg
ICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVs
dEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBm
b2N1cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0TXVsdGlwbGUoYm9v
bCBtdWx0aXBsZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobXVsdGlwbGVBdHRyLCBtdWx0aXBsZSA/
ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRTaXplKGludCBz
aXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKHNpemUp
KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MS2V5Z2VuRWxlbWVudEltcGw6OkhU
TUxLZXlnZW5FbGVtZW50SW1wbChEb2N1bWVudEltcGwqIGRvYywgSFRNTEZvcm1FbGVtZW50SW1w
bCogZikKLSAgICA6IEhUTUxTZWxlY3RFbGVtZW50SW1wbChrZXlnZW5UYWcsIGRvYywgZikKLXsK
LSAgICBRU3RyaW5nTGlzdCBrZXlzID0gS1NTTEtleUdlbjo6c3VwcG9ydGVkS2V5U2l6ZXMoKTsK
LSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpID0ga2V5cy5iZWdpbigpOyBpICE9IGtl
eXMuZW5kKCk7ICsraSkgewotICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG8gPSBuZXcg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsKGRvYywgZm9ybSgpKTsKLSAgICAgICAgYWRkQ2hpbGQobyk7
Ci0gICAgICAgIG8tPmFkZENoaWxkKG5ldyBUZXh0SW1wbChkb2MsIERPTVN0cmluZygqaSkpKTsK
LSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OnR5cGUoKSBjb25z
dAotewotICAgIHJldHVybiAia2V5Z2VuIjsKLX0KLQotdm9pZCBIVE1MS2V5Z2VuRWxlbWVudElt
cGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17Ci0g
ICAgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGFsbGVuZ2VBdHRyKQotICAgICAgICBtX2NoYWxsZW5n
ZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGtleXR5cGVB
dHRyKQotICAgICAgICBtX2tleVR5cGUgPSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UKLSAgICAg
ICAgLy8gc2tpcCBIVE1MU2VsZWN0RWxlbWVudEltcGwgcGFyc2luZyEKLSAgICAgICAgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1i
b29sIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBl
bmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICAvLyBPbmx5IFJTQSBpcyBzdXBwb3J0ZWQgYXQg
dGhpcyB0aW1lLgotICAgIGlmICghbV9rZXlUeXBlLmlzTnVsbCgpICYmICFlcXVhbElnbm9yaW5n
Q2FzZShtX2tleVR5cGUsICJyc2EiKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFFTdHJp
bmcgdmFsdWUgPSBLU1NMS2V5R2VuOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVuZ2VTdHJpbmco
c2VsZWN0ZWRJbmRleCgpLCBtX2NoYWxsZW5nZS5xc3RyaW5nKCksIGdldERvY3VtZW50KCktPmZy
YW1lKCktPmJhc2VVUkwoKSk7Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlLnV0
ZjgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRN
TE9wdEdyb3VwRWxlbWVudEltcGw6OkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwob3B0Z3JvdXBUYWcsIGRvYywgZikKLXsKLX0KLQotSFRNTE9wdEdyb3VwRWxlbWVu
dEltcGw6On5IVE1MT3B0R3JvdXBFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTE9wdEdy
b3VwRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuICJvcHRncm91cCI7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVm
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQs
IGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICByZWNh
bGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhU
TUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQs
IE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1w
bCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZChuZXdD
aGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoIWV4Y2VwdGlvbmNvZGUpCi0g
ICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1O
b2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwg
Km9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQg
PSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2Vw
dGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVj
dE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdy
b3VwRWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlm
KCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICBy
ZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCogSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFk
ZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7
Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5ld0No
aWxkKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci0gICAgcmVjYWxjU2VsZWN0
T3B0aW9ucygpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZWNhbGNTZWxl
Y3RPcHRpb25zKCkKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0ID0gcGFyZW50Tm9kZSgpOwotICAg
IHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFtZShzZWxlY3RUYWcpKQotICAgICAg
ICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3QpLT5zZXRSZWNhbGNM
aXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpsYWJl
bCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwotfQotCi12
b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsYWJlbEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0aW9uRWxlbWVudEltcGw6OkhUTUxPcHRpb25FbGVtZW50
SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGlvblRhZywgZG9jLCBmKQotewotICAgIG1fc2Vs
ZWN0ZWQgPSBmYWxzZTsKLX0KLQotYm9vbCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmlzRm9jdXNh
YmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAib3B0aW9uIjsKLX0K
LQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dGV4dCgpIGNvbnN0Ci17Ci0gICAg
RE9NU3RyaW5nIHRleHQ7Ci0KLSAgICAvLyBXaW5JRSBkb2VzIG5vdCB1c2UgdGhlIGxhYmVsIGF0
dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdub3JlIGl0LgotICAgIGlmIChnZXREb2N1bWVu
dCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSkgewotICAgICAgICBET01TdHJp
bmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwotICAgICAgICBpZiAoIXRleHQuaXNF
bXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgY29uc3QgTm9k
ZUltcGwgKm4gPSB0aGlzLT5maXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4pIHsKLSAgICAgICAg
aWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RFIHx8IG4tPm5vZGVUeXBlKCkgPT0g
Tm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFKQotICAgICAgICAgICAgdGV4dCArPSBuLT5ub2RlVmFs
dWUoKTsKLSAgICAgICAgLy8gc2tpcCBzY3JpcHQgY29udGVudAotICAgICAgICBpZiAobi0+aXNF
bGVtZW50Tm9kZSgpICYmIG4tPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3JpcHRUYWcpKQotICAg
ICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dFNpYmxpbmcodGhpcyk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpOwotICAgIH0KLQotICAg
IHJldHVybiB0ZXh0OwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0VGV4dChj
b25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhjZXB0aW9uKQotewotICAgIC8vIEhhbmRsZSB0
aGUgY29tbW9uIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVyZSdzIGV4YWN0bHkgMSBjaGlsZCBub2Rl
LCBhbmQgaXQncyBhIHRleHQgbm9kZS4KLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxk
KCk7Ci0gICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1RleHROb2RlKCkgJiYgIWNoaWxkLT5uZXh0
U2libGluZygpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFRleHRJbXBsICo+KGNoaWxkKS0+c2V0
RGF0YSh0ZXh0LCBleGNlcHRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVt
b3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGlsZChuZXcgVGV4dEltcGwoZ2V0RG9jdW1lbnQo
KSwgdGV4dCksIGV4Y2VwdGlvbik7Ci19Ci0KLWludCBIVE1MT3B0aW9uRWxlbWVudEltcGw6Omlu
ZGV4KCkgY29uc3QKLXsKLSAgICAvLyBMZXQncyBkbyB0aGlzIGR5bmFtaWNhbGx5LiBNaWdodCBi
ZSBhIGJpdCBzbG93LCBidXQgd2UncmUgc3VyZQotICAgIC8vIHdlIHdvbid0IGZvcmdldCB0byB1
cGRhdGUgYSBtZW1iZXIgdmFyaWFibGUgaW4gc29tZSBjYXNlcy4uLgotICAgIEhUTUxTZWxlY3RF
bGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICAgaWYgKHNlbGVjdCkgewotICAg
ICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBzZWxlY3QtPmxpc3RJdGVt
cygpOwotICAgICAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0gICAgICAgIGludCBvcHRpb25J
bmRleCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAg
ICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAg
ICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pID09
IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25JbmRleDsKLSAgICAgICAg
ICAgICAgICBvcHRpb25JbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
ICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0SW5kZXgo
aW50LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAgICBleGNlcHRpb24gPSBET01FeGNlcHRpb246Ok5P
X01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAvLyAjIyMKLX0KLQotdm9pZCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwg
KmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzZWxlY3RlZEF0dHIpCi0gICAgICAg
IG1fc2VsZWN0ZWQgPSAoIWF0dHItPmlzTnVsbCgpKTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gdmFsdWVBdHRyKQotICAgICAgICBtX3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICBl
bHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dmFsdWUo
KSBjb25zdAotewotICAgIGlmICggIW1fdmFsdWUuaXNOdWxsKCkgKQotICAgICAgICByZXR1cm4g
bV92YWx1ZTsKLSAgICAvLyBVc2UgdGhlIHRleHQgaWYgdGhlIHZhbHVlIHdhc24ndCBzZXQuCi0g
ICAgcmV0dXJuIHRleHQoKS5xc3RyaW5nKCkuc3RyaXBXaGl0ZVNwYWNlKCk7Ci19Ci0KLXZvaWQg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OnNldFNlbGVjdGVkKGJvb2wgX3NlbGVjdGVkKQotewotICAgIGlmKG1f
c2VsZWN0ZWQgPT0gX3NlbGVjdGVkKQotICAgICAgICByZXR1cm47Ci0gICAgbV9zZWxlY3RlZCA9
IF9zZWxlY3RlZDsKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVj
dCgpOwotICAgIGlmIChzZWxlY3QpCi0gICAgICAgIHNlbGVjdC0+bm90aWZ5T3B0aW9uU2VsZWN0
ZWQodGhpcyxfc2VsZWN0ZWQpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6Y2hp
bGRyZW5DaGFuZ2VkKCkKLXsKLSAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0
U2VsZWN0KCk7Ci0gICBpZiAoc2VsZWN0KQotICAgICAgIHNlbGVjdC0+Y2hpbGRyZW5DaGFuZ2Vk
KCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbCAqSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpn
ZXRTZWxlY3QoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpzZWxlY3QgPSBwYXJlbnROb2RlKCk7
Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNUYWdOYW1lKHNlbGVjdFRhZykpCi0g
ICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgpOwotICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3QpOwotfQotCi1ib29sIEhUTUxPcHRp
b25FbGVtZW50SW1wbDo6ZGVmYXVsdFNlbGVjdGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdl
dEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVsbCgpOwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0RGVmYXVsdFNlbGVjdGVkKGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1
dGUoc2VsZWN0ZWRBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobGFi
ZWxBdHRyKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldExhYmVsKGNvbnN0
IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxhYmVsQXR0ciwgdmFsdWUp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpI
VE1MVGV4dEFyZWFFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHRleHRhcmVhVGFnLCBk
b2MsIGYpLCBtX3ZhbHVlSXNWYWxpZChmYWxzZSksIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIoZmFs
c2UpCi17Ci0gICAgLy8gRFREIHJlcXVpcmVzIHJvd3MgJiBjb2xzIGJlIHNwZWNpZmllZCwgYnV0
IHdlIHdpbGwgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHRzCi0gICAgbV9yb3dzID0gMjsKLSAg
ICBtX2NvbHMgPSAyMDsKLSAgICBtX3dyYXAgPSB0YV9WaXJ0dWFsOwotfQotCi1IVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6fkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0
RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMp
OwotfQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAot
ewotICAgIHJldHVybiAidGV4dGFyZWEiOwotfQotCi1RU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpzdGF0ZSggKQotewotICAgIC8vIE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBl
bXB0eSEKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyB2
YWx1ZSgpLnFzdHJpbmcoKSsnLic7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6
OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQotewotICAgIFFTdHJpbmcgc3RhdGUg
PSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoc3RhdGVzKTsK
LSAgICBpZiAoc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLSAgICBzZXREZWZhdWx0VmFsdWUoc3Rh
dGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSk7Ci0gICAgLy8gdGhlIGNsb3NlKCkgaW4gdGhlIHJl
bmRlcnRyZWUgd2lsbCB0YWtlIGNhcmUgb2YgdHJhbnNmZXJyaW5nIGRlZmF1bHR2YWx1ZSB0byAn
dmFsdWUnCi19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2VsZWN0aW9uU3RhcnQo
KQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRl
clRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICByZXR1cm4gMDsK
LX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZWxlY3Rpb25FbmQoKQotewotICAg
IGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVh
ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uRW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsK
LSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+
KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQpOwotfQotCi12b2lkIEhUTUxUZXh0
QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBpZiAobV9y
ZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+
c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6
OnNlbGVjdCggICkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJl
bmRlclRleHRBcmVhKj4obV9yZW5kZXIpLT5zZWxlY3QoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQotewot
ICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4o
bV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTsKLX0KLQotdm9pZCBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBzZXRWYWx1ZShk
ZWZhdWx0VmFsdWUoKSk7Ci19Ci0gICAgCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlm
IChhdHRyLT5uYW1lKCkgPT0gcm93c0F0dHIpIHsKLSAgICAgICAgbV9yb3dzID0gIWF0dHItPmlz
TnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMzsKLSAgICAgICAgaWYgKHJlbmRlcmVy
KCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2Fs
YygpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNvbHNBdHRyKSB7Ci0gICAgICAg
IG1fY29scyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IDYwOwot
ICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRz
TGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
d3JhcEF0dHIpIHsKLSAgICAgICAgLy8gdmlydHVhbCAvIHBoeXNpY2FsIGlzIE5ldHNjYXBlIGV4
dGVuc2lvbiBvZiBIVE1MIDMuMCwgbm93IGRlcHJlY2F0ZWQKLSAgICAgICAgLy8gc29mdC8gaGFy
ZCAvIG9mZiBpcyByZWNvbW1lbmRhdGlvbiBmb3IgSFRNTCA0IGV4dGVuc2lvbiBieSBJRSBhbmQg
TlMgNAotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInZpcnR1
YWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAic29mdCIpKQotICAgICAg
ICAgICAgbV93cmFwID0gdGFfVmlydHVhbDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoYXR0ci0+dmFsdWUoKSwgInBoeXNpY2FsIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYXR0
ci0+dmFsdWUoKSwgImhhcmQiKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1BoeXNpY2FsOwot
ICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib24iICkp
Ci0gICAgICAgICAgICBtX3dyYXAgPSB0YV9QaHlzaWNhbDsKLSAgICAgICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIpKQotICAgICAgICAgICAgbV93cmFw
ID0gdGFfTm9XcmFwOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRl
cmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBpZ25vcmUgZm9yIHRo
ZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewot
ICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVu
dExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlbGVjdEV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmNoYW5nZUF0dHIp
IHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxl
KQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJUZXh0QXJlYSh0aGlzKTsKLX0KLQot
Ym9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0
JiBlbmNvZGluZywgYm9vbCkKLXsKLSAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSkgcmV0dXJuIGZh
bHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6cmVzZXQoKQotewot
ICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6dXBkYXRlVmFsdWUoKQotewotICAgIGlmICggIW1fdmFsdWVJc1ZhbGlkICkgewot
ICAgICAgICBpZiAoIG1fcmVuZGVyICkgewotICAgICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19j
YXN0PFJlbmRlclRleHRBcmVhKj4oIG1fcmVuZGVyICktPnRleHQoKS5xc3RyaW5nKCk7Ci0gICAg
ICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgIG1fdmFsdWUgPSBkZWZhdWx0VmFsdWUoKS5xc3RyaW5nKCk7Ci0gICAgICAg
ICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAg
bV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjp2YWx1ZSgpCi17Ci0gICAgdXBkYXRlVmFsdWUoKTsKLSAgICByZXR1cm4g
bV92YWx1ZS5pc051bGwoKSA/IERPTVN0cmluZygiIikgOiBtX3ZhbHVlOwotfQotCi12b2lkIEhU
TUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIG1fdmFsdWUgPSB2YWx1ZS5xc3RyaW5nKCk7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5k
ZXJlciA9IGZhbHNlOwotICAgIG1fdmFsdWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICBpZiAobV9yZW5k
ZXIpCi0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIC8vIEZJWE1F
OiBGb3JjZSByZWxvYWQgZnJvbSByZW5kZXJlciwgYXMgcmVuZGVyZXIgbWF5IGhhdmUgbm9ybWFs
aXplZCBsaW5lIGVuZGluZ3MuCi0gICAgbV92YWx1ZUlzVmFsaWQgPSBmYWxzZTsKLSAgICBzZXRD
aGFuZ2VkKHRydWUpOwotfQotCi0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
ZGVmYXVsdFZhbHVlKCkKLXsKLSAgICBET01TdHJpbmcgdmFsID0gIiI7Ci0gICAgLy8gdGhlcmUg
bWF5IGJlIGNvbW1lbnRzIC0ganVzdCBncmFiIHRoZSB0ZXh0IG5vZGVzCi0gICAgTm9kZUltcGwg
Km47Ci0gICAgZm9yIChuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkK
LSAgICAgICAgaWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAgICAgICAgIHZhbCArPSBzdGF0aWNf
Y2FzdDxUZXh0SW1wbCo+KG4pLT5kYXRhKCk7CiAgICAgCi0gICAgaWYgKHZhbFswXSA9PSAnXHIn
ICYmIHZhbFsxXSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9IHZhbC5jb3B5KCk7Ci0gICAgICAg
IHZhbC5yZW1vdmUoMCwyKTsKLSAgICB9IGVsc2UgaWYgKHZhbFswXSA9PSAnXHInIHx8IHZhbFsw
XSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9IHZhbC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1v
dmUoMCwxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOwotfQotCi12b2lkIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZkZWZhdWx0VmFs
dWUpCi17Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNvbW1lbnRzIC0gcmVtb3ZlIGFsbCB0aGUgdGV4
dCBub2RlcyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggb25lCi0gICAgUVB0ckxpc3Q8Tm9kZUltcGw+
IHRvUmVtb3ZlOwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsg
bjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0g
ICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQobik7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxOb2Rl
SW1wbD4gaXQodG9SZW1vdmUpOwotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAgICBmb3Ig
KDsgaXQuY3VycmVudCgpOyArK2l0KSB7Ci0gICAgICAgIE5vZGVJbXBsICpuID0gaXQuY3VycmVu
dCgpOwotICAgICAgICBuLT5yZWYoKTsKLSAgICAgICAgcmVtb3ZlQ2hpbGQobiwgZXhjZXB0aW9u
Y29kZSk7Ci0gICAgICAgIG4tPmRlcmVmKCk7Ci0gICAgfQotICAgIGluc2VydEJlZm9yZShnZXRE
b2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZShkZWZhdWx0VmFsdWUpLGZpcnN0Q2hpbGQoKSwgZXhj
ZXB0aW9uY29kZSk7Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLX0KLQotYm9vbCBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNl
bmRUb0FueUVsZW1lbnQpCi17Ci0gICAgZm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpOwotICAgIHVwZGF0ZVZhbHVlKCk7
Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmRldGFjaCgpCi17Ci0gICAgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVu
ZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjph
Y2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2
YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldENvbHMoaW50IGNv
bHMpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNBdHRyLCBRU3RyaW5nOjpudW1iZXIoY29scykp
OwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRSb3dzKGludCByb3dzKQot
ewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgUVN0cmluZzo6bnVtYmVyKHJvd3MpKTsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpIVE1MSXNJ
bmRleEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
KQotICAgIDogSFRNTElucHV0RWxlbWVudEltcGwoaXNpbmRleFRhZywgZG9jLCBmKQotewotICAg
IG1fdHlwZSA9IFRFWFQ7Ci0gICAgbV9uYW1lID0gImlzaW5kZXgiOwotfQotCi12b2lkIEhUTUxJ
c0luZGV4RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUlt
cGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBwcm9tcHRBdHRyKQotCXNldFZh
bHVlKGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UKLSAgICAgICAgLy8gZG9uJ3QgY2FsbCBIVE1M
SW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZSBoZXJlLCBhcyBpdCB3b3VsZAotICAg
ICAgICAvLyBhY2NlcHQgYXR0cmlidXRlcyB0aGlzIGVsZW1lbnQgZG9lcyBub3Qgc3VwcG9ydAot
ICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
YXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpwcm9tcHQoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUocHJvbXB0QXR0cik7Ci19Ci0KLXZvaWQg
SFRNTElzSW5kZXhFbGVtZW50SW1wbDo6c2V0UHJvbXB0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHByb21wdEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi11bnNpZ25lZCBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpsZW5ndGgo
KSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19
Ci0KLXZvaWQgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6c2V0TGVuZ3RoKHVuc2lnbmVkIGxl
bmd0aCkKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotfQotCi1Ob2RlSW1wbCAqSFRN
TE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6aXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLXsKLSAg
ICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAq
SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6bmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFt
ZSkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAgIHJldHVybiAwOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZvcm1EYXRhTGlzdDo6Rm9ybURhdGFMaXN0KFFU
ZXh0Q29kZWMgKmMpCi0gICAgOiBtX2NvZGVjKGMpCi17Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0
OjphcHBlbmRTdHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpCi17Ci0gICAgbV9saXN0LmFwcGVuZChz
KTsKLX0KLQotdm9pZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRU3RyaW5nICZz
KQotewotICAgIFFDU3RyaW5nIGNzdHIgPSBmaXhMaW5lQnJlYWtzKG1fY29kZWMtPmZyb21Vbmlj
b2RlKHMsIHRydWUpKTsKLSAgICBjc3RyLnRydW5jYXRlKGNzdHIubGVuZ3RoKCkpOwotICAgIG1f
bGlzdC5hcHBlbmQoY3N0cik7Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRGaWxlKGNv
bnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01TdHJpbmcgJmZpbGVuYW1lKQotewotICAgIGFw
cGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsKLSAgICBtX2xpc3QuYXBwZW5kKGZpbGVuYW1lLnFz
dHJpbmcoKSk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlCkluZGV4OiBraHRtbC9odG1sL0hUTUxGb3Jt
RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTEZvcm1FbGVtZW50
SW1wbC5jcHAJKHJldmlzaW9uIDExOTc2KQorKysga2h0bWwvaHRtbC9IVE1MRm9ybUVsZW1lbnRJ
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykg
MTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAgIChDKSAxOTk5IEFu
dHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQogICogICAgICAgICAgIChDKSAyMDAxIERp
cmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1
IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYg
QXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqICAgICAgICAgICAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1
cnlha292IChhcEBueXBvcC5jb20pCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjQsNDEgKzI0LDE5IEBACiAg
KgogICovCiAKLSN1bmRlZiBGT1JNU19ERUJVRwotLy8jZGVmaW5lIEZPUk1TX0RFQlVHCi0KICNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZm9ybWltcGwuaCIKLQotI2lu
Y2x1ZGUgImtodG1sdmlldy5oIgotI2luY2x1ZGUgIk1hY0ZyYW1lLmgiCi0jaW5jbHVkZSAiaHRt
bC9odG1sX2RvY3VtZW50aW1wbC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudEltcGwuaCIK
ICNpbmNsdWRlICJodG1sX2ltYWdlaW1wbC5oIgotI2luY2x1ZGUgImtodG1sX3NldHRpbmdzLmgi
Ci0jaW5jbHVkZSAibWlzYy9mb3JtZGF0YS5oIgotCi0jaW5jbHVkZSAiZG9tL2RvbV9leGNlcHRp
b24uaCIKLSNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImNzc3By
b3BlcnRpZXMuaCIKLSNpbmNsdWRlICJjc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX3Rl
eHRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInht
bC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAia2h0bWxfZXh0LmgiCisjaW5jbHVkZSAiaHRtbF9k
b2N1bWVudGltcGwuaCIKKyNpbmNsdWRlICJjc3NoZWxwZXIuaCIgLy8gRm9yIGt0aG1sOjpwYXJz
ZVVSTAorI2luY2x1ZGUgIkZvcm1EYXRhTGlzdC5oIgogCiAjaW5jbHVkZSAicmVuZGVyaW5nL3Jl
bmRlcl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgotI2luY2x1ZGUgInJlbmRl
cl90aGVtZS5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKIAotI2luY2x1ZGUgPGtsb2NhbGUu
aD4KLSNpbmNsdWRlIDxxZmlsZS5oPgotI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KLQotLy8gZm9y
IGtleWdlbgotI2luY2x1ZGUgPHFzdHJpbmcuaD4KLSNpbmNsdWRlIDxrc3Nsa2V5Z2VuLmg+Cisj
aW5jbHVkZSAiTWFjRnJhbWUuaCIKIAotI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHF0
ZXh0Y29kZWMuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGtodG1sOwogCkBAIC02Nyw0MSArNDUsNiBA
QCBuYW1lc3BhY2UgRE9NIHsKIHVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwogdXNpbmcgbmFt
ZXNwYWNlIEhUTUxOYW1lczsKIAotc3RydWN0IEZvcm1EYXRhTGlzdEl0ZW0gewotICAgIEZvcm1E
YXRhTGlzdEl0ZW0oY29uc3QgUUNTdHJpbmcgJmRhdGEpIDogbV9kYXRhKGRhdGEpIHsgfQotICAg
IEZvcm1EYXRhTGlzdEl0ZW0oY29uc3QgUVN0cmluZyAmcGF0aCkgOiBtX3BhdGgocGF0aCkgeyB9
Ci0KLSAgICBRU3RyaW5nIG1fcGF0aDsKLSAgICBRQ1N0cmluZyBtX2RhdGE7Ci19OwotCi1jbGFz
cyBGb3JtRGF0YUxpc3QgewotcHVibGljOgotICAgIEZvcm1EYXRhTGlzdChRVGV4dENvZGVjICop
OwotCi0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01T
dHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBw
ZW5kU3RyaW5nKHZhbHVlLnFzdHJpbmcoKSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3Qg
RE9NU3RyaW5nICZrZXksIGNvbnN0IFFTdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0
cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsgfQotICAgIHZvaWQgYXBw
ZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgUUNTdHJpbmcgJnZhbHVlKQotICAg
ICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsg
fQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgaW50IHZhbHVlKQot
ICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKFFTdHJp
bmc6Om51bWJlcih2YWx1ZSkpOyB9Ci0gICAgdm9pZCBhcHBlbmRGaWxlKGNvbnN0IERPTVN0cmlu
ZyAma2V5LCBjb25zdCBET01TdHJpbmcgJmZpbGVuYW1lKTsKLQotICAgIFFWYWx1ZUxpc3RDb25z
dEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+IGJlZ2luKCkgY29uc3QKLSAgICAgICAgeyByZXR1
cm4gbV9saXN0LmJlZ2luKCk7IH0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0
YUxpc3RJdGVtPiBlbmQoKSBjb25zdAotICAgICAgICB7IHJldHVybiBtX2xpc3QuZW5kKCk7IH0K
LQotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcyk7Ci0g
ICAgdm9pZCBhcHBlbmRTdHJpbmcoY29uc3QgUVN0cmluZyAmcyk7Ci0KLSAgICBRVGV4dENvZGVj
ICptX2NvZGVjOwotICAgIFFWYWx1ZUxpc3Q8Rm9ybURhdGFMaXN0SXRlbT4gbV9saXN0OwotfTsK
LQogSFRNTEZvcm1FbGVtZW50SW1wbDo6SFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYykKICAgICA6IEhUTUxFbGVtZW50SW1wbChmb3JtVGFnLCBkb2MpCiB7CkBAIC0xMjgsNyAr
NzEsNiBAQCBIVE1MRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEZvcm1FbGVtZW50SW1wCiAgICAgICAg
IGltZ0VsZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOwogfQogCi0KIGJvb2wgSFRNTEZvcm1FbGVtZW50
SW1wbDo6Zm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwp
CiB7CiAgICAgaWYgKHVybC5pc051bGwoKSkgewpAQCAtMTM3LDcgKzc5LDYgQEAgYm9vbCBIVE1M
Rm9ybUVsZW1lbnRJbXBsOjpmb3JtV291bGRIYXZlUwogICAgIHJldHVybiBnZXREb2N1bWVudCgp
LT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKS5zdGFydHNXaXRoKCJodHRwczoiLCBmYWxzZSk7
CiB9CiAKLQogdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKQogewogICAgIEhUTUxF
bGVtZW50SW1wbDo6YXR0YWNoKCk7CkBAIC0xOTYsNyArMTM3LDYgQEAgdm9pZCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpzdWJtaXRDbGljaygpCiAgICAgICAgIHByZXBhcmVTdWJtaXQoKTsKIH0KIAot
CiBzdGF0aWMgUUNTdHJpbmcgZW5jb2RlQ1N0cmluZyhjb25zdCBRQ1N0cmluZyYgZSkKIHsKICAg
ICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcu
MTMuNC4xCkBAIC0yNDYsNTYgKzE4Niw2IEBAIHN0YXRpYyBRQ1N0cmluZyBlbmNvZGVDU3RyaW5n
KGNvbnN0IFFDU3QKICAgICByZXR1cm4gZW5jb2RlZDsKIH0KIAotLy8gQ2hhbmdlIHBsYWluIENS
IGFuZCBwbGFpbiBMRiB0byBDUkxGIHBhaXJzLgotc3RhdGljIFFDU3RyaW5nIGZpeExpbmVCcmVh
a3MoY29uc3QgUUNTdHJpbmcgJnMpCi17Ci0gICAgLy8gQ29tcHV0ZSB0aGUgbGVuZ3RoLgotICAg
IHVuc2lnbmVkIG5ld0xlbiA9IDA7Ci0gICAgY29uc3QgY2hhciAqcCA9IHMuZGF0YSgpOwotICAg
IHdoaWxlIChjaGFyIGMgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAg
ICAgICAgIC8vIFNhZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0g
ICAgICAgICAgICBpZiAoKnAgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1Ig
aW50byBDUkxGLgotICAgICAgICAgICAgICAgIG5ld0xlbiArPSAyOwotICAgICAgICAgICAgfQot
ICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgLy8gVHVybiBMRiBp
bnRvIENSTEYuCi0gICAgICAgICAgICBuZXdMZW4gKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIC8vIExlYXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICBu
ZXdMZW4gKz0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobmV3TGVuID09IHMubGVuZ3Ro
KCkpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIAotICAgIC8vIE1ha2UgYSBjb3B5
IG9mIHRoZSBzdHJpbmcuCi0gICAgcCA9IHMuZGF0YSgpOwotICAgIFFDU3RyaW5nIHJlc3VsdChu
ZXdMZW4gKyAxKTsKLSAgICBjaGFyICpxID0gcmVzdWx0LmRhdGEoKTsKLSAgICB3aGlsZSAoY2hh
ciBjID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBT
YWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGluZyAnXDAnLgotICAgICAgICAgICAg
aWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAvLyBUdXJuIENSIGludG8gQ1JMRi4K
LSAgICAgICAgICAgICAgICAqcSsrID0gJ1xyJzsKLSAgICAgICAgICAgICAgICAqcSsrID0gJ1xu
JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAg
ICAgICAgIC8vIFR1cm4gTEYgaW50byBDUkxGLgotICAgICAgICAgICAgKnErKyA9ICdccic7Ci0g
ICAgICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8v
IExlYXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICAqcSsrID0gYzsKLSAg
ICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KIGJvb2wgSFRNTEZvcm1F
bGVtZW50SW1wbDo6Zm9ybURhdGEoRm9ybURhdGEgJmZvcm1fZGF0YSkgY29uc3QKIHsKICAgICBR
Q1N0cmluZyBlbmNfc3RyaW5nID0gIiI7IC8vIHVzZWQgZm9yIG5vbi1tdWx0aXBhcnQgZGF0YQpA
QCAtNzMxLDI4MzggKzYyMSw1IEBAIHZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0VGFyZ2V0
KGNvbnMKIHsKICAgICBzZXRBdHRyaWJ1dGUodGFyZ2V0QXR0ciwgdmFsdWUpOwogfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxFbGVtZW50SW1wbCh0
YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9kaXNhYmxlZCA9IG1fcmVhZE9ubHkgPSBmYWxzZTsKLQot
ICAgIGlmIChmKQotCW1fZm9ybSA9IGY7Ci0gICAgZWxzZQotCW1fZm9ybSA9IGdldEZvcm0oKTsK
LSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhp
cyk7Ci19Ci0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwoKQotewotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9ybS0+cmVtb3ZlRm9y
bUVsZW1lbnQodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYg
KGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGRpc2FibGVkQXR0cikgewotICAgICAgICBib29s
IG9sZERpc2FibGVkID0gbV9kaXNhYmxlZDsKLSAgICAgICAgbV9kaXNhYmxlZCA9ICFhdHRyLT5p
c051bGwoKTsKLSAgICAgICAgaWYgKG9sZERpc2FibGVkICE9IG1fZGlzYWJsZWQpIHsKLSAgICAg
ICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRl
cmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgICAgICB0aGVtZSgp
LT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgRW5hYmxlZFN0YXRlKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlYWRvbmx5QXR0cikgewotICAgICAgICBib29s
IG9sZFJlYWRPbmx5ID0gbV9yZWFkT25seTsKLSAgICAgICAgbV9yZWFkT25seSA9ICFhdHRyLT5p
c051bGwoKTsKLSAgICAgICAgaWYgKG9sZFJlYWRPbmx5ICE9IG1fcmVhZE9ubHkpIHNldENoYW5n
ZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0
YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotCi0gICAgSFRNTEVsZW1lbnRJbXBs
OjphdHRhY2goKTsKLQotICAgIC8vIFRoZSBjYWxsIHRvIHVwZGF0ZUZyb21FbGVtZW50KCkgbmVl
ZHMgdG8gZ28gYWZ0ZXIgdGhlIGNhbGwgdGhyb3VnaAotICAgIC8vIHRvIHRoZSBiYXNlIGNsYXNz
J3MgYXR0YWNoKCkgYmVjYXVzZSB0aGF0IGNhbiBzb21ldGltZXMgZG8gYSBjbG9zZQotICAgIC8v
IG9uIHRoZSByZW5kZXJlci4KLSAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAgbV9yZW5kZXIt
PnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgCi0gICAgICAgIC8vIERlbGF5ZWQgYXR0YWNobWVu
dCBpbiBvcmRlciB0byBwcmV2ZW50IEZPVUMgY2FuIHJlc3VsdCBpbiBhbiBvYmplY3QgYmVpbmcK
LSAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBmb2N1c2VkIGJlZm9yZSBpdCBoYXMgYSByZW5k
ZXIgb2JqZWN0LiAgSWYgd2UgaGF2ZSBiZWVuIGZvY3VzZWQKLSAgICAgICAgLy8gKGkuZS4sIGlm
IHdlIGFyZSB0aGUgZm9jdXNOb2RlKSB0aGVuIGdvIGFoZWFkIGFuZCBmb2N1cyBvdXIgY29ycmVz
cG9uZGluZyBuYXRpdmUgd2lkZ2V0LgotICAgICAgICAvLyAoQXR0YWNoL2RldGFjaCBjYW4gYWxz
byBoYXBwZW4gYXMgYSByZXN1bHQgb2YgZGlzcGxheSB0eXBlIGNoYW5nZXMsIGUuZy4sIG1ha2lu
ZyBhIHdpZGdldAotICAgICAgICAvLyBibG9jayBpbnN0ZWFkIG9mIGlubGluZSwgYW5kIGZvY3Vz
IHNob3VsZCBiZSByZXN0b3JlZCBpbiB0aGF0IGNhc2UgYXMgd2VsbC4pCi0gICAgICAgIGlmIChn
ZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKSA9PSB0aGlzICYmIG1fcmVuZGVyLT5pc1dpZGdldCgp
ICYmIAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVyZXIoKSkt
PndpZGdldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVy
ZXIoKSktPndpZGdldCgpLT5zZXRGb2N1cygpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApCi17Ci0gICAgaWYg
KCFtX2Zvcm0pIHsKLSAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIGEgbmV3IGZv
cm0gZWxlbWVudCBiZWluZyBjcmVhdGVkIGJ5Ci0gICAgICAgIC8vIEphdmFTY3JpcHQgYW5kIGlu
c2VydGVkIGluc2lkZSBhIGZvcm0uICBJbiB0aGUgY2FzZSBvZiB0aGUgcGFyc2VyCi0gICAgICAg
IC8vIHNldHRpbmcgYSBmb3JtLCB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBhIG5vbi1udWxsIHZhbHVl
IGZvciBtX2Zvcm0sIAotICAgICAgICAvLyBhbmQgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0
aGluZy4KLSAgICAgICAgbV9mb3JtID0gZ2V0Rm9ybSgpOwotCWlmIChtX2Zvcm0pCi0JICAgIG1f
Zm9ybS0+cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAg
ICAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAo
ZG9jICYmIGlzUmFkaW9CdXR0b24oKSAmJiAhbmFtZSgpLmlzRW1wdHkoKSAmJiBpc0NoZWNrZWQo
KSkKLSAgICAgICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9uQ2hlY2tlZCgoSFRNTElucHV0RWxl
bWVudEltcGwqKXRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MRWxl
bWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoZGVlcCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApCi17Ci0gICAgLy8gV2hl
biBiZWluZyByZW1vdmVkIHdlIGhhdmUgdG8gcG9zc2libHkgbnVsbCBvdXQgb3VyIGZvcm0gYW5k
IHJlbW92ZSBvdXJzZWx2ZXMgZnJvbQotICAgIC8vIHRoZSBmb3JtJ3MgbGlzdCBvZiBlbGVtZW50
cy4KLSAgICBpZiAobV9mb3JtKSB7Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gcmUtYWNxdWlyZSB0
aGUgZm9ybS4gIElmIHdlIGNhbid0IHJlLWFjcXVpcmUsIHRoZW4KLSAgICAgICAgLy8gcmVtb3Zl
IG91cnNlbHZlcyBmcm9tIHRoZSBmb3JtLgotICAgICAgICBOb2RlSW1wbCogZm9ybSA9IHBhcmVu
dE5vZGUoKTsKLSAgICAgICAgTm9kZUltcGwqIHJvb3QgPSB0aGlzOwotICAgICAgICB3aGlsZSAo
Zm9ybSkgewotICAgICAgICAgICAgaWYgKGZvcm0tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByb290ID0gZm9ybTsKLSAgICAgICAgICAg
IGZvcm0gPSBmb3JtLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAg
IC8vIElmIHRoZSBmb3JtIGhhcyBiZWVuIGRlbW90ZWQgdG8gYSBsZWFmLCB0aGVuIHdlIHdvbid0
IGZpbmQgaXQgYXMgYW4gYW5jZXN0b3IuCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUg
cm9vdCBub2RlIG9mIG91ciBjdXJyZW50IGZvcm0gYW5kIG91ciByb290IG5vZGUKLSAgICAgICAg
Ly8gbWF0Y2guICBJZiBzbywgcHJlc2VydmUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGZvcm0uCi0g
ICAgICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgTm9kZUltcGwqIGZvcm1Sb290ID0gbV9m
b3JtOwotICAgICAgICAgICAgd2hpbGUgKGZvcm1Sb290LT5wYXJlbnQoKSkgZm9ybVJvb3QgPSBm
b3JtUm9vdC0+cGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoZm9ybVJvb3QgPT0gcm9vdCkKLSAg
ICAgICAgICAgICAgICBmb3JtID0gbV9mb3JtOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAg
ICAgaWYgKCFmb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1FbGVtZW50KHRo
aXMpOwotICAgICAgICAgICAgbV9mb3JtID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAg
ICBhc3NlcnQoZm9ybSA9PSBtX2Zvcm0pOyAvLyBUaGUgcmUtYWNxdWlyZWQgZm9ybSBzaG91bGQg
YmUgdGhlIHNhbWUuIElmIG5vdCwgc29tZXRoaW5nIHJlYWxseSBzdHJhbmdlIGhhcHBlbmVkLgot
ICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21UcmVlKGRlZXApOwot
fQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Z2V0
Rm9ybSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hp
bGUocCkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAgICAgICBw
ID0gcC0+cGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5n
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAgICBET01TdHJp
bmcgbiA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0gICAgcmV0dXJuIG4uaXNOdWxsKCkgPyAi
IiA6IG47Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldE5hbWUoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobmFtZUF0dHIsIHZhbHVl
KTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25TZWxlY3QoKQotewot
ICAgIC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1
cmUKLSAgICBkaXNwYXRjaEhUTUxFdmVudChzZWxlY3RFdmVudCx0cnVlLGZhbHNlKTsKLX0KLQot
dm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25DaGFuZ2UoKQotewotICAgIC8vICMj
IyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUKLSAgICBk
aXNwYXRjaEhUTUxFdmVudChjaGFuZ2VFdmVudCx0cnVlLGZhbHNlKTsKLX0KLQotYm9vbCBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGlzYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBt
X2Rpc2FibGVkOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXREaXNh
YmxlZChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKGRpc2FibGVkQXR0ciwgYiA/ICIiIDog
MCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFJlYWRPbmx5KGJv
b2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyLCBiID8gIiIgOiAwKTsKLX0K
LQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hh
bmdlIGNoICkKLXsKLSAgICAvL2Jvb2wgY2hhbmdlZCA9IGNoYW5nZWQoKTsKLSAgICBIVE1MRWxl
bWVudEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotCi0gICAgaWYgKG1fcmVuZGVyIC8qJiYgY2hh
bmdlZCovKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotYm9v
bCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAg
IGlmIChkaXNhYmxlZCgpIHx8ICFtX3JlbmRlciB8fCAKLSAgICAgICAgKG1fcmVuZGVyLT5zdHls
ZSgpICYmIG1fcmVuZGVyLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkgfHwgCi0g
ICAgICAgIG1fcmVuZGVyLT53aWR0aCgpID09IDAgfHwgbV9yZW5kZXItPmhlaWdodCgpID09IDAp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0g
ICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyLT5pc1dpZGdldCgp
KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5k
ZXIpLT53aWRnZXQoKSAmJgotICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxSZW5kZXJXaWRn
ZXQqPihtX3JlbmRlciktPndpZGdldCgpLT5mb2N1c1BvbGljeSgpICYgUVdpZGdldDo6VGFiRm9j
dXMpOwotICAgICAgICB9Ci0JaWYgKGdldERvY3VtZW50KCktPmZyYW1lKCkpCi0JICAgIHJldHVy
biBnZXREb2N1bWVudCgpLT5mcmFtZSgpLT50YWJzVG9BbGxDb250cm9scygpOwotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omlz
TW91c2VGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7Ci0gICAg
ICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCkgJiYKLSAgICAgICAgICAg
ICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQoKS0+Zm9j
dXNQb2xpY3koKSAmIFFXaWRnZXQ6OkNsaWNrRm9jdXMpOwotICAgICAgICB9Ci0gICAgICAgIC8v
IEZvciA8aW5wdXQgdHlwZT1pbWFnZT4gYW5kIDxidXR0b24+LCB3ZSB3aWxsIGFzc3VtZSBubyBt
b3VzZSBmb2N1c2FiaWxpdHkuICBUaGlzIGlzCi0gICAgICAgIC8vIGNvbnNpc3RlbnQgd2l0aCBP
UyBYIGJlaGF2aW9yIGZvciBidXR0b25zLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBTcGVjaWFsIGNoYXJz
IHVzZWQgdG8gZW5jb2RlIGZvcm0gc3RhdGUgc3RyaW5ncy4KLS8vIFdlIHBpY2sgY2hhcnMgdGhh
dCBhcmUgdW5saWtlbHkgdG8gYmUgdXNlZCBpbiBhbiBIVE1MIGF0dHIsIHNvIHdlIHJhcmVseSBo
YXZlIHRvIHJlYWxseSBlbmNvZGUuCi1jb25zdCBjaGFyIHN0YXRlU2VwYXJhdG9yID0gJyYnOwot
Y29uc3QgY2hhciBzdGF0ZUVzY2FwZSA9ICc8JzsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlU2Vw
YXJhdG9yTWFya2VyW10gPSAiPEEiOwotc3RhdGljIGNvbnN0IGNoYXIgc3RhdGVFc2NhcGVNYXJr
ZXJbXSA9ICI8PCI7Ci0KLS8vIEVuY29kZSBhbiBlbGVtZW50IG5hbWUgc28gd2UgY2FuIHB1dCBp
dCBpbiBhIHN0YXRlIHN0cmluZyB3aXRob3V0IGNvbGxpZGluZwotLy8gd2l0aCBvdXIgc2VwYXJh
dG9yIGNoYXIuCi1zdGF0aWMgUVN0cmluZyBlbmNvZGVkRWxlbWVudE5hbWUoUVN0cmluZyBzdHIp
Ci17Ci0gICAgaW50IHNlcExvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICBpbnQg
ZXNjTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IpOwotICAgIGlmIChzZXBMb2MgPj0gMCB8
fCBlc2NMb2MgPj0gMCkgewotICAgICAgICBRU3RyaW5nIG5ld1N0ciA9IHN0cjsKLSAgICAgICAg
Ly8gICByZXBsYWNlICI8IiB3aXRoICI8PCIKLSAgICAgICAgd2hpbGUgKGVzY0xvYyA+PSAwKSB7
Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFjZShlc2NMb2MsIDEsIHN0YXRlRXNjYXBlTWFya2Vy
KTsKLSAgICAgICAgICAgIGVzY0xvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBlc2NMb2Mr
MSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICByZXBsYWNlICImIiB3aXRoICI8QSIKLSAgICAg
ICAgd2hpbGUgKHNlcExvYyA+PSAwKSB7Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFjZShzZXBM
b2MsIDEsIHN0YXRlU2VwYXJhdG9yTWFya2VyKTsKLSAgICAgICAgICAgIHNlcExvYyA9IHN0ci5m
aW5kKHN0YXRlU2VwYXJhdG9yLCBzZXBMb2MrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJu
IG5ld1N0cjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLX0KLQot
UVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICAvLyBC
dWlsZCBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIEVsZW1lbnROYW1lJkVsZW1lbnRUeXBlJgotICAg
IHJldHVybiBlbmNvZGVkRWxlbWVudE5hbWUobmFtZSgpLnFzdHJpbmcoKSkgKyBzdGF0ZVNlcGFy
YXRvciArIHR5cGUoKS5xc3RyaW5nKCkgKyBzdGF0ZVNlcGFyYXRvcjsKLX0KLQotUVN0cmluZyBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoUVN0cmluZ0xpc3Qg
JnN0YXRlcykKLXsKLSAgICBRU3RyaW5nIGVuY05hbWUgPSBlbmNvZGVkRWxlbWVudE5hbWUobmFt
ZSgpLnFzdHJpbmcoKSk7Ci0gICAgUVN0cmluZyB0eXBlU3RyID0gdHlwZSgpLnFzdHJpbmcoKTsK
LSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IHN0YXRlcy5iZWdpbigpOyBpdCAh
PSBzdGF0ZXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgUVN0cmluZyBzdGF0ZSA9ICppdDsKLSAg
ICAgICAgaW50IHNlcDEgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICAgICAgaW50
IHNlcDIgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXAxKzEpOwotICAgICAgICBhc3Nl
cnQoc2VwMSA+PSAwKTsKLSAgICAgICAgYXNzZXJ0KHNlcDIgPj0gMCk7Ci0KLSAgICAgICAgUVN0
cmluZyBuYW1lQW5kVHlwZSA9IHN0YXRlLmxlZnQoc2VwMik7Ci0gICAgICAgIGlmIChlbmNOYW1l
Lmxlbmd0aCgpICsgdHlwZVN0ci5sZW5ndGgoKSArIDEgPT0gKHVpbnQpc2VwMgotICAgICAgICAg
ICAgJiYgbmFtZUFuZFR5cGUuc3RhcnRzV2l0aChlbmNOYW1lKQotICAgICAgICAgICAgJiYgbmFt
ZUFuZFR5cGUuZW5kc1dpdGgodHlwZVN0cikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRl
cy5yZW1vdmUoaXQpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLm1pZChzZXAyKzEpOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiBRU3RyaW5nOjpudWxsOwotfQotCi1pbnQgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OnRhYkluZGV4KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHRhYmluZGV4QXR0cikudG9JbnQoKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6c2V0VGFiSW5kZXgoaW50IHZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh0YWJpbmRleEF0dHIsIFFTdHJpbmc6Om51bWJlcih2YWx1ZSkpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6SFRNTEJ1dHRvbkVsZW1lbnRJbXBs
KERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwoYnV0dG9uVGFnLCBkb2MsIGYpCi17Ci0gICAgbV90eXBlID0g
U1VCTUlUOwotICAgIG1fZGlydHkgPSB0cnVlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7
Ci19Ci0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6fkhUTUxCdXR0b25FbGVtZW50SW1wbCgpCi17
Ci19Ci0KLVJlbmRlck9iamVjdCogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJl
cihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4g
bmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRv
bkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHR5
cGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZh
bHVlKCksICJzdWJtaXQiKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAgICAgICAg
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInJlc2V0IikpCi0gICAg
ICAgICAgICBtX3R5cGUgPSBSRVNFVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UoYXR0ci0+dmFsdWUoKSwgImJ1dHRvbiIpKQotICAgICAgICAgICAgbV90eXBlID0gQlVUVE9O
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAgICAgICBt
X3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgbV9jdXJyVmFsdWUgPSBtX3ZhbHVlOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAg
Ly8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0
cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhU
TUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0K
LQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQpCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBCVVRUT04gJiYgKGV2dC0+dHlwZSgpID09
IERPTUFjdGl2YXRlRXZlbnQpKSB7Ci0KLSAgICAgICAgaWYobV9mb3JtICYmIG1fdHlwZSA9PSBT
VUJNSVQpIHsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsKLSAgICAgICAgICAg
IG1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpOwotICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSBm
YWxzZTsgLy8gaW4gY2FzZSB3ZSB3ZXJlIGNhbmNlbGVkCi0gICAgICAgIH0KLSAgICAgICAgaWYo
bV9mb3JtICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgpOwotICAgIH0KLSAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQot
Ci1ib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkg
Y29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5h
bWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdGhlciBi
cm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVyZWZvcmUs
IHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0
b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gUmVtb3ZlIHRo
ZSBuYW1lIGNvbnN0cmFpbnQgZm9yIG5vdy4KLSAgICAvLyBXYXM6IG1fdHlwZSA9PSBTVUJNSVQg
JiYgIW1fZGlzYWJsZWQgJiYgIW5hbWUoKS5pc0VtcHR5KCkKLSAgICByZXR1cm4gbV90eXBlID09
IFNVQk1JVCAmJiAhbV9kaXNhYmxlZDsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6
OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7
Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJtaXQoYm9v
bCBmbGFnKQotewotICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBIVE1MQnV0
dG9uRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RpbmcsIGJv
b2wgLyptdWx0aXBhcnQqLykKLXsKLSAgICBpZiAobV90eXBlICE9IFNVQk1JVCB8fCBuYW1lKCku
aXNFbXB0eSgpIHx8ICFtX2FjdGl2ZVN1Ym1pdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBtX2N1cnJWYWx1ZSk7Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9v
bCBzZW5kVG9BbnlFbGVtZW50KQoteyAgIAotICAgIC8vIHNlbmQgdGhlIG1vdXNlIGJ1dHRvbiBl
dmVudHMgaWZmIHRoZQotICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2VuZFRvQW55RWxlbWVudAot
ICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVs
ZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
YWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY2Nl
c3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNz
a2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp2
YWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQot
Ci12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OkhUTUxGaWVsZFNldEVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAg
OiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChmaWVsZHNldFRhZywgZG9jLCBmKQotewotfQot
Ci1IVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6fkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCkKLXsK
LX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3QgTm9kZUlt
cGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShsZWdlbmRU
YWcpIHx8IEhUTUxFbGVtZW50SW1wbDo6Y2hlY2tEVEQobmV3Q2hpbGQpOwotfQotCi1ib29sIEhU
TUxGaWVsZFNldEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OnR5cGUoKSBj
b25zdAotewotICAgIHJldHVybiAiZmllbGRzZXQiOwotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxG
aWVsZFNldEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJl
bmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyRmllbGRz
ZXQodGhpcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElucHV0RWxlbWVudElt
cGw6OkhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoaW5wdXRUYWcsIGRv
YywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpIVE1MSW5w
dXRFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKHRhZ05hbWUsIGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1faW1hZ2VMb2FkZXIgPSAwOwotICAgIG1f
dmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3R5cGUgPSBURVhUOwotICAgIG1f
bWF4TGVuID0gLTE7Ci0gICAgbV9zaXplID0gMjA7Ci0gICAgbV9jaGVja2VkID0gZmFsc2U7Ci0g
ICAgbV9kZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0
cnVlOwotICAgIG1faW5kZXRlcm1pbmF0ZSA9IGZhbHNlOwotCi0gICAgbV9oYXZlVHlwZSA9IGZh
bHNlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci0gICAgbV9hdXRvY29tcGxldGUgPSB0
cnVlOwotICAgIG1faW5pdGVkID0gZmFsc2U7Ci0KLSAgICB4UG9zID0gMDsKLSAgICB5UG9zID0g
MDsKLQotICAgIG1fbWF4UmVzdWx0cyA9IC0xOwotCi0gICAgaWYgKG1fZm9ybSkKLSAgICAgICAg
bV9hdXRvY29tcGxldGUgPSBtX2Zvcm0tPmF1dG9Db21wbGV0ZSgpOwotfQotCi1IVE1MSW5wdXRF
bGVtZW50SW1wbDo6fkhUTUxJbnB1dEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1l
bnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotICAg
IGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudElt
cGw6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBtX25hbWUuaXNOdWxsKCkgPyAiIiA6IG1f
bmFtZTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJs
ZSgpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIGJhc2UgY2xhc3Mgc2F5cyB3ZSBjYW4ndCBiZSBm
b2N1c2VkLCB0aGVuIHdlIGNhbiBzdG9wIG5vdy4KLSAgICBpZiAoIUhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGlmIChtX3R5cGUgPT0gUkFESU8pIHsKLSAgICAgICAgLy8gVW5uYW1lZCByYWRpbyBi
dXR0b25zIGFyZSBuZXZlciBmb2N1c2FibGUgKG1hdGNoZXMgV2luSUUpLgotICAgICAgICBpZiAo
bmFtZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAv
LyBOZXZlciBhbGxvdyBrZXlib2FyZCB0YWJiaW5nIHRvIGxlYXZlIHlvdSBpbiB0aGUgc2FtZSBy
YWRpbyBncm91cC4gIEFsd2F5cwotICAgICAgICAvLyBza2lwIGFueSBvdGhlciBlbGVtZW50cyBp
biB0aGUgZ3JvdXAuCi0gICAgICAgIE5vZGVJbXBsKiBjdXJyZW50Rm9jdXNOb2RlID0gZ2V0RG9j
dW1lbnQoKS0+Zm9jdXNOb2RlKCk7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9jdXNOb2RlICYmIGN1
cnJlbnRGb2N1c05vZGUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBIVE1M
SW5wdXRFbGVtZW50SW1wbCogZm9jdXNlZElucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudEltcGwqPihjdXJyZW50Rm9jdXNOb2RlKTsKLSAgICAgICAgICAgIGlmIChmb2N1c2VkSW5w
dXQtPmlucHV0VHlwZSgpID09IFJBRElPICYmIGZvY3VzZWRJbnB1dC0+Zm9ybSgpID09IG1fZm9y
bSAmJgotICAgICAgICAgICAgICAgIGZvY3VzZWRJbnB1dC0+bmFtZSgpID09IG5hbWUoKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAg
IC8vIEFsbG93IGtleWJvYXJkIGZvY3VzIGlmIHdlJ3JlIGNoZWNrZWQgb3IgaWYgbm90aGluZyBp
biB0aGUgZ3JvdXAgaXMgY2hlY2tlZC4KLSAgICAgICAgcmV0dXJuIGNoZWNrZWQoKSB8fCAhZ2V0
RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9m
b3JtKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIGlmICh0Lmlz
RW1wdHkoKSkgewotICAgICAgICBpbnQgZXhjY29kZTsKLSAgICAgICAgcmVtb3ZlQXR0cmlidXRl
KHR5cGVBdHRyLCBleGNjb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzZXRBdHRyaWJ1
dGUodHlwZUF0dHIsIHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbnB1
dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIHR5cGVFbnVtIG5ld1R5cGU7Ci0gICAg
Ci0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJwYXNzd29yZCIpKQotICAgICAgICBuZXdU
eXBlID0gUEFTU1dPUkQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImNoZWNr
Ym94IikpCi0gICAgICAgIG5ld1R5cGUgPSBDSEVDS0JPWDsKLSAgICBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZSh0LCAicmFkaW8iKSkKLSAgICAgICAgbmV3VHlwZSA9IFJBRElPOwotICAgIGVs
c2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJzdWJtaXQiKSkKLSAgICAgICAgbmV3VHlwZSA9
IFNVQk1JVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmVzZXQiKSkKLSAg
ICAgICAgbmV3VHlwZSA9IFJFU0VUOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQs
ICJmaWxlIikpCi0gICAgICAgIG5ld1R5cGUgPSBGSUxFOwotICAgIGVsc2UgaWYgKGVxdWFsSWdu
b3JpbmdDYXNlKHQsICJoaWRkZW4iKSkKLSAgICAgICAgbmV3VHlwZSA9IEhJRERFTjsKLSAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaW1hZ2UiKSkKLSAgICAgICAgbmV3VHlwZSA9
IElNQUdFOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJidXR0b24iKSkKLSAg
ICAgICAgbmV3VHlwZSA9IEJVVFRPTjsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0
LCAia2h0bWxfaXNpbmRleCIpKQotICAgICAgICBuZXdUeXBlID0gSVNJTkRFWDsKLSAgICBlbHNl
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic2VhcmNoIikpCi0gICAgICAgIG5ld1R5cGUgPSBT
RUFSQ0g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhbmdlIikpCi0gICAg
ICAgIG5ld1R5cGUgPSBSQU5HRTsKLSAgICBlbHNlCi0gICAgICAgIG5ld1R5cGUgPSBURVhUOwot
Ci0gICAgLy8gIyMjIElNUE9SVEFOVDogRG9uJ3QgYWxsb3cgdGhlIHR5cGUgdG8gYmUgY2hhbmdl
ZCB0byBGSUxFIGFmdGVyIHRoZSBmaXJzdAotICAgIC8vIHR5cGUgY2hhbmdlLCBvdGhlcndpc2Ug
YSBKYXZhU2NyaXB0IHByb2dyYW1tZXIgd291bGQgYmUgYWJsZSB0byBzZXQgYSB0ZXh0Ci0gICAg
Ly8gZmllbGQncyB2YWx1ZSB0byBzb21ldGhpbmcgbGlrZSAvZXRjL3Bhc3N3ZCBhbmQgdGhlbiBj
aGFuZ2UgaXQgdG8gYSBmaWxlIGZpZWxkLgotICAgIGlmIChtX3R5cGUgIT0gbmV3VHlwZSkgewot
ICAgICAgICBpZiAobmV3VHlwZSA9PSBGSUxFICYmIG1faGF2ZVR5cGUpIHsKLSAgICAgICAgICAg
IC8vIFNldCB0aGUgYXR0cmlidXRlIGJhY2sgdG8gdGhlIG9sZCB2YWx1ZS4KLSAgICAgICAgICAg
IC8vIFVzZWZ1bCBpbiBjYXNlIHdlIHdlcmUgY2FsbGVkIGZyb20gaW5zaWRlIHBhcnNlTWFwcGVk
QXR0cmlidXRlLgotICAgICAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0eXBlKCkpOwot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAhbmFt
ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5jaGVj
a2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pID09IHRoaXMpCi0g
ICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAo
bmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wg
d2FzQXR0YWNoZWQgPSBtX2F0dGFjaGVkOwotICAgICAgICAgICAgaWYgKHdhc0F0dGFjaGVkKQot
ICAgICAgICAgICAgICAgIGRldGFjaCgpOwotICAgICAgICAgICAgYm9vbCBkaWRTdG9yZVZhbHVl
ID0gc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIG1fdHlw
ZSA9IG5ld1R5cGU7Ci0gICAgICAgICAgICBib29sIHdpbGxTdG9yZVZhbHVlID0gc3RvcmVzVmFs
dWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIGlmIChkaWRTdG9yZVZhbHVl
ICYmICF3aWxsU3RvcmVWYWx1ZSAmJiAhbV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICAgICAg
ICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIG1fdmFsdWUpOwotICAgICAgICAgICAgICAgIG1f
dmFsdWUgPSBET01TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGlk
U3RvcmVWYWx1ZSAmJiB3aWxsU3RvcmVWYWx1ZSkgewotICAgICAgICAgICAgICAgIG1fdmFsdWUg
PSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
ICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgIC8vIElmIG91ciB0eXBlIG1vcnBocyBpbnRvIGEgcmFkaW8gYnV0dG9u
IGFuZCB3ZSBhcmUgY2hlY2tlZCwgdGhlbiBnbyBhaGVhZAotICAgICAgICAgICAgLy8gYW5kIHNp
Z25hbCB0aGlzIHRvIHRoZSBmb3JtLgotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAm
JiBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmFkaW9CdXR0b25D
aGVja2VkKHRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9oYXZlVHlwZSA9
IHRydWU7CiAgICAgCi0gICAgaWYgKG1fdHlwZSAhPSBJTUFHRSAmJiBtX2ltYWdlTG9hZGVyKSB7
Ci0gICAgICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotICAgICAgICBtX2ltYWdlTG9hZGVyID0g
MDsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dHlwZSgpIGNv
bnN0Ci17Ci0gICAgLy8gbmVlZHMgdG8gYmUgbG93ZXJjYXNlIGFjY29yZGluZyB0byBET00gc3Bl
YwotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBURVhUOiByZXR1cm4gInRleHQiOwot
ICAgIGNhc2UgUEFTU1dPUkQ6IHJldHVybiAicGFzc3dvcmQiOwotICAgIGNhc2UgQ0hFQ0tCT1g6
IHJldHVybiAiY2hlY2tib3giOwotICAgIGNhc2UgUkFESU86IHJldHVybiAicmFkaW8iOwotICAg
IGNhc2UgU1VCTUlUOiByZXR1cm4gInN1Ym1pdCI7Ci0gICAgY2FzZSBSRVNFVDogcmV0dXJuICJy
ZXNldCI7Ci0gICAgY2FzZSBGSUxFOiByZXR1cm4gImZpbGUiOwotICAgIGNhc2UgSElEREVOOiBy
ZXR1cm4gImhpZGRlbiI7Ci0gICAgY2FzZSBJTUFHRTogcmV0dXJuICJpbWFnZSI7Ci0gICAgY2Fz
ZSBCVVRUT046IHJldHVybiAiYnV0dG9uIjsKLSAgICBjYXNlIFNFQVJDSDogcmV0dXJuICJzZWFy
Y2giOwotICAgIGNhc2UgUkFOR0U6IHJldHVybiAicmFuZ2UiOwotICAgIGNhc2UgSVNJTkRFWDog
cmV0dXJuICIiOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLVFTdHJpbmcgSFRNTElucHV0
RWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgYXNzZXJ0KG1fdHlwZSAhPSBQQVNTV09SRCk7
CQkvLyBzaG91bGQgbmV2ZXIgc2F2ZS9yZXN0b3JlIHBhc3N3b3JkIGZpZWxkcwotCi0gICAgUVN0
cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpOwotICAgIHN3
aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAg
ICAgICByZXR1cm4gc3RhdGUgKyAoY2hlY2tlZCgpID8gIm9uIiA6ICJvZmYiKTsKLSAgICBkZWZh
dWx0OgotICAgICAgICByZXR1cm4gc3RhdGUgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7IC8vIE1h
a2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQotewotICAg
IGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9y
ZSBwYXNzd29yZCBmaWVsZHMKLSAgICAKLSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKHN0YXRlcyk7Ci0gICAgaWYgKHN0YXRl
LmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgQ0hF
Q0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgc2V0Q2hlY2tlZCgoc3RhdGUgPT0gIm9u
IikpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBzZXRWYWx1ZShET01T
dHJpbmcoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSkpOwotICAgICAgICBicmVhazsKLSAg
ICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmNhbkhhdmVTZWxlY3Rpb24oKQot
ewotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2Fz
ZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLWludCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0aW9uU3RhcnQo
KQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3aXRjaCAobV90
eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGlu
ZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25TdGFydCgpOwotICAgICAgICBkZWZhdWx0Ogot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0
dXJuIDA7Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09S
RDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNlbGVjdGlv
bkVuZCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAg
IHJldHVybiAwOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25T
dGFydChpbnQgc3RhcnQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAg
IHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2Ug
U0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
fQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQoaW50IGVu
ZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5
cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAg
ICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+
KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmKCFtX3JlbmRlcikgcmV0dXJu
OwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbio+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBT
RUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRl
ckxpbmVFZGl0Kj4obV9yZW5kZXIpLT5zZWxlY3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBI
SURERU46Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAg
ICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNFVDoK
LSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50
IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNoICht
X3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0g
ICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0
ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMs
IGJvb2wgc2hvd1ByZXNzZWRMb29rKQotewotICAgIHN3aXRjaCAoaW5wdXRUeXBlKCkpIHsKLSAg
ICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAvLyBhIG5vLW9wIGZvciB0aGlzIHR5cGUK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgY2FzZSBS
RVNFVDoKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGlmIChyZW5k
ZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbiAq
PihyZW5kZXJlcigpKS0+Y2xpY2soc2VuZE1vdXNlRXZlbnRzKTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAg
ICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNs
aWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9u
KGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0g
ICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBl
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAg
ICAgICAgICAgZm9jdXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIRUNL
Qk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAg
Y2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBCVVRUT046Ci0g
ICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgIC8vIGZv
Y3VzCi0gICAgICAgICAgICBmb2N1cygpOwotCi0gICAgICAgICAgICAvLyBzZW5kIHRoZSBtb3Vz
ZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAgICAgICAgIC8vIGNhbGxlciBzcGVjaWZpZWQg
c2VuZFRvQW55RWxlbWVudAotICAgICAgICAgICAgY2xpY2soc2VuZFRvQW55RWxlbWVudCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6
Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0
ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0ciB8
fAotICAgICAgICBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09
IHZzcGFjZUF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaHNwYWNlQXR0cikgewotICAgICAg
ICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAKLSAg
ICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVS
ZXBsYWNlZDsgLy8gU2hhcmUgd2l0aCA8aW1nPiBzaW5jZSB0aGUgYWxpZ25tZW50IGJlaGF2aW9y
IGlzIHRoZSBzYW1lLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJl
dHVybiBIVE1MRWxlbWVudEltcGw6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0
dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikg
ewotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSAmJiBtX2Zvcm0pIHsK
LSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmFkaW8gZnJvbSBpdHMgb2xkIGdyb3VwLgotICAg
ICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAhbV9uYW1lLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG1fbmFtZS5p
bXBsKCksIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFVwZGF0ZSBv
dXIgY2FjaGVkIHJlZmVyZW5jZSB0byB0aGUgbmFtZS4KLSAgICAgICAgbV9uYW1lID0gYXR0ci0+
dmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCBpdCB0byBpdHMgbmV3IGdyb3VwLgot
ICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSkKLSAgICAgICAgICAgIGdl
dERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAgbV9hdXRv
Y29tcGxldGUgPSAhZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09ICB0eXBlQXR0cikgewotICAgICAgICBzZXRJbnB1
dFR5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFs
dWVBdHRyKSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBzZXRDaGFuZ2VkIGlmIHRoZSBm
b3JtIGlzIGxvb2tpbmcgYXQgdGhlIGRlZmF1bHQgdmFsdWUgcmlnaHQgbm93LgotICAgICAgICBp
ZiAobV92YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAg
bV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGNoZWNrZWRBdHRyKSB7Ci0gICAgICAgIG1fZGVmYXVsdENoZWNrZWQgPSAhYXR0ci0+
aXNOdWxsKCk7Ci0gICAgICAgIGlmIChtX3VzZURlZmF1bHRDaGVja2VkKSB7Ci0gICAgICAgICAg
ICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNrZWQpOwotICAgICAgICAgICAgbV91c2VEZWZhdWx0
Q2hlY2tlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBtYXhsZW5ndGhBdHRyKSB7Ci0gICAgICAgIG1fbWF4TGVuID0gIWF0dHItPmlzTnVsbCgpID8g
YXR0ci0+dmFsdWUoKS50b0ludCgpIDogLTE7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSAh
YXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAyMDsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBhbHRBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAmJiBt
X3R5cGUgPT0gSU1BR0UpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KG1f
cmVuZGVyKS0+dXBkYXRlQWx0VGV4dCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IHNyY0F0dHIpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyICYmIG1fdHlwZSA9PSBJTUFHRSkgewot
ICAgICAgICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgICAgIG1faW1hZ2VM
b2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICAgICAgbV9pbWFnZUxv
YWRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IHVzZW1hcEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9
PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBtb21l
bnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2c3BhY2VBdHRyKSB7Ci0gICAgICAg
IGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fVE9QLCBhdHRyLT52YWx1ZSgpKTsK
LSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9CT1RUT00sIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhzcGFjZUF0dHIpIHsK
LSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9MRUZULCBhdHRyLT52
YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9SSUdI
VCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWxpZ25B
dHRyKSB7Ci0gICAgICAgIGFkZEhUTUxBbGlnbm1lbnQoYXR0cik7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBD
U1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1Bf
SEVJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBh
dHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZl
bnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uaW5wdXRBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGlucHV0RXZlbnQsIGF0dHIpOwotICAgIH0K
LSAgICAvLyBTZWFyY2ggZmllbGQgYW5kIHNsaWRlciBhdHRyaWJ1dGVzIGFsbCBqdXN0IGNhdXNl
IHVwZGF0ZUZyb21FbGVtZW50IHRvIGJlIGNhbGxlZCB0aHJvdWdoIHN0eWxlCi0gICAgLy8gcmVj
YWxjaW5nLgotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlYXJjaEF0dHIpIHsKLSAg
ICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc2VhcmNoRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlc3VsdHNBdHRyKSB7Ci0gICAgICAgIG1fbWF4UmVzdWx0
cyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYXV0b3NhdmVB
dHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gaW5jcmVtZW50YWxBdHRyIHx8
Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcGxhY2Vob2xkZXJBdHRyIHx8Ci0gICAg
ICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbWluQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0
ci0+bmFtZSgpID09IG1heEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBw
cmVjaXNpb25BdHRyKSB7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UKLSAgICAg
ICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIp
OwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKFJlbmRl
clN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBjYXNlIFRF
WFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNlIFJBTkdF
OgotICAgIGNhc2UgSVNJTkRFWDoKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86
Ci0gICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBJTUFHRToKLSAgICBjYXNlIFJFU0VUOgotICAg
IGNhc2UgRklMRToKLSAgICBjYXNlIEJVVFRPTjogICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnJlbmRlcmVySXNOZWVkZWQoc3R5bGUpOwotICAgIGNhc2UgSElEREVOOiAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTElucHV0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHN3aXRjaCht
X3R5cGUpCi0gICAgewotICAgIGNhc2UgVEVYVDoKLSAgICBjYXNlIFBBU1NXT1JEOgotICAgIGNh
c2UgU0VBUkNIOgotICAgIGNhc2UgSVNJTkRFWDogIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJM
aW5lRWRpdCh0aGlzKTsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAg
ICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci0gICAg
Y2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAg
cmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLSAgICBjYXNlIElNQUdFOiAg
ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVySW1hZ2VCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBG
SUxFOiAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpbGVCdXR0b24odGhpcyk7Ci0gICAg
Y2FzZSBSQU5HRTogICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclNsaWRlcih0aGlzKTsKLSAg
ICBjYXNlIEhJRERFTjogICBicmVhazsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICBy
ZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAg
ICBpZiAoIW1faW5pdGVkKSB7Ci0gICAgICAgIGlmICghbV9oYXZlVHlwZSkKLSAgICAgICAgICAg
IHNldElucHV0VHlwZShnZXRBdHRyaWJ1dGUodHlwZUF0dHIpKTsKLQotICAgICAgICAvLyBGSVhN
RTogVGhpcyBuZWVkcyB0byBiZSBkeW5hbWljLCBkb2Vzbid0IGl0LCBzaW5jZSBzb21lb25lIGNv
dWxkIHNldCB0aGlzCi0gICAgICAgIC8vIGFmdGVyIGF0dGFjaG1lbnQ/Ci0gICAgICAgIERPTVN0
cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgaWYgKCh1aW50KSBt
X3R5cGUgPD0gSVNJTkRFWCAmJiAhdmFsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gcmVt
b3ZlIG5ld2xpbmUgc3R1ZmYuLgotICAgICAgICAgICAgUVN0cmluZyBudmFsdWU7Ci0gICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZhbC5sZW5ndGgoKTsgKytpKQotICAg
ICAgICAgICAgICAgIGlmICh2YWxbaV0gPj0gJyAnKQotICAgICAgICAgICAgICAgICAgICBudmFs
dWUgKz0gdmFsW2ldOwotCi0gICAgICAgICAgICBpZiAodmFsLmxlbmd0aCgpICE9IG52YWx1ZS5s
ZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBudmFsdWUp
OwotICAgICAgICB9Ci0KLSAgICAgICAgbV9pbml0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8v
IERpc2FsbG93IHRoZSB3aWR0aCBhdHRyaWJ1dGUgb24gaW5wdXRzIG90aGVyIHRoYW4gSElEREVO
IGFuZCBJTUFHRS4KLSAgICAvLyBEdW1iIFdlYiBzaXRlcyB3aWxsIHRyeSB0byBzZXQgdGhlIHdp
ZHRoIGFzIGFuIGF0dHJpYnV0ZSBvbiBmb3JtIGNvbnRyb2xzIHRoYXQgYXJlbid0Ci0gICAgLy8g
aW1hZ2VzIG9yIGhpZGRlbi4KLSAgICBpZiAoaGFzTWFwcGVkQXR0cmlidXRlcygpICYmIG1fdHlw
ZSAhPSBISURERU4gJiYgbV90eXBlICE9IElNQUdFICYmICFnZXRBdHRyaWJ1dGUod2lkdGhBdHRy
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y0NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJp
YnV0ZSh3aWR0aEF0dHIsIGV4Y0NvZGUpOwotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIGlmIChtX3R5cGUgPT0gSU1BR0UpIHsKLSAgICAg
ICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgbV9pbWFnZUxvYWRlciA9IG5ldyBI
VE1MSW1hZ2VMb2FkZXIodGhpcyk7Ci0gICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21F
bGVtZW50KCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICBSZW5kZXJJ
bWFnZSogaW1hZ2VPYmogPSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKCkpOwot
ICAgICAgICAgICAgaW1hZ2VPYmotPnNldEltYWdlKG1faW1hZ2VMb2FkZXItPmltYWdlKCkpOyAg
ICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3aXRoIGNh
bGxpbmcgcGFzc3dvcmRGaWVsZFJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhlIHRpbWlu
ZwotICAgIC8vIHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVhcmx5Ci0g
ICAgaWYgKG1fdHlwZSA9PSBQQVNTV09SRCkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cGFzc3dv
cmRGaWVsZEFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmRldGFjaCgp
Ci17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwotICAgIG1fdmFs
dWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjphbHRUZXh0KCkgY29uc3QKLXsKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8x
OTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvYXBwZW5kaXgvbm90ZXMuaHRtbCNhbHRnZW4KLSAgICAv
LyBhbHNvIGhlYXZpbHkgZGlzY3Vzc2VkIGJ5IEhpeGllIG9uIGJ1Z3ppbGxhCi0gICAgLy8gbm90
ZSB0aGlzIGlzIGludGVudGlvbmFsbHkgZGlmZmVyZW50IHRvIEhUTUxJbWFnZUVsZW1lbnRJbXBs
OjphbHRUZXh0KCkKLSAgICBET01TdHJpbmcgYWx0ID0gZ2V0QXR0cmlidXRlKGFsdEF0dHIpOwot
ICAgIC8vIGZhbGwgYmFjayB0byB0aXRsZSBhdHRyaWJ1dGUKLSAgICBpZiAoYWx0LmlzTnVsbCgp
KQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICBpZiAoYWx0Lmlz
TnVsbCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICBpZiAo
YWx0LmlzRW1wdHkoKSkKLSAgICAgICAgYWx0ID0gaW5wdXRFbGVtZW50QWx0VGV4dCgpOwotCi0g
ICAgcmV0dXJuIGFsdDsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNTdWNjZXNz
ZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1
dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVs
LiBIb3dldmVyLCBvdGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25z
dHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4g
dXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4g
Ci0gICAgLy8gV2FzOiAobV90eXBlID09IFNVQk1JVCAmJiAhbmFtZSgpLmlzRW1wdHkoKSkKLSAg
ICByZXR1cm4gIW1fZGlzYWJsZWQgJiYgKG1fdHlwZSA9PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VC
TUlUKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNBY3RpdmF0ZWRTdWJtaXQo
KSBjb25zdAotewotICAgIHJldHVybiBtX2FjdGl2ZVN1Ym1pdDsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAgICBtX2Fj
dGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmFwcGVu
ZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCAmZW5jb2RpbmcsIGJvb2wgbXVsdGlwYXJ0KQotewotICAg
IC8vIGltYWdlIGdlbmVyYXRlcyBpdHMgb3duIG5hbWVzCi0gICAgaWYgKG5hbWUoKS5pc0VtcHR5
KCkgJiYgbV90eXBlICE9IElNQUdFKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBj
YXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBQQVNTV09SRDoK
LSAgICAgICAgICAgIC8vIGFsd2F5cyBzdWNjZXNzZnVsCi0gICAgICAgICAgICBlbmNvZGluZy5h
cHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQot
ICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAg
aWYgKGNoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFt
ZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBj
YXNlIFJFU0VUOgotICAgICAgICAgICAgLy8gdGhvc2UgYnV0dG9ucyBhcmUgbmV2ZXIgc3VjY2Vz
c2Z1bAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNhc2UgSU1BR0U6Ci0g
ICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGlu
Zy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieCIgOiAobmFtZSgpICsgIi54IiksIGNs
aWNrWCgpKTsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKS5pc0Vt
cHR5KCkgPyAieSIgOiAobmFtZSgpICsgIi55IiksIGNsaWNrWSgpKTsKLSAgICAgICAgICAgICAg
ICBpZiAoIW5hbWUoKS5pc0VtcHR5KCkgJiYgIXZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAg
ICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsK
LQotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVN1Ym1pdCkg
ewotICAgICAgICAgICAgICAgIERPTVN0cmluZyBlbmNfc3RyID0gdmFsdWVXaXRoRGVmYXVsdCgp
OwotICAgICAgICAgICAgICAgIGlmICghZW5jX3N0ci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIGVuY19zdHIpOwotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIHsKLSAg
ICAgICAgICAgIC8vIGNhbid0IHN1Ym1pdCBmaWxlIG9uIEdFVAotICAgICAgICAgICAgLy8gZG9u
J3Qgc3VibWl0IGlmIGRpc3BsYXk6IG5vbmUgb3IgZGlzcGxheTogaGlkZGVuCi0gICAgICAgICAg
ICBpZighbXVsdGlwYXJ0IHx8ICFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZp
c2liaWxpdHkoKSAhPSBraHRtbDo6VklTSUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgICAgIC8vIGlmIG5vIGZpbGVuYW1lIGF0IGFsbCBpcyBlbnRlcmVkLCBy
ZXR1cm4gc3VjY2Vzc2Z1bCwgaG93ZXZlciBlbXB0eQotICAgICAgICAgICAgLy8gbnVsbCB3b3Vs
ZCBiZSBtb3JlIGxvZ2ljYWwgYnV0IG5ldHNjYXBlIHBvc3RzIGFuIGVtcHR5IGZpbGUuIGFyZ2gu
Ci0gICAgICAgICAgICBpZiAodmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBl
bmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgUVN0cmluZygiIikpOwotICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmNvZGluZy5hcHBl
bmRGaWxlKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgfQotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBlbmNvZGluZy5hcHBlbmRE
YXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZXNldCgp
Ci17Ci0gICAgaWYgKHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkpCi0gICAgICAg
IHNldFZhbHVlKERPTVN0cmluZygpKTsKLSAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNrZWQp
OwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRDaGVja2VkKGJvb2wgX2NoZWNrZWQpCi17Ci0gICAgLy8gV2luSUUgZG9l
cyBub3QgYWxsb3cgdW5uYW1lZCByYWRpbyBidXR0b25zIHRvIGV2ZW4gYmUgY2hlY2tlZC4KLSAg
ICBpZiAoY2hlY2tlZCgpID09IF9jaGVja2VkIHx8IChtX3R5cGUgPT0gUkFESU8gJiYgbmFtZSgp
LmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3R5cGUgPT0gUkFESU8g
JiYgX2NoZWNrZWQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0
aGlzLCBtX2Zvcm0pOwotCi0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1f
Y2hlY2tlZCA9IF9jaGVja2VkOwotICAgIHNldENoYW5nZWQoKTsKLSAgICBpZiAocmVuZGVyZXIo
KSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHRoZW1l
KCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotICAgIG9uQ2hhbmdl
KCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEluZGV0ZXJtaW5hdGUoYm9v
bCBfaW5kZXRlcm1pbmF0ZSkKLXsKLSAgICAvLyBPbmx5IGNoZWNrYm94ZXMgaG9ub3IgaW5kZXRl
cm1pbmF0ZS4KLSAgICBpZiAobV90eXBlICE9IENIRUNLQk9YIHx8IGluZGV0ZXJtaW5hdGUoKSA9
PSBfaW5kZXRlcm1pbmF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9pbmRldGVybWluYXRl
ID0gX2luZGV0ZXJtaW5hdGU7Ci0KLSAgICBzZXRDaGFuZ2VkKCk7Ci0KLSAgICBpZiAocmVuZGVy
ZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHRo
ZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjb3B5Tm9uQXR0cmlidXRlUHJvcGVydGllcyhjb25zdCBF
bGVtZW50SW1wbCAqc291cmNlKQotewotICAgIGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICpz
b3VyY2VFbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudEltcGwgKj4oc291
cmNlKTsKLQotICAgIG1fdmFsdWUgPSBzb3VyY2VFbGVtLT5tX3ZhbHVlOwotICAgIG1fY2hlY2tl
ZCA9IHNvdXJjZUVsZW0tPm1fY2hlY2tlZDsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBzb3VyY2VF
bGVtLT5tX2luZGV0ZXJtaW5hdGU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6dmFsdWUoKSBjb25zdAotewotICAgIERPTVN0cmluZyB2YWx1ZSA9IG1fdmFsdWU7Ci0KLSAg
ICAvLyBJdCdzIGltcG9ydGFudCAqbm90KiB0byBmYWxsIGJhY2sgdG8gdGhlIHZhbHVlIGF0dHJp
YnV0ZSBmb3IgZmlsZSBpbnB1dHMsCi0gICAgLy8gYmVjYXVzZSB0aGF0IHdvdWxkIGFsbG93IGEg
bWFsaWNpb3VzIHdlYiBwYWdlIHRvIHVwbG9hZCBmaWxlcyBieSBzZXR0aW5nIHRoZQotICAgIC8v
IHZhbHVlIGF0dHJpYnV0ZSBpbiBtYXJrdXAuCi0gICAgaWYgKHZhbHVlLmlzTnVsbCgpICYmIG1f
dHlwZSAhPSBGSUxFKQotICAgICAgICB2YWx1ZSA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwot
Ci0gICAgLy8gSWYgbm8gYXR0cmlidXRlIGV4aXN0cywgdGhlbiBqdXN0IHVzZSAib24iIG9yICIi
IGJhc2VkIG9mZiB0aGUgY2hlY2tlZCgpIHN0YXRlIG9mIHRoZSBjb250cm9sLgotICAgIGlmICh2
YWx1ZS5pc051bGwoKSAmJiAobV90eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9PSBSQURJTykp
Ci0gICAgICAgIHJldHVybiBET01TdHJpbmcoY2hlY2tlZCgpID8gIm9uIiA6ICIiKTsKLQotICAg
IHJldHVybiB2YWx1ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp2YWx1
ZVdpdGhEZWZhdWx0KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdiA9IHZhbHVlKCk7Ci0gICAg
aWYgKHYuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgICAg
ICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIHYgPSByZXNldEJ1dHRvbkRlZmF1bHRMYWJl
bCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNVQk1JVDoK
LSAgICAgICAgICAgICAgICB2ID0gc3VibWl0QnV0dG9uRGVmYXVsdExhYmVsKCk7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAg
Y2FzZSBDSEVDS0JPWDoKLSAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGNhc2Ug
SElEREVOOgotICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgIGNhc2UgSVNJTkRF
WDoKLSAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICBjYXNlIFJBRElPOgot
ICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAg
ICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiB2OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1
ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIGlmIChtX3R5cGUgPT0gRklMRSkgcmV0
dXJuOwotCi0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIGlmIChzdG9y
ZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKSB7Ci0gICAgICAgIG1fdmFsdWUgPSB2YWx1
ZTsKLSAgICAgICAgaWYgKG1fcmVuZGVyKQotICAgICAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZy
b21FbGVtZW50KCk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
ID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGaXJlIHRoZSAiaW5wdXQiIERPTSBldmVudC4KLSAgICBk
aXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLWJvb2wgSFRN
TElucHV0RWxlbWVudEltcGw6OnN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29u
c3QKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAg
ICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICBjYXNlIEhJRERF
TjoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2Fz
ZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2Fz
ZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZv
aWQqIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwcmVEaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVudElt
cGwgKmV2dCkKLXsKLSAgICAvLyBwcmV2ZW50RGVmYXVsdCBvciAicmV0dXJuIGZhbHNlIiBhcmUg
dXNlZCB0byByZXZlcnNlIHRoZSBhdXRvbWF0aWMgY2hlY2tpbmcvc2VsZWN0aW9uIHdlIGRvIGhl
cmUuCi0gICAgLy8gVGhpcyByZXN1bHQgZ2l2ZXMgdXMgZW5vdWdoIGluZm8gdG8gcGVyZm9ybSB0
aGUgInVuZG8iIGluIHBvc3REaXNwYXRjaCBvZiB0aGUgYWN0aW9uIHdlIHRha2UgaGVyZS4KLSAg
ICB2b2lkKiByZXN1bHQgPSAwOyAKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5
cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xp
Y2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpLT5i
dXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gpIHsKLSAgICAg
ICAgICAgIC8vIEFzIGEgd2F5IHRvIHN0b3JlIHRoZSBzdGF0ZSwgd2UgcmV0dXJuIDAgaWYgd2Ug
d2VyZSB1bmNoZWNrZWQsIDEgaWYgd2Ugd2VyZSBjaGVja2VkLCBhbmQgMiBmb3IKLSAgICAgICAg
ICAgIC8vIGluZGV0ZXJtaW5hdGUuCi0gICAgICAgICAgICBpZiAoaW5kZXRlcm1pbmF0ZSgpKSB7
Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKTB4MjsKLSAgICAgICAgICAgICAgICBz
ZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQq
KTB4MTsKLSAgICAgICAgICAgICAgICBzZXRDaGVja2VkKCFjaGVja2VkKCkpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIHJhZGlvIGJ1dHRvbnMs
IHN0b3JlIHRoZSBjdXJyZW50IHNlbGVjdGVkIHJhZGlvIG9iamVjdC4KLSAgICAgICAgICAgIGlm
IChuYW1lKCkuaXNFbXB0eSgpIHx8IGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
MDsgLy8gVW5uYW1lZCByYWRpbyBidXR0b25zIGRvbnQgZ2V0IGNoZWNrZWQuIENoZWNrZWQgYnV0
dG9ucyBqdXN0IHN0YXkgY2hlY2tlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklY
TUU6IE5lZWQgdG8gbGVhcm4gdG8gd29yayB3aXRob3V0IGEgZm9ybS4KLQotICAgICAgICAgICAg
Ly8gV2UgcmVhbGx5IHdhbnQgcmFkaW8gZ3JvdXBzIHRvIGVuZCB1cCBpbiBzYW5lIHN0YXRlcywg
aS5lLiwgdG8gaGF2ZSBzb21ldGhpbmcgY2hlY2tlZC4KLSAgICAgICAgICAgIC8vIFRoZXJlZm9y
ZSBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSBzZWxlY3RlZCwgd2Ugd29uJ3QgYWxsb3cgdGhpcyBh
Y3Rpb24gdG8gYmUgInVuZG9uZSIsIHNpbmNlCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHNvbWUg
b2JqZWN0IGluIHRoZSByYWRpbyBncm91cCB0byBhY3R1YWxseSBnZXQgc2VsZWN0ZWQuCi0gICAg
ICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY3VyclJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+
Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICAg
ICAgICAgIGlmIChjdXJyUmFkaW8pIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcmFk
aW8gYnV0dG9uIHNlbGVjdGVkIHRoYXQgaXMgbm90IHVzLiAgQ2FjaGUgaXQgaW4gb3VyIHJlc3Vs
dCBmaWVsZCBhbmQgcmVmIGl0IHNvCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4ndCBi
ZSBkZXN0cm95ZWQuCi0gICAgICAgICAgICAgICAgY3VyclJhZGlvLT5yZWYoKTsKLSAgICAgICAg
ICAgICAgICByZXN1bHQgPSBjdXJyUmFkaW87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBz
ZXRDaGVja2VkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19
Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBvc3REaXNwYXRjaEV2ZW50SGFuZGxlcihF
dmVudEltcGwgKmV2dCwgdm9pZCogZGF0YSkKLXsKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JP
WCB8fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBl
KCkgPT0gY2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwq
PihldnQpLT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gp
IHsKLSAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIGNoZWNraW5nIHdlIGRpZCBpbiBwcmVEaXNw
YXRjaC4KLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRl
ZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSAodm9pZCopMHgy
KQotICAgICAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKHRydWUpOwotICAgICAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZChkYXRhKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBIVE1MSW5w
dXRFbGVtZW50SW1wbCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+
KGRhdGEpOwotICAgICAgICAgICAgaWYgKGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpIHx8IGV2dC0+
ZGVmYXVsdEhhbmRsZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdp
bmFsIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBpZiBwb3NzaWJsZS4KLSAgICAgICAgICAgICAgICAv
LyBNYWtlIHN1cmUgaXQgaXMgc3RpbGwgYSByYWRpbyBidXR0b24gYW5kIG9ubHkgZG8gdGhlIHJl
c3RvcmF0aW9uIGlmIGl0IHN0aWxsCi0gICAgICAgICAgICAgICAgLy8gYmVsb25ncyB0byBvdXIg
Z3JvdXAuCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0LT5mb3JtKCkgPT0gZm9ybSgpICYmIGlu
cHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1dC0+bmFtZSgpID09IG5hbWUoKSkgewot
ICAgICAgICAgICAgICAgICAgICAvLyBPaywgdGhlIG9sZCByYWRpbyBidXR0b24gaXMgc3RpbGwg
aW4gb3VyIGZvcm0gYW5kIGluIG91ciBncm91cCBhbmQgaXMgc3RpbGwgYSAKLSAgICAgICAgICAg
ICAgICAgICAgLy8gcmFkaW8gYnV0dG9uLCBzbyBpdCdzIHNhZmUgdG8gcmVzdG9yZSBzZWxlY3Rp
b24gdG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LT5zZXRDaGVja2VkKHRydWUpOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LT5kZXJl
ZigpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpk
ZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlmIChtX3R5cGUgPT0g
SU1BR0UgJiYgZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9PSBjbGlja0V2ZW50
ICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIC8vIHJlY29yZCB0aGUgbW91c2UgcG9zaXRpb24gZm9y
IHdoZW4gd2UgZ2V0IHRoZSBET01BY3RpdmF0ZSBldmVudAotICAgICAgICBNb3VzZUV2ZW50SW1w
bCAqbWUgPSBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2dCk7Ci0gICAgICAgIGludCBv
ZmZzZXRYLCBvZmZzZXRZOwotICAgICAgICBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlvbihvZmZz
ZXRYLG9mZnNldFkpOwotICAgICAgICB4UG9zID0gbWUtPmNsaWVudFgoKS1vZmZzZXRYOwotICAg
ICAgICB5UG9zID0gbWUtPmNsaWVudFkoKS1vZmZzZXRZOwotCi0JbWUtPnNldERlZmF1bHRIYW5k
bGVkKCk7Ci0gICAgfQotCi0gICAgLy8gRE9NQWN0aXZhdGUgZXZlbnRzIGNhdXNlIHRoZSBpbnB1
dCB0byBiZSAiYWN0aXZhdGVkIiAtIGluIHRoZSBjYXNlIG9mIGltYWdlIGFuZCBzdWJtaXQgaW5w
dXRzLCB0aGlzIG1lYW5zCi0gICAgLy8gYWN0dWFsbHkgc3VibWl0dGluZyB0aGUgZm9ybS4gRm9y
IHJlc2V0IGlucHV0cywgdGhlIGZvcm0gaXMgcmVzZXQuIFRoZXNlIGV2ZW50cyBhcmUgc2VudCB3
aGVuIHRoZSB1c2VyIGNsaWNrcwotICAgIC8vIG9uIHRoZSBlbGVtZW50LCBvciBwcmVzc2VzIGVu
dGVyIHdoaWxlIGl0IGlzIHRoZSBhY3RpdmUgZWxlbWVudC4gSmF2YWNzcmlwdCBjb2RlIHdpc2hp
bmcgdG8gYWN0aXZhdGUgdGhlIGVsZW1lbnQKLSAgICAvLyBtdXN0IGRpc3BhdGNoIGEgRE9NQWN0
aXZhdGUgZXZlbnQgLSBhIGNsaWNrIGV2ZW50IHdpbGwgbm90IGRvIHRoZSBqb2IuCi0gICAgaWYg
KGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQpIHsKLSAgICAgICAgaWYgKG1fdHlwZSA9
PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCkgewotICAgICAg
ICAgICAgaWYgKCFtX2Zvcm0pCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg
aWYgKG1fdHlwZSA9PSBSRVNFVCkKLSAgICAgICAgICAgICAgICBtX2Zvcm0tPnJlc2V0KCk7Ci0g
ICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKSkgewotICAgICAg
ICAgICAgICAgICAgICB4UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgeVBvcyA9IDA7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgLy8gVXNlIGtleSBwcmVz
cyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNlIGV2ZW50cwotICAgIC8v
IG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2YgdGhlIGtleSBwcmVzcyBl
dmVudC4KLSAgICBpZiAoZXZ0LT50eXBlKCkgPT0ga2V5cHJlc3NFdmVudCAmJiBldnQtPmlzS2V5
Ym9hcmRFdmVudCgpKSB7Ci0gICAgICAgIGJvb2wgY2xpY2tFbGVtZW50ID0gZmFsc2U7Ci0gICAg
ICAgIGJvb2wgY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IGZhbHNlOwotCi0gICAgICAgIERPTVN0
cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpLT5rZXlJZGVu
dGlmaWVyKCk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSAiVSswMDAwMjAiKSB7Ci0gICAgICAgICAg
ICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAg
ICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFOgotICAg
ICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAg
ICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxh
dGUgbW91c2UgY2xpY2sgZm9yIHNwYWNlYmFyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4K
LSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEFwcEtpdCBhbHJlYWR5IGRvZXMgdGhpcyBmb3Ig
c29tZSwgYnV0IG5vdCBhbGwsIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrRWxl
bWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg
IGNhc2UgUkFESU86Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIHVuc2VsZWN0ZWQgcmFk
aW8gaXMgdGFiYmVkIGludG8gKGJlY2F1c2UgdGhlIGVudGlyZSBncm91cCBoYXMgbm90aGluZwot
ICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkLCBvciBiZWNhdXNlIG9mIHNvbWUgZXhwbGlj
aXQgLmZvY3VzKCkgY2FsbCksIHRoZW4gYWxsb3cgc3BhY2UgdG8gY2hlY2sgaXQuCi0gICAgICAg
ICAgICAgICAgICAgIGlmICghY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY2xp
Y2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAg
ICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAg
ICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6Ci0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKGtleSA9PSAiRW50ZXIiKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgICAgIGNhc2UgQ0hF
Q0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBJU0lOREVYOgotICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAg
ICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAg
ICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNs
aWNrIG9uIHRoZSBkZWZhdWx0IGZvcm0gYnV0dG9uIGZvciBlbnRlciBmb3IgdGhlc2UgdHlwZXMg
b2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24g
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNl
IEZJTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgICAgICBjYXNl
IFJFU0VUOgotICAgICAgICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgICAgICAg
ICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVs
ZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAg
ICAgICAgICAgICAgICBicmVhazsgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIGVudGVyIG9uIGEg
cmFkaW8gYnV0dG9uLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1f
dHlwZSA9PSBSQURJTyAmJiAoa2V5ID09ICJVcCIgfHwga2V5ID09ICJEb3duIiB8fCBrZXkgPT0g
IkxlZnQiIHx8IGtleSA9PSAiUmlnaHQiKSkgewotICAgICAgICAgICAgLy8gTGVmdCBhbmQgdXAg
bWVhbiAicHJldmlvdXMgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFJpZ2h0IGFuZCBk
b3duIG1lYW4gIm5leHQgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFRlc3RlZCBpbiBX
aW5JRSwgYW5kIGV2ZW4gZm9yIFJUTCwgbGVmdCBzdGlsbCBtZWFucyBwcmV2aW91cyByYWRpbyBi
dXR0b24gKGFuZCBzbyBtb3ZlcwotICAgICAgICAgICAgLy8gdG8gdGhlIHJpZ2h0KS4gIFNlZW1z
IHN0cmFuZ2UsIGJ1dCB3ZSdsbCBtYXRjaCBpdC4KLSAgICAgICAgICAgIGJvb2wgZm9yd2FyZCA9
IChrZXkgPT0gIkRvd24iIHx8IGtleSA9PSAiUmlnaHQiKTsKLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgLy8gV2UgY2FuIG9ubHkgc3RheSB3aXRoaW4gdGhlIGZvcm0ncyBjaGlsZHJlbiBpZiB0
aGUgZm9ybSBoYXNuJ3QgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiBiZWNhdXNlCi0gICAgICAgICAg
ICAvLyBvZiBtYWxmb3JtZWQgSFRNTC4KLSAgICAgICAgICAgIE5vZGVJbXBsKiBuID0gdGhpczsK
LSAgICAgICAgICAgIHdoaWxlICgobiA9IChmb3J3YXJkID8gbi0+dHJhdmVyc2VOZXh0Tm9kZSgp
IDogbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25j
ZSB3ZSBlbmNvdW50ZXIgYSBmb3JtIGVsZW1lbnQsIHdlIGtub3cgd2UncmUgdGhyb3VnaC4KLSAg
ICAgICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIExv
b2sgZm9yIG1vcmUgcmFkaW8gYnV0dG9ucy4KLSAgICAgICAgICAgICAgICBpZiAobi0+aGFzVGFn
TmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudElt
cGwqIGVsdCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4obik7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmIChlbHQtPmZvcm0oKSAhPSBtX2Zvcm0pCi0gICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5w
dXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCog
aW5wdXRFbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWx0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBp
bnB1dEVsdC0+bmFtZSgpID09IG5hbWUoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlucHV0RWx0LT5pc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW5wdXRFbHQtPnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
Z2V0RG9jdW1lbnQoKS0+c2V0Rm9jdXNOb2RlKGlucHV0RWx0KTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnB1dEVsdC0+Y2xpY2soZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoY2xpY2tFbGVtZW50KSB7Ci0gICAgICAgICAgICBjbGljayhmYWxzZSk7
Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0gZWxzZSBp
ZiAoY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiAmJiBtX2Zvcm0pIHsKLSAgICAgICAgICAgIG1fZm9y
bS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZh
dWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6Omlz
RWRpdGFibGUoKQotewotICAgIHJldHVybiAoKG1fdHlwZSA9PSBURVhUKSB8fCAobV90eXBlID09
IFBBU1NXT1JEKSB8fAotICAgICAgICAgICAgKG1fdHlwZSA9PSBTRUFSQ0gpIHx8IChtX3R5cGUg
PT0gSVNJTkRFWCkgfHwgKG1fdHlwZSA9PSBGSUxFKSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxl
bWVudEltcGw6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIChhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHZhbHVlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNl
dERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh2YWx1ZUF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVm
YXVsdENoZWNrZWQoKSBjb25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKGNoZWNrZWRB
dHRyKS5pc051bGwoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0RGVmYXVs
dENoZWNrZWQoYm9vbCBkZWZhdWx0Q2hlY2tlZCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hlY2tl
ZEF0dHIsIGRlZmF1bHRDaGVja2VkID8gIiIgOiAwKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjphY2NlcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
YWNjZXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjY2VwdChj
b25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2NlcHRBdHRyLCB2
YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1E
T01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6
OmFsdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWx0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGFsdEF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0TWF4TGVuZ3RoKGludCBfbWF4TGVuZ3RoKQotewotICAgIHNldEF0
dHJpYnV0ZShtYXhsZW5ndGhBdHRyLCBRU3RyaW5nOjpudW1iZXIoX21heExlbmd0aCkpOwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTaXplKHVuc2lnbmVkIF9zaXplKQotewot
ICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9zaXplKSk7Ci19Ci0K
LURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3JjKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoZ2V0QXR0cmlidXRlKHNyY0F0dHIpKTsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U3JjKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5n
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp1c2VNYXAoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUodXNlbWFwQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNl
dFVzZU1hcChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh1c2Vt
YXBBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExhYmVsRWxl
bWVudEltcGw6OkhUTUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAgIDog
SFRNTEVsZW1lbnRJbXBsKGxhYmVsVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxMYWJlbEVsZW1lbnRJ
bXBsOjp+SFRNTExhYmVsRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMYWJlbEVsZW1l
bnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12
b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIp
IHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1M
RXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1M
RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1FbGVtZW50SW1w
bCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm1FbGVtZW50KCkKLXsKLSAgICBET01TdHJpbmcg
Zm9ybUVsZW1lbnRJZCA9IGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLSAgICBpZiAoZm9ybUVsZW1l
bnRJZC5pc051bGwoKSkgewotICAgICAgICAvLyBTZWFyY2ggY2hpbGRyZW4gb2YgdGhlIGxhYmVs
IGVsZW1lbnQgZm9yIGEgZm9ybSBlbGVtZW50LgotICAgICAgICBOb2RlSW1wbCAqbm9kZSA9IHRo
aXM7Ci0gICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhpcykp
KSB7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAg
ICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJ
bXBsICo+KG5vZGUpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5pc0dlbmVyaWNGb3Jt
RWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGZvcm1F
bGVtZW50SWQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZ2V0RG9j
dW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZm9ybUVsZW1lbnRJZCk7Ci19Ci0KLXZvaWQgSFRNTExh
YmVsRWxlbWVudEltcGw6OmZvY3VzKCkKLXsKLSAgICBpZiAoRWxlbWVudEltcGwgKmVsZW1lbnQg
PSBmb3JtRWxlbWVudCgpKQotICAgICAgICBlbGVtZW50LT5mb2N1cygpOwotfQotCi12b2lkIEhU
TUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50
KQotewotICAgIEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKTsKLSAgICBpZiAo
ZWxlbWVudCkKLSAgICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVsZW1l
bnQpOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9y
bSgpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKTsgcCAhPSAwOyBwID0g
cC0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChwLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQot
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudEltcGwgKj4ocCk7
Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotCi1ET01TdHJpbmcgSFRNTExhYmVsRWxl
bWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShh
Y2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tl
eUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpodG1s
Rm9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZvckF0dHIpOwotfQotCi12
b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpzZXRIdG1sRm9yKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGZvckF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1IVE1MTGVnZW5kRWxlbWVudEltcGw6OkhUTUxMZWdlbmRFbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLTogSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwobGVnZW5kVGFnLCBkb2MsIGYpCi17Ci19Ci0KLUhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6fkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTExl
Z2VuZEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVy
ZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJu
IG5ldyAoYXJlbmEpIFJlbmRlckxlZ2VuZCh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJsZWdlbmQiOwotfQot
Ci1ET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExl
Z2VuZEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcg
SFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0
QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25B
dHRyLCB2YWx1ZSk7Ci19Ci0KLUVsZW1lbnRJbXBsICpIVE1MTGVnZW5kRWxlbWVudEltcGw6OmZv
cm1FbGVtZW50KCkKLXsKLSAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgZmllbGRzZXQgYmVsb25n
aW5nIHRvIHRoaXMgbGVnZW5kLgotICAgIE5vZGVJbXBsICpmaWVsZHNldCA9IHBhcmVudE5vZGUo
KTsKLSAgICB3aGlsZSAoZmllbGRzZXQgJiYgIWZpZWxkc2V0LT5oYXNUYWdOYW1lKGZpZWxkc2V0
VGFnKSkKLSAgICAgICAgZmllbGRzZXQgPSBmaWVsZHNldC0+cGFyZW50Tm9kZSgpOwotICAgIGlm
ICghZmllbGRzZXQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gRmluZCBmaXJzdCBmb3Jt
IGVsZW1lbnQgaW5zaWRlIHRoZSBmaWVsZHNldC4KLSAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGNh
cmUgYWJvdXQgdGFiaW5kZXg/Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBmaWVsZHNldDsKLSAgICB3
aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKGZpZWxkc2V0KSkpIHsKLSAgICAg
ICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgSFRNTEVsZW1lbnRJ
bXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpOwotICAg
ICAgICAgICAgaWYgKCFlbGVtZW50LT5oYXNMb2NhbE5hbWUobGVnZW5kVGFnKSAmJiBlbGVtZW50
LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTExlZ2Vu
ZEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0g
Zm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1M
TGVnZW5kRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQp
Ci17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAg
ICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNlbGVjdEVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDog
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoc2VsZWN0VGFnLCBkb2MsIGYpLCBtX29wdGlvbnMo
MCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNlbGVj
dEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAq
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwodGFnTmFtZSwgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgpOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5pdCgpCi17Ci0gICAgbV9vcHRpb25zID0g
MDsKLSAgICBtX211bHRpcGxlID0gZmFsc2U7Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSBmYWxz
ZTsKLSAgICAvLyAwIG1lYW5zIGludmFsaWQgKGkuZS4gbm90IHNldCkKLSAgICBtX3NpemUgPSAw
OwotICAgIG1fbWlud2lkdGggPSAwOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6On5IVE1M
U2VsZWN0RWxlbWVudEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1bWVu
dCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci0gICAgaWYgKG1fb3B0aW9ucykg
ewotICAgICAgICBtX29wdGlvbnMtPmRldGFjaCgpOwotICAgICAgICBtX29wdGlvbnMtPmRlcmVm
KCk7Ci0gICAgfQotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29u
c3QgTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aXNUZXh0Tm9k
ZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhhc1Rh
Z05hbWUob3B0Z3JvdXBUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGhyVGFnKSB8fAotICAg
ICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi12b2lkIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAgICBp
ZiAoaGFzQ2hhbmdlZENoaWxkKCkgJiYgbV9yZW5kZXIpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8
a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7
Ci0gICAgfQotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBj
aCApOwotfQotCi0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnR5cGUoKSBjb25z
dAotewotICAgIHJldHVybiAobV9tdWx0aXBsZSA/ICJzZWxlY3QtbXVsdGlwbGUiIDogInNlbGVj
dC1vbmUiKTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2VsZWN0ZWRJbmRleCgp
IGNvbnN0Ci17Ci0gICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG9wdGlvbiBz
ZWxlY3RlZAotICAgIHVpbnQgbyA9IDA7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+
IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBp
dGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShv
cHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBv
OwotICAgICAgICAgICAgbysrOwotICAgICAgICB9Ci0gICAgfQotICAgIFFfQVNTRVJUKG1fbXVs
dGlwbGUpOwotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6
OnNldFNlbGVjdGVkSW5kZXgoIGludCAgaW5kZXggKQotewotICAgIC8vIGRlc2VsZWN0IGFsbCBv
dGhlciBvcHRpb25zIGFuZCBzZWxlY3Qgb25seSB0aGUgbmV3IG9uZQotICAgIFFNZW1BcnJheTxI
VE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBsaXN0SW5kZXg7
Ci0gICAgZm9yIChsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBpbnQoaXRlbXMuc2l6ZSgpKTsg
bGlzdEluZGV4KyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKj4oaXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICB9Ci0gICAg
bGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoaW5kZXgpOwotICAgIGlmIChsaXN0SW5kZXgg
Pj0gMCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNb
bGlzdEluZGV4XSktPnNldFNlbGVjdGVkKHRydWUpOwotCi0gICAgc2V0Q2hhbmdlZCh0cnVlKTsK
LX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICBp
bnQgbGVuID0gMDsKLSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+
IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsg
aSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0g
ICAgICAgICAgICBsZW4rKzsKLSAgICB9Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotdm9pZCBIVE1M
U2VsZWN0RWxlbWVudEltcGw6OmFkZCggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBIVE1MRWxl
bWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBSZWZQdHI8SFRN
TEVsZW1lbnRJbXBsPiBwcm90ZWN0TmV3Q2hpbGQoZWxlbWVudCk7IC8vIG1ha2Ugc3VyZSB0aGUg
ZWxlbWVudCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICBp
ZiAoIWVsZW1lbnQgfHwgIShlbGVtZW50LT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSB8fCBlbGVt
ZW50LT5oYXNMb2NhbE5hbWUoaHJUYWcpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW5zZXJ0
QmVmb3JlKGVsZW1lbnQsIGJlZm9yZSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCFleGNlcHRp
b25jb2RlKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotdm9pZCBIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnJlbW92ZSggaW50IGluZGV4ICkKLXsKLSAgICBpbnQgZXhjZXB0aW9u
Y29kZSA9IDA7Ci0gICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsK
LQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwot
ICAgIGlmKGxpc3RJbmRleCA8IDAgfHwgaW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAg
ICAgIHJldHVybjsgLy8gIyMjIHdoYXQgc2hvdWxkIHdlIGRvID8gcmVtb3ZlIHRoZSBsYXN0IGl0
ZW0/Ci0KLSAgICBOb2RlSW1wbCAqaXRlbSA9IGl0ZW1zW2xpc3RJbmRleF07Ci0gICAgaXRlbS0+
cmVmKCk7Ci0gICAgcmVtb3ZlQ2hpbGQoaXRlbSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaXRlbS0+
ZGVyZWYoKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0
SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6dmFsdWUoKQot
ewotICAgIHVpbnQgaTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBs
aXN0SXRlbXMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAg
ICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0p
LT52YWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gRE9NU3RyaW5nKCIiKTsKLX0KLQotdm9pZCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17
Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gZmluZCB0
aGUgb3B0aW9uIHdpdGggdmFsdWUoKSBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVyCi0gICAg
Ly8gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgIFFNZW1BcnJheTxIVE1M
RWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2Nh
bE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihp
dGVtc1tpXSktPnZhbHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhU
TUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQotUVN0cmluZyBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OnN0YXRlKCkKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMg
PSBsaXN0SXRlbXMoKTsKLQotICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKLQotICAgIFFDaGFy
IHN0YXRlQ2hhcnNbbF07Ci0gICAgCi0gICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykKLSAg
ICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpICYmIHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAg
ICAgIHN0YXRlQ2hhcnNbaV0gPSAnWCc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRl
Q2hhcnNbaV0gPSAnLic7Ci0gICAgUVN0cmluZyBzdGF0ZShzdGF0ZUNoYXJzLCBsKTsKLQotICAg
IHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKSArIHN0YXRlOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZf
c3RhdGVzKQotewotICAgIFFTdHJpbmcgX3N0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmZpbmRNYXRjaGluZ1N0YXRlKF9zdGF0ZXMpOwotICAgIGlmIChfc3RhdGUuaXNOdWxsKCkp
IHJldHVybjsKLQotICAgIHJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgUVN0cmluZyBzdGF0ZSA9
IF9zdGF0ZTsKLSAgICBpZighc3RhdGUuaXNFbXB0eSgpICYmICFzdGF0ZS5jb250YWlucygnWCcp
ICYmICFtX211bHRpcGxlKSB7Ci0gICAgICAgIHFXYXJuaW5nKCJzaG91bGQgbm90IGhhcHBlbiBp
biByZXN0b3JlU3RhdGUhIik7Ci0gICAgICAgIC8vIEtXUVN0cmluZyBkb2Vzbid0IHN1cHBvcnQg
dGhpcyBvcGVyYXRpb24uIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhbnl3YXkuCi0gICAgICAgIC8v
c3RhdGVbMF0gPSAnWCc7Ci0gICAgfQotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+
IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0gICAg
Zm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotICAgICAgICBpZihpdGVtc1tpXS0+aGFzTG9j
YWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCog
b2UgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAg
ICAgICAgICBvZS0+c2V0U2VsZWN0ZWQoc3RhdGVbaV0gPT0gJ1gnKTsKLSAgICAgICAgfQotICAg
IH0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdDaGlsZCxyZWZDaGlsZCwg
ZXhjZXB0aW9uY29kZSApOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAgc2V0UmVj
YWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2Rl
SW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJl
c3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQobmV3Q2hpbGQs
b2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAg
ICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJ
bXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENo
aWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNv
ZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVt
cygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0
aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHNldENoYW5nZWQo
dHJ1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwqIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHNldFJlY2FsY0xp
c3RJdGVtcygpOwotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YWRkQ2hp
bGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+
bmFtZSgpID09IHNpemVBdHRyKSB7Ci0gICAgICAgIG1fc2l6ZSA9IGtNYXgoYXR0ci0+dmFsdWUo
KS50b0ludCgpLCAxKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIp
IHsKLSAgICAgICAgbV9taW53aWR0aCA9IGtNYXgoIGF0dHItPnZhbHVlKCkudG9JbnQoKSwgMCAp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG11bHRpcGxlQXR0cikgewotICAgICAg
ICBtX211bHRpcGxlID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0
aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsK
LSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZl
bnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VF
dmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1M
U2VsZWN0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVu
ZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTZWxlY3Qo
dGhpcyk7Ci19Ci0KLWJvb2wgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShG
b3JtRGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIGJvb2wgc3VjY2Vzc2Z1
bCA9IGZhbHNlOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJ
dGVtcygpOwotCi0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7
Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGlmIChvcHRp
b24tPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmRE
YXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzZnVs
ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICMjIyB0
aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4uIG1ha2Ugc3VyZSB0aGF0IHdlIHNlbGVjdCB0aGUg
Zmlyc3Qgb3B0aW9uCi0gICAgLy8gaW4gYW55IGNhc2UuIG90aGVyd2lzZSB3ZSBoYXZlIG5vIGNv
bnNpc3RlbmN5IHdpdGggdGhlIERPTSBpbnRlcmZhY2UuIEZJWE1FIQotICAgIC8vIHdlIHJldHVy
biB0aGUgZmlyc3Qgb25lIGlmIGl0IHdhcyBhIGNvbWJvYm94IHNlbGVjdAotICAgIGlmICghc3Vj
Y2Vzc2Z1bCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSAmJiBpdGVtcy5zaXplKCkgJiYK
LSAgICAgICAgKGl0ZW1zWzBdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkpIHsKLSAgICAgICAg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxl
bWVudEltcGwqPihpdGVtc1swXSk7Ci0gICAgICAgIGlmIChvcHRpb24tPnZhbHVlKCkuaXNOdWxs
KCkpCi0gICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9u
LT50ZXh0KCkucXN0cmluZygpLnN0cmlwV2hpdGVTcGFjZSgpKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dmFsdWUo
KSk7Ci0gICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBzdWNj
ZXNzZnVsOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25Ub0xpc3RJbmRl
eChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1w
bCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKG9wdGlvbkluZGV4IDwgMCB8fCBvcHRp
b25JbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAg
aW50IGxpc3RJbmRleCA9IDA7Ci0gICAgaW50IG9wdGlvbkluZGV4MiA9IDA7Ci0gICAgZm9yICg7
Ci0gICAgICAgICBvcHRpb25JbmRleDIgPCBpbnQoaXRlbXMuc2l6ZSgpKSAmJiBvcHRpb25JbmRl
eDIgPD0gb3B0aW9uSW5kZXg7Ci0gICAgICAgICBsaXN0SW5kZXgrKykgeyAvLyBub3QgYSB0eXBv
IQotICAgICAgICBpZiAoaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykp
Ci0gICAgICAgICAgICBvcHRpb25JbmRleDIrKzsKLSAgICB9Ci0gICAgbGlzdEluZGV4LS07Ci0g
ICAgcmV0dXJuIGxpc3RJbmRleDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bGlz
dFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3QKLXsKLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZiAobGlzdEluZGV4IDwg
MCB8fCBsaXN0SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkgfHwKLSAgICAgICAgIWl0ZW1zW2xp
c3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICByZXR1cm4gLTE7Ci0K
LSAgICBpbnQgb3B0aW9uSW5kZXggPSAwOyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9uIG5vdCBj
b3VudGluZyBPUFRHUk9VUCBlbnRyaWVzIHRoYXQgbWF5IGJlIGluIGxpc3QKLSAgICBpbnQgaTsK
LSAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdEluZGV4OyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tp
XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBvcHRpb25JbmRleCsrOwot
ICAgIHJldHVybiBvcHRpb25JbmRleDsKLX0KLQotLy8gRklYTUUgNDE5Nzk5NzogdGhpcyBtZXRo
b2QgaXMgdXNlZCBieSB0aGUgcHVibGljIEFQSSAtW0RPTUhUTUxTZWxlY3RFbGVtZW50IG9wdGlv
bnNdLCBidXQgYWx3YXlzIHJldHVybnMKLS8vIGFuIGVtcHR5IGxpc3QuCi1IVE1MT3B0aW9uc0Nv
bGxlY3Rpb25JbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6Om9wdGlvbnMoKQotewotICAgIGlm
ICghbV9vcHRpb25zKSB7Ci0gICAgICAgIG1fb3B0aW9ucyA9IG5ldyBIVE1MT3B0aW9uc0NvbGxl
Y3Rpb25JbXBsKHRoaXMpOwotICAgICAgICBtX29wdGlvbnMtPnJlZigpOwotICAgIH0KLSAgICBy
ZXR1cm4gbV9vcHRpb25zOwotfQotCi0vLyBGSVhNRTogRGVsZXRlIG9uY2UgdGhlIGFib3ZlIGZ1
bmN0aW9uIGlzIHdvcmtpbmcgd2VsbCBlbm91Z2ggdG8gdXNlIGZvciByZWFsLgotUmVmUHRyPEhU
TUxDb2xsZWN0aW9uSW1wbD4gSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zSFRNTENvbGxl
Y3Rpb24oKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRN
TENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6U0VMRUNUX09QVElPTlMp
KTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlY2FsY0xpc3RJdGVtcygpCi17
Ci0gICAgTm9kZUltcGwqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7Ci0gICAgbV9saXN0SXRlbXMu
cmVzaXplKDApOwotICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCogZm91bmRTZWxlY3RlZCA9IDA7
Ci0gICAgd2hpbGUoY3VycmVudCkgewotICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShv
cHRncm91cFRhZykgJiYgY3VycmVudC0+Zmlyc3RDaGlsZCgpKSB7Ci0gICAgICAgICAgICAvLyAj
IyMgd2hhdCBpZiBvcHRncm91cCBjb250YWlucyBqdXN0IGNvbW1lbnRzPyBkb24ndCB3YW50IG9u
ZSBvZiBubyBvcHRpb25zIGluIGl0Li4uCi0gICAgICAgICAgICBtX2xpc3RJdGVtcy5yZXNpemUo
bV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9saXN0SXRl
bXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0g
ICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAgICB9Ci0g
ICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAg
IG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBt
X2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVu
dEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIGlmICghZm91bmRTZWxlY3RlZCAmJiAhbV9t
dWx0aXBsZSAmJiBtX3NpemUgPD0gMSkgewotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQg
PSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAg
ICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUgJiYgc3Rh
dGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCktPnNlbGVjdGVkKCkpIHsK
LSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAg
ICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChj
dXJyZW50LT5oYXNUYWdOYW1lKGhyVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVz
aXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlz
dEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQp
OwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsICpwYXJlbnQgPSBjdXJyZW50LT5wYXJlbnRO
b2RlKCk7Ci0gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOwotICAgICAg
ICBpZiAoIWN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gdGhpcykKLSAgICAg
ICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50LT5uZXh0U2libGluZygpOwotICAgICAgICB9Ci0g
ICAgfQotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFJlY2FsY0xpc3RJdGVt
cygpOwotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgp
OwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0UmVjYWxjTGlzdEl0ZW1zKCkK
LXsKLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAg
ICAgICBzdGF0aWNfY2FzdDxraHRtbDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRPcHRp
b25zQ2hhbmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+
IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBp
dGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShv
cHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9
IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAg
ICAgIGJvb2wgc2VsZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0ciku
aXNOdWxsKCkpOwotICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZChzZWxlY3RlZCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCBtX3JlbmRlciApCi0gICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLSAg
ICBzZXRDaGFuZ2VkKCB0cnVlICk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpu
b3RpZnlPcHRpb25TZWxlY3RlZChIVE1MT3B0aW9uRWxlbWVudEltcGwgKnNlbGVjdGVkT3B0aW9u
LCBib29sIHNlbGVjdGVkKQotewotICAgIGlmIChzZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSkgewot
ICAgICAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucwotICAgICAgICBRTWVtQXJyYXk8
SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICAgICAgdWludCBpOwot
ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAg
IGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5tX3NlbGVjdGVk
ID0gKGl0ZW1zW2ldID09IHNlbGVjdGVkT3B0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBp
ZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVy
KS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19
Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0KQotewotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5k
aW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhl
IHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlw
ZSgpID09IGtleXByZXNzRXZlbnQpIHsKLSAgICAKLSAgICAgICAgaWYgKCFtX2Zvcm0gfHwgIW1f
cmVuZGVyIHx8ICFldnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAKLSAgICAgICAgRE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZl
bnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChr
ZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgbV9mb3JtLT5zdWJtaXRDbGljaygpOwotICAg
ICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgfQotICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19
Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5k
VG9BbnlFbGVtZW50KQotewotICAgIGZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpzZXRNdWx0aXBsZShib29sIG11bHRpcGxlKQotewotICAgIHNldEF0dHJpYnV0ZSht
dWx0aXBsZUF0dHIsIG11bHRpcGxlID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OnNldFNpemUoaW50IHNpemUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNpemVBdHRy
LCBRU3RyaW5nOjpudW1iZXIoc2l6ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhU
TUxLZXlnZW5FbGVtZW50SW1wbDo6SFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCog
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsKiBmKQotICAgIDogSFRNTFNlbGVjdEVsZW1lbnRJbXBs
KGtleWdlblRhZywgZG9jLCBmKQotewotICAgIFFTdHJpbmdMaXN0IGtleXMgPSBLU1NMS2V5R2Vu
OjpzdXBwb3J0ZWRLZXlTaXplcygpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGkg
PSBrZXlzLmJlZ2luKCk7IGkgIT0ga2V5cy5lbmQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxPcHRp
b25FbGVtZW50SW1wbCogbyA9IG5ldyBIVE1MT3B0aW9uRWxlbWVudEltcGwoZG9jLCBmb3JtKCkp
OwotICAgICAgICBhZGRDaGlsZChvKTsKLSAgICAgICAgby0+YWRkQ2hpbGQobmV3IFRleHRJbXBs
KGRvYywgRE9NU3RyaW5nKCppKSkpOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIEhUTUxLZXlnZW5F
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJrZXlnZW4iOwotfQotCi12
b2lkIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0
cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGNoYWxsZW5nZUF0
dHIpCi0gICAgICAgIG1fY2hhbGxlbmdlID0gYXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0ga2V5dHlwZUF0dHIpCi0gICAgICAgIG1fa2V5VHlwZSA9IGF0dHItPnZh
bHVlKCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBza2lwIEhUTUxTZWxlY3RFbGVtZW50SW1wbCBw
YXJzaW5nIQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEtleWdlbkVsZW1lbnRJbXBsOjphcHBlbmRG
b3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIC8vIE9u
bHkgUlNBIGlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuCi0gICAgaWYgKCFtX2tleVR5cGUuaXNO
dWxsKCkgJiYgIWVxdWFsSWdub3JpbmdDYXNlKG1fa2V5VHlwZSwgInJzYSIpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgUVN0cmluZyB2YWx1ZSA9IEtTU0xLZXlHZW46OnNpZ25lZFB1Ymxp
Y0tleUFuZENoYWxsZW5nZVN0cmluZyhzZWxlY3RlZEluZGV4KCksIG1fY2hhbGxlbmdlLnFzdHJp
bmcoKSwgZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKS0+YmFzZVVSTCgpKTsKLSAgICBpZiAodmFsdWUu
aXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGVkX3ZhbHVlcy5hcHBl
bmREYXRhKG5hbWUoKSwgdmFsdWUudXRmOCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6SFRNTE9wdEdyb3Vw
RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0g
ICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChvcHRncm91cFRhZywgZG9jLCBmKQotewot
fQotCi1IVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6fkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKCkK
LXsKLX0KLQotYm9vbCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25z
dAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIm9wdGdyb3VwIjsKLX0KLQotTm9k
ZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAq
bmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAg
ICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJl
Zm9yZShuZXdDaGlsZCxyZWZDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCAhZXhjZXB0
aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlcGxhY2VDaGls
ZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAg
ICBpZighZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAg
IHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6
cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17
Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW1v
dmVDaGlsZChvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2Rl
ICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19
Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJl
c3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZChuZXdDaGlsZCwg
ZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgcmVjYWxj
U2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1M
T3B0R3JvdXBFbGVtZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAg
IHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6YWRkQ2hpbGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQot
ewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShh
dHRyKTsKLSAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdEdyb3Vw
RWxlbWVudEltcGw6OnJlY2FsY1NlbGVjdE9wdGlvbnMoKQotewotICAgIE5vZGVJbXBsICpzZWxl
Y3QgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNUYWdO
YW1lKHNlbGVjdFRhZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgpOwot
ICAgIGlmIChzZWxlY3QpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1w
bCo+KHNlbGVjdCktPnNldFJlY2FsY0xpc3RJdGVtcygpOwotfQotCi1ET01TdHJpbmcgSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OmxhYmVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGxhYmVsQXR0cik7Ci19Ci0KLXZvaWQgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnNldExh
YmVsKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxhYmVsQXR0
ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRpb25FbGVtZW50
SW1wbDo6SFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0aW9uVGFn
LCBkb2MsIGYpCi17Ci0gICAgbV9zZWxlY3RlZCA9IGZhbHNlOwotfQotCi1ib29sIEhUTUxPcHRp
b25FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuICJvcHRpb24iOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBs
Ojp0ZXh0KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdGV4dDsKLQotICAgIC8vIFdpbklFIGRv
ZXMgbm90IHVzZSB0aGUgbGFiZWwgYXR0cmlidXRlLCBzbyBhcyBhIHF1aXJrLCB3ZSBpZ25vcmUg
aXQuCi0gICAgaWYgKGdldERvY3VtZW50KCkgJiYgIWdldERvY3VtZW50KCktPmluQ29tcGF0TW9k
ZSgpKSB7Ci0gICAgICAgIERPTVN0cmluZyB0ZXh0ID0gZ2V0QXR0cmlidXRlKGxhYmVsQXR0cik7
Ci0gICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsK
LSAgICB9Ci0KLSAgICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXMtPmZpcnN0Q2hpbGQoKTsKLSAg
ICB3aGlsZSAobikgewotICAgICAgICBpZiAobi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05P
REUgfHwgbi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREUpCi0gICAgICAg
ICAgICB0ZXh0ICs9IG4tPm5vZGVWYWx1ZSgpOwotICAgICAgICAvLyBza2lwIHNjcmlwdCBjb250
ZW50Ci0gICAgICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkgJiYgbi0+aGFzVGFnTmFtZShIVE1M
TmFtZXM6OnNjcmlwdFRhZykpCi0gICAgICAgICAgICBuID0gbi0+dHJhdmVyc2VOZXh0U2libGlu
Zyh0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dE5v
ZGUodGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRleHQ7Ci19Ci0KLXZvaWQgSFRNTE9wdGlv
bkVsZW1lbnRJbXBsOjpzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmdGV4dCwgaW50ICZleGNlcHRp
b24pCi17Ci0gICAgLy8gSGFuZGxlIHRoZSBjb21tb24gc3BlY2lhbCBjYXNlIHdoZXJlIHRoZXJl
J3MgZXhhY3RseSAxIGNoaWxkIG5vZGUsIGFuZCBpdCdzIGEgdGV4dCBub2RlLgotICAgIE5vZGVJ
bXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzVGV4
dE5vZGUoKSAmJiAhY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8
VGV4dEltcGwgKj4oY2hpbGQpLT5zZXREYXRhKHRleHQsIGV4Y2VwdGlvbik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICByZW1vdmVDaGlsZHJlbigpOwotICAgIGFwcGVuZENoaWxkKG5l
dyBUZXh0SW1wbChnZXREb2N1bWVudCgpLCB0ZXh0KSwgZXhjZXB0aW9uKTsKLX0KLQotaW50IEhU
TUxPcHRpb25FbGVtZW50SW1wbDo6aW5kZXgoKSBjb25zdAotewotICAgIC8vIExldCdzIGRvIHRo
aXMgZHluYW1pY2FsbHkuIE1pZ2h0IGJlIGEgYml0IHNsb3csIGJ1dCB3ZSdyZSBzdXJlCi0gICAg
Ly8gd2Ugd29uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBhIG1lbWJlciB2YXJpYWJsZSBpbiBzb21lIGNh
c2VzLi4uCi0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsK
LSAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsID0gaXRlbXMuY291bnQo
KTsKLSAgICAgICAgaW50IG9wdGlvbkluZGV4ID0gMDsKLSAgICAgICAgZm9yKGludCBpID0gMDsg
aSA8IGw7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxl
bWVudEltcGwqPihpdGVtc1tpXSkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IG9wdGlvbkluZGV4OwotICAgICAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9wdGlv
bkVsZW1lbnRJbXBsOjpzZXRJbmRleChpbnQsIGludCAmZXhjZXB0aW9uKQotewotICAgIGV4Y2Vw
dGlvbiA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgIC8v
ICMjIwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09
IHNlbGVjdGVkQXR0cikKLSAgICAgICAgbV9zZWxlY3RlZCA9ICghYXR0ci0+aXNOdWxsKCkpOwot
ICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpCi0gICAgICAgIG1fdmFsdWUg
PSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTE9w
dGlvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCAhbV92YWx1ZS5pc051
bGwoKSApCi0gICAgICAgIHJldHVybiBtX3ZhbHVlOwotICAgIC8vIFVzZSB0aGUgdGV4dCBpZiB0
aGUgdmFsdWUgd2Fzbid0IHNldC4KLSAgICByZXR1cm4gdGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdo
aXRlU3BhY2UoKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFs
dWUpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0U2VsZWN0ZWQoYm9vbCBf
c2VsZWN0ZWQpCi17Ci0gICAgaWYobV9zZWxlY3RlZCA9PSBfc2VsZWN0ZWQpCi0gICAgICAgIHJl
dHVybjsKLSAgICBtX3NlbGVjdGVkID0gX3NlbGVjdGVkOwotICAgIEhUTUxTZWxlY3RFbGVtZW50
SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICAgaWYgKHNlbGVjdCkKLSAgICAgICAgc2Vs
ZWN0LT5ub3RpZnlPcHRpb25TZWxlY3RlZCh0aGlzLF9zZWxlY3RlZCk7Ci19Ci0KLXZvaWQgSFRN
TE9wdGlvbkVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgIGlmIChzZWxlY3QpCi0gICAgICAg
c2VsZWN0LT5jaGlsZHJlbkNoYW5nZWQoKTsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpI
VE1MT3B0aW9uRWxlbWVudEltcGw6OmdldFNlbGVjdCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwg
KnNlbGVjdCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3QtPmhh
c1RhZ05hbWUoc2VsZWN0VGFnKSkKLSAgICAgICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnROb2Rl
KCk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHNlbGVj
dCk7Ci19Ci0KLWJvb2wgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpkZWZhdWx0U2VsZWN0ZWQoKSBj
b25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxsKCk7
Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXREZWZhdWx0U2VsZWN0ZWQoYm9v
bCBiKQotewotICAgIHNldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIsIGIgPyAiIiA6IDApOwotfQot
Ci1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVt
ZW50SW1wbDo6c2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUobGFiZWxBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwodGV4dGFyZWFUYWcsIGRvYywgZiksIG1fdmFsdWVJc1ZhbGlkKGZhbHNlKSwgbV92
YWx1ZU1hdGNoZXNSZW5kZXJlcihmYWxzZSkKLXsKLSAgICAvLyBEVEQgcmVxdWlyZXMgcm93cyAm
IGNvbHMgYmUgc3BlY2lmaWVkLCBidXQgd2Ugd2lsbCBwcm92aWRlIHJlYXNvbmFibGUgZGVmYXVs
dHMKLSAgICBtX3Jvd3MgPSAyOwotICAgIG1fY29scyA9IDIwOwotICAgIG1fd3JhcCA9IHRhX1Zp
cnR1YWw7Ci19Ci0KLUhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp+SFRNTFRleHRBcmVhRWxlbWVu
dEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJlZ2lz
dGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJ0ZXh0YXJlYSI7Ci19Ci0KLVFT
dHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gTWFrZSBz
dXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6c3RhdGUoKSArIHZhbHVlKCkucXN0cmluZygpKycuJzsKLX0KLQotdm9pZCBI
VE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMp
Ci17Ci0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5k
TWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJuOwot
ICAgIHNldERlZmF1bHRWYWx1ZShzdGF0ZS5sZWZ0KHN0YXRlLmxlbmd0aCgpLTEpKTsKLSAgICAv
LyB0aGUgY2xvc2UoKSBpbiB0aGUgcmVuZGVydHJlZSB3aWxsIHRha2UgY2FyZSBvZiB0cmFuc2Zl
cnJpbmcgZGVmYXVsdHZhbHVlIHRvICd2YWx1ZScKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25T
dGFydCgpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6
OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAg
ICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0
aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGlj
X2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFy
dCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVuZChp
bnQgZW5kKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9pZCBI
VE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmIChtX3JlbmRlcikK
LSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPihtX3JlbmRlciktPnNlbGVjdCgp
OwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShp
bnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNf
Y2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0
LCBlbmQpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5n
ZWQoKQotewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KLSAgICAKLXZvaWQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewotICAg
ICAgICBtX3Jvd3MgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAz
OwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5l
ZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gY29sc0F0dHIpIHsKLSAgICAgICAgbV9jb2xzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+
dmFsdWUoKS50b0ludCgpIDogNjA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAg
ICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3cmFwQXR0cikgewotICAgICAgICAvLyB2aXJ0dWFsIC8g
cGh5c2ljYWwgaXMgTmV0c2NhcGUgZXh0ZW5zaW9uIG9mIEhUTUwgMy4wLCBub3cgZGVwcmVjYXRl
ZAotICAgICAgICAvLyBzb2Z0LyBoYXJkIC8gb2ZmIGlzIHJlY29tbWVuZGF0aW9uIGZvciBIVE1M
IDQgZXh0ZW5zaW9uIGJ5IElFIGFuZCBOUyA0Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZShhdHRyLT52YWx1ZSgpLCAidmlydHVhbCIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZh
bHVlKCksICJzb2Z0IikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9WaXJ0dWFsOwotICAgICAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicGh5c2ljYWwiKSB8
fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiaGFyZCIpKQotICAgICAgICAgICAg
bV93cmFwID0gdGFfUGh5c2ljYWw7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KGF0dHItPnZhbHVlKCksICJvbiIgKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1BoeXNpY2Fs
OwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2Zm
IikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9Ob1dyYXA7Ci0gICAgICAgIGlmIChyZW5kZXJl
cigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNh
bGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0g
ICAgICAgIC8vIGlnbm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3Vz
RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIp
IHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlbGVjdEF0dHIpIHsKLSAgICAgICAgc2V0SFRN
TEV2ZW50TGlzdGVuZXIoc2VsZWN0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihj
aGFuZ2VFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2JqZWN0
ICpIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFy
ZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRl
clRleHRBcmVhKHRoaXMpOwotfQotCi1ib29sIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphcHBl
bmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29sKQotewotICAgIGlmIChuYW1l
KCkuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1l
KCksIHZhbHVlKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwotfQot
Ci12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp1cGRhdGVWYWx1ZSgpCi17Ci0gICAgaWYg
KCAhbV92YWx1ZUlzVmFsaWQgKSB7Ci0gICAgICAgIGlmICggbV9yZW5kZXIgKSB7Ci0gICAgICAg
ICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPiggbV9yZW5kZXIgKS0+
dGV4dCgpLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0
cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV92YWx1ZSA9IGRlZmF1bHRWYWx1
ZSgpLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxz
ZTsKLSAgICAgICAgfQotICAgICAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAgfQotfQot
Ci1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1cGRh
dGVWYWx1ZSgpOwotICAgIHJldHVybiBtX3ZhbHVlLmlzTnVsbCgpID8gRE9NU3RyaW5nKCIiKSA6
IG1fdmFsdWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgbV92YWx1ZSA9IHZhbHVlLnFzdHJpbmcoKTsK
LSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV92YWx1ZUlzVmFsaWQg
PSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21F
bGVtZW50KCk7Ci0gICAgLy8gRklYTUU6IEZvcmNlIHJlbG9hZCBmcm9tIHJlbmRlcmVyLCBhcyBy
ZW5kZXJlciBtYXkgaGF2ZSBub3JtYWxpemVkIGxpbmUgZW5kaW5ncy4KLSAgICBtX3ZhbHVlSXNW
YWxpZCA9IGZhbHNlOwotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLQotRE9NU3RyaW5nIEhU
TUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpkZWZhdWx0VmFsdWUoKQotewotICAgIERPTVN0cmluZyB2
YWwgPSAiIjsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMgLSBqdXN0IGdyYWIgdGhlIHRl
eHQgbm9kZXMKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSBmaXJzdENoaWxkKCk7IG47
IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQotICAg
ICAgICAgICAgdmFsICs9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4obiktPmRhdGEoKTsKLSAgICAK
LSAgICBpZiAodmFsWzBdID09ICdccicgJiYgdmFsWzFdID09ICdcbicpIHsKLSAgICAgICAgdmFs
ID0gdmFsLmNvcHkoKTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDIpOwotICAgIH0gZWxzZSBpZiAo
dmFsWzBdID09ICdccicgfHwgdmFsWzBdID09ICdcbicpIHsKLSAgICAgICAgdmFsID0gdmFsLmNv
cHkoKTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDEpOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7
Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldERlZmF1bHRWYWx1ZShjb25z
dCBET01TdHJpbmcgJmRlZmF1bHRWYWx1ZSkKLXsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVu
dHMgLSByZW1vdmUgYWxsIHRoZSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBvbmUK
LSAgICBRUHRyTGlzdDxOb2RlSW1wbD4gdG9SZW1vdmU7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAg
Zm9yIChuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAg
aWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChuKTsKLSAg
ICBRUHRyTGlzdEl0ZXJhdG9yPE5vZGVJbXBsPiBpdCh0b1JlbW92ZSk7Ci0gICAgaW50IGV4Y2Vw
dGlvbmNvZGUgPSAwOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpIHsKLSAgICAgICAg
Tm9kZUltcGwgKm4gPSBpdC5jdXJyZW50KCk7Ci0gICAgICAgIG4tPnJlZigpOwotICAgICAgICBy
ZW1vdmVDaGlsZChuLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgbi0+ZGVyZWYoKTsKLSAgICB9
Ci0gICAgaW5zZXJ0QmVmb3JlKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKGRlZmF1bHRW
YWx1ZSksZmlyc3RDaGlsZCgpLCBleGNlcHRpb25jb2RlKTsKLSAgICBzZXRWYWx1ZShkZWZhdWx0
VmFsdWUpOwotfQotCi1ib29sIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjppc0VkaXRhYmxlKCkK
LXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwot
fQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphdHRhY2goKQotewotICAgIG1fdmFs
dWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNo
KCk7Ci0gICAgdXBkYXRlVmFsdWUoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1w
bDo6ZGV0YWNoKCkKLXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGV0YWNoKCk7
Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6c2V0Q29scyhpbnQgY29scykKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY29sc0F0dHIs
IFFTdHJpbmc6Om51bWJlcihjb2xzKSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnNldFJvd3MoaW50IHJvd3MpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJvd3NBdHRyLCBRU3Ry
aW5nOjpudW1iZXIocm93cykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJc0lu
ZGV4RWxlbWVudEltcGw6OkhUTUxJc0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MSW5wdXRFbGVtZW50SW1wbChpc2lu
ZGV4VGFnLCBkb2MsIGYpCi17Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX25hbWUgPSAiaXNp
bmRleCI7Ci19Ci0KLXZvaWQgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgp
ID09IHByb21wdEF0dHIpCi0Jc2V0VmFsdWUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZQotICAg
ICAgICAvLyBkb24ndCBjYWxsIEhUTUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRl
IGhlcmUsIGFzIGl0IHdvdWxkCi0gICAgICAgIC8vIGFjY2VwdCBhdHRyaWJ1dGVzIHRoaXMgZWxl
bWVudCBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJc0luZGV4
RWxlbWVudEltcGw6OnByb21wdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShw
cm9tcHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpzZXRQcm9tcHQo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUocHJvbXB0QXR0ciwg
dmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVuc2lnbmVkIEhUTUxPcHRpb25z
Q29sbGVjdGlvbkltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1l
bnRlZC4KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBs
OjpzZXRMZW5ndGgodW5zaWduZWQgbGVuZ3RoKQotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50
ZWQuCi19Ci0KLU5vZGVJbXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjppdGVtKHVuc2ln
bmVkIGluZGV4KSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0
dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpuYW1lZEl0
ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVt
ZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9ybURh
dGFMaXN0OjpGb3JtRGF0YUxpc3QoUVRleHRDb2RlYyAqYykKLSAgICA6IG1fY29kZWMoYykKLXsK
LX0KLQotdm9pZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcykK
LXsKLSAgICBtX2xpc3QuYXBwZW5kKHMpOwotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5k
U3RyaW5nKGNvbnN0IFFTdHJpbmcgJnMpCi17Ci0gICAgUUNTdHJpbmcgY3N0ciA9IGZpeExpbmVC
cmVha3MobV9jb2RlYy0+ZnJvbVVuaWNvZGUocywgdHJ1ZSkpOwotICAgIGNzdHIudHJ1bmNhdGUo
Y3N0ci5sZW5ndGgoKSk7Ci0gICAgbV9saXN0LmFwcGVuZChjc3RyKTsKLX0KLQotdm9pZCBGb3Jt
RGF0YUxpc3Q6OmFwcGVuZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmlu
ZyAmZmlsZW5hbWUpCi17Ci0gICAgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOwotICAgIG1f
bGlzdC5hcHBlbmQoZmlsZW5hbWUucXN0cmluZygpKTsKLX0KLQogfSAvLyBuYW1lc3BhY2UKSW5k
ZXg6IGtodG1sL2h0bWwvaHRtbF9pbWFnZWltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0
bWwvaHRtbF9pbWFnZWltcGwuY3BwCShyZXZpc2lvbiAxMTk3OCkKKysrIGtodG1sL2h0bWwvaHRt
bF9pbWFnZWltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2ltYWdlaW1wbC5oIgogCi0jaW5jbHVk
ZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1w
bC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudEltcGwuaCIKIAogI2luY2x1ZGUgImtodG1s
dmlldy5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCkluZGV4OiBraHRtbC9odG1sL0hUTUxCdXR0b25F
bGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9IVE1MQnV0dG9uRWxlbWVu
dEltcGwuY3BwCShyZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0bWwvSFRNTEJ1dHRvbkVsZW1l
bnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAo
QykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAgIChDKSAxOTk5
IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQogICogICAgICAgICAgIChDKSAyMDAx
IERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDA0LCAy
MDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIw
MDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqICAgICAgICAgICAoQykgMjAwNiBBbGV4ZXkgUHJv
c2t1cnlha292IChhcEBueXBvcC5jb20pCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjQsMzU0NSArMjQsMTM3
IEBACiAgKgogICovCiAKLSN1bmRlZiBGT1JNU19ERUJVRwotLy8jZGVmaW5lIEZPUk1TX0RFQlVH
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZm9ybWltcGwuaCIK
LQotI2luY2x1ZGUgImtodG1sdmlldy5oIgotI2luY2x1ZGUgIk1hY0ZyYW1lLmgiCi0jaW5jbHVk
ZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWxfaW1hZ2VpbXBsLmgi
Ci0jaW5jbHVkZSAia2h0bWxfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJtaXNjL2Zvcm1kYXRhLmgi
Ci0KLSNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgotI2luY2x1ZGUgImNzcy9jc3NzdHls
ZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiY3NzcHJvcGVydGllcy5oIgotI2luY2x1ZGUgImNzc2hl
bHBlci5oIgotI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9t
Ml9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAieG1sL0V2ZW50TmFtZXMuaCIKLSNpbmNsdWRlICJr
aHRtbF9leHQuaCIKLQotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5oIgotI2luY2x1
ZGUgInJlbmRlcl9idXR0b24uaCIKLSNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIKLQotI2luY2x1
ZGUgPGtsb2NhbGUuaD4KLSNpbmNsdWRlIDxxZmlsZS5oPgotI2luY2x1ZGUgPHF0ZXh0Y29kZWMu
aD4KLQotLy8gZm9yIGtleWdlbgotI2luY2x1ZGUgPHFzdHJpbmcuaD4KLSNpbmNsdWRlIDxrc3Ns
a2V5Z2VuLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGtodG1s
OwotCi1uYW1lc3BhY2UgRE9NIHsKLQotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci11c2lu
ZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1zdHJ1Y3QgRm9ybURhdGFMaXN0SXRlbSB7Ci0gICAg
Rm9ybURhdGFMaXN0SXRlbShjb25zdCBRQ1N0cmluZyAmZGF0YSkgOiBtX2RhdGEoZGF0YSkgeyB9
Ci0gICAgRm9ybURhdGFMaXN0SXRlbShjb25zdCBRU3RyaW5nICZwYXRoKSA6IG1fcGF0aChwYXRo
KSB7IH0KLQotICAgIFFTdHJpbmcgbV9wYXRoOwotICAgIFFDU3RyaW5nIG1fZGF0YTsKLX07Ci0K
LWNsYXNzIEZvcm1EYXRhTGlzdCB7Ci1wdWJsaWM6Ci0gICAgRm9ybURhdGFMaXN0KFFUZXh0Q29k
ZWMgKik7Ci0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0
IERPTVN0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkp
OyBhcHBlbmRTdHJpbmcodmFsdWUucXN0cmluZygpKTsgfQotICAgIHZvaWQgYXBwZW5kRGF0YShj
b25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgUVN0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBw
ZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFsdWUpOyB9Ci0gICAgdm9p
ZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBRQ1N0cmluZyAmdmFsdWUp
Ci0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFs
dWUpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBpbnQgdmFs
dWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmco
UVN0cmluZzo6bnVtYmVyKHZhbHVlKSk7IH0KLSAgICB2b2lkIGFwcGVuZEZpbGUoY29uc3QgRE9N
U3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmZmlsZW5hbWUpOwotCi0gICAgUVZhbHVlTGlz
dENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gYmVnaW4oKSBjb25zdAotICAgICAgICB7
IHJldHVybiBtX2xpc3QuYmVnaW4oKTsgfQotICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZv
cm1EYXRhTGlzdEl0ZW0+IGVuZCgpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5lbmQo
KTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0IFFDU3RyaW5nICZz
KTsKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBRU3RyaW5nICZzKTsKLQotICAgIFFUZXh0
Q29kZWMgKm1fY29kZWM7Ci0gICAgUVZhbHVlTGlzdDxGb3JtRGF0YUxpc3RJdGVtPiBtX2xpc3Q7
Ci19OwotCi1IVE1MRm9ybUVsZW1lbnRJbXBsOjpIVE1MRm9ybUVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnRJbXBsKGZvcm1UYWcsIGRvYykKLXsKLSAgICBj
b2xsZWN0aW9uSW5mbyA9IDA7Ci0gICAgbV9wb3N0ID0gZmFsc2U7Ci0gICAgbV9tdWx0aXBhcnQg
PSBmYWxzZTsKLSAgICBtX2F1dG9jb21wbGV0ZSA9IHRydWU7Ci0gICAgbV9pbnN1Ym1pdCA9IGZh
bHNlOwotICAgIG1fZG9pbmdzdWJtaXQgPSBmYWxzZTsKLSAgICBtX2lucmVzZXQgPSBmYWxzZTsK
LSAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAg
ICBtX2JvdW5kYXJ5ID0gIi0tLS0tLS0tLS0weEtoVG1MYk91TmRBclkiOwotICAgIG1fYWNjZXB0
Y2hhcnNldCA9ICJVTktOT1dOIjsKLSAgICBtX21hbGZvcm1lZCA9IGZhbHNlOwotfQotCi1IVE1M
Rm9ybUVsZW1lbnRJbXBsOjp+SFRNTEZvcm1FbGVtZW50SW1wbCgpCi17Ci0gICAgZGVsZXRlIGNv
bGxlY3Rpb25JbmZvOwotICAgIAotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxl
bWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxlbWVudHNbaV0tPm1fZm9ybSA9IDA7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGltZ0VsZW1lbnRzLmNvdW50KCk7ICsraSkK
LSAgICAgICAgaW1nRWxlbWVudHNbaV0tPm1fZm9ybSA9IDA7Ci19Ci0KLQotYm9vbCBIVE1MRm9y
bUVsZW1lbnRJbXBsOjpmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihjb25zdCBET01TdHJp
bmcgJnVybCkKLXsKLSAgICBpZiAodXJsLmlzTnVsbCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybC5xc3Ry
aW5nKCkpLnN0YXJ0c1dpdGgoImh0dHBzOiIsIGZhbHNlKTsKLX0KLQotCi12b2lkIEhUTUxGb3Jt
RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgSFRNTEVsZW1lbnRJbXBsOjphdHRhY2goKTsK
LQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3aXRoIGNhbGxpbmcgc2VjdXJlRm9ybVJlbW92
ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhlIHRpbWluZwotICAgIC8vIHdhcyBzdWNoIHRoYXQg
aXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVhcmx5Ci0gICAgaWYgKGZvcm1Xb3VsZEhhdmVTZWN1
cmVTdWJtaXNzaW9uKG1fdXJsKSkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFk
ZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1l
bnQoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0JSFRN
TERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+
KGdldERvY3VtZW50KCkpOwotCWRvY3VtZW50LT5hZGROYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwot
ICAgIH0KLQotICAgIEhUTUxFbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLX0K
LQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCkKLXsKLSAg
ICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotCUhUTUxEb2N1bWVudElt
cGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAqPihnZXREb2N1bWVu
dCgpKTsKLQlkb2N1bWVudC0+cmVtb3ZlTmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0g
ICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLX0KLQotaW50
IEhUTUxGb3JtRWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50IGxlbiA9IDA7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kp
Ci0JaWYgKGZvcm1FbGVtZW50c1tpXS0+aXNFbnVtZXJhdGFibGUoKSkKLQkgICAgKytsZW47Ci0K
LSAgICByZXR1cm4gbGVuOwotfQotCi0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c3VibWl0
Q2xpY2soKQotewotICAgIGJvb2wgc3VibWl0Rm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkgewotICAgICAgICBpZiAo
Zm9ybUVsZW1lbnRzW2ldLT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBI
VE1MSW5wdXRFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnRJbXBsICo+KGZvcm1FbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNT
dWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgJiYgZWxlbWVudC0+cmVuZGVyZXIoKSkgewotICAgICAg
ICAgICAgICAgIHN1Ym1pdEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LT5j
bGljayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzdWJtaXRGb3VuZCkgLy8gc3VibWl0IHRoZSBmb3JtIHdp
dGhvdXQgYSBzdWJtaXQgb3IgaW1hZ2UgaW5wdXQKLSAgICAgICAgcHJlcGFyZVN1Ym1pdCgpOwot
fQotCi0KLXN0YXRpYyBRQ1N0cmluZyBlbmNvZGVDU3RyaW5nKGNvbnN0IFFDU3RyaW5nJiBlKQot
ewotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludGVyYWN0L2Zvcm1zLmh0bWwj
aC0xNy4xMy40LjEKLSAgICAvLyBzYWZlIGNoYXJhY3RlcnMgbGlrZSBOUyBoYW5kbGVzIHRoZW0g
Zm9yIGNvbXBhdGliaWxpdHkKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqc2FmZSA9ICItLl8qIjsK
LSAgICBpbnQgZWxlbiA9IGUubGVuZ3RoKCk7Ci0gICAgUUNTdHJpbmcgZW5jb2RlZCgoIGVsZW4r
ZS5jb250YWlucyggJ1xuJyApICkqMysxKTsKLSAgICBpbnQgZW5jbGVuID0gMDsKLQotICAgIC8v
UUNTdHJpbmcgb3JpZyhlLmRhdGEoKSwgZS5zaXplKCkpOwotCi0gICAgZm9yKGludCBwb3MgPSAw
OyBwb3MgPCBlbGVuOyBwb3MrKykgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBlW3Bvc107
Ci0KLSAgICAgICAgaWYgKCAoKCBjID49ICdBJykgJiYgKCBjIDw9ICdaJykpIHx8Ci0gICAgICAg
ICAgICAgKCggYyA+PSAnYScpICYmICggYyA8PSAneicpKSB8fAotICAgICAgICAgICAgICgoIGMg
Pj0gJzAnKSAmJiAoIGMgPD0gJzknKSkgfHwKLSAgICAgICAgICAgICAoc3RyY2hyKHNhZmUsIGMp
KQotICAgICAgICAgICAgKQotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBjOwotICAg
ICAgICBlbHNlIGlmICggYyA9PSAnICcgKQotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10g
PSAnKyc7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICdcbicgfHwgKCBjID09ICdccicgJiYgZVtw
b3MrMV0gIT0gJ1xuJyApICkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4r
K10gPSAnJSc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcwJzsKLSAgICAgICAg
ICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ0QnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4r
K10gPSAnJSc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcwJzsKLSAgICAgICAg
ICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ0EnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYg
KCBjICE9ICdccicgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9
ICclJzsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBoID0gYyAvIDE2OwotICAgICAgICAgICAg
aCArPSAoaCA+IDkpID8gKCdBJyAtIDEwKSA6ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5j
bGVuKytdID0gaDsKLQotICAgICAgICAgICAgdW5zaWduZWQgaW50IGwgPSBjICUgMTY7Ci0gICAg
ICAgICAgICBsICs9IChsID4gOSkgPyAoJ0EnIC0gMTApIDogJzAnOwotICAgICAgICAgICAgZW5j
b2RlZFtlbmNsZW4rK10gPSBsOwotICAgICAgICB9Ci0gICAgfQotICAgIGVuY29kZWRbZW5jbGVu
KytdID0gJ1wwJzsKLSAgICBlbmNvZGVkLnRydW5jYXRlKGVuY2xlbik7Ci0KLSAgICByZXR1cm4g
ZW5jb2RlZDsKLX0KLQotLy8gQ2hhbmdlIHBsYWluIENSIGFuZCBwbGFpbiBMRiB0byBDUkxGIHBh
aXJzLgotc3RhdGljIFFDU3RyaW5nIGZpeExpbmVCcmVha3MoY29uc3QgUUNTdHJpbmcgJnMpCi17
Ci0gICAgLy8gQ29tcHV0ZSB0aGUgbGVuZ3RoLgotICAgIHVuc2lnbmVkIG5ld0xlbiA9IDA7Ci0g
ICAgY29uc3QgY2hhciAqcCA9IHMuZGF0YSgpOwotICAgIHdoaWxlIChjaGFyIGMgPSAqcCsrKSB7
Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAgICAgICAgIC8vIFNhZmUgdG8gbG9vayBh
aGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0gICAgICAgICAgICBpZiAoKnAgIT0gJ1xu
JykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1IgaW50byBDUkxGLgotICAgICAgICAgICAg
ICAgIG5ld0xlbiArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGMgPT0g
J1xuJykgewotICAgICAgICAgICAgLy8gVHVybiBMRiBpbnRvIENSTEYuCi0gICAgICAgICAgICBu
ZXdMZW4gKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExlYXZlIG90aGVy
IGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICBuZXdMZW4gKz0gMTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBpZiAobmV3TGVuID09IHMubGVuZ3RoKCkpIHsKLSAgICAgICAgcmV0dXJuIHM7
Ci0gICAgfQotICAgIAotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcuCi0gICAgcCA9
IHMuZGF0YSgpOwotICAgIFFDU3RyaW5nIHJlc3VsdChuZXdMZW4gKyAxKTsKLSAgICBjaGFyICpx
ID0gcmVzdWx0LmRhdGEoKTsKLSAgICB3aGlsZSAoY2hhciBjID0gKnArKykgewotICAgICAgICBp
ZiAoYyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBTYWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVz
ZSBvZiB0cmFpbGluZyAnXDAnLgotICAgICAgICAgICAgaWYgKCpwICE9ICdcbicpIHsKLSAgICAg
ICAgICAgICAgICAvLyBUdXJuIENSIGludG8gQ1JMRi4KLSAgICAgICAgICAgICAgICAqcSsrID0g
J1xyJzsKLSAgICAgICAgICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8vIFR1cm4gTEYgaW50byBD
UkxGLgotICAgICAgICAgICAgKnErKyA9ICdccic7Ci0gICAgICAgICAgICAqcSsrID0gJ1xuJzsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExlYXZlIG90aGVyIGNoYXJhY3RlcnMg
YWxvbmUuCi0gICAgICAgICAgICAqcSsrID0gYzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1
cm4gcmVzdWx0OwotfQotCi0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6Zm9ybURhdGEoRm9y
bURhdGEgJmZvcm1fZGF0YSkgY29uc3QKLXsKLSAgICBRQ1N0cmluZyBlbmNfc3RyaW5nID0gIiI7
IC8vIHVzZWQgZm9yIG5vbi1tdWx0aXBhcnQgZGF0YQotCi0gICAgLy8gZmluZCBvdXQgdGhlIFFU
ZXh0Y29kZWMgdG8gdXNlCi0gICAgUVN0cmluZyBzdHIgPSBtX2FjY2VwdGNoYXJzZXQucXN0cmlu
ZygpOwotICAgIHN0ci5yZXBsYWNlKCcsJywgJyAnKTsKLSAgICBRU3RyaW5nTGlzdCBjaGFyc2V0
cyA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnICcsIHN0cik7Ci0gICAgUVRleHRDb2RlYyogY29kZWMg
PSAwOwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgZm9y
IChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBjaGFyc2V0cy5iZWdpbigpOyBpdCAhPSBjaGFy
c2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5nIGVuYyA9ICgqaXQpOwotICAgICAg
ICBpZiAoZW5jLmNvbnRhaW5zKCJVTktOT1dOIikpIHsKLSAgICAgICAgICAgIC8vIHVzZSBzdGFu
ZGFyZCBkb2N1bWVudCBlbmNvZGluZwotICAgICAgICAgICAgZW5jID0gIklTTy04ODU5LTEiOwot
ICAgICAgICAgICAgaWYgKGZyYW1lKQotICAgICAgICAgICAgICAgIGVuYyA9IGZyYW1lLT5lbmNv
ZGluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY29kZWMgPSBRVGV4dENvZGVjOjpjb2Rl
Y0Zvck5hbWUoZW5jLmxhdGluMSgpKSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAg
ICBpZiAoIWNvZGVjKQotICAgICAgICBjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTG9jYWxl
KCk7Ci0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQo
KTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50ID0g
Zm9ybUVsZW1lbnRzW2ldOwotICAgICAgICBGb3JtRGF0YUxpc3QgbHN0KGNvZGVjKTsKLQotICAg
ICAgICBpZiAoIWN1cnJlbnQtPmRpc2FibGVkKCkgJiYgY3VycmVudC0+YXBwZW5kRm9ybURhdGEo
bHN0LCBtX211bHRpcGFydCkpIHsKLSAgICAgICAgICAgIGZvciAoUVZhbHVlTGlzdENvbnN0SXRl
cmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gaXQgPSBsc3QuYmVnaW4oKTsgaXQgIT0gbHN0LmVuZCgp
OyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX211bHRpcGFydCkgewotICAgICAgICAg
ICAgICAgICAgICAvLyBoYW5kbGUgSVNJTkRFWCAvIDxpbnB1dCBuYW1lPWlzaW5kZXg+IHNwZWNp
YWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYgaXRzIHRoZSBmaXJzdCBlbnRy
eQotICAgICAgICAgICAgICAgICAgICBpZiAoIGVuY19zdHJpbmcuaXNFbXB0eSgpICYmICgqaXQp
Lm1fZGF0YSA9PSAiaXNpbmRleCIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2l0Owot
ICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVDU3RyaW5nKCAoKml0
KS5tX2RhdGEgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbmNfc3RyaW5nLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9ICcmJzsKLQotICAgICAg
ICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVDU3RyaW5nKCgqaXQpLm1fZGF0
YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9ICI9IjsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5n
ICs9IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
ewotICAgICAgICAgICAgICAgICAgICBRQ1N0cmluZyBoc3RyKCItLSIpOwotICAgICAgICAgICAg
ICAgICAgICBoc3RyICs9IG1fYm91bmRhcnkucXN0cmluZygpLmxhdGluMSgpOwotICAgICAgICAg
ICAgICAgICAgICBoc3RyICs9ICJcclxuIjsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAi
Q29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIjsKLSAgICAgICAgICAgICAg
ICAgICAgaHN0ciArPSAoKml0KS5tX2RhdGEuZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBo
c3RyICs9ICJcIiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgdHlw
ZSBpcyBGSUxFLCB0aGVuIHdlIGFsc28gbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAvLyBp
bmNsdWRlIHRoZSBmaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+aGFz
TG9jYWxOYW1lKGlucHV0VGFnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+aW5wdXRUeXBlKCkgPT0gSFRNTElu
cHV0RWxlbWVudEltcGw6OkZJTEUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIFFTdHJpbmcgcGF0aCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJ
bXBsKj4oY3VycmVudCktPnZhbHVlKCkucXN0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGlmIHRoZSBmaWxlbmFtZSBpbmNsdWRlcyBh
ICIgbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGNvbnRyb2wgY2hhcmFjdGVy
cyBsaWtlIENSIG9yIExGLiBUaGlzIGFsc28gZG9lcyBzdHJhbmdlCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyB0aGluZ3MgaWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGNoYXJhY3RlcnMgeW91
IGNhbid0IGVuY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHdlYnNpdGUn
cyBjaGFyYWN0ZXIgc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiOyBmaWxl
bmFtZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9IGNvZGVjLT5mcm9tVW5p
Y29kZShwYXRoLm1pZChwYXRoLmZpbmRSZXYoJy8nKSArIDEpLCB0cnVlKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYo
IXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCktPnZhbHVlKCkuaXNF
bXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFFTdHJpbmcgbWltZVR5cGUgPSBmcmFtZSA/IE1hYyhmcmFtZSktPm1pbWVUeXBlRm9y
RmlsZU5hbWUocGF0aCkgOiBRU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCFtaW1lVHlwZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaHN0ciArPSAiXHJcbkNvbnRlbnQtVHlwZTogIjsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaHN0ciArPSBtaW1lVHlwZS5hc2NpaSgpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG5cclxuIjsKLSAgICAgICAgICAg
ICAgICAgICAgKytpdDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgYm9keQotICAg
ICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShoc3RyLmRhdGEoKSwgaHN0ci5s
ZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1EYXRhTGlzdEl0ZW0gJml0
ZW0gPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhU2l6ZSA9IGl0ZW0ubV9k
YXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFTaXplICE9IDApCi0gICAg
ICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShpdGVtLm1fZGF0YSwgZGF0
YVNpemUgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWl0ZW0ubV9wYXRoLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmRGaWxlKGl0
ZW0ubV9wYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZERhdGEoIlxy
XG4iLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLQotICAgIGlmIChtX211bHRpcGFydCkKLSAgICAgICAgZW5jX3N0cmluZyA9ICgiLS0i
ICsgbV9ib3VuZGFyeS5xc3RyaW5nKCkgKyAiLS1cclxuIikuYXNjaWkoKTsKLQotICAgIGZvcm1f
ZGF0YS5hcHBlbmREYXRhKGVuY19zdHJpbmcuZGF0YSgpLCBlbmNfc3RyaW5nLmxlbmd0aCgpKTsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpwYXJzZUVu
Y3R5cGUoY29uc3QgRE9NU3RyaW5nJiB0eXBlKQotewotICAgIGlmKHR5cGUuY29udGFpbnMoIm11
bHRpcGFydCIsIGZhbHNlKSB8fCB0eXBlLmNvbnRhaW5zKCJmb3JtLWRhdGEiLCBmYWxzZSkpIHsK
LSAgICAgICAgbV9lbmN0eXBlID0gIm11bHRpcGFydC9mb3JtLWRhdGEiOwotICAgICAgICBtX211
bHRpcGFydCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh0eXBlLmNvbnRhaW5zKCJ0ZXh0IiwgZmFs
c2UpIHx8IHR5cGUuY29udGFpbnMoInBsYWluIiwgZmFsc2UpKSB7Ci0gICAgICAgIG1fZW5jdHlw
ZSA9ICJ0ZXh0L3BsYWluIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICB9IGVs
c2UgewotICAgICAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNv
ZGVkIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRN
TEZvcm1FbGVtZW50SW1wbDo6c2V0Qm91bmRhcnkoIGNvbnN0IERPTVN0cmluZyYgYm91bmQgKQot
ewotICAgIG1fYm91bmRhcnkgPSBib3VuZDsKLX0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpwcmVwYXJlU3VibWl0KCkKLXsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5m
cmFtZSgpOwotICAgIGlmKG1faW5zdWJtaXQgfHwgIWZyYW1lIHx8IGZyYW1lLT5vbmx5TG9jYWxS
ZWZlcmVuY2VzKCkpCi0gICAgICAgIHJldHVybiBtX2luc3VibWl0OwotCi0gICAgbV9pbnN1Ym1p
dCA9IHRydWU7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwotCi0gICAgaWYgKCBkaXNwYXRj
aEhUTUxFdmVudChzdWJtaXRFdmVudCxmYWxzZSx0cnVlKSAmJiAhbV9kb2luZ3N1Ym1pdCApCi0g
ICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotCi0gICAgbV9pbnN1Ym1pdCA9IGZhbHNlOwot
Ci0gICAgaWYgKCBtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgc3VibWl0KHRydWUpOwotCi0gICAg
cmV0dXJuIG1fZG9pbmdzdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c3Vi
bWl0KCBib29sIGFjdGl2YXRlU3VibWl0QnV0dG9uICkKLXsKLSAgICBLSFRNTFZpZXcgKnZpZXcg
PSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQo
KS0+ZnJhbWUoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWZyYW1lKSB7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBpZiAoIG1faW5zdWJtaXQgKSB7Ci0gICAgICAgIG1fZG9pbmdzdWJtaXQg
PSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9pbnN1Ym1pdCA9IHRydWU7
Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogZmlyc3RTdWNjZXNzZnVsU3VibWl0
QnV0dG9uID0gMDsKLSAgICBib29sIG5lZWRCdXR0b25BY3RpdmF0aW9uID0gYWN0aXZhdGVTdWJt
aXRCdXR0b247CS8vIGRvIHdlIG5lZWQgdG8gYWN0aXZhdGUgYSBzdWJtaXQgYnV0dG9uPwotICAg
IAotICAgIE1hYyhmcmFtZSktPmNsZWFyUmVjb3JkZWRGb3JtVmFsdWVzKCk7Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0g
ICAgICAgIC8vIE91ciBhcHAgbmVlZHMgdG8gZ2V0IGZvcm0gdmFsdWVzIGZvciBwYXNzd29yZCBm
aWVsZHMgZm9yIGRvaW5nIHBhc3N3b3JkIGF1dG9jb21wbGV0ZSwKLSAgICAgICAgLy8gc28gd2Ug
YXJlIG1vcmUgbGVuaWVudCBpbiBwdXNoaW5nIHZhbHVlcywgYW5kIGxldCB0aGUgYXBwIGRlY2lk
ZSB3aGF0IHRvIHNhdmUgd2hlbi4KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc0xvY2FsTmFtZShp
bnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsICppbnB1dCA9IHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBp
ZiAoaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpURVhUCi0gICAg
ICAgICAgICAgICAgfHwgaW5wdXQtPmlucHV0VHlwZSgpID09ICBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6UEFTU1dPUkQKLSAgICAgICAgICAgICAgICB8fCBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRN
TElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAg
ICBNYWMoZnJhbWUpLT5yZWNvcmRGb3JtVmFsdWUoaW5wdXQtPm5hbWUoKS5xc3RyaW5nKCksIGlu
cHV0LT52YWx1ZSgpLnFzdHJpbmcoKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0
LT5yZW5kZXJlcigpICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6U0VBUkNIKQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRp
dCo+KGlucHV0LT5yZW5kZXJlcigpKS0+YWRkU2VhcmNoUmVzdWx0KCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24pIHsKLSAgICAg
ICAgICAgIGlmIChjdXJyZW50LT5pc0FjdGl2YXRlZFN1Ym1pdCgpKSB7Ci0gICAgICAgICAgICAg
ICAgbmVlZEJ1dHRvbkFjdGl2YXRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAo
Zmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID09IDAgJiYgY3VycmVudC0+aXNTdWNjZXNzZnVs
U3VibWl0QnV0dG9uKCkpIHsKLSAgICAgICAgICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRC
dXR0b24gPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAg
aWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uICYmIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbikg
ewotICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24tPnNldEFjdGl2YXRlZFN1Ym1p
dCh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fcG9zdCkKLSAgICAgICAgbV9tdWx0aXBhcnQg
PSBmYWxzZTsKLSAgICAKLSAgICBGb3JtRGF0YSBmb3JtX2RhdGE7Ci0gICAgaWYgKGZvcm1EYXRh
KGZvcm1fZGF0YSkpIHsKLSAgICAgICAgaWYobV9wb3N0KSB7Ci0gICAgICAgICAgICBmcmFtZS0+
c3VibWl0Rm9ybSggInBvc3QiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0YSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmluZygpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN0eXBlKCkucXN0cmluZygpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSgpLnFzdHJpbmcoKSAp
OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnJhbWUtPnN1Ym1pdEZv
cm0oICJnZXQiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0YSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmluZygpICk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmlyc3RTdWNjZXNzZnVsU3Vi
bWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbi0+c2V0QWN0
aXZhdGVkU3VibWl0KGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgbV9kb2luZ3N1Ym1pdCA9IG1f
aW5zdWJtaXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZXNldCgg
ICkKLXsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlm
KG1faW5yZXNldCB8fCAhZnJhbWUpIHJldHVybjsKLQotICAgIG1faW5yZXNldCA9IHRydWU7Ci0K
LSAgICAvLyAjIyMgRE9NMiBsYWJlbHMgdGhpcyBldmVudCBhcyBub3QgY2FuY2VsYWJsZSwgaG93
ZXZlcgotICAgIC8vIGNvbW1vbiBicm93c2Vycyggc2ljayEgKSBhbGxvdyBpdCBiZSBjYW5jZWxs
ZWQuCi0gICAgaWYgKCAhZGlzcGF0Y2hIVE1MRXZlbnQocmVzZXRFdmVudCx0cnVlLCB0cnVlKSAp
IHsKLSAgICAgICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkK
LSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5yZXNldCgpOwotCi0gICAgbV9pbnJlc2V0ID0gZmFs
c2U7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGFj
dGlvbkF0dHIpIAotICAgIHsKLSAgICAgICAgYm9vbCBvbGRVUkxXYXNTZWN1cmUgPSBmb3JtV291
bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7Ci0gICAgICAgIG1fdXJsID0ga2h0bWw6OnBh
cnNlVVJMKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBib29sIG5ld1VSTElzU2VjdXJlID0gZm9y
bVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpOwotCi0gICAgICAgIGlmIChtX2F0dGFj
aGVkICYmIChvbGRVUkxXYXNTZWN1cmUgIT0gbmV3VVJMSXNTZWN1cmUpKQotICAgICAgICAgICAg
aWYgKG5ld1VSTElzU2VjdXJlKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNlY3Vy
ZUZvcm1BZGRlZCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGdldERvY3Vt
ZW50KCktPnNlY3VyZUZvcm1SZW1vdmVkKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSB0YXJnZXRBdHRyKSB7Ci0gICAgICAgIG1fdGFyZ2V0ID0gYXR0ci0+dmFsdWUoKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtZXRob2RBdHRyKSB7Ci0gICAgICAgIGlm
IChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicG9zdCIpKQotICAgICAgICAgICAg
bV9wb3N0ID0gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+
dmFsdWUoKSwgImdldCIpKQotICAgICAgICAgICAgbV9wb3N0ID0gZmFsc2U7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gZW5jdHlwZUF0dHIpIHsKLSAgICAgICAgcGFyc2VFbmN0eXBl
KGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2VwdF9j
aGFyc2V0QXR0cikgewotICAgICAgICAvLyBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyc2V0
cyB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFjY2VwdHMgLSBzZWUgcmZjMjA0NQotICAgICAgICBt
X2FjY2VwdGNoYXJzZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGFjY2VwdEF0dHIpIHsKLSAgICAgICAgLy8gaWdub3JlIHRoaXMgb25lIGZvciB0aGUg
bW9tZW50Li4uCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYXV0b2NvbXBsZXRlQXR0
cikgewotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9ICFlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52
YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zdWJtaXRB
dHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHN1Ym1pdEV2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnJlc2V0QXR0cikgewotICAgICAgICBz
ZXRIVE1MRXZlbnRMaXN0ZW5lcihyZXNldEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBET01TdHJpbmcgbmV3TmFtZUF0dHIg
PSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoaW5Eb2N1bWVudCgpICYmIGdldERvY3VtZW50
KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxEb2N1bWVudEltcGwgKmRv
Y3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAqPihnZXREb2N1bWVudCgpKTsK
LSAgICAgICAgICAgIGRvY3VtZW50LT5yZW1vdmVOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAg
ICAgICAgICAgZG9jdW1lbnQtPmFkZE5hbWVkSXRlbShuZXdOYW1lQXR0cik7Ci0gICAgICAgIH0K
LSAgICAgICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1lQXR0cjsKLSAgICB9IGVsc2UKLSAgICAgICAg
SFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdGVtcGxh
dGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5zZXJ0SW50b1ZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2
ZWMsIHVuc2lnbmVkIHBvcywgVCogaXRlbSkKLXsKLSAgICB1bnNpZ25lZCBzaXplID0gdmVjLnNp
emUoKTsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwotICAgIGFzc2VydChwb3Mg
PD0gY291bnQpOwotICAgIGlmIChzaXplID09IGNvdW50KQotICAgICAgICB2ZWMucmVzaXplKHNp
emUgPT0gMCA/IDggOiBzaXplICogMyAvIDIpOwotICAgIGZvciAodW5zaWduZWQgaSA9IGNvdW50
OyBpID4gcG9zOyAtLWkpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwgdmVjW2kgLSAxXSk7ICAgIAot
ICAgIHZlYy5pbnNlcnQocG9zLCBpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGlj
IHZvaWQgYXBwZW5kVG9WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCBUICppdGVtKQotewotICAg
IHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNv
dW50KCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9
PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAgdmVjLmluc2VydChjb3VudCwgaXRlbSk7Ci19
Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJlbW92ZUZyb21WZWN0b3IoUVB0clZl
Y3RvcjxUPiAmdmVjLCBUICppdGVtKQotewotICAgIGludCBwb3MgPSB2ZWMuZmluZFJlZihpdGVt
KTsKLSAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgcmV0dXJuOwotICAgIHVuc2lnbmVkIGNvdW50
ID0gdmVjLmNvdW50KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gcG9zOyBpIDwgY291bnQgLSAx
OyArK2kpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwgdmVjW2kgKyAxXSk7Ci0gICAgdmVjLnJlbW92
ZShjb3VudCAtIDEpOwotfQotCi11bnNpZ25lZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtRWxl
bWVudEluZGV4KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICplKQotewotICAgIC8vIENoZWNr
IGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHRoaXMgZWxlbWVudCBpcyB0aGUgdmVyeSBsYXN0
IHRoaW5nIGluCi0gICAgLy8gdGhlIGZvcm0ncyB0cmVlIG9mIGNoaWxkcmVuOyB3ZSBkb24ndCB3
YW50IHRvIHdhbGsgdGhlIGVudGlyZSB0cmVlIGluIHRoYXQKLSAgICAvLyBjb21tb24gY2FzZSB0
aGF0IG9jY3VycyBkdXJpbmcgcGFyc2luZzsgaW5zdGVhZCB3ZSdsbCBqdXN0IHJldHVybiBhIHZh
bHVlCi0gICAgLy8gdGhhdCBzYXlzICJhZGQgdGhpcyBmb3JtIGVsZW1lbnQgdG8gdGhlIGVuZCBv
ZiB0aGUgYXJyYXkiLgotICAgIGlmIChlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSB7Ci0gICAg
ICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAgICBmb3IgKE5vZGVJbXBsICpub2RlID0gdGhpczsg
bm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhpcykpIHsKLSAgICAgICAgICAg
IGlmIChub2RlID09IGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICBp
ZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19j
YXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKS0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKQotICAg
ICAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCAqPihub2RlKS0+Zm9ybSgpID09IHRoaXMpCi0gICAgICAgICAgICAgICAgKytpOwotICAgICAg
ICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtRWxlbWVudHMuY291bnQoKTsKLX0KLQotdm9pZCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjpyZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsICplKQotewotICAgIERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9jdW1lbnQoKTsK
LSAgICBpZiAoZG9jICYmIGUtPmlzUmFkaW9CdXR0b24oKSAmJiAhZS0+bmFtZSgpLmlzRW1wdHko
KSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogY3VycmVudENoZWNrZWRS
YWRpbyA9IGRvYy0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwg
KEhUTUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAgaWYgKGN1cnJlbnRDaGVja2VkUmFk
aW8gPT0gZSkKLSAgICAgICAgICAgIGRvYy0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChlLT5uYW1l
KCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDApOwotICAgICAgICBpZiAoZS0+aXND
aGVja2VkKCkpCi0gICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9uQ2hlY2tlZCgoSFRNTElucHV0
RWxlbWVudEltcGwqKSBlLCB0aGlzKTsKLSAgICB9Ci0gICAgaW5zZXJ0SW50b1ZlY3Rvcihmb3Jt
RWxlbWVudHMsIGZvcm1FbGVtZW50SW5kZXgoZSksIGUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxl
bWVudEltcGw6OnJlbW92ZUZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICpl
KQotewotICAgIGlmICghZS0+bmFtZSgpLmlzRW1wdHkoKSAmJiBnZXREb2N1bWVudCgpKSB7Ci0g
ICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50Q2hlY2tlZFJhZGlvID0g
Z2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoZS0+bmFtZSgpLmltcGwo
KSwgdGhpcyk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvID09IGUpCi0gICAgICAg
ICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKGUtPm5hbWUoKS5pbXBs
KCksIHRoaXMpOwotICAgIH0KLSAgICByZW1vdmVGcm9tVmVjdG9yKGZvcm1FbGVtZW50cywgZSk7
Ci19Ci0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRl
SW1wbCAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IGFjdGlvbkF0
dHI7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVnaXN0ZXJJbWdFbGVtZW50KEhU
TUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIGFwcGVuZFRvVmVjdG9yKGltZ0VsZW1lbnRz
LCBlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVJbWdFbGVtZW50KEhU
TUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIHJlbW92ZUZyb21WZWN0b3IoaW1nRWxlbWVu
dHMsIGUpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjplbGVtZW50cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+
KG5ldyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsKHRoaXMpKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxG
b3JtRWxlbWVudEltcGw6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
bmFtZUF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldE5hbWUoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobmFtZUF0dHIsIHZhbHVlKTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6OmFjY2VwdENoYXJzZXQoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0X2NoYXJzZXRBdHRyKTsKLX0KLQot
dm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2VwdF9jaGFyc2V0QXR0ciwgdmFsdWUp
OwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6YWN0aW9uKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjdGlvbkF0dHIpOwotfQotCi12b2lkIEhUTUxGb3Jt
RWxlbWVudEltcGw6OnNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZShhY3Rpb25BdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50
SW1wbDo6c2V0RW5jdHlwZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShlbmN0eXBlQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50
SW1wbDo6bWV0aG9kKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG1ldGhvZEF0
dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldE1ldGhvZChjb25zdCBET01T
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShtZXRob2RBdHRyLCB2YWx1ZSk7Ci19
Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjp0YXJnZXQoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUodGFyZ2V0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVt
ZW50SW1wbDo6c2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKHRhcmdldEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1I
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoY29u
c3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxl
bWVudEltcGwgKmYpCi0gICAgOiBIVE1MRWxlbWVudEltcGwodGFnTmFtZSwgZG9jKQotewotICAg
IG1fZGlzYWJsZWQgPSBtX3JlYWRPbmx5ID0gZmFsc2U7Ci0KLSAgICBpZiAoZikKLQltX2Zvcm0g
PSBmOwotICAgIGVsc2UKLQltX2Zvcm0gPSBnZXRGb3JtKCk7Ci0gICAgaWYgKG1fZm9ybSkKLSAg
ICAgICAgbV9mb3JtLT5yZWdpc3RlckZvcm1FbGVtZW50KHRoaXMpOwotfQotCi1IVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6fkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCkKLXsKLSAgICBp
ZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1FbGVtZW50KHRoaXMpOwotfQot
Ci12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShN
YXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFt
ZUF0dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBkaXNhYmxlZEF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGREaXNhYmxlZCA9IG1fZGlz
YWJsZWQ7Ci0gICAgICAgIG1fZGlzYWJsZWQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlm
IChvbGREaXNhYmxlZCAhPSBtX2Rpc2FibGVkKSB7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7
Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNB
cHBlYXJhbmNlKCkpCi0gICAgICAgICAgICAgICAgdGhlbWUoKS0+c3RhdGVDaGFuZ2VkKHJlbmRl
cmVyKCksIEVuYWJsZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSByZWFkb25seUF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGRSZWFkT25seSA9IG1fcmVh
ZE9ubHk7Ci0gICAgICAgIG1fcmVhZE9ubHkgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlm
IChvbGRSZWFkT25seSAhPSBtX3JlYWRPbmx5KSBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0g
ICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgYXNzZXJ0
KCFhdHRhY2hlZCgpKTsKLQotICAgIEhUTUxFbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICAv
LyBUaGUgY2FsbCB0byB1cGRhdGVGcm9tRWxlbWVudCgpIG5lZWRzIHRvIGdvIGFmdGVyIHRoZSBj
YWxsIHRocm91Z2gKLSAgICAvLyB0byB0aGUgYmFzZSBjbGFzcydzIGF0dGFjaCgpIGJlY2F1c2Ug
dGhhdCBjYW4gc29tZXRpbWVzIGRvIGEgY2xvc2UKLSAgICAvLyBvbiB0aGUgcmVuZGVyZXIuCi0g
ICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxlbWVudCgp
OwotICAgIAotICAgICAgICAvLyBEZWxheWVkIGF0dGFjaG1lbnQgaW4gb3JkZXIgdG8gcHJldmVu
dCBGT1VDIGNhbiByZXN1bHQgaW4gYW4gb2JqZWN0IGJlaW5nCi0gICAgICAgIC8vIHByb2dyYW1t
YXRpY2FsbHkgZm9jdXNlZCBiZWZvcmUgaXQgaGFzIGEgcmVuZGVyIG9iamVjdC4gIElmIHdlIGhh
dmUgYmVlbiBmb2N1c2VkCi0gICAgICAgIC8vIChpLmUuLCBpZiB3ZSBhcmUgdGhlIGZvY3VzTm9k
ZSkgdGhlbiBnbyBhaGVhZCBhbmQgZm9jdXMgb3VyIGNvcnJlc3BvbmRpbmcgbmF0aXZlIHdpZGdl
dC4KLSAgICAgICAgLy8gKEF0dGFjaC9kZXRhY2ggY2FuIGFsc28gaGFwcGVuIGFzIGEgcmVzdWx0
IG9mIGRpc3BsYXkgdHlwZSBjaGFuZ2VzLCBlLmcuLCBtYWtpbmcgYSB3aWRnZXQKLSAgICAgICAg
Ly8gYmxvY2sgaW5zdGVhZCBvZiBpbmxpbmUsIGFuZCBmb2N1cyBzaG91bGQgYmUgcmVzdG9yZWQg
aW4gdGhhdCBjYXNlIGFzIHdlbGwuKQotICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Zm9jdXNO
b2RlKCkgPT0gdGhpcyAmJiBtX3JlbmRlci0+aXNXaWRnZXQoKSAmJiAKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRnZXQoKSkKLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRnZXQoKS0+c2V0
Rm9jdXMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omlu
c2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQotewotICAgIGlmICghbV9mb3JtKSB7Ci0gICAgICAg
IC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBmb3JtIGVsZW1lbnQgYmVpbmcgY3Jl
YXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBpbnNlcnRlZCBpbnNpZGUgYSBmb3Jt
LiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAgICAvLyBzZXR0aW5nIGEgZm9ybSwg
d2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1ZSBmb3IgbV9mb3JtLCAKLSAgICAg
ICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gICAgICAgIG1fZm9y
bSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBtX2Zvcm0tPnJlZ2lzdGVyRm9ybUVs
ZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgRG9jdW1lbnRJbXBsICpk
b2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRvYyAmJiBpc1JhZGlvQnV0dG9u
KCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2VkKCkpCi0gICAgICAgICAgICAgICAg
ZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJbXBsKil0aGlzLCBtX2Zv
cm0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjppbnNlcnRlZElu
dG9UcmVlKGRlZXApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW1v
dmVkRnJvbVRyZWUoYm9vbCBkZWVwKQotewotICAgIC8vIFdoZW4gYmVpbmcgcmVtb3ZlZCB3ZSBo
YXZlIHRvIHBvc3NpYmx5IG51bGwgb3V0IG91ciBmb3JtIGFuZCByZW1vdmUgb3Vyc2VsdmVzIGZy
b20KLSAgICAvLyB0aGUgZm9ybSdzIGxpc3Qgb2YgZWxlbWVudHMuCi0gICAgaWYgKG1fZm9ybSkg
ewotICAgICAgICAvLyBBdHRlbXB0IHRvIHJlLWFjcXVpcmUgdGhlIGZvcm0uICBJZiB3ZSBjYW4n
dCByZS1hY3F1aXJlLCB0aGVuCi0gICAgICAgIC8vIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUg
Zm9ybS4KLSAgICAgICAgTm9kZUltcGwqIGZvcm0gPSBwYXJlbnROb2RlKCk7Ci0gICAgICAgIE5v
ZGVJbXBsKiByb290ID0gdGhpczsKLSAgICAgICAgd2hpbGUgKGZvcm0pIHsKLSAgICAgICAgICAg
IGlmIChmb3JtLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgcm9vdCA9IGZvcm07Ci0gICAgICAgICAgICBmb3JtID0gZm9ybS0+cGFyZW50
Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgZm9ybSBoYXMg
YmVlbiBkZW1vdGVkIHRvIGEgbGVhZiwgdGhlbiB3ZSB3b24ndCBmaW5kIGl0IGFzIGFuIGFuY2Vz
dG9yLgotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJvb3Qgbm9kZSBvZiBvdXIgY3Vy
cmVudCBmb3JtIGFuZCBvdXIgcm9vdCBub2RlCi0gICAgICAgIC8vIG1hdGNoLiAgSWYgc28sIHBy
ZXNlcnZlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBmb3JtLgotICAgICAgICBpZiAoIWZvcm0pIHsK
LSAgICAgICAgICAgIE5vZGVJbXBsKiBmb3JtUm9vdCA9IG1fZm9ybTsKLSAgICAgICAgICAgIHdo
aWxlIChmb3JtUm9vdC0+cGFyZW50KCkpIGZvcm1Sb290ID0gZm9ybVJvb3QtPnBhcmVudCgpOwot
ICAgICAgICAgICAgaWYgKGZvcm1Sb290ID09IHJvb3QpCi0gICAgICAgICAgICAgICAgZm9ybSA9
IG1fZm9ybTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmICghZm9ybSkgewotICAg
ICAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgICAgIG1f
Zm9ybSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYXNzZXJ0KGZvcm0gPT0gbV9m
b3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVkIGZvcm0gc2hvdWxkIGJlIHRoZSBzYW1lLiBJZiBub3Qs
IHNvbWV0aGluZyByZWFsbHkgc3RyYW5nZSBoYXBwZW5lZC4KLSAgICB9Ci0gICAKLSAgICBIVE1M
RWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsKLX0KLQotSFRNTEZvcm1FbGVtZW50
SW1wbCAqSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmdldEZvcm0oKSBjb25zdAotewotICAg
IE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlKHApIHsKLSAgICAgICAgaWYg
KHAtPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
SFRNTEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAgICAgICAgcCA9IHAtPnBhcmVudE5vZGUoKTsK
LSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURPTVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIG4gPSBnZXRBdHRyaWJ1dGUo
bmFtZUF0dHIpOwotICAgIHJldHVybiBuLmlzTnVsbCgpID8gIiIgOiBuOwotfQotCi12b2lkIEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6Om9uU2VsZWN0KCkKLXsKLSAgICAvLyAjIyMgbWFrZSB0aGlz
IHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJlCi0gICAgZGlzcGF0Y2hIVE1M
RXZlbnQoc2VsZWN0RXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6Om9uQ2hhbmdlKCkKLXsKLSAgICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0
aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJlCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoY2hh
bmdlRXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kaXNhYmxlZDsKLX0KLQotdm9p
ZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0RGlzYWJsZWQoYm9vbCBiKQotewotICAg
IHNldEF0dHJpYnV0ZShkaXNhYmxlZEF0dHIsIGIgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRSZWFkT25seShib29sIGIpCi17Ci0gICAgc2V0QXR0
cmlidXRlKHJlYWRvbmx5QXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgLy9i
b29sIGNoYW5nZWQgPSBjaGFuZ2VkKCk7Ci0gICAgSFRNTEVsZW1lbnRJbXBsOjpyZWNhbGNTdHls
ZSggY2ggKTsKLQotICAgIGlmIChtX3JlbmRlciAvKiYmIGNoYW5nZWQqLykKLSAgICAgICAgbV9y
ZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoZGlzYWJsZWQoKSB8fCAh
bV9yZW5kZXIgfHwgCi0gICAgICAgIChtX3JlbmRlci0+c3R5bGUoKSAmJiBtX3JlbmRlci0+c3R5
bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHx8IAotICAgICAgICBtX3JlbmRlci0+d2lk
dGgoKSA9PSAwIHx8IG1fcmVuZGVyLT5oZWlnaHQoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlmIChpc0ZvY3VzYWJsZSgp
KSB7Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewotICAgICAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCkgJiYKLSAg
ICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRn
ZXQoKS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OlRhYkZvY3VzKTsKLSAgICAgICAgfQotCWlm
IChnZXREb2N1bWVudCgpLT5mcmFtZSgpKQotCSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+ZnJh
bWUoKS0+dGFic1RvQWxsQ29udHJvbHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc01vdXNlRm9jdXNhYmxlKCkgY29u
c3QKLXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAgICBpZiAobV9yZW5kZXItPmlz
V2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQq
PihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PFJl
bmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3VzUG9saWN5KCkgJiBRV2lkZ2V0
OjpDbGlja0ZvY3VzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBGb3IgPGlucHV0IHR5cGU9aW1h
Z2U+IGFuZCA8YnV0dG9uPiwgd2Ugd2lsbCBhc3N1bWUgbm8gbW91c2UgZm9jdXNhYmlsaXR5LiAg
VGhpcyBpcwotICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggT1MgWCBiZWhhdmlvciBmb3IgYnV0
dG9ucy4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQotewotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotLy8gU3BlY2lhbCBjaGFycyB1c2VkIHRvIGVuY29kZSBmb3Jt
IHN0YXRlIHN0cmluZ3MuCi0vLyBXZSBwaWNrIGNoYXJzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGJl
IHVzZWQgaW4gYW4gSFRNTCBhdHRyLCBzbyB3ZSByYXJlbHkgaGF2ZSB0byByZWFsbHkgZW5jb2Rl
LgotY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvciA9ICcmJzsKLWNvbnN0IGNoYXIgc3RhdGVFc2Nh
cGUgPSAnPCc7Ci1zdGF0aWMgY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvck1hcmtlcltdID0gIjxB
IjsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlRXNjYXBlTWFya2VyW10gPSAiPDwiOwotCi0vLyBF
bmNvZGUgYW4gZWxlbWVudCBuYW1lIHNvIHdlIGNhbiBwdXQgaXQgaW4gYSBzdGF0ZSBzdHJpbmcg
d2l0aG91dCBjb2xsaWRpbmcKLS8vIHdpdGggb3VyIHNlcGFyYXRvciBjaGFyLgotc3RhdGljIFFT
dHJpbmcgZW5jb2RlZEVsZW1lbnROYW1lKFFTdHJpbmcgc3RyKQotewotICAgIGludCBzZXBMb2Mg
PSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaW50IGVzY0xvYyA9IHN0ci5maW5kKHN0
YXRlU2VwYXJhdG9yKTsKLSAgICBpZiAoc2VwTG9jID49IDAgfHwgZXNjTG9jID49IDApIHsKLSAg
ICAgICAgUVN0cmluZyBuZXdTdHIgPSBzdHI7Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiPCIgd2l0
aCAiPDwiCi0gICAgICAgIHdoaWxlIChlc2NMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3Ry
LnJlcGxhY2UoZXNjTG9jLCAxLCBzdGF0ZUVzY2FwZU1hcmtlcik7Ci0gICAgICAgICAgICBlc2NM
b2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgZXNjTG9jKzEpOwotICAgICAgICB9Ci0gICAg
ICAgIC8vICAgcmVwbGFjZSAiJiIgd2l0aCAiPEEiCi0gICAgICAgIHdoaWxlIChzZXBMb2MgPj0g
MCkgewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2Uoc2VwTG9jLCAxLCBzdGF0ZVNlcGFyYXRv
ck1hcmtlcik7Ci0gICAgICAgICAgICBzZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwg
c2VwTG9jKzEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdTdHI7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gQnVpbGQgYSBzdHJpbmcgdGhhdCBj
b250YWlucyBFbGVtZW50TmFtZSZFbGVtZW50VHlwZSYKLSAgICByZXR1cm4gZW5jb2RlZEVsZW1l
bnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpICsgc3RhdGVTZXBhcmF0b3IgKyB0eXBlKCkucXN0cmlu
ZygpICsgc3RhdGVTZXBhcmF0b3I7Ci19Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgUVN0
cmluZyBlbmNOYW1lID0gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpOwotICAg
IFFTdHJpbmcgdHlwZVN0ciA9IHR5cGUoKS5xc3RyaW5nKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlz
dDo6SXRlcmF0b3IgaXQgPSBzdGF0ZXMuYmVnaW4oKTsgaXQgIT0gc3RhdGVzLmVuZCgpOyArK2l0
KSB7Ci0gICAgICAgIFFTdHJpbmcgc3RhdGUgPSAqaXQ7Ci0gICAgICAgIGludCBzZXAxID0gc3Rh
dGUuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgICAgIGludCBzZXAyID0gc3RhdGUuZmluZChz
dGF0ZVNlcGFyYXRvciwgc2VwMSsxKTsKLSAgICAgICAgYXNzZXJ0KHNlcDEgPj0gMCk7Ci0gICAg
ICAgIGFzc2VydChzZXAyID49IDApOwotCi0gICAgICAgIFFTdHJpbmcgbmFtZUFuZFR5cGUgPSBz
dGF0ZS5sZWZ0KHNlcDIpOwotICAgICAgICBpZiAoZW5jTmFtZS5sZW5ndGgoKSArIHR5cGVTdHIu
bGVuZ3RoKCkgKyAxID09ICh1aW50KXNlcDIKLSAgICAgICAgICAgICYmIG5hbWVBbmRUeXBlLnN0
YXJ0c1dpdGgoZW5jTmFtZSkKLSAgICAgICAgICAgICYmIG5hbWVBbmRUeXBlLmVuZHNXaXRoKHR5
cGVTdHIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZXMucmVtb3ZlKGl0KTsKLSAgICAg
ICAgICAgIHJldHVybiBzdGF0ZS5taWQoc2VwMisxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBy
ZXR1cm4gUVN0cmluZzo6bnVsbDsKLX0KLQotaW50IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
Ojp0YWJJbmRleCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0YWJpbmRleEF0
dHIpLnRvSW50KCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFRh
YkluZGV4KGludCB2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFiaW5kZXhBdHRyLCBRU3Ry
aW5nOjpudW1iZXIodmFsdWUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MQnV0
dG9uRWxlbWVudEltcGw6OkhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywg
SFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
KGJ1dHRvblRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAgICBtX2RpcnR5
ID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotfQotCi1IVE1MQnV0dG9uRWxl
bWVudEltcGw6On5IVE1MQnV0dG9uRWxlbWVudEltcGwoKQotewotfQotCi1SZW5kZXJPYmplY3Qq
IEhUTUxCdXR0b25FbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5h
LCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1
dHRvbih0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dHlwZSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0eXBlQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gIHR5cGVBdHRyKSB7Ci0g
ICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAic3VibWl0IikpCi0g
ICAgICAgICAgICBtX3R5cGUgPSBTVUJNSVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKGF0dHItPnZhbHVlKCksICJyZXNldCIpKQotICAgICAgICAgICAgbV90eXBlID0gUkVT
RVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJi
dXR0b24iKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IEJVVFRPTjsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKLSAgICAgICAgbV92YWx1ZSA9IGF0dHItPnZhbHVl
KCk7Ci0gICAgICAgIG1fY3VyclZhbHVlID0gbV92YWx1ZTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRN
TEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVy
RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVs
ZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlm
IChtX3R5cGUgIT0gQlVUVE9OICYmIChldnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSkg
ewotCi0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gU1VCTUlUKSB7Ci0gICAgICAgICAg
ICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAgICBtX2Zvcm0tPnByZXBhcmVTdWJt
aXQoKTsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7IC8vIGluIGNhc2Ugd2Ug
d2VyZSBjYW5jZWxlZAotICAgICAgICB9Ci0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0g
UkVTRVQpIG1fZm9ybS0+cmVzZXQoKTsKLSAgICB9Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxl
bWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRN
TCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNv
bnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBu
b3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBk
aWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAv
LyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBjb25zdHJhaW50IGZv
ciBub3cuCi0gICAgLy8gV2FzOiBtX3R5cGUgPT0gU1VCTUlUICYmICFtX2Rpc2FibGVkICYmICFu
YW1lKCkuaXNFbXB0eSgpCi0gICAgcmV0dXJuIG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJs
ZWQ7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjppc0FjdGl2YXRlZFN1Ym1pdCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0OwotfQotCi12b2lkIEhUTUxCdXR0
b25FbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAgICBtX2Fj
dGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphcHBl
bmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29sIC8qbXVsdGlwYXJ0Ki8pCi17
Ci0gICAgaWYgKG1fdHlwZSAhPSBTVUJNSVQgfHwgbmFtZSgpLmlzRW1wdHkoKSB8fCAhbV9hY3Rp
dmVTdWJtaXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGluZy5hcHBlbmREYXRh
KG5hbWUoKSwgbV9jdXJyVmFsdWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxC
dXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkK
LXsgICAKLSAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAv
LyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAgICBjbGljayhzZW5kVG9BbnlF
bGVtZW50KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQot
Ci12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0K
LQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxl
bWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhU
TUxGaWVsZFNldEVsZW1lbnRJbXBsOjpIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgIDogSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwoZmllbGRzZXRUYWcsIGRvYywgZikKLXsKLX0KLQotSFRNTEZpZWxkU2V0RWxlbWVu
dEltcGw6On5IVE1MRmllbGRTZXRFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTEZpZWxk
U2V0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAg
ICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSB8fCBIVE1MRWxlbWVudElt
cGw6OmNoZWNrRFREKG5ld0NoaWxkKTsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1w
bDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
ImZpZWxkc2V0IjsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6
Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17
Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpZWxkc2V0KHRoaXMpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpIVE1MSW5wdXRFbGVtZW50
SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGlucHV0VGFnLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgp
OwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0RWxlbWVudEltcGwoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVu
dEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCh0YWdOYW1lLCBkb2Ms
IGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppbml0
KCkKLXsKLSAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
ID0gZmFsc2U7Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX21heExlbiA9IC0xOwotICAgIG1f
c2l6ZSA9IDIwOwotICAgIG1fY2hlY2tlZCA9IGZhbHNlOwotICAgIG1fZGVmYXVsdENoZWNrZWQg
PSBmYWxzZTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLSAgICBtX2luZGV0ZXJt
aW5hdGUgPSBmYWxzZTsKLQotICAgIG1faGF2ZVR5cGUgPSBmYWxzZTsKLSAgICBtX2FjdGl2ZVN1
Ym1pdCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAgICBtX2luaXRlZCA9
IGZhbHNlOwotCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7Ci0KLSAgICBtX21heFJlc3Vs
dHMgPSAtMTsKLQotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gbV9m
b3JtLT5hdXRvQ29tcGxldGUoKTsKLX0KLQotSFRNTElucHV0RWxlbWVudEltcGw6On5IVE1MSW5w
dXRFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCkt
PmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAgICBkZWxldGUgbV9pbWFnZUxvYWRl
cjsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBtX25hbWU7Ci19Ci0KLWJvb2wgSFRN
TElucHV0RWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIC8v
IElmIHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3QgYmUgZm9jdXNlZCwgdGhlbiB3ZSBjYW4g
c3RvcCBub3cuCi0gICAgaWYgKCFIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2Fy
ZEZvY3VzYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV90eXBlID09
IFJBRElPKSB7Ci0gICAgICAgIC8vIFVubmFtZWQgcmFkaW8gYnV0dG9ucyBhcmUgbmV2ZXIgZm9j
dXNhYmxlIChtYXRjaGVzIFdpbklFKS4KLSAgICAgICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gTmV2ZXIgYWxsb3cga2V5Ym9h
cmQgdGFiYmluZyB0byBsZWF2ZSB5b3UgaW4gdGhlIHNhbWUgcmFkaW8gZ3JvdXAuICBBbHdheXMK
LSAgICAgICAgLy8gc2tpcCBhbnkgb3RoZXIgZWxlbWVudHMgaW4gdGhlIGdyb3VwLgotICAgICAg
ICBOb2RlSW1wbCogY3VycmVudEZvY3VzTm9kZSA9IGdldERvY3VtZW50KCktPmZvY3VzTm9kZSgp
OwotICAgICAgICBpZiAoY3VycmVudEZvY3VzTm9kZSAmJiBjdXJyZW50Rm9jdXNOb2RlLT5oYXNU
YWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGZv
Y3VzZWRJbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudEZv
Y3VzTm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNlZElucHV0LT5pbnB1dFR5cGUoKSA9PSBS
QURJTyAmJiBmb2N1c2VkSW5wdXQtPmZvcm0oKSA9PSBtX2Zvcm0gJiYKLSAgICAgICAgICAgICAg
ICBmb2N1c2VkSW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvdyBrZXlib2FyZCBm
b2N1cyBpZiB3ZSdyZSBjaGVja2VkIG9yIGlmIG5vdGhpbmcgaW4gdGhlIGdyb3VwIGlzIGNoZWNr
ZWQuCi0gICAgICAgIHJldHVybiBjaGVja2VkKCkgfHwgIWdldERvY3VtZW50KCktPmNoZWNrZWRS
YWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgfQotICAgIAot
ICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRUeXBl
KGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICBpZiAodC5pc0VtcHR5KCkpIHsKLSAgICAgICAg
aW50IGV4Y2NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh0eXBlQXR0ciwgZXhjY29kZSk7
Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0KTsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmlu
ZyYgdCkKLXsKLSAgICB0eXBlRW51bSBuZXdUeXBlOwotICAgIAotICAgIGlmIChlcXVhbElnbm9y
aW5nQ2FzZSh0LCAicGFzc3dvcmQiKSkKLSAgICAgICAgbmV3VHlwZSA9IFBBU1NXT1JEOwotICAg
IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJjaGVja2JveCIpKQotICAgICAgICBuZXdU
eXBlID0gQ0hFQ0tCT1g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhZGlv
IikpCi0gICAgICAgIG5ld1R5cGUgPSBSQURJTzsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZSh0LCAic3VibWl0IikpCi0gICAgICAgIG5ld1R5cGUgPSBTVUJNSVQ7Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJlc2V0IikpCi0gICAgICAgIG5ld1R5cGUgPSBSRVNF
VDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiZmlsZSIpKQotICAgICAgICBu
ZXdUeXBlID0gRklMRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaGlkZGVu
IikpCi0gICAgICAgIG5ld1R5cGUgPSBISURERU47Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgImltYWdlIikpCi0gICAgICAgIG5ld1R5cGUgPSBJTUFHRTsKLSAgICBlbHNlIGlm
IChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiYnV0dG9uIikpCi0gICAgICAgIG5ld1R5cGUgPSBCVVRU
T047Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImtodG1sX2lzaW5kZXgiKSkK
LSAgICAgICAgbmV3VHlwZSA9IElTSU5ERVg7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UodCwgInNlYXJjaCIpKQotICAgICAgICBuZXdUeXBlID0gU0VBUkNIOwotICAgIGVsc2UgaWYg
KGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYW5nZSIpKQotICAgICAgICBuZXdUeXBlID0gUkFOR0U7
Ci0gICAgZWxzZQotICAgICAgICBuZXdUeXBlID0gVEVYVDsKLQotICAgIC8vICMjIyBJTVBPUlRB
TlQ6IERvbid0IGFsbG93IHRoZSB0eXBlIHRvIGJlIGNoYW5nZWQgdG8gRklMRSBhZnRlciB0aGUg
Zmlyc3QKLSAgICAvLyB0eXBlIGNoYW5nZSwgb3RoZXJ3aXNlIGEgSmF2YVNjcmlwdCBwcm9ncmFt
bWVyIHdvdWxkIGJlIGFibGUgdG8gc2V0IGEgdGV4dAotICAgIC8vIGZpZWxkJ3MgdmFsdWUgdG8g
c29tZXRoaW5nIGxpa2UgL2V0Yy9wYXNzd2QgYW5kIHRoZW4gY2hhbmdlIGl0IHRvIGEgZmlsZSBm
aWVsZC4KLSAgICBpZiAobV90eXBlICE9IG5ld1R5cGUpIHsKLSAgICAgICAgaWYgKG5ld1R5cGUg
PT0gRklMRSAmJiBtX2hhdmVUeXBlKSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGF0dHJpYnV0
ZSBiYWNrIHRvIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAgICAvLyBVc2VmdWwgaW4gY2FzZSB3
ZSB3ZXJlIGNhbGxlZCBmcm9tIGluc2lkZSBwYXJzZU1hcHBlZEF0dHJpYnV0ZS4KLSAgICAgICAg
ICAgIHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW5hbWUoKS5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3Jv
dXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBn
ZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9y
bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdhc0F0dGFjaGVkID0gbV9hdHRh
Y2hlZDsKLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBkZXRh
Y2goKTsKLSAgICAgICAgICAgIGJvb2wgZGlkU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJh
dGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBtX3R5cGUgPSBuZXdUeXBlOwotICAgICAg
ICAgICAgYm9vbCB3aWxsU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmli
dXRlKCk7Ci0gICAgICAgICAgICBpZiAoZGlkU3RvcmVWYWx1ZSAmJiAhd2lsbFN0b3JlVmFsdWUg
JiYgIW1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFs
dWVBdHRyLCBtX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gRE9NU3RyaW5nKCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpZFN0b3JlVmFsdWUgJiYgd2lsbFN0
b3JlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gZ2V0QXR0cmlidXRlKHZhbHVl
QXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2FzQXR0YWNoZWQpCi0gICAg
ICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJ
ZiBvdXIgdHlwZSBtb3JwaHMgaW50byBhIHJhZGlvIGJ1dHRvbiBhbmQgd2UgYXJlIGNoZWNrZWQs
IHRoZW4gZ28gYWhlYWQKLSAgICAgICAgICAgIC8vIGFuZCBzaWduYWwgdGhpcyB0byB0aGUgZm9y
bS4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpKQotICAgICAg
ICAgICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0p
OwotICAgICAgICB9Ci0gICAgfQotICAgIG1faGF2ZVR5cGUgPSB0cnVlOwotICAgIAotICAgIGlm
IChtX3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikgewotICAgICAgICBkZWxldGUgbV9p
bWFnZUxvYWRlcjsKLSAgICAgICAgbV9pbWFnZUxvYWRlciA9IDA7Ci0gICAgfQotfQotCi1ET01T
dHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIC8vIG5lZWRz
IHRvIGJlIGxvd2VyY2FzZSBhY2NvcmRpbmcgdG8gRE9NIHNwZWMKLSAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgIGNhc2UgVEVYVDogcmV0dXJuICJ0ZXh0IjsKLSAgICBjYXNlIFBBU1NXT1JEOiBy
ZXR1cm4gInBhc3N3b3JkIjsKLSAgICBjYXNlIENIRUNLQk9YOiByZXR1cm4gImNoZWNrYm94IjsK
LSAgICBjYXNlIFJBRElPOiByZXR1cm4gInJhZGlvIjsKLSAgICBjYXNlIFNVQk1JVDogcmV0dXJu
ICJzdWJtaXQiOwotICAgIGNhc2UgUkVTRVQ6IHJldHVybiAicmVzZXQiOwotICAgIGNhc2UgRklM
RTogcmV0dXJuICJmaWxlIjsKLSAgICBjYXNlIEhJRERFTjogcmV0dXJuICJoaWRkZW4iOwotICAg
IGNhc2UgSU1BR0U6IHJldHVybiAiaW1hZ2UiOwotICAgIGNhc2UgQlVUVE9OOiByZXR1cm4gImJ1
dHRvbiI7Ci0gICAgY2FzZSBTRUFSQ0g6IHJldHVybiAic2VhcmNoIjsKLSAgICBjYXNlIFJBTkdF
OiByZXR1cm4gInJhbmdlIjsKLSAgICBjYXNlIElTSU5ERVg6IHJldHVybiAiIjsKLSAgICB9Ci0g
ICAgcmV0dXJuICIiOwotfQotCi1RU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzdGF0ZSgg
KQotewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNh
dmUvcmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKTsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAg
IGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsg
KGNoZWNrZWQoKSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJu
IHN0YXRlICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOyAvLyBNYWtlIHN1cmUgdGhlIHN0cmluZyBp
cyBub3QgZW1wdHkhCi0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZXN0
b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBhc3NlcnQobV90eXBlICE9IFBB
U1NXT1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFzc3dvcmQgZmllbGRzCi0g
ICAgCi0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5k
TWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJuOwot
Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFE
SU86Ci0gICAgICAgIHNldENoZWNrZWQoKHN0YXRlID09ICJvbiIpKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc2V0VmFsdWUoRE9NU3RyaW5nKHN0YXRlLmxlZnQoc3Rh
dGUubGVuZ3RoKCktMSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpjYW5IYXZlU2VsZWN0aW9uKCkKLXsKLSAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAg
IGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6
Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBpZiAoIW1fcmVu
ZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNl
IFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAg
ICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+
c2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZWxl
Y3Rpb25FbmQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3
aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VB
UkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgZGVm
YXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewot
ICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewot
ICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2Fz
ZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5k
ZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17Ci0gICAgaWYgKCFtX3Jl
bmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAg
ICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVj
dGlvbkVuZChlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNl
bGVjdCggICkKLXsKLSAgICBpZighbV9yZW5kZXIpIHJldHVybjsKLQotICAgIHN3aXRjaCAobV90
eXBlKSB7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRl
ckZpbGVCdXR0b24qPihtX3JlbmRlciktPnNlbGVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNl
IFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCo+KG1fcmVuZGVy
KS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0g
ICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICBjYXNl
IElNQUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAg
ICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlU
OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaWYgKCFt
X3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNh
c2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0g
ICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNl
bGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxl
bWVudEltcGw6OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzLCBib29sIHNob3dQcmVzc2VkTG9v
aykKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSElEREVOOgot
ICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2Ug
QlVUVE9OOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNl
bmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24gKj4ocmVuZGVyZXIoKSktPmNsaWNr
KHNlbmRNb3VzZUV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNl
RXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0g
ICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2Fz
ZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMs
IHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1l
bnQpCi17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhJRERFTjoK
LSAgICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlwZQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2Fz
ZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgIGZvY3VzKCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBS
QURJTzoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAg
IGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIEZJTEU6Ci0g
ICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAvLyBmb2N1cwotICAgICAgICAgICAgZm9j
dXMoKTsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgbW91c2UgYnV0dG9uIGV2ZW50cyBpZmYg
dGhlCi0gICAgICAgICAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAg
ICAgICAgICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGNvbnN0IFF1
YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25z
dAotewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUg
PT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2c3BhY2VBdHRyIHx8Ci0gICAg
ICAgIGF0dHJOYW1lID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNh
bDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0gICAgaWYgKGF0dHJOYW1l
ID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlUmVwbGFjZWQ7IC8vIFNoYXJlIHdp
dGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gSFRNTEVsZW1lbnRJbXBs
OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQot
ewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgaWYgKG1fdHlw
ZSA9PSBSQURJTyAmJiBjaGVja2VkKCkgJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICAvLyBSZW1v
dmUgdGhlIHJhZGlvIGZyb20gaXRzIG9sZCBncm91cC4KLSAgICAgICAgICAgIGlmIChtX3R5cGUg
PT0gUkFESU8gJiYgIW1fbmFtZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1l
bnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChtX25hbWUuaW1wbCgpLCBtX2Zvcm0pOwotICAg
ICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUgb3VyIGNhY2hlZCByZWZlcmVuY2Ug
dG8gdGhlIG5hbWUuCi0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIAot
ICAgICAgICAvLyBBZGQgaXQgdG8gaXRzIG5ldyBncm91cC4KLSAgICAgICAgaWYgKG1fdHlwZSA9
PSBSQURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1
dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gIWVxdWFsSWdu
b3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgc2V0SW5wdXRUeXBlKGF0dHItPnZhbHVlKCkp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAgICAgICAv
LyBXZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9ybSBpcyBsb29raW5nIGF0IHRo
ZSBkZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KLSAgICAgICAgaWYgKG1fdmFsdWUuaXNOdWxsKCkp
Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVy
ZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGVja2VkQXR0cikg
ewotICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICBp
ZiAobV91c2VEZWZhdWx0Q2hlY2tlZCkgewotICAgICAgICAgICAgc2V0Q2hlY2tlZChtX2RlZmF1
bHRDaGVja2VkKTsKLSAgICAgICAgICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikgewot
ICAgICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQo
KSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0gIWF0dHItPmlzTnVsbCgpID8gYXR0
ci0+dmFsdWUoKS50b0ludCgpIDogMjA7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YWx0QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90eXBlID09IElNQUdFKQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3JlbmRlciktPnVwZGF0ZUFsdFRl
eHQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7Ci0gICAgICAg
IGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsKLSAgICAgICAgICAgIGlmICghbV9p
bWFnZUxvYWRlcikKLSAgICAgICAgICAgICAgICBtX2ltYWdlTG9hZGVyID0gbmV3IEhUTUxJbWFn
ZUxvYWRlcih0aGlzKTsKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB1c2VtYXBB
dHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewot
ICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwg
Q1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFk
ZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBhZGRI
VE1MQWxpZ25tZW50KGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRo
QXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsK
LSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUo
KSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAg
ICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0
ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
c2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWxlY3RFdmVudCwg
YXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmlucHV0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZl
bnRMaXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRyKTsKLSAgICB9Ci0gICAgLy8gU2VhcmNoIGZpZWxk
IGFuZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwganVzdCBjYXVzZSB1cGRhdGVGcm9tRWxlbWVudCB0
byBiZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQotICAgIC8vIHJlY2FsY2luZy4KLSAgICBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25zZWFyY2hBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSByZXN1bHRzQXR0cikgewotICAgICAgICBtX21heFJlc3VsdHMgPSAhYXR0ci0+aXNOdWxsKCkg
PyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0ciB8fAotICAgICAgICAgICAg
ICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0
ci0+bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFt
ZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtYXhBdHRy
IHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9uQXR0cikgewotICAg
ICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0g
ICAgc3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBURVhUOgotICAgIGNhc2UgUEFTU1dP
UkQ6Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBSQU5HRToKLSAgICBjYXNlIElTSU5ERVg6
Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgIGNhc2UgU1VCTUlUOgot
ICAgIGNhc2UgSU1BR0U6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEZJTEU6Ci0gICAgY2Fz
ZSBCVVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW5kZXJlcklz
TmVlZGVkKHN0eWxlKTsKLSAgICBjYXNlIEhJRERFTjogICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJPYmplY3Qg
KkhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEs
IFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBj
YXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNl
IElTSU5ERVg6ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyTGluZUVkaXQodGhpcyk7Ci0gICAg
Y2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICByZXR1cm4gUmVuZGVyT2Jq
ZWN0OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotICAgIGNhc2UgU1VCTUlUOgotICAgIGNh
c2UgUkVTRVQ6Ci0gICAgY2FzZSBCVVRUT046Ci0gICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBS
ZW5kZXJCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBJTUFHRTogICAgcmV0dXJuIG5ldyAoYXJlbmEp
IFJlbmRlckltYWdlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgRklMRTogICAgIHJldHVybiBuZXcg
KGFyZW5hKSBSZW5kZXJGaWxlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgUkFOR0U6ICAgIHJldHVy
biBuZXcgKGFyZW5hKSBSZW5kZXJTbGlkZXIodGhpcyk7Ci0gICAgY2FzZSBISURERU46ICAgYnJl
YWs7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgaWYgKCFtX2luaXRlZCkgewot
ICAgICAgICBpZiAoIW1faGF2ZVR5cGUpCi0gICAgICAgICAgICBzZXRJbnB1dFR5cGUoZ2V0QXR0
cmlidXRlKHR5cGVBdHRyKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUg
ZHluYW1pYywgZG9lc24ndCBpdCwgc2luY2Ugc29tZW9uZSBjb3VsZCBzZXQgdGhpcwotICAgICAg
ICAvLyBhZnRlciBhdHRhY2htZW50PwotICAgICAgICBET01TdHJpbmcgdmFsID0gZ2V0QXR0cmli
dXRlKHZhbHVlQXR0cik7Ci0gICAgICAgIGlmICgodWludCkgbV90eXBlIDw9IElTSU5ERVggJiYg
IXZhbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIHN0dWZmLi4K
LSAgICAgICAgICAgIFFTdHJpbmcgbnZhbHVlOwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBp
bnQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoKCk7ICsraSkKLSAgICAgICAgICAgICAgICBpZiAodmFs
W2ldID49ICcgJykKLSAgICAgICAgICAgICAgICAgICAgbnZhbHVlICs9IHZhbFtpXTsKLQotICAg
ICAgICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSBudmFsdWUubGVuZ3RoKCkpCi0gICAgICAgICAg
ICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbnZhbHVlKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIG1faW5pdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBEaXNhbGxvdyB0aGUgd2lkdGgg
YXR0cmlidXRlIG9uIGlucHV0cyBvdGhlciB0aGFuIEhJRERFTiBhbmQgSU1BR0UuCi0gICAgLy8g
RHVtYiBXZWIgc2l0ZXMgd2lsbCB0cnkgdG8gc2V0IHRoZSB3aWR0aCBhcyBhbiBhdHRyaWJ1dGUg
b24gZm9ybSBjb250cm9scyB0aGF0IGFyZW4ndAotICAgIC8vIGltYWdlcyBvciBoaWRkZW4uCi0g
ICAgaWYgKGhhc01hcHBlZEF0dHJpYnV0ZXMoKSAmJiBtX3R5cGUgIT0gSElEREVOICYmIG1fdHlw
ZSAhPSBJTUFHRSAmJiAhZ2V0QXR0cmlidXRlKHdpZHRoQXR0cikuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgIGludCBleGNDb2RlOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUod2lkdGhBdHRyLCBleGND
b2RlKTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCk7
Ci0KLSAgICBpZiAobV90eXBlID09IElNQUdFKSB7Ci0gICAgICAgIGlmICghbV9pbWFnZUxvYWRl
cikKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMp
OwotICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAgICBp
ZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAgUmVuZGVySW1hZ2UqIGltYWdlT2JqID0gc3Rh
dGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJlcigpKTsKLSAgICAgICAgICAgIGltYWdlT2Jq
LT5zZXRJbWFnZShtX2ltYWdlTG9hZGVyLT5pbWFnZSgpKTsgICAgCi0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5nIHBhc3N3b3JkRmllbGRS
ZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcKLSAgICAvLyB3YXMgc3VjaCB0
aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAgIGlmIChtX3R5cGUgPT0gUEFT
U1dPUkQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnBhc3N3b3JkRmllbGRBZGRlZCgpOwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZXRhY2goKQotewotICAgIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0g
ZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWx0VGV4dCgpIGNv
bnN0Ci17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgw
NDI0L2FwcGVuZGl4L25vdGVzLmh0bWwjYWx0Z2VuCi0gICAgLy8gYWxzbyBoZWF2aWx5IGRpc2N1
c3NlZCBieSBIaXhpZSBvbiBidWd6aWxsYQotICAgIC8vIG5vdGUgdGhpcyBpcyBpbnRlbnRpb25h
bGx5IGRpZmZlcmVudCB0byBIVE1MSW1hZ2VFbGVtZW50SW1wbDo6YWx0VGV4dCgpCi0gICAgRE9N
U3RyaW5nIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLSAgICAvLyBmYWxsIGJhY2sgdG8g
dGl0bGUgYXR0cmlidXRlCi0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0
QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAgICAgICAgYWx0
ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgaWYgKGFsdC5pc0VtcHR5KCkpCi0gICAg
ICAgIGFsdCA9IGlucHV0RWxlbWVudEFsdFRleHQoKTsKLQotICAgIHJldHVybiBhbHQ7Ci19Ci0K
LWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNv
bnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1l
cwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJv
d3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3
ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9u
cyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFdhczogKG1fdHlw
ZSA9PSBTVUJNSVQgJiYgIW5hbWUoKS5pc0VtcHR5KCkpCi0gICAgcmV0dXJuICFtX2Rpc2FibGVk
ICYmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCk7Ci19Ci0KLWJvb2wgSFRN
TElucHV0RWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFj
dGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmbGFnOwot
fQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxp
c3QgJmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKLXsKLSAgICAvLyBpbWFnZSBnZW5lcmF0ZXMg
aXRzIG93biBuYW1lcwotICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpICYmIG1fdHlwZSAhPSBJTUFH
RSkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBI
SURERU46Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAg
IGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAvLyBhbHdh
eXMgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZh
bHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgY2FzZSBDSEVDS0JP
WDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGlmIChjaGVja2VkKCkpIHsKLSAg
ICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVh
azsKLQotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAg
ICAgIC8vIHRob3NlIGJ1dHRvbnMgYXJlIG5ldmVyIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgaWYgKG1fYWN0
aXZlU3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCku
aXNFbXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBjbGlja1goKSk7Ci0gICAgICAgICAg
ICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gInkiIDogKG5hbWUo
KSArICIueSIpLCBjbGlja1koKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFuYW1lKCkuaXNFbXB0
eSgpICYmICF2YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmcu
YXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVUJN
SVQ6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBE
T01TdHJpbmcgZW5jX3N0ciA9IHZhbHVlV2l0aERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICBp
ZiAoIWVuY19zdHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLmFw
cGVuZERhdGEobmFtZSgpLCBlbmNfc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBz
dWJtaXQgZmlsZSBvbiBHRVQKLSAgICAgICAgICAgIC8vIGRvbid0IHN1Ym1pdCBpZiBkaXNwbGF5
OiBub25lIG9yIGRpc3BsYXk6IGhpZGRlbgotICAgICAgICAgICAgaWYoIW11bHRpcGFydCB8fCAh
cmVuZGVyZXIoKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0ga2h0bWw6
OlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAv
LyBpZiBubyBmaWxlbmFtZSBhdCBhbGwgaXMgZW50ZXJlZCwgcmV0dXJuIHN1Y2Nlc3NmdWwsIGhv
d2V2ZXIgZW1wdHkKLSAgICAgICAgICAgIC8vIG51bGwgd291bGQgYmUgbW9yZSBsb2dpY2FsIGJ1
dCBuZXRzY2FwZSBwb3N0cyBhbiBlbXB0eSBmaWxlLiBhcmdoLgotICAgICAgICAgICAgaWYgKHZh
bHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShu
YW1lKCksIFFTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRmlsZShuYW1lKCksIHZhbHVl
KCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJ
U0lOREVYOgotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkp
OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIGlmIChzdG9yZXNW
YWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKQotICAgICAgICBzZXRWYWx1ZShET01TdHJpbmco
KSk7Ci0gICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICBtX3VzZURlZmF1bHRD
aGVja2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0Q2hlY2tl
ZChib29sIF9jaGVja2VkKQotewotICAgIC8vIFdpbklFIGRvZXMgbm90IGFsbG93IHVubmFtZWQg
cmFkaW8gYnV0dG9ucyB0byBldmVuIGJlIGNoZWNrZWQuCi0gICAgaWYgKGNoZWNrZWQoKSA9PSBf
Y2hlY2tlZCB8fCAobV90eXBlID09IFJBRElPICYmIG5hbWUoKS5pc0VtcHR5KCkpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPICYmIF9jaGVja2VkKQotICAgICAg
ICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLQotICAg
IG1fdXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2NoZWNrZWQgPSBfY2hlY2tlZDsK
LSAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5
bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVu
ZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLSAgICBvbkNoYW5nZSgpOwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJvb2wgX2luZGV0ZXJtaW5hdGUpCi17
Ci0gICAgLy8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0ZXJtaW5hdGUuCi0gICAgaWYgKG1f
dHlwZSAhPSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkgPT0gX2luZGV0ZXJtaW5hdGUpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIG1faW5kZXRlcm1pbmF0ZSA9IF9pbmRldGVybWluYXRlOwot
Ci0gICAgc2V0Q2hhbmdlZCgpOwotCi0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+
c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQo
cmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudEltcGwgKnNvdXJjZSkK
LXsKLSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAqc291cmNlRWxlbSA9IHN0YXRpY19j
YXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KHNvdXJjZSk7Ci0KLSAgICBtX3ZhbHVl
ID0gc291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQgPSBzb3VyY2VFbGVtLT5tX2No
ZWNrZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0gc291cmNlRWxlbS0+bV9pbmRldGVybWluYXRl
OwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnZhbHVlKCkgY29uc3QKLXsK
LSAgICBET01TdHJpbmcgdmFsdWUgPSBtX3ZhbHVlOwotCi0gICAgLy8gSXQncyBpbXBvcnRhbnQg
Km5vdCogdG8gZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIGZpbGUgaW5wdXRz
LAotICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBhIG1hbGljaW91cyB3ZWIgcGFnZSB0
byB1cGxvYWQgZmlsZXMgYnkgc2V0dGluZyB0aGUKLSAgICAvLyB2YWx1ZSBhdHRyaWJ1dGUgaW4g
bWFya3VwLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiBtX3R5cGUgIT0gRklMRSkKLSAgICAg
ICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLQotICAgIC8vIElmIG5vIGF0dHJp
YnV0ZSBleGlzdHMsIHRoZW4ganVzdCB1c2UgIm9uIiBvciAiIiBiYXNlZCBvZmYgdGhlIGNoZWNr
ZWQoKSBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLSAgICBpZiAodmFsdWUuaXNOdWxsKCkgJiYgKG1f
dHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pKQotICAgICAgICByZXR1cm4gRE9N
U3RyaW5nKGNoZWNrZWQoKSA/ICJvbiIgOiAiIik7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0K
LURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0
Ci17Ci0gICAgRE9NU3RyaW5nIHYgPSB2YWx1ZSgpOwotICAgIGlmICh2LmlzRW1wdHkoKSkgewot
ICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAg
ICAgICAgICAgICB2ID0gcmVzZXRCdXR0b25EZWZhdWx0TGFiZWwoKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgdiA9
IHN1Ym1pdEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0g
ICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAg
ICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAg
IGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBjYXNl
IFBBU1NXT1JEOgotICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGNhc2UgUkFO
R0U6Ci0gICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgIGNhc2UgVEVYVDoKLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdjsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBpZiAobV90eXBlID09IEZJTEUpIHJldHVybjsKLQotICAgIG1fdmFsdWVN
YXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21B
dHRyaWJ1dGUoKSkgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGlmIChtX3Jl
bmRlcikKLSAgICAgICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVl
QXR0ciwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0
VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBtX3ZhbHVl
ID0gdmFsdWU7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7Ci0gICAgCi0gICAg
Ly8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoaW5w
dXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
dG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoICht
X3R5cGUpIHsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0g
ICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgSU1B
R0U6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNh
c2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAg
IGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkKiBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgLy8g
cHJldmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJlIHVzZWQgdG8gcmV2ZXJzZSB0aGUg
YXV0b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJlLgotICAgIC8vIFRoaXMgcmVz
dWx0IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhlICJ1bmRvIiBpbiBwb3N0RGlz
cGF0Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCi0gICAgdm9pZCogcmVzdWx0ID0gMDsg
Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSAmJiBldnQt
PmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAg
IHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAg
ICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAgICAvLyBBcyBhIHdheSB0
byBzdG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdlIHdlcmUgdW5jaGVja2VkLCAxIGlm
IHdlIHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCi0gICAgICAgICAgICAvLyBpbmRldGVybWluYXRl
LgotICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkgewotICAgICAgICAgICAgICAgIHJl
c3VsdCA9ICh2b2lkKikweDI7Ci0gICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZShmYWxz
ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKCkp
Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDE7Ci0gICAgICAgICAgICAg
ICAgc2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBzdG9yZSB0aGUgY3VycmVudCBz
ZWxlY3RlZCByYWRpbyBvYmplY3QuCi0gICAgICAgICAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSB8
fCBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIFVubmFtZWQgcmFkaW8g
YnV0dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1dHRvbnMganVzdCBzdGF5IGNoZWNr
ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBOZWVkIHRvIGxlYXJuIHRv
IHdvcmsgd2l0aG91dCBhIGZvcm0uCi0KLSAgICAgICAgICAgIC8vIFdlIHJlYWxseSB3YW50IHJh
ZGlvIGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGkuZS4sIHRvIGhhdmUgc29tZXRo
aW5nIGNoZWNrZWQuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgbm90aGluZyBpcyBjdXJy
ZW50bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMgYWN0aW9uIHRvIGJlICJ1bmRvbmUi
LCBzaW5jZQotICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21lIG9iamVjdCBpbiB0aGUgcmFkaW8g
Z3JvdXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgotICAgICAgICAgICAgSFRNTElucHV0RWxl
bWVudEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZv
ckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICBpZiAoY3VyclJhZGlv
KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlvIGJ1dHRvbiBzZWxlY3RlZCB0
aGF0IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1bHQgZmllbGQgYW5kIHJlZiBpdCBz
bwotICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUgZGVzdHJveWVkLgotICAgICAg
ICAgICAgICAgIGN1cnJSYWRpby0+cmVmKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY3Vy
clJhZGlvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKLSAg
ICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQq
IGRhdGEpCi17Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElP
KSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYg
Ci0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0g
MCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAgICAvLyBS
ZXZlcnNlIHRoZSBjaGVja2luZyB3ZSBkaWQgaW4gcHJlRGlzcGF0Y2guCi0gICAgICAgICAgICBp
ZiAoZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZhdWx0SGFuZGxlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gKHZvaWQqKTB4MikKLSAgICAgICAgICAgICAgICAg
ICAgc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgICAgIHNldENoZWNrZWQoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0g
ZWxzZSBpZiAoZGF0YSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0
ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihkYXRhKTsKLSAgICAgICAgICAg
IGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRlZmF1bHRIYW5kbGVkKCkpIHsK
LSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzZWxlY3RlZCByYWRpbyBi
dXR0b24gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGlzIHN0
aWxsIGEgcmFkaW8gYnV0dG9uIGFuZCBvbmx5IGRvIHRoZSByZXN0b3JhdGlvbiBpZiBpdCBzdGls
bAotICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gb3VyIGdyb3VwLgotICAgICAgICAgICAg
ICAgIGlmIChpbnB1dC0+Zm9ybSgpID09IGZvcm0oKSAmJiBpbnB1dC0+aW5wdXRUeXBlKCkgPT0g
UkFESU8gJiYgaW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gT2ssIHRoZSBvbGQgcmFkaW8gYnV0dG9uIGlzIHN0aWxsIGluIG91ciBmb3JtIGFuZCBpbiBv
dXIgZ3JvdXAgYW5kIGlzIHN0aWxsIGEgCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhZGlvIGJ1
dHRvbiwgc28gaXQncyBzYWZlIHRvIHJlc3RvcmUgc2VsZWN0aW9uIHRvIGl0LgotICAgICAgICAg
ICAgICAgICAgICBpbnB1dC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC0+ZGVyZWYoKTsKLSAgICAgICAgfQotICAg
IH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihF
dmVudEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlID09IElNQUdFICYmIGV2dC0+aXNNb3Vz
ZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiBtX3JlbmRlcikgewotICAg
ICAgICAvLyByZWNvcmQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB3aGVuIHdlIGdldCB0aGUgRE9N
QWN0aXZhdGUgZXZlbnQKLSAgICAgICAgTW91c2VFdmVudEltcGwgKm1lID0gc3RhdGljX2Nhc3Q8
TW91c2VFdmVudEltcGwqPihldnQpOwotICAgICAgICBpbnQgb2Zmc2V0WCwgb2Zmc2V0WTsKLSAg
ICAgICAgbV9yZW5kZXItPmFic29sdXRlUG9zaXRpb24ob2Zmc2V0WCxvZmZzZXRZKTsKLSAgICAg
ICAgeFBvcyA9IG1lLT5jbGllbnRYKCktb2Zmc2V0WDsKLSAgICAgICAgeVBvcyA9IG1lLT5jbGll
bnRZKCktb2Zmc2V0WTsKLQotCW1lLT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0KLQotICAg
IC8vIERPTUFjdGl2YXRlIGV2ZW50cyBjYXVzZSB0aGUgaW5wdXQgdG8gYmUgImFjdGl2YXRlZCIg
LSBpbiB0aGUgY2FzZSBvZiBpbWFnZSBhbmQgc3VibWl0IGlucHV0cywgdGhpcyBtZWFucwotICAg
IC8vIGFjdHVhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm0uIEZvciByZXNldCBpbnB1dHMsIHRoZSBm
b3JtIGlzIHJlc2V0LiBUaGVzZSBldmVudHMgYXJlIHNlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MK
LSAgICAvLyBvbiB0aGUgZWxlbWVudCwgb3IgcHJlc3NlcyBlbnRlciB3aGlsZSBpdCBpcyB0aGUg
YWN0aXZlIGVsZW1lbnQuIEphdmFjc3JpcHQgY29kZSB3aXNoaW5nIHRvIGFjdGl2YXRlIHRoZSBl
bGVtZW50Ci0gICAgLy8gbXVzdCBkaXNwYXRjaCBhIERPTUFjdGl2YXRlIGV2ZW50IC0gYSBjbGlj
ayBldmVudCB3aWxsIG5vdCBkbyB0aGUgam9iLgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBET01B
Y3RpdmF0ZUV2ZW50KSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09
IFNVQk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQpIHsKLSAgICAgICAgICAgIGlmICghbV9mb3JtKQot
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkVTRVQp
Ci0gICAgICAgICAgICAgICAgbV9mb3JtLT5yZXNldCgpOwotICAgICAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlm
ICghbV9mb3JtLT5wcmVwYXJlU3VibWl0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgeFBvcyA9
IDA7Ci0gICAgICAgICAgICAgICAgICAgIHlQb3MgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAg
ICAgICB9IAotICAgIH0KLQotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBz
ZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3Mg
dGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+
dHlwZSgpID09IGtleXByZXNzRXZlbnQgJiYgZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkgewotICAg
ICAgICBib29sIGNsaWNrRWxlbWVudCA9IGZhbHNlOwotICAgICAgICBib29sIGNsaWNrRGVmYXVs
dEZvcm1CdXR0b24gPSBmYWxzZTsKLQotICAgICAgICBET01TdHJpbmcga2V5ID0gc3RhdGljX2Nh
c3Q8S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRpZmllcigpOwotCi0gICAgICAg
IGlmIChrZXkgPT0gIlUrMDAwMDIwIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsK
LSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNL
Qk9YOgotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgICAgICBjYXNlIElN
QUdFOgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBT
VUJNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIGZvciBz
cGFjZWJhciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAg
IC8vIFRoZSBBcHBLaXQgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHNvbWUsIGJ1dCBub3QgYWxsLCBv
ZiB0aGVtLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAg
ICAgICAgICAgICAgICAvLyBJZiBhbiB1bnNlbGVjdGVkIHJhZGlvIGlzIHRhYmJlZCBpbnRvIChi
ZWNhdXNlIHRoZSBlbnRpcmUgZ3JvdXAgaGFzIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAg
Ly8gY2hlY2tlZCwgb3IgYmVjYXVzZSBvZiBzb21lIGV4cGxpY2l0IC5mb2N1cygpIGNhbGwpLCB0
aGVuIGFsbG93IHNwYWNlIHRvIGNoZWNrIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoIWNo
ZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrRWxlbWVudCA9IHRydWU7Ci0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgot
ICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NX
T1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBT
RUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChrZXkgPT0gIkVu
dGVyIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBj
YXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAg
ICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAg
ICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAg
ICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBvbiB0aGUgZGVmYXVsdCBm
b3JtIGJ1dHRvbiBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAgICAg
ICAgICAgICAgICAgICBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAg
ICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAg
ICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbW91c2Ug
Y2xpY2sgZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4KLSAgICAgICAgICAg
ICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
IC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBlbnRlciBvbiBhIHJhZGlvIGJ1dHRvbi4KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgKGtl
eSA9PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09ICJMZWZ0IiB8fCBrZXkgPT0gIlJp
Z2h0IikpIHsKLSAgICAgICAgICAgIC8vIExlZnQgYW5kIHVwIG1lYW4gInByZXZpb3VzIHJhZGlv
IGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBSaWdodCBhbmQgZG93biBtZWFuICJuZXh0IHJhZGlv
IGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBUZXN0ZWQgaW4gV2luSUUsIGFuZCBldmVuIGZvciBS
VEwsIGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0dG9uIChhbmQgc28gbW92ZXMK
LSAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVtcyBzdHJhbmdlLCBidXQgd2UnbGwg
bWF0Y2ggaXQuCi0gICAgICAgICAgICBib29sIGZvcndhcmQgPSAoa2V5ID09ICJEb3duIiB8fCBr
ZXkgPT0gIlJpZ2h0Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIGNhbiBvbmx5
IHN0YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhlIGZvcm0gaGFzbid0IGJlZW4g
ZGVtb3RlZCB0byBhIGxlYWYgYmVjYXVzZQotICAgICAgICAgICAgLy8gb2YgbWFsZm9ybWVkIEhU
TUwuCi0gICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7Ci0gICAgICAgICAgICB3aGlsZSAo
KG4gPSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6IG4tPnRyYXZlcnNlUHJldmlv
dXNOb2RlKCkpKSkgewotICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UgZW5jb3VudGVyIGEgZm9y
bSBlbGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCi0gICAgICAgICAgICAgICAgaWYgKG4t
Pmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBtb3JlIHJhZGlvIGJ1
dHRvbnMuCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBlbHQgPSBzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWx0
LT5mb3JtKCkgIT0gbV9mb3JtKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0RWx0ID0gc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChpbnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXRFbHQtPm5hbWUoKSA9PSBu
YW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+aXNGb2N1c2Fi
bGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5zZXRDaGVja2Vk
KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNldEZv
Y3VzTm9kZShpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQt
PmNsaWNrKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsaWNr
RWxlbWVudCkgewotICAgICAgICAgICAgY2xpY2soZmFsc2UpOwotICAgICAgICAgICAgZXZ0LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNsaWNrRGVmYXVsdEZvcm1C
dXR0b24gJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnN1Ym1pdENsaWNrKCk7Ci0g
ICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQp
OwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0VkaXRhYmxlKCkKLXsKLSAgICBy
ZXR1cm4gKChtX3R5cGUgPT0gVEVYVCkgfHwgKG1fdHlwZSA9PSBQQVNTV09SRCkgfHwKLSAgICAg
ICAgICAgIChtX3R5cGUgPT0gU0VBUkNIKSB8fCAobV90eXBlID09IElTSU5ERVgpIHx8IChtX3R5
cGUgPT0gRklMRSkpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc1VSTEF0dHJp
YnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAgIHJldHVybiAoYXR0ci0+bmFt
ZSgpID09IHNyY0F0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmRl
ZmF1bHRWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIp
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7
Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRDaGVja2VkKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShjaGVja2VkQXR0cikuaXNOdWxsKCk7Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRDaGVja2VkKGJvb2wgZGVmYXVs
dENoZWNrZWQpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoZWNrZWRBdHRyLCBkZWZhdWx0Q2hlY2tl
ZCA/ICIiIDogMCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXB0
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2VwdEF0dHIpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJp
bmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGln
bkF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBbGlnbihjb25zdCBE
T01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHQoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OnNldEFsdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShhbHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldE1h
eExlbmd0aChpbnQgX21heExlbmd0aCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobWF4bGVuZ3RoQXR0
ciwgUVN0cmluZzo6bnVtYmVyKF9tYXhMZW5ndGgpKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2l6
ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihfc2l6ZSkpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0
RWxlbWVudEltcGw6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmNv
bXBsZXRlVVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxl
bWVudEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShzcmNBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6dXNlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHVzZW1hcEF0dHIp
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRVc2VNYXAoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodXNlbWFwQXR0ciwgdmFsdWUpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMYWJlbEVsZW1lbnRJbXBsOjpIVE1MTGFiZWxF
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50SW1wbChsYWJl
bFRhZywgZG9jKQotewotfQotCi1IVE1MTGFiZWxFbGVtZW50SW1wbDo6fkhUTUxMYWJlbEVsZW1l
bnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUo
KSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsK
LSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxF
dmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRWxlbWVudEltcGwgKkhUTUxMYWJlbEVsZW1lbnRJ
bXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgRE9NU3RyaW5nIGZvcm1FbGVtZW50SWQgPSBnZXRB
dHRyaWJ1dGUoZm9yQXR0cik7Ci0gICAgaWYgKGZvcm1FbGVtZW50SWQuaXNOdWxsKCkpIHsKLSAg
ICAgICAgLy8gU2VhcmNoIGNoaWxkcmVuIG9mIHRoZSBsYWJlbCBlbGVtZW50IGZvciBhIGZvcm0g
ZWxlbWVudC4KLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSB0aGlzOwotICAgICAgICB3aGlsZSAo
KG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSkgewotICAgICAgICAgICAgaWYg
KG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIEhUTUxFbGVtZW50SW1w
bCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAg
ICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3JtRWxlbWVudElkLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmdldEVsZW1lbnRC
eUlkKGZvcm1FbGVtZW50SWQpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb2N1
cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAg
ICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6
YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBFbGVtZW50SW1w
bCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQpCi0gICAgICAgIGVs
ZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotSFRNTEZvcm1F
bGVtZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm0oKQotewotICAgIGZvciAoTm9k
ZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7IHAgIT0gMDsgcCA9IHAtPnBhcmVudE5vZGUoKSkgewot
ICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAgIH0KLSAgICAKLSAgICBy
ZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXko
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0K
LXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0K
LURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aHRtbEZvcigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50
SW1wbDo6c2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShmb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExl
Z2VuZEVsZW1lbnRJbXBsOjpIVE1MTGVnZW5kRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi06IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGxl
Z2VuZFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MTGVnZW5kRWxlbWVudEltcGw6On5IVE1MTGVn
ZW5kRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6aXNG
b2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmVuZGVyT2JqZWN0
KiBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVu
YSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJM
ZWdlbmQodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnR5cGUo
KSBjb25zdAotewotICAgIHJldHVybiAibGVnZW5kIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0
QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFj
Y2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1w
bDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsK
LX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1F
bGVtZW50SW1wbCAqSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAg
Ly8gQ2hlY2sgaWYgdGhlcmUncyBhIGZpZWxkc2V0IGJlbG9uZ2luZyB0byB0aGlzIGxlZ2VuZC4K
LSAgICBOb2RlSW1wbCAqZmllbGRzZXQgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKGZpZWxk
c2V0ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNldFRhZykpCi0gICAgICAgIGZpZWxk
c2V0ID0gZmllbGRzZXQtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoIWZpZWxkc2V0KQotICAgICAg
ICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgZmlyc3QgZm9ybSBlbGVtZW50IGluc2lkZSB0aGUg
ZmllbGRzZXQuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBjYXJlIGFib3V0IHRhYmluZGV4Pwot
ICAgIE5vZGVJbXBsICpub2RlID0gZmllbGRzZXQ7Ci0gICAgd2hpbGUgKChub2RlID0gbm9kZS0+
dHJhdmVyc2VOZXh0Tm9kZShmaWVsZHNldCkpKSB7Ci0gICAgICAgIGlmIChub2RlLT5pc0hUTUxF
bGVtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRp
Y19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgICAgIGlmICghZWxlbWVu
dC0+aGFzTG9jYWxOYW1lKGxlZ2VuZFRhZykgJiYgZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1l
bnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Zm9jdXMo
KQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAg
ICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjph
Y2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGlmIChFbGVtZW50
SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tl
eUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1I
VE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKHNlbGVjdFRhZywgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgpOwot
fQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1wbChjb25zdCBR
dWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywg
ZiksIG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OmluaXQoKQotewotICAgIG1fb3B0aW9ucyA9IDA7Ci0gICAgbV9tdWx0aXBsZSA9
IGZhbHNlOwotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci0gICAgLy8gMCBtZWFucyBp
bnZhbGlkIChpLmUuIG5vdCBzZXQpCi0gICAgbV9zaXplID0gMDsKLSAgICBtX21pbndpZHRoID0g
MDsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp+SFRNTFNlbGVjdEVsZW1lbnRJbXBsKCkK
LXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50
YWluc1N0YXRlKHRoaXMpOwotICAgIGlmIChtX29wdGlvbnMpIHsKLSAgICAgICAgbV9vcHRpb25z
LT5kZXRhY2goKTsKLSAgICAgICAgbV9vcHRpb25zLT5kZXJlZigpOwotICAgIH0KLX0KLQotYm9v
bCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGls
ZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFz
VGFnTmFtZShvcHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSB8
fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShoclRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhh
c1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJl
Y2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGhhc0NoYW5nZWRDaGlsZCgp
ICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PGtodG1sOjpSZW5kZXJTZWxlY3Qq
PihtX3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgIH0KLQotICAgIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLX0KLQotCi1ET01TdHJp
bmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG1f
bXVsdGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qtb25lIik7Ci19Ci0KLWludCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAotewotICAgIC8vIHJl
dHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0ZWQKLSAgICB1aW50IG8g
PSAwOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsK
LSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAg
ICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+
c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgIG8rKzsK
LSAgICAgICAgfQotICAgIH0KLSAgICBRX0FTU0VSVChtX211bHRpcGxlKTsKLSAgICByZXR1cm4g
LTE7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRTZWxlY3RlZEluZGV4KCBp
bnQgIGluZGV4ICkKLXsKLSAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucyBhbmQgc2Vs
ZWN0IG9ubHkgdGhlIG5ldyBvbmUKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpbnQgbGlzdEluZGV4OwotICAgIGZvciAobGlzdEluZGV4
ID0gMDsgbGlzdEluZGV4IDwgaW50KGl0ZW1zLnNpemUoKSk7IGxpc3RJbmRleCsrKSB7Ci0gICAg
ICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJbmRl
eF0pLT5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgfQotICAgIGxpc3RJbmRleCA9IG9wdGlvblRv
TGlzdEluZGV4KGluZGV4KTsKLSAgICBpZiAobGlzdEluZGV4ID49IDApCi0gICAgICAgIHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxl
Y3RlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLWludCBIVE1MU2VsZWN0
RWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgdWlu
dCBpOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAo
aXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgbGVuKys7Ci0g
ICAgfQotICAgIHJldHVybiBsZW47Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjph
ZGQoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJbXBsICpiZWZvcmUsIGlu
dCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgUmVmUHRyPEhUTUxFbGVtZW50SW1wbD4gcHJvdGVj
dE5ld0NoaWxkKGVsZW1lbnQpOyAvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgcmVmJ2QgYW5k
IGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYgKCFlbGVtZW50IHx8ICEoZWxl
bWVudC0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzTG9jYWxOYW1lKGhy
VGFnKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGluc2VydEJlZm9yZShlbGVtZW50LCBiZWZv
cmUsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAgc2V0
UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1v
dmUoIGludCBpbmRleCApCi17Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIGludCBs
aXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZihsaXN0SW5kZXggPCAw
IHx8IGluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAgICAgICByZXR1cm47IC8vICMjIyB3
aGF0IHNob3VsZCB3ZSBkbyA/IHJlbW92ZSB0aGUgbGFzdCBpdGVtPwotCi0gICAgTm9kZUltcGwg
Kml0ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgIGl0ZW0tPnJlZigpOwotICAgIHJlbW92ZUNo
aWxkKGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOwotICAgIGl0ZW0tPmRlcmVmKCk7Ci0gICAgaWYoICFl
eGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLURPTVN0
cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1aW50IGk7Ci0gICAg
UU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9y
IChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+
aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+dmFsdWUoKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIERPTVN0cmluZygiIik7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIGlmICh2YWx1ZS5pc051
bGwoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIGZpbmQgdGhlIG9wdGlvbiB3aXRoIHZhbHVl
KCkgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcgotICAgIC8vIGFuZCBtYWtlIGl0IHRoZSBj
dXJyZW50IHNlbGVjdGlvbi4KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMg
PSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgp
OyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYg
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT52YWx1ZSgpID09
IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihpdGVtc1tpXSktPnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzdGF0ZSgpCi17Ci0g
ICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAg
ICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0KLSAgICBRQ2hhciBzdGF0ZUNoYXJzW2xdOwotICAg
IAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspCi0gICAgICAgIGlmKGl0ZW1zW2ldLT5o
YXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICBzdGF0ZUNoYXJzW2ldID0g
J1gnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZUNoYXJzW2ldID0gJy4nOwotICAg
IFFTdHJpbmcgc3RhdGUoc3RhdGVDaGFycywgbCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyBzdGF0ZTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmX3N0YXRlcykKLXsKLSAgICBRU3Ry
aW5nIF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0
ZShfc3RhdGVzKTsKLSAgICBpZiAoX3N0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICByZWNh
bGNMaXN0SXRlbXMoKTsKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBfc3RhdGU7Ci0gICAgaWYoIXN0
YXRlLmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gnKSAmJiAhbV9tdWx0aXBsZSkgewot
ICAgICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4gaW4gcmVzdG9yZVN0YXRlISIpOwot
ICAgICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLiBTaG91
bGQgbmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgotICAgICAgICAvL3N0YXRlWzBdID0gJ1gnOwotICAg
IH0KLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotCi0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBs
OyBpKyspIHsKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7
Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG9lID0gc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgb2UtPnNldFNlbGVj
dGVkKHN0YXRlW2ldID09ICdYJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2V0Q2hhbmdlZCh0
cnVlKTsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3Jl
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9u
Y29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUgKTsKLSAg
ICBpZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAg
IHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJl
cGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENoaWxkLCBleGNlcHRpb25j
b2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2Vw
dGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZCAo
IE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1w
bCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFwcGVuZENoaWxkKG5ld0No
aWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBz
ZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotICAgIHJldHVybiBy
ZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZENoaWxkKE5v
ZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1
cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0
dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikg
ewotICAgICAgICBtX3NpemUgPSBrTWF4KGF0dHItPnZhbHVlKCkudG9JbnQoKSwgMSk7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIG1fbWlud2lk
dGggPSBrTWF4KCBhdHRyLT52YWx1ZSgpLnRvSW50KCksIDAgKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpIHsKLSAgICAgICAgbV9tdWx0aXBsZSA9ICghYXR0
ci0+aXNOdWxsKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0
dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVu
dExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsK
LSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpj
cmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsK
LSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2VsZWN0KHRoaXMpOwotfQotCi1ib29sIEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGVk
X3ZhbHVlcywgYm9vbCkKLXsKLSAgICBib29sIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICBRTWVt
QXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIHVpbnQg
aTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYg
KGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgSFRNTE9w
dGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3RlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+
dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAjIyMgdGhpcyBjYXNlIHNob3VsZCBub3Qg
aGFwcGVuLiBtYWtlIHN1cmUgdGhhdCB3ZSBzZWxlY3QgdGhlIGZpcnN0IG9wdGlvbgotICAgIC8v
IGluIGFueSBjYXNlLiBvdGhlcndpc2Ugd2UgaGF2ZSBubyBjb25zaXN0ZW5jeSB3aXRoIHRoZSBE
T00gaW50ZXJmYWNlLiBGSVhNRSEKLSAgICAvLyB3ZSByZXR1cm4gdGhlIGZpcnN0IG9uZSBpZiBp
dCB3YXMgYSBjb21ib2JveCBzZWxlY3QKLSAgICBpZiAoIXN1Y2Nlc3NmdWwgJiYgIW1fbXVsdGlw
bGUgJiYgbV9zaXplIDw9IDEgJiYgaXRlbXMuc2l6ZSgpICYmCi0gICAgICAgIChpdGVtc1swXS0+
aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpKSB7Ci0gICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1w
bCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbMF0p
OwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVsbCgpKQotICAgICAgICAgICAgZW5j
b2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dGV4dCgpLnFzdHJpbmcoKS5z
dHJpcFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVuY29kZWRfdmFs
dWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwotICAgICAgICBzdWNjZXNz
ZnVsID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKLX0KLQotaW50IEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5kZXgoaW50IG9wdGlvbkluZGV4KSBj
b25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVt
cygpOwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5kZXggPj0gaW50KGl0ZW1z
LnNpemUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGludCBsaXN0SW5kZXggPSAwOwot
ICAgIGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAoOwotICAgICAgICAgb3B0aW9uSW5k
ZXgyIDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5kZXgyIDw9IG9wdGlvbkluZGV4Owot
ICAgICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlwbyEKLSAgICAgICAgaWYgKGl0ZW1z
W2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgb3B0aW9u
SW5kZXgyKys7Ci0gICAgfQotICAgIGxpc3RJbmRleC0tOwotICAgIHJldHVybiBsaXN0SW5kZXg7
Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxpc3RUb09wdGlvbkluZGV4KGludCBs
aXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1z
ID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAgfHwgbGlzdEluZGV4ID49IGlu
dChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5h
bWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IG9wdGlvbkluZGV4
ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291bnRpbmcgT1BUR1JPVVAgZW50
cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8
IGxpc3RJbmRleDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRp
b25UYWcpKQotICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICByZXR1cm4gb3B0aW9uSW5k
ZXg7Ci19Ci0KLS8vIEZJWE1FIDQxOTc5OTc6IHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHB1
YmxpYyBBUEkgLVtET01IVE1MU2VsZWN0RWxlbWVudCBvcHRpb25zXSwgYnV0IGFsd2F5cyByZXR1
cm5zCi0vLyBhbiBlbXB0eSBsaXN0LgotSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zKCkKLXsKLSAgICBpZiAoIW1fb3B0aW9ucykgewotICAg
ICAgICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCh0aGlzKTsKLSAg
ICAgICAgbV9vcHRpb25zLT5yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fb3B0aW9uczsKLX0K
LQotLy8gRklYTUU6IERlbGV0ZSBvbmNlIHRoZSBhYm92ZSBmdW5jdGlvbiBpcyB3b3JraW5nIHdl
bGwgZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uc0hUTUxDb2xsZWN0aW9uKCkKLXsKLSAgICByZXR1
cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9uSW1wbCh0aGlz
LCBIVE1MQ29sbGVjdGlvbkltcGw6OlNFTEVDVF9PUFRJT05TKSk7Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNMaXN0SXRlbXMoKQotewotICAgIE5vZGVJbXBsKiBjdXJy
ZW50ID0gZmlyc3RDaGlsZCgpOwotICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZSgwKTsKLSAgICBIVE1M
T3B0aW9uRWxlbWVudEltcGwqIGZvdW5kU2VsZWN0ZWQgPSAwOwotICAgIHdoaWxlKGN1cnJlbnQp
IHsKLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpICYmIGN1cnJl
bnQtPmZpcnN0Q2hpbGQoKSkgewotICAgICAgICAgICAgLy8gIyMjIHdoYXQgaWYgb3B0Z3JvdXAg
Y29udGFpbnMganVzdCBjb21tZW50cz8gZG9uJ3Qgd2FudCBvbmUgb2Ygbm8gb3B0aW9ucyBpbiBp
dC4uLgotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsx
KTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRp
Y19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgY3VycmVudCA9
IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudC0+
aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtcy5yZXNpemUo
bV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9saXN0SXRl
bXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0g
ICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUgJiYgbV9zaXplIDw9
IDEpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgZm91bmRTZWxlY3Rl
ZC0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlm
IChmb3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZm91
bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvdW5kU2Vs
ZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZSho
clRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXpl
KCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBz
dGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgfQotICAgICAg
ICBOb2RlSW1wbCAqcGFyZW50ID0gY3VycmVudC0+cGFyZW50Tm9kZSgpOwotICAgICAgICBjdXJy
ZW50ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgaWYgKCFjdXJyZW50KSB7Ci0g
ICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMpCi0gICAgICAgICAgICAgICAgY3VycmVudCA9
IHBhcmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3JlY2FsY0xp
c3RJdGVtcyA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hpbGRy
ZW5DaGFuZ2VkKCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLQotICAgIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKTsKLX0KLQotdm9pZCBIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygpCi17Ci0gICAgbV9yZWNhbGNMaXN0
SXRlbXMgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8a2h0
bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7Ci0g
ICAgc2V0Q2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVzZXQo
KQotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsK
LSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAg
ICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBib29sIHNlbGVjdGVkID0g
KCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVsbCgpKTsKLSAgICAgICAg
ICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotICAgICAgICB9Ci0gICAgfQotICAg
IGlmICggbV9yZW5kZXIgKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3Jl
bmRlciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0gICAgc2V0Q2hhbmdlZCggdHJ1ZSAp
OwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bm90aWZ5T3B0aW9uU2VsZWN0ZWQo
SFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCkKLXsK
LSAgICBpZiAoc2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUpIHsKLSAgICAgICAgLy8gZGVzZWxlY3Qg
YWxsIG90aGVyIG9wdGlvbnMKLSAgICAgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0
ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgICAgIHVpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsg
aSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRp
b25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9IChpdGVtc1tpXSA9PSBzZWxl
Y3RlZE9wdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAg
ICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkNoYW5n
ZWQodHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICAv
LyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGluZyBzaW11bGF0ZWQgbW91c2Ug
ZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBwcm9wZXIgc2VuZGluZyBvZiB0
aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBrZXlwcmVzc0V2ZW50
KSB7Ci0gICAgCi0gICAgICAgIGlmICghbV9mb3JtIHx8ICFtX3JlbmRlciB8fCAhZXZ0LT5pc0tl
eWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIERP
TVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpLT5rZXlJ
ZGVudGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoa2V5ID09ICJFbnRlciIpIHsKLSAg
ICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVm
YXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAg
ICBmb2N1cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0TXVsdGlwbGUo
Ym9vbCBtdWx0aXBsZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobXVsdGlwbGVBdHRyLCBtdWx0aXBs
ZSA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRTaXplKGlu
dCBzaXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKHNp
emUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MS2V5Z2VuRWxlbWVudEltcGw6
OkhUTUxLZXlnZW5FbGVtZW50SW1wbChEb2N1bWVudEltcGwqIGRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCogZikKLSAgICA6IEhUTUxTZWxlY3RFbGVtZW50SW1wbChrZXlnZW5UYWcsIGRvYywgZikK
LXsKLSAgICBRU3RyaW5nTGlzdCBrZXlzID0gS1NTTEtleUdlbjo6c3VwcG9ydGVkS2V5U2l6ZXMo
KTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpID0ga2V5cy5iZWdpbigpOyBpICE9
IGtleXMuZW5kKCk7ICsraSkgewotICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG8gPSBu
ZXcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKGRvYywgZm9ybSgpKTsKLSAgICAgICAgYWRkQ2hpbGQo
byk7Ci0gICAgICAgIG8tPmFkZENoaWxkKG5ldyBUZXh0SW1wbChkb2MsIERPTVN0cmluZygqaSkp
KTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OnR5cGUoKSBj
b25zdAotewotICAgIHJldHVybiAia2V5Z2VuIjsKLX0KLQotdm9pZCBIVE1MS2V5Z2VuRWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17
Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGFsbGVuZ2VBdHRyKQotICAgICAgICBtX2NoYWxs
ZW5nZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGtleXR5
cGVBdHRyKQotICAgICAgICBtX2tleVR5cGUgPSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UKLSAg
ICAgICAgLy8gc2tpcCBIVE1MU2VsZWN0RWxlbWVudEltcGwgcGFyc2luZyEKLSAgICAgICAgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQot
Ci1ib29sIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0
JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICAvLyBPbmx5IFJTQSBpcyBzdXBwb3J0ZWQg
YXQgdGhpcyB0aW1lLgotICAgIGlmICghbV9rZXlUeXBlLmlzTnVsbCgpICYmICFlcXVhbElnbm9y
aW5nQ2FzZShtX2tleVR5cGUsICJyc2EiKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFFT
dHJpbmcgdmFsdWUgPSBLU1NMS2V5R2VuOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVuZ2VTdHJp
bmcoc2VsZWN0ZWRJbmRleCgpLCBtX2NoYWxsZW5nZS5xc3RyaW5nKCksIGdldERvY3VtZW50KCkt
PmZyYW1lKCktPmJhc2VVUkwoKSk7Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVl
LnV0ZjgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
SFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwob3B0Z3JvdXBUYWcsIGRvYywgZikKLXsKLX0KLQotSFRNTE9wdEdyb3VwRWxl
bWVudEltcGw6On5IVE1MT3B0R3JvdXBFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuICJvcHRncm91cCI7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBF
bGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAq
cmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hp
bGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBy
ZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwg
KkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hp
bGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2Rl
SW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZChu
ZXdDaGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoIWV4Y2VwdGlvbmNvZGUp
Ci0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUlt
cGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1
bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4
Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1Nl
bGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAg
IGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAg
ICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCogSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6
OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZWNhbGNTZWxlY3RPcHRpb25z
KCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5l
d0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci0gICAgcmVjYWxjU2Vs
ZWN0T3B0aW9ucygpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZWNhbGNT
ZWxlY3RPcHRpb25zKCkKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0ID0gcGFyZW50Tm9kZSgpOwot
ICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFtZShzZWxlY3RUYWcpKQotICAg
ICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0KQotICAg
ICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3QpLT5zZXRSZWNh
bGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjps
YWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwotfQor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkhUTUxCdXR0b25FbGVtZW50SW1wbC5oIgor
I2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJkb20yX2V2ZW50c2lt
cGwuaCIKKyNpbmNsdWRlICJGb3JtRGF0YUxpc3QuaCIKIAotdm9pZCBIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbDo6c2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUobGFiZWxBdHRyLCB2YWx1ZSk7Ci19CisjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9m
b3JtLmgiCisjaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgogCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgogCi1IVE1MT3B0aW9uRWxlbWVudEltcGw6OkhUTUxP
cHRpb25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAq
ZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGlvblRhZywgZG9jLCBmKQot
ewotICAgIG1fc2VsZWN0ZWQgPSBmYWxzZTsKLX0KK3VzaW5nIG5hbWVzcGFjZSBraHRtbDsKIAot
Ym9vbCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci19CituYW1lc3BhY2UgRE9NIHsKIAotRE9NU3RyaW5nIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJvcHRpb24iOwotfQordXNp
bmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1E
T01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp0ZXh0KCkgY29uc3QKK0hUTUxCdXR0b25F
bGVtZW50SW1wbDo6SFRNTEJ1dHRvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmKQorICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoYnV0
dG9uVGFnLCBkb2MsIGYpCiB7Ci0gICAgRE9NU3RyaW5nIHRleHQ7Ci0KLSAgICAvLyBXaW5JRSBk
b2VzIG5vdCB1c2UgdGhlIGxhYmVsIGF0dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdub3Jl
IGl0LgotICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1v
ZGUoKSkgewotICAgICAgICBET01TdHJpbmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0dHIp
OwotICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7
Ci0gICAgfQotCi0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzLT5maXJzdENoaWxkKCk7Ci0g
ICAgd2hpbGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9O
T0RFIHx8IG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFKQotICAgICAg
ICAgICAgdGV4dCArPSBuLT5ub2RlVmFsdWUoKTsKLSAgICAgICAgLy8gc2tpcCBzY3JpcHQgY29u
dGVudAotICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgpICYmIG4tPmhhc1RhZ05hbWUoSFRN
TE5hbWVzOjpzY3JpcHRUYWcpKQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dFNpYmxp
bmcodGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHRO
b2RlKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB0ZXh0OworICAgIG1fdHlwZSA9IFNVQk1J
VDsKKyAgICBtX2RpcnR5ID0gdHJ1ZTsKKyAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwogfQog
Ci12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0VGV4dChjb25zdCBET01TdHJpbmcgJnRl
eHQsIGludCAmZXhjZXB0aW9uKQorSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp+SFRNTEJ1dHRvbkVs
ZW1lbnRJbXBsKCkKIHsKLSAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugd2hl
cmUgdGhlcmUncyBleGFjdGx5IDEgY2hpbGQgbm9kZSwgYW5kIGl0J3MgYSB0ZXh0IG5vZGUuCi0g
ICAgTm9kZUltcGwgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIGlmIChjaGlsZCAmJiBjaGls
ZC0+aXNUZXh0Tm9kZSgpICYmICFjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBzdGF0
aWNfY2FzdDxUZXh0SW1wbCAqPihjaGlsZCktPnNldERhdGEodGV4dCwgZXhjZXB0aW9uKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgYXBwZW5k
Q2hpbGQobmV3IFRleHRJbXBsKGdldERvY3VtZW50KCksIHRleHQpLCBleGNlcHRpb24pOwogfQog
Ci1pbnQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjppbmRleCgpIGNvbnN0CitSZW5kZXJPYmplY3Qq
IEhUTUxCdXR0b25FbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5h
LCBSZW5kZXJTdHlsZSogc3R5bGUpCiB7Ci0gICAgLy8gTGV0J3MgZG8gdGhpcyBkeW5hbWljYWxs
eS4gTWlnaHQgYmUgYSBiaXQgc2xvdywgYnV0IHdlJ3JlIHN1cmUKLSAgICAvLyB3ZSB3b24ndCBm
b3JnZXQgdG8gdXBkYXRlIGEgbWVtYmVyIHZhcmlhYmxlIGluIHNvbWUgY2FzZXMuLi4KLSAgICBI
VE1MU2VsZWN0RWxlbWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgIGlmIChzZWxl
Y3QpIHsKLSAgICAgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gc2VsZWN0
LT5saXN0SXRlbXMoKTsKLSAgICAgICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgICAgICBp
bnQgb3B0aW9uSW5kZXggPSAwOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7
Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0
ZW1zW2ldKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uSW5kZXg7
Ci0gICAgICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0
dG9uKHRoaXMpOwogfQogCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0SW5kZXgoaW50
LCBpbnQgJmV4Y2VwdGlvbikKK0RPTVN0cmluZyBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnR5cGUo
KSBjb25zdAogewotICAgIGV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9O
X0FMTE9XRURfRVJSOwotICAgIC8vICMjIworICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodHlwZUF0
dHIpOwogfQogCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKK3ZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQogewotICAg
IGlmIChhdHRyLT5uYW1lKCkgPT0gc2VsZWN0ZWRBdHRyKQotICAgICAgICBtX3NlbGVjdGVkID0g
KCFhdHRyLT5pc051bGwoKSk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0
cikKKyAgICBpZiAoYXR0ci0+bmFtZSgpID09ICB0eXBlQXR0cikgeworICAgICAgICBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInN1Ym1pdCIpKQorICAgICAgICAgICAgbV90
eXBlID0gU1VCTUlUOworICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52
YWx1ZSgpLCAicmVzZXQiKSkKKyAgICAgICAgICAgIG1fdHlwZSA9IFJFU0VUOworICAgICAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiYnV0dG9uIikpCisgICAg
ICAgICAgICBtX3R5cGUgPSBCVVRUT047CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
dmFsdWVBdHRyKSB7CiAgICAgICAgIG1fdmFsdWUgPSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UK
LSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNv
bnN0Ci17Ci0gICAgaWYgKCAhbV92YWx1ZS5pc051bGwoKSApCi0gICAgICAgIHJldHVybiBtX3Zh
bHVlOwotICAgIC8vIFVzZSB0aGUgdGV4dCBpZiB0aGUgdmFsdWUgd2Fzbid0IHNldC4KLSAgICBy
ZXR1cm4gdGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKTsKLX0KLQotdm9pZCBIVE1M
T3B0aW9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0U2VsZWN0ZWQoYm9vbCBfc2VsZWN0ZWQpCi17Ci0gICAgaWYobV9zZWxl
Y3RlZCA9PSBfc2VsZWN0ZWQpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3NlbGVjdGVkID0gX3Nl
bGVjdGVkOwotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7
Ci0gICAgaWYgKHNlbGVjdCkKLSAgICAgICAgc2VsZWN0LT5ub3RpZnlPcHRpb25TZWxlY3RlZCh0
aGlzLF9zZWxlY3RlZCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpjaGlsZHJl
bkNoYW5nZWQoKQotewotICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxl
Y3QoKTsKLSAgIGlmIChzZWxlY3QpCi0gICAgICAgc2VsZWN0LT5jaGlsZHJlbkNoYW5nZWQoKTsK
LX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpIVE1MT3B0aW9uRWxlbWVudEltcGw6OmdldFNl
bGVjdCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnNlbGVjdCA9IHBhcmVudE5vZGUoKTsKLSAg
ICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3QtPmhhc1RhZ05hbWUoc2VsZWN0VGFnKSkKLSAgICAg
ICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnROb2RlKCk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0
PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHNlbGVjdCk7Ci19Ci0KLWJvb2wgSFRNTE9wdGlvbkVs
ZW1lbnRJbXBsOjpkZWZhdWx0U2VsZWN0ZWQoKSBjb25zdAotewotICAgIHJldHVybiAhZ2V0QXR0
cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1l
bnRJbXBsOjpzZXREZWZhdWx0U2VsZWN0ZWQoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShz
ZWxlY3RlZEF0dHIsIGIgPyAiIiA6IDApOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1l
bnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsYWJlbEF0
dHIpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0TGFiZWwoY29uc3QgRE9N
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobGFiZWxBdHRyLCB2YWx1ZSk7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OkhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBs
ICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwodGV4dGFyZWFUYWcsIGRvYywg
ZiksIG1fdmFsdWVJc1ZhbGlkKGZhbHNlKSwgbV92YWx1ZU1hdGNoZXNSZW5kZXJlcihmYWxzZSkK
LXsKLSAgICAvLyBEVEQgcmVxdWlyZXMgcm93cyAmIGNvbHMgYmUgc3BlY2lmaWVkLCBidXQgd2Ug
d2lsbCBwcm92aWRlIHJlYXNvbmFibGUgZGVmYXVsdHMKLSAgICBtX3Jvd3MgPSAyOwotICAgIG1f
Y29scyA9IDIwOwotICAgIG1fd3JhcCA9IHRhX1ZpcnR1YWw7Ci19Ci0KLUhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjp+SFRNTFRleHRBcmVhRWxlbWVudEltcGwoKQotewotICAgIGlmIChnZXREb2N1
bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci19
Ci0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuICJ0ZXh0YXJlYSI7Ci19Ci0KLVFTdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnN0YXRlKCApCi17Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5
IQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKSArIHZhbHVl
KCkucXN0cmluZygpKycuJzsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6cmVz
dG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgUVN0cmluZyBzdGF0ZSA9IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAg
IGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJuOwotICAgIHNldERlZmF1bHRWYWx1ZShzdGF0ZS5s
ZWZ0KHN0YXRlLmxlbmd0aCgpLTEpKTsKLSAgICAvLyB0aGUgY2xvc2UoKSBpbiB0aGUgcmVuZGVy
dHJlZSB3aWxsIHRha2UgY2FyZSBvZiB0cmFuc2ZlcnJpbmcgZGVmYXVsdHZhbHVlIHRvICd2YWx1
ZScKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZWxlY3Rpb25TdGFydCgpCi17
Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4
dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25TdGFydCgpOwotICAgIHJldHVybiAwOwotfQot
Ci1pbnQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYg
KG1fcmVuZGVyKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4o
bV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAg
IGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9y
ZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewotICAgIGlmIChtX3JlbmRl
cikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRT
ZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2Vs
ZWN0KCAgKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dEFyZWEqPihtX3JlbmRlciktPnNlbGVjdCgpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAg
aWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3Jl
bmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotfQotCi12b2lkIEhUTUxUZXh0
QXJlYUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFZhbHVlKGRlZmF1
bHRWYWx1ZSgpKTsKLX0KLSAgICAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0
dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewotICAgICAgICBtX3Jvd3MgPSAhYXR0ci0+aXNOdWxs
KCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAzOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkK
LSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY29sc0F0dHIpIHsKLSAgICAgICAgbV9j
b2xzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogNjA7Ci0gICAg
ICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlv
dXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3cmFw
QXR0cikgewotICAgICAgICAvLyB2aXJ0dWFsIC8gcGh5c2ljYWwgaXMgTmV0c2NhcGUgZXh0ZW5z
aW9uIG9mIEhUTUwgMy4wLCBub3cgZGVwcmVjYXRlZAotICAgICAgICAvLyBzb2Z0LyBoYXJkIC8g
b2ZmIGlzIHJlY29tbWVuZGF0aW9uIGZvciBIVE1MIDQgZXh0ZW5zaW9uIGJ5IElFIGFuZCBOUyA0
Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAidmlydHVhbCIp
IHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJzb2Z0IikpCi0gICAgICAgICAg
ICBtX3dyYXAgPSB0YV9WaXJ0dWFsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZShhdHRyLT52YWx1ZSgpLCAicGh5c2ljYWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52
YWx1ZSgpLCAiaGFyZCIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFfUGh5c2ljYWw7Ci0gICAg
ICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvbiIgKSkKLSAg
ICAgICAgICAgIG1fd3JhcCA9IHRhX1BoeXNpY2FsOwotICAgICAgICBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0
YV9Ob1dyYXA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIo
KS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKKyAgICAgICAgbV9jdXJyVmFsdWUg
PSBtX3ZhbHVlOwogICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIp
IHsKLSAgICAgICAgLy8gaWdub3JlIGZvciB0aGUgbW9tZW50CisgICAgICAgIC8vIERvIG5vdGhp
bmcuCiAgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKICAgICAg
ICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7CiAgICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewogICAgICAgICBzZXRIVE1MRXZlbnRMaXN0
ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
c2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWxlY3RFdmVudCwg
YXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBhdHRyKTsKICAgICB9IGVs
c2UKICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmli
dXRlKGF0dHIpOwogfQogCi1SZW5kZXJPYmplY3QgKkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpj
cmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsK
LSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyVGV4dEFyZWEodGhpcyk7Ci19Ci0KLWJvb2wg
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5j
b2RpbmcsIGJvb2wpCi17Ci0gICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsK
LSAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnJlc2V0KCkKK3ZvaWQgSFRN
TEJ1dHRvbkVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQog
ewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KKyAgICBpZiAobV90eXBlICE9IEJV
VFRPTiAmJiAoZXZ0LT50eXBlKCkgPT0gRE9NQWN0aXZhdGVFdmVudCkpIHsKIAotdm9pZCBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6dXBkYXRlVmFsdWUoKQotewotICAgIGlmICggIW1fdmFsdWVJ
c1ZhbGlkICkgewotICAgICAgICBpZiAoIG1fcmVuZGVyICkgewotICAgICAgICAgICAgbV92YWx1
ZSA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4oIG1fcmVuZGVyICktPnRleHQoKS5xc3Ry
aW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBkZWZhdWx0VmFsdWUoKS5xc3RyaW5n
KCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7CisgICAgICAg
IGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gU1VCTUlUKSB7CisgICAgICAgICAgICBtX2FjdGl2ZVN1
Ym1pdCA9IHRydWU7CisgICAgICAgICAgICBtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKTsKKyAgICAg
ICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7IC8vIGluIGNhc2Ugd2Ugd2VyZSBjYW5jZWxl
ZAogICAgICAgICB9Ci0gICAgICAgIG1fdmFsdWVJc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgaWYo
bV9mb3JtICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgpOwogICAgIH0KKyAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwogfQog
Ci1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1cGRh
dGVWYWx1ZSgpOwotICAgIHJldHVybiBtX3ZhbHVlLmlzTnVsbCgpID8gRE9NU3RyaW5nKCIiKSA6
IG1fdmFsdWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCitib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNTdWNj
ZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKIHsKLSAgICBtX3ZhbHVlID0gdmFsdWUucXN0cmlu
ZygpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3ZhbHVlSXNW
YWxpZCA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRl
RnJvbUVsZW1lbnQoKTsKLSAgICAvLyBGSVhNRTogRm9yY2UgcmVsb2FkIGZyb20gcmVuZGVyZXIs
IGFzIHJlbmRlcmVyIG1heSBoYXZlIG5vcm1hbGl6ZWQgbGluZSBlbmRpbmdzLgotICAgIG1fdmFs
dWVJc1ZhbGlkID0gZmFsc2U7Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKKyAgICAvLyBIVE1MIHNw
ZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCisgICAgLy8gdG8gYmUgY29uc2lk
ZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2VycworICAgIC8vIGRvIG5vdCBp
bXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQorICAgIC8vIGRpZmZl
cmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAorICAgIC8vIGF1
dGhvciBpbnRlbmRlZC4gCisgICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGNvbnN0cmFpbnQgZm9yIG5v
dy4KKyAgICAvLyBXYXM6IG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJsZWQgJiYgIW5hbWUo
KS5pc0VtcHR5KCkKKyAgICByZXR1cm4gbV90eXBlID09IFNVQk1JVCAmJiAhbV9kaXNhYmxlZDsK
IH0KIAotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgp
Citib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdAog
ewotICAgIERPTVN0cmluZyB2YWwgPSAiIjsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMg
LSBqdXN0IGdyYWIgdGhlIHRleHQgbm9kZXMKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4g
PSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAobi0+
aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFsICs9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4o
biktPmRhdGEoKTsKLSAgICAKLSAgICBpZiAodmFsWzBdID09ICdccicgJiYgdmFsWzFdID09ICdc
bicpIHsKLSAgICAgICAgdmFsID0gdmFsLmNvcHkoKTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDIp
OwotICAgIH0gZWxzZSBpZiAodmFsWzBdID09ICdccicgfHwgdmFsWzBdID09ICdcbicpIHsKLSAg
ICAgICAgdmFsID0gdmFsLmNvcHkoKTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDEpOwotICAgIH0K
LQotICAgIHJldHVybiB2YWw7CisgICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0OwogfQogCi12b2lk
IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5n
ICZkZWZhdWx0VmFsdWUpCit2b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVk
U3VibWl0KGJvb2wgZmxhZykKIHsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMgLSByZW1v
dmUgYWxsIHRoZSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBvbmUKLSAgICBRUHRy
TGlzdDxOb2RlSW1wbD4gdG9SZW1vdmU7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0g
Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKG4tPmlz
VGV4dE5vZGUoKSkKLSAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChuKTsKLSAgICBRUHRyTGlz
dEl0ZXJhdG9yPE5vZGVJbXBsPiBpdCh0b1JlbW92ZSk7Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUg
PSAwOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpIHsKLSAgICAgICAgTm9kZUltcGwg
Km4gPSBpdC5jdXJyZW50KCk7Ci0gICAgICAgIG4tPnJlZigpOwotICAgICAgICByZW1vdmVDaGls
ZChuLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgbi0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgaW5z
ZXJ0QmVmb3JlKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKGRlZmF1bHRWYWx1ZSksZmly
c3RDaGlsZCgpLCBleGNlcHRpb25jb2RlKTsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUpOwor
ICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKIH0KIAotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6aXNFZGl0YWJsZSgpCitib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YXBwZW5kRm9y
bURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCAvKm11bHRpcGFydCovKQogeworICAg
IGlmIChtX3R5cGUgIT0gU1VCTUlUIHx8IG5hbWUoKS5pc0VtcHR5KCkgfHwgIW1fYWN0aXZlU3Vi
bWl0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1l
KCksIG1fY3VyclZhbHVlKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsK
LSAgICBmb2N1cygpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphdHRhY2go
KQotewotICAgIG1fdmFsdWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6YXR0YWNoKCk7Ci0gICAgdXBkYXRlVmFsdWUoKTsKLX0KLQotdm9pZCBIVE1MVGV4
dEFyZWFFbGVtZW50SW1wbDo6ZGV0YWNoKCkKLXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6ZGV0YWNoKCk7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwordm9p
ZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVs
ZW1lbnQpCit7ICAgCisgICAgLy8gc2VuZCB0aGUgbW91c2UgYnV0dG9uIGV2ZW50cyBpZmYgdGhl
CisgICAgLy8gY2FsbGVyIHNwZWNpZmllZCBzZW5kVG9BbnlFbGVtZW50CisgICAgY2xpY2soc2Vu
ZFRvQW55RWxlbWVudCk7CiB9CiAKLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
YWNjZXNzS2V5KCkgY29uc3QKK0RPTVN0cmluZyBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmFjY2Vz
c0tleSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsK
IH0KIAotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpCit2b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCiB7CiAgICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0
dHIsIHZhbHVlKTsKIH0KIAotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0Q29scyhp
bnQgY29scykKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY29sc0F0dHIsIFFTdHJpbmc6Om51bWJlcihj
b2xzKSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFJvd3MoaW50IHJv
d3MpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJvd3NBdHRyLCBRU3RyaW5nOjpudW1iZXIocm93cykp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJc0luZGV4RWxlbWVudEltcGw6OkhU
TUxJc0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudElt
cGwgKmYpCi0gICAgOiBIVE1MSW5wdXRFbGVtZW50SW1wbChpc2luZGV4VGFnLCBkb2MsIGYpCi17
Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX25hbWUgPSAiaXNpbmRleCI7Ci19Ci0KLXZvaWQg
SFRNTElzSW5kZXhFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHByb21wdEF0dHIpCi0J
c2V0VmFsdWUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZQotICAgICAgICAvLyBkb24ndCBjYWxs
IEhUTUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlIGhlcmUsIGFzIGl0IHdvdWxk
Ci0gICAgICAgIC8vIGFjY2VwdCBhdHRyaWJ1dGVzIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBzdXBw
b3J0Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnByb21w
dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShwcm9tcHRBdHRyKTsKLX0KLQot
dm9pZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUocHJvbXB0QXR0ciwgdmFsdWUpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLXVuc2lnbmVkIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Omxl
bmd0aCgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpzZXRMZW5ndGgodW5zaWdu
ZWQgbGVuZ3RoKQotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi19Ci0KLU5vZGVJbXBs
ICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAot
ewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJ
bXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5n
ICZuYW1lKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJu
IDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9ybURhdGFMaXN0OjpGb3JtRGF0YUxp
c3QoUVRleHRDb2RlYyAqYykKLSAgICA6IG1fY29kZWMoYykKLXsKLX0KLQotdm9pZCBGb3JtRGF0
YUxpc3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcykKLXsKLSAgICBtX2xpc3QuYXBw
ZW5kKHMpOwotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0IFFTdHJp
bmcgJnMpCitET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0CiB7
Ci0gICAgUUNTdHJpbmcgY3N0ciA9IGZpeExpbmVCcmVha3MobV9jb2RlYy0+ZnJvbVVuaWNvZGUo
cywgdHJ1ZSkpOwotICAgIGNzdHIudHJ1bmNhdGUoY3N0ci5sZW5ndGgoKSk7Ci0gICAgbV9saXN0
LmFwcGVuZChjc3RyKTsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7CiB9CiAK
LXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25z
dCBET01TdHJpbmcgJmZpbGVuYW1lKQordm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnNldFZh
bHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCiB7Ci0gICAgYXBwZW5kU3RyaW5nKGtleS5xc3Ry
aW5nKCkpOwotICAgIG1fbGlzdC5hcHBlbmQoZmlsZW5hbWUucXN0cmluZygpKTsKKyAgICBzZXRB
dHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7CiB9Ci0KKyAgICAKIH0gLy8gbmFtZXNwYWNlCklu
ZGV4OiBraHRtbC9odG1sL0hUTUxLZXlnZW5FbGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
a2h0bWwvaHRtbC9IVE1MS2V5Z2VuRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMTk3NikKKysr
IGtodG1sL2h0bWwvSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUu
b3JnKQogICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUu
b3JnKQogICogICAgICAgICAgIChDKSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3Jn
KQotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqICAg
ICAgICAgICAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292IChhcEBueXBvcC5jb20pCiAgKgog
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgpAQCAtMjQsMjk0NSArMjQsMjEgQEAKICAqCiAgKi8KIAotI3VuZGVmIEZPUk1TX0RF
QlVHCi0vLyNkZWZpbmUgRk9STVNfREVCVUcKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgImh0bWwvaHRtbF9mb3JtaW1wbC5oIgotCi0jaW5jbHVkZSAia2h0bWx2aWV3LmgiCi0jaW5j
bHVkZSAiTWFjRnJhbWUuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0j
aW5jbHVkZSAiaHRtbF9pbWFnZWltcGwuaCIKLSNpbmNsdWRlICJraHRtbF9zZXR0aW5ncy5oIgot
I2luY2x1ZGUgIm1pc2MvZm9ybWRhdGEuaCIKLQotI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9u
LmgiCi0jaW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJjc3Nwcm9w
ZXJ0aWVzLmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAieG1sL2RvbV90ZXh0
aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJ4bWwv
RXZlbnROYW1lcy5oIgotI2luY2x1ZGUgImtodG1sX2V4dC5oIgotCi0jaW5jbHVkZSAicmVuZGVy
aW5nL3JlbmRlcl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgotI2luY2x1ZGUg
InJlbmRlcl90aGVtZS5oIgotCi0jaW5jbHVkZSA8a2xvY2FsZS5oPgotI2luY2x1ZGUgPHFmaWxl
Lmg+Ci0jaW5jbHVkZSA8cXRleHRjb2RlYy5oPgotCi0vLyBmb3Iga2V5Z2VuCi0jaW5jbHVkZSA8
cXN0cmluZy5oPgotI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KLQotI2luY2x1ZGUgPGFzc2VydC5o
PgotCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci0KLW5hbWVzcGFjZSBET00gewotCi11c2luZyBu
YW1lc3BhY2UgRXZlbnROYW1lczsKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLXN0cnVj
dCBGb3JtRGF0YUxpc3RJdGVtIHsKLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFDU3RyaW5n
ICZkYXRhKSA6IG1fZGF0YShkYXRhKSB7IH0KLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFT
dHJpbmcgJnBhdGgpIDogbV9wYXRoKHBhdGgpIHsgfQotCi0gICAgUVN0cmluZyBtX3BhdGg7Ci0g
ICAgUUNTdHJpbmcgbV9kYXRhOwotfTsKLQotY2xhc3MgRm9ybURhdGFMaXN0IHsKLXB1YmxpYzoK
LSAgICBGb3JtRGF0YUxpc3QoUVRleHRDb2RlYyAqKTsKLQotICAgIHZvaWQgYXBwZW5kRGF0YShj
b25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBh
cHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZS5xc3RyaW5nKCkp
OyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBRU3Ry
aW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVu
ZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZr
ZXksIGNvbnN0IFFDU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFz
dHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29u
c3QgRE9NU3RyaW5nICZrZXksIGludCB2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5
LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyhRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsgfQotICAg
IHZvaWQgYXBwZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZm
aWxlbmFtZSk7Ci0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVt
PiBiZWdpbigpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5iZWdpbigpOyB9Ci0gICAg
UVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gZW5kKCkgY29uc3QKLSAg
ICAgICAgeyByZXR1cm4gbV9saXN0LmVuZCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBl
bmRTdHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpOwotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0
IFFTdHJpbmcgJnMpOwotCi0gICAgUVRleHRDb2RlYyAqbV9jb2RlYzsKLSAgICBRVmFsdWVMaXN0
PEZvcm1EYXRhTGlzdEl0ZW0+IG1fbGlzdDsKLX07Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6OkhU
TUxGb3JtRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudElt
cGwoZm9ybVRhZywgZG9jKQotewotICAgIGNvbGxlY3Rpb25JbmZvID0gMDsKLSAgICBtX3Bvc3Qg
PSBmYWxzZTsKLSAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0g
dHJ1ZTsKLSAgICBtX2luc3VibWl0ID0gZmFsc2U7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNl
OwotICAgIG1faW5yZXNldCA9IGZhbHNlOwotICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94
LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgIG1fYm91bmRhcnkgPSAiLS0tLS0tLS0tLTB4S2hU
bUxiT3VOZEFyWSI7Ci0gICAgbV9hY2NlcHRjaGFyc2V0ID0gIlVOS05PV04iOwotICAgIG1fbWFs
Zm9ybWVkID0gZmFsc2U7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6On5IVE1MRm9ybUVsZW1l
bnRJbXBsKCkKLXsKLSAgICBkZWxldGUgY29sbGVjdGlvbkluZm87Ci0gICAgCi0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZv
cm1FbGVtZW50c1tpXS0+bV9mb3JtID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
aW1nRWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBpbWdFbGVtZW50c1tpXS0+bV9mb3Jt
ID0gMDsKLX0KLQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1Xb3VsZEhhdmVTZWN1
cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKQotewotICAgIGlmICh1cmwuaXNOdWxs
KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZ2V0RG9jdW1l
bnQoKS0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSkuc3RhcnRzV2l0aCgiaHR0cHM6IiwgZmFs
c2UpOwotfQotCi0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBI
VE1MRWxlbWVudEltcGw6OmF0dGFjaCgpOwotCi0gICAgLy8gbm90ZSB3ZSBkb24ndCBkZWFsIHdp
dGggY2FsbGluZyBzZWN1cmVGb3JtUmVtb3ZlZCgpIG9uIGRldGFjaCwgYmVjYXVzZSB0aGUgdGlt
aW5nCi0gICAgLy8gd2FzIHN1Y2ggdGhhdCBpdCBjbGVhcmVkIG91ciBzdGF0ZSB0b28gZWFybHkK
LSAgICBpZiAoZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpKQotICAgICAgICBn
ZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1l
bnRJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkt
PmlzSFRNTERvY3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRp
Y19jYXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1lbnQtPmFk
ZE5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjpp
bnNlcnRlZEludG9Eb2N1bWVudCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJl
bW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1
bWVudCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
RG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3VtZW50LT5yZW1vdmVOYW1lZEl0
ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotfQotCi1pbnQgSFRNTEZvcm1FbGVtZW50SW1wbDo6bGVuZ3RoKCkg
Y29uc3QKLXsKLSAgICBpbnQgbGVuID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
Zm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkKLQlpZiAoZm9ybUVsZW1lbnRzW2ldLT5pc0VudW1l
cmF0YWJsZSgpKQotCSAgICArK2xlbjsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQotdm9pZCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjpzdWJtaXRDbGljaygpCi17Ci0gICAgYm9vbCBzdWJtaXRGb3Vu
ZCA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291
bnQoKTsgKytpKSB7Ci0gICAgICAgIGlmIChmb3JtRWxlbWVudHNbaV0tPmhhc0xvY2FsTmFtZShp
bnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsICplbGVtZW50ID0g
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwgKj4oZm9ybUVsZW1lbnRzW2ldKTsKLSAg
ICAgICAgICAgIGlmIChlbGVtZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSAmJiBlbGVt
ZW50LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3VibWl0Rm91bmQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIGVsZW1lbnQtPmNsaWNrKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXN1Ym1pdEZv
dW5kKSAvLyBzdWJtaXQgdGhlIGZvcm0gd2l0aG91dCBhIHN1Ym1pdCBvciBpbWFnZSBpbnB1dAot
ICAgICAgICBwcmVwYXJlU3VibWl0KCk7Ci19Ci0KLQotc3RhdGljIFFDU3RyaW5nIGVuY29kZUNT
dHJpbmcoY29uc3QgUUNTdHJpbmcmIGUpCi17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIv
aHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQotICAgIC8vIHNhZmUgY2hhcmFj
dGVycyBsaWtlIE5TIGhhbmRsZXMgdGhlbSBmb3IgY29tcGF0aWJpbGl0eQotICAgIHN0YXRpYyBj
b25zdCBjaGFyICpzYWZlID0gIi0uXyoiOwotICAgIGludCBlbGVuID0gZS5sZW5ndGgoKTsKLSAg
ICBRQ1N0cmluZyBlbmNvZGVkKCggZWxlbitlLmNvbnRhaW5zKCAnXG4nICkgKSozKzEpOwotICAg
IGludCBlbmNsZW4gPSAwOwotCi0gICAgLy9RQ1N0cmluZyBvcmlnKGUuZGF0YSgpLCBlLnNpemUo
KSk7Ci0KLSAgICBmb3IoaW50IHBvcyA9IDA7IHBvcyA8IGVsZW47IHBvcysrKSB7Ci0gICAgICAg
IHVuc2lnbmVkIGNoYXIgYyA9IGVbcG9zXTsKLQotICAgICAgICBpZiAoICgoIGMgPj0gJ0EnKSAm
JiAoIGMgPD0gJ1onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49ICdhJykgJiYgKCBjIDw9ICd6
JykpIHx8Ci0gICAgICAgICAgICAgKCggYyA+PSAnMCcpICYmICggYyA8PSAnOScpKSB8fAotICAg
ICAgICAgICAgIChzdHJjaHIoc2FmZSwgYykpCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBl
bmNvZGVkW2VuY2xlbisrXSA9IGM7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICcgJyApCi0gICAg
ICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcrJzsKLSAgICAgICAgZWxzZSBpZiAoIGMgPT0g
J1xuJyB8fCAoIGMgPT0gJ1xyJyAmJiBlW3BvcysxXSAhPSAnXG4nICkgKQotICAgICAgICB7Ci0g
ICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVuY29kZWRb
ZW5jbGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnRCc7Ci0g
ICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVuY29kZWRb
ZW5jbGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnQSc7Ci0g
ICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGMgIT0gJ1xyJyApCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAgdW5zaWduZWQgaW50
IGggPSBjIC8gMTY7Ci0gICAgICAgICAgICBoICs9IChoID4gOSkgPyAoJ0EnIC0gMTApIDogJzAn
OwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBoOwotCi0gICAgICAgICAgICB1bnNp
Z25lZCBpbnQgbCA9IGMgJSAxNjsKLSAgICAgICAgICAgIGwgKz0gKGwgPiA5KSA/ICgnQScgLSAx
MCkgOiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGw7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnXDAnOwotICAgIGVuY29kZWQudHJ1bmNh
dGUoZW5jbGVuKTsKLQotICAgIHJldHVybiBlbmNvZGVkOwotfQotCi0vLyBDaGFuZ2UgcGxhaW4g
Q1IgYW5kIHBsYWluIExGIHRvIENSTEYgcGFpcnMuCi1zdGF0aWMgUUNTdHJpbmcgZml4TGluZUJy
ZWFrcyhjb25zdCBRQ1N0cmluZyAmcykKLXsKLSAgICAvLyBDb21wdXRlIHRoZSBsZW5ndGguCi0g
ICAgdW5zaWduZWQgbmV3TGVuID0gMDsKLSAgICBjb25zdCBjaGFyICpwID0gcy5kYXRhKCk7Ci0g
ICAgd2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKLSAgICAgICAgaWYgKGMgPT0gJ1xyJykgewotICAg
ICAgICAgICAgLy8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2YgdHJhaWxpbmcgJ1wwJy4K
LSAgICAgICAgICAgIGlmICgqcCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHVybiBD
UiBpbnRvIENSTEYuCi0gICAgICAgICAgICAgICAgbmV3TGVuICs9IDI7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAvLyBUdXJuIExG
IGludG8gQ1JMRi4KLSAgICAgICAgICAgIG5ld0xlbiArPSAyOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgLy8gTGVhdmUgb3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAgICAgICAg
IG5ld0xlbiArPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuZXdMZW4gPT0gcy5sZW5n
dGgoKSkgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgCi0gICAgLy8gTWFrZSBhIGNv
cHkgb2YgdGhlIHN0cmluZy4KLSAgICBwID0gcy5kYXRhKCk7Ci0gICAgUUNTdHJpbmcgcmVzdWx0
KG5ld0xlbiArIDEpOwotICAgIGNoYXIgKnEgPSByZXN1bHQuZGF0YSgpOwotICAgIHdoaWxlIChj
aGFyIGMgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAgICAgICAgIC8v
IFNhZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0gICAgICAgICAg
ICBpZiAoKnAgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1IgaW50byBDUkxG
LgotICAgICAgICAgICAgICAgICpxKysgPSAnXHInOwotICAgICAgICAgICAgICAgICpxKysgPSAn
XG4nOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAg
ICAgICAgICAgLy8gVHVybiBMRiBpbnRvIENSTEYuCi0gICAgICAgICAgICAqcSsrID0gJ1xyJzsK
LSAgICAgICAgICAgICpxKysgPSAnXG4nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
Ly8gTGVhdmUgb3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAgICAgICAgICpxKysgPSBjOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotYm9vbCBIVE1MRm9y
bUVsZW1lbnRJbXBsOjpmb3JtRGF0YShGb3JtRGF0YSAmZm9ybV9kYXRhKSBjb25zdAotewotICAg
IFFDU3RyaW5nIGVuY19zdHJpbmcgPSAiIjsgLy8gdXNlZCBmb3Igbm9uLW11bHRpcGFydCBkYXRh
Ci0KLSAgICAvLyBmaW5kIG91dCB0aGUgUVRleHRjb2RlYyB0byB1c2UKLSAgICBRU3RyaW5nIHN0
ciA9IG1fYWNjZXB0Y2hhcnNldC5xc3RyaW5nKCk7Ci0gICAgc3RyLnJlcGxhY2UoJywnLCAnICcp
OwotICAgIFFTdHJpbmdMaXN0IGNoYXJzZXRzID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcgJywgc3Ry
KTsKLSAgICBRVGV4dENvZGVjKiBjb2RlYyA9IDA7Ci0gICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9j
dW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IGNo
YXJzZXRzLmJlZ2luKCk7IGl0ICE9IGNoYXJzZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFT
dHJpbmcgZW5jID0gKCppdCk7Ci0gICAgICAgIGlmIChlbmMuY29udGFpbnMoIlVOS05PV04iKSkg
ewotICAgICAgICAgICAgLy8gdXNlIHN0YW5kYXJkIGRvY3VtZW50IGVuY29kaW5nCi0gICAgICAg
ICAgICBlbmMgPSAiSVNPLTg4NTktMSI7Ci0gICAgICAgICAgICBpZiAoZnJhbWUpCi0gICAgICAg
ICAgICAgICAgZW5jID0gZnJhbWUtPmVuY29kaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYg
KChjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShlbmMubGF0aW4xKCkpKSkKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghY29kZWMpCi0gICAgICAgIGNvZGVjID0g
UVRleHRDb2RlYzo6Y29kZWNGb3JMb2NhbGUoKTsKLQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIEZvcm1E
YXRhTGlzdCBsc3QoY29kZWMpOwotCi0gICAgICAgIGlmICghY3VycmVudC0+ZGlzYWJsZWQoKSAm
JiBjdXJyZW50LT5hcHBlbmRGb3JtRGF0YShsc3QsIG1fbXVsdGlwYXJ0KSkgewotICAgICAgICAg
ICAgZm9yIChRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBpdCA9IGxz
dC5iZWdpbigpOyBpdCAhPSBsc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAo
IW1fbXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBJU0lOREVYIC8g
PGlucHV0IG5hbWU9aXNpbmRleD4gc3BlY2lhbAotICAgICAgICAgICAgICAgICAgICAvLyBidXQg
b25seSBpZiBpdHMgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZW5j
X3N0cmluZy5pc0VtcHR5KCkgJiYgKCppdCkubV9kYXRhID09ICJpc2luZGV4IiApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3Ry
aW5nICs9IGVuY29kZUNTdHJpbmcoICgqaXQpLm1fZGF0YSApOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAg
aWYoIWVuY19zdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu
Y19zdHJpbmcgKz0gJyYnOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9
IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVu
Y19zdHJpbmcgKz0gIj0iOwotICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZygoKml0KS5tX2RhdGEp
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFDU3RyaW5n
IGhzdHIoIi0tIik7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gbV9ib3VuZGFyeS5xc3Ry
aW5nKCkubGF0aW4xKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG4iOwotICAg
ICAgICAgICAgICAgICAgICBoc3RyICs9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7
IG5hbWU9XCIiOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICgqaXQpLm1fZGF0YS5kYXRh
KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAgICAgICAg
ICAgICAvLyBpZiB0aGUgY3VycmVudCB0eXBlIGlzIEZJTEUsIHRoZW4gd2UgYWxzbyBuZWVkIHRv
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGZpbGVuYW1lCi0gICAgICAgICAg
ICAgICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpICYmCi0gICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJl
bnQpLT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6RklMRSkKLSAgICAgICAg
ICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBwYXRoID0gc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+dmFsdWUoKS5xc3RyaW5n
KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsg
aWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgIiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gb3IgY29udHJvbCBjaGFyYWN0ZXJzIGxpa2UgQ1Igb3IgTEYuIFRoaXMgYWxzbyBkb2Vz
IHN0cmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaW5ncyBpZiB0aGUgZmlsZW5h
bWUgaW5jbHVkZXMgY2hhcmFjdGVycyB5b3UgY2FuJ3QgZW5jb2RlCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBpbiB0aGUgd2Vic2l0ZSdzIGNoYXJhY3RlciBzZXQuCi0gICAgICAgICAgICAg
ICAgICAgICAgICBoc3RyICs9ICI7IGZpbGVuYW1lPVwiIjsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGhzdHIgKz0gY29kZWMtPmZyb21Vbmljb2RlKHBhdGgubWlkKHBhdGguZmluZFJldignLycp
ICsgMSksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwotCi0g
ICAgICAgICAgICAgICAgICAgICAgICBpZighc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudElt
cGwqPihjdXJyZW50KS0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBtaW1lVHlwZSA9IGZyYW1l
ID8gTWFjKGZyYW1lKS0+bWltZVR5cGVGb3JGaWxlTmFtZShwYXRoKSA6IFFTdHJpbmcoKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUeXBlLmlzRW1wdHkoKSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuQ29udGVudC1UeXBlOiAi
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1pbWVUeXBlLmFzY2lp
KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaHN0ciAr
PSAiXHJcblxyXG4iOwotICAgICAgICAgICAgICAgICAgICArK2l0OwotCi0gICAgICAgICAgICAg
ICAgICAgIC8vIGFwcGVuZCBib2R5Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBl
bmREYXRhKGhzdHIuZGF0YSgpLCBoc3RyLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAg
Y29uc3QgRm9ybURhdGFMaXN0SXRlbSAmaXRlbSA9ICppdDsKLSAgICAgICAgICAgICAgICAgICAg
c2l6ZV90IGRhdGFTaXplID0gaXRlbS5tX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAg
ICBpZiAoZGF0YVNpemUgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5h
cHBlbmREYXRhKGl0ZW0ubV9kYXRhLCBkYXRhU2l6ZSAtIDEpOwotICAgICAgICAgICAgICAgICAg
ICBlbHNlIGlmICghaXRlbS5tX3BhdGguaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgZm9ybV9kYXRhLmFwcGVuZEZpbGUoaXRlbS5tX3BhdGgpOwotICAgICAgICAgICAgICAgICAg
ICBmb3JtX2RhdGEuYXBwZW5kRGF0YSgiXHJcbiIsIDIpOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKG1fbXVsdGlwYXJ0KQot
ICAgICAgICBlbmNfc3RyaW5nID0gKCItLSIgKyBtX2JvdW5kYXJ5LnFzdHJpbmcoKSArICItLVxy
XG4iKS5hc2NpaSgpOwotCi0gICAgZm9ybV9kYXRhLmFwcGVuZERhdGEoZW5jX3N0cmluZy5kYXRh
KCksIGVuY19zdHJpbmcubGVuZ3RoKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhU
TUxGb3JtRWxlbWVudEltcGw6OnBhcnNlRW5jdHlwZShjb25zdCBET01TdHJpbmcmIHR5cGUpCi17
Ci0gICAgaWYodHlwZS5jb250YWlucygibXVsdGlwYXJ0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFp
bnMoImZvcm0tZGF0YSIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAibXVsdGlwYXJ0
L2Zvcm0tZGF0YSI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYg
KHR5cGUuY29udGFpbnMoInRleHQiLCBmYWxzZSkgfHwgdHlwZS5jb250YWlucygicGxhaW4iLCBm
YWxzZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gInRleHQvcGxhaW4iOwotICAgICAgICBtX211
bHRpcGFydCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJhcHBs
aWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgICAgICBtX211bHRpcGFydCA9IGZh
bHNlOwotICAgIH0KLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRCb3VuZGFyeSgg
Y29uc3QgRE9NU3RyaW5nJiBib3VuZCApCi17Ci0gICAgbV9ib3VuZGFyeSA9IGJvdW5kOwotfQot
Ci1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OnByZXBhcmVTdWJtaXQoKQotewotICAgIEZyYW1l
ICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYobV9pbnN1Ym1pdCB8fCAh
ZnJhbWUgfHwgZnJhbWUtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSkKLSAgICAgICAgcmV0dXJuIG1f
aW5zdWJtaXQ7Ci0KLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLSAgICBtX2RvaW5nc3VibWl0ID0g
ZmFsc2U7Ci0KLSAgICBpZiAoIGRpc3BhdGNoSFRNTEV2ZW50KHN1Ym1pdEV2ZW50LGZhbHNlLHRy
dWUpICYmICFtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0K
LSAgICBtX2luc3VibWl0ID0gZmFsc2U7Ci0KLSAgICBpZiAoIG1fZG9pbmdzdWJtaXQgKQotICAg
ICAgICBzdWJtaXQodHJ1ZSk7Ci0KLSAgICByZXR1cm4gbV9kb2luZ3N1Ym1pdDsKLX0KLQotdm9p
ZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzdWJtaXQoIGJvb2wgYWN0aXZhdGVTdWJtaXRCdXR0b24g
KQotewotICAgIEtIVE1MVmlldyAqdmlldyA9IGdldERvY3VtZW50KCktPnZpZXcoKTsKLSAgICBG
cmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmICghdmlldyB8fCAh
ZnJhbWUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggbV9pbnN1Ym1pdCAp
IHsKLSAgICAgICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSAwOwotICAgIGJvb2wgbmVlZEJ1dHRv
bkFjdGl2YXRpb24gPSBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbjsJLy8gZG8gd2UgbmVlZCB0byBhY3Rp
dmF0ZSBhIHN1Ym1pdCBidXR0b24/Ci0gICAgCi0gICAgTWFjKGZyYW1lKS0+Y2xlYXJSZWNvcmRl
ZEZvcm1WYWx1ZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRz
LmNvdW50KCk7ICsraSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogY3Vy
cmVudCA9IGZvcm1FbGVtZW50c1tpXTsKLSAgICAgICAgLy8gT3VyIGFwcCBuZWVkcyB0byBnZXQg
Zm9ybSB2YWx1ZXMgZm9yIHBhc3N3b3JkIGZpZWxkcyBmb3IgZG9pbmcgcGFzc3dvcmQgYXV0b2Nv
bXBsZXRlLAotICAgICAgICAvLyBzbyB3ZSBhcmUgbW9yZSBsZW5pZW50IGluIHB1c2hpbmcgdmFs
dWVzLCBhbmQgbGV0IHRoZSBhcHAgZGVjaWRlIHdoYXQgdG8gc2F2ZSB3aGVuLgotICAgICAgICBp
ZiAoY3VycmVudC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElu
cHV0RWxlbWVudEltcGwgKmlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwq
PihjdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElu
cHV0RWxlbWVudEltcGw6OlRFWFQKLSAgICAgICAgICAgICAgICB8fCBpbnB1dC0+aW5wdXRUeXBl
KCkgPT0gIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpQQVNTV09SRAotICAgICAgICAgICAgICAgIHx8
IGlucHV0LT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAg
ICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hYyhmcmFtZSktPnJlY29yZEZvcm1WYWx1ZShp
bnB1dC0+bmFtZSgpLnFzdHJpbmcoKSwgaW5wdXQtPnZhbHVlKCkucXN0cmluZygpLCB0aGlzKTsK
LSAgICAgICAgICAgICAgICBpZiAoaW5wdXQtPnJlbmRlcmVyKCkgJiYgaW5wdXQtPmlucHV0VHlw
ZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpTRUFSQ0gpCi0gICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0Kj4oaW5wdXQtPnJlbmRlcmVyKCkpLT5hZGRTZWFy
Y2hSZXN1bHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVk
QnV0dG9uQWN0aXZhdGlvbikgewotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmlzQWN0aXZhdGVk
U3VibWl0KCkpIHsKLSAgICAgICAgICAgICAgICBuZWVkQnV0dG9uQWN0aXZhdGlvbiA9IGZhbHNl
OwotICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPT0g
MCAmJiBjdXJyZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSkgewotICAgICAgICAgICAg
ICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmly
c3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1p
dEJ1dHRvbi0+c2V0QWN0aXZhdGVkU3VibWl0KHRydWUpOwotICAgIH0KLQotICAgIGlmICghbV9w
b3N0KQotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIAotICAgIEZvcm1EYXRhIGZv
cm1fZGF0YTsKLSAgICBpZiAoZm9ybURhdGEoZm9ybV9kYXRhKSkgewotICAgICAgICBpZihtX3Bv
c3QpIHsKLSAgICAgICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAicG9zdCIsIG1fdXJsLnFzdHJp
bmcoKSwgZm9ybV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
X3RhcmdldC5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVuY3R5cGUoKS5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJvdW5kYXJ5KCkucXN0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggImdldCIsIG1fdXJsLnFzdHJpbmcoKSwgZm9y
bV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RhcmdldC5x
c3RyaW5nKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZWVkQnV0dG9uQWN0aXZh
dGlvbiAmJiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsKLSAgICAgICAgZmlyc3RTdWNj
ZXNzZnVsU3VibWl0QnV0dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQoZmFsc2UpOwotICAgIH0KLSAg
ICAKLSAgICBtX2RvaW5nc3VibWl0ID0gbV9pbnN1Ym1pdCA9IGZhbHNlOwotfQotCi12b2lkIEhU
TUxGb3JtRWxlbWVudEltcGw6OnJlc2V0KCAgKQotewotICAgIEZyYW1lICpmcmFtZSA9IGdldERv
Y3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYobV9pbnJlc2V0IHx8ICFmcmFtZSkgcmV0dXJuOwot
Ci0gICAgbV9pbnJlc2V0ID0gdHJ1ZTsKLQotICAgIC8vICMjIyBET00yIGxhYmVscyB0aGlzIGV2
ZW50IGFzIG5vdCBjYW5jZWxhYmxlLCBob3dldmVyCi0gICAgLy8gY29tbW9uIGJyb3dzZXJzKCBz
aWNrISApIGFsbG93IGl0IGJlIGNhbmNlbGxlZC4KLSAgICBpZiAoICFkaXNwYXRjaEhUTUxFdmVu
dChyZXNldEV2ZW50LHRydWUsIHRydWUpICkgewotICAgICAgICBtX2lucmVzZXQgPSBmYWxzZTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBm
b3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxlbWVudHNbaV0tPnJlc2V0
KCk7Ci0KLSAgICBtX2lucmVzZXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewot
ICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cikgCi0gICAgewotICAgICAgICBib29s
IG9sZFVSTFdhc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKTsK
LSAgICAgICAgbV91cmwgPSBraHRtbDo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAg
IGJvb2wgbmV3VVJMSXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3Vy
bCk7Ci0KLSAgICAgICAgaWYgKG1fYXR0YWNoZWQgJiYgKG9sZFVSTFdhc1NlY3VyZSAhPSBuZXdV
UkxJc1NlY3VyZSkpCi0gICAgICAgICAgICBpZiAobmV3VVJMSXNTZWN1cmUpCi0gICAgICAgICAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybVJlbW92ZWQoKTsKLSAg
ICB9Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHRhcmdldEF0dHIpIHsKLSAgICAgICAg
bV90YXJnZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG1ldGhvZEF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVl
KCksICJwb3N0IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSB0cnVlOwotICAgICAgICBlbHNlIGlm
IChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiZ2V0IikpCi0gICAgICAgICAgICBt
X3Bvc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBlbmN0eXBlQXR0
cikgewotICAgICAgICBwYXJzZUVuY3R5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0X2NoYXJzZXRBdHRyKSB7Ci0gICAgICAgIC8vIHNwYWNl
IHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJzZXRzIHRoZSBzZXJ2ZXIKLSAgICAgICAgLy8gYWNjZXB0
cyAtIHNlZSByZmMyMDQ1Ci0gICAgICAgIG1fYWNjZXB0Y2hhcnNldCA9IGF0dHItPnZhbHVlKCk7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0QXR0cikgewotICAgICAgICAv
LyBpZ25vcmUgdGhpcyBvbmUgZm9yIHRoZSBtb21lbnQuLi4KLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0g
IWVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBvbnN1Ym1pdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlz
dGVuZXIoc3VibWl0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG9ucmVzZXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHJlc2V0RXZlbnQs
IGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAg
ICAgIERPTVN0cmluZyBuZXdOYW1lQXR0ciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChp
bkRvY3VtZW50KCkgJiYgZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAg
ICAgICAgSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1l
bnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgZG9jdW1lbnQtPnJlbW92ZU5h
bWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2N1bWVudC0+YWRkTmFtZWRJdGVt
KG5ld05hbWVBdHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lQXR0ciA9IG5ld05hbWVB
dHRyOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKGF0dHIpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBpbnNlcnRJ
bnRvVmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgdW5zaWduZWQgcG9zLCBUKiBpdGVtKQotewot
ICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVj
LmNvdW50KCk7Ci0gICAgYXNzZXJ0KHBvcyA8PSBjb3VudCk7Ci0gICAgaWYgKHNpemUgPT0gY291
bnQpCi0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gY291bnQ7IGkgPiBwb3M7IC0taSkKLSAgICAgICAgdmVjLmlu
c2VydChpLCB2ZWNbaSAtIDFdKTsgICAgCi0gICAgdmVjLmluc2VydChwb3MsIGl0ZW0pOwotfQot
Ci10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBhcHBlbmRUb1ZlY3RvcihRUHRyVmVjdG9y
PFQ+ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAgdW5zaWduZWQgc2l6ZSA9IHZlYy5zaXplKCk7Ci0g
ICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBpZiAoc2l6ZSA9PSBjb3VudCkK
LSAgICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6ZSAqIDMgLyAyKTsKLSAgICB2
ZWMuaW5zZXJ0KGNvdW50LCBpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZv
aWQgcmVtb3ZlRnJvbVZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAg
aW50IHBvcyA9IHZlYy5maW5kUmVmKGl0ZW0pOwotICAgIGlmIChwb3MgPCAwKQotICAgICAgICBy
ZXR1cm47Ci0gICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBmb3IgKHVuc2ln
bmVkIGkgPSBwb3M7IGkgPCBjb3VudCAtIDE7ICsraSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2
ZWNbaSArIDFdKTsKLSAgICB2ZWMucmVtb3ZlKGNvdW50IC0gMSk7Ci19Ci0KLXVuc2lnbmVkIEhU
TUxGb3JtRWxlbWVudEltcGw6OmZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwgKmUpCi17Ci0gICAgLy8gQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhp
cyBlbGVtZW50IGlzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgaW4KLSAgICAvLyB0aGUgZm9ybSdzIHRy
ZWUgb2YgY2hpbGRyZW47IHdlIGRvbid0IHdhbnQgdG8gd2FsayB0aGUgZW50aXJlIHRyZWUgaW4g
dGhhdAotICAgIC8vIGNvbW1vbiBjYXNlIHRoYXQgb2NjdXJzIGR1cmluZyBwYXJzaW5nOyBpbnN0
ZWFkIHdlJ2xsIGp1c3QgcmV0dXJuIGEgdmFsdWUKLSAgICAvLyB0aGF0IHNheXMgImFkZCB0aGlz
IGZvcm0gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSIuCi0gICAgaWYgKGUtPnRyYXZl
cnNlTmV4dE5vZGUodGhpcykpIHsKLSAgICAgICAgdW5zaWduZWQgaSA9IDA7Ci0gICAgICAgIGZv
ciAoTm9kZUltcGwgKm5vZGUgPSB0aGlzOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0
Tm9kZSh0aGlzKSkgewotICAgICAgICAgICAgaWYgKG5vZGUgPT0gZSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gaTsKLSAgICAgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkKLSAgICAg
ICAgICAgICAgICAgICAgJiYgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpLT5p
c0dlbmVyaWNGb3JtRWxlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0
PEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICo+KG5vZGUpLT5mb3JtKCkgPT0gdGhpcykKLSAg
ICAgICAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1FbGVt
ZW50cy5jb3VudCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlZ2lzdGVyRm9y
bUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgRG9jdW1lbnRJ
bXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGlmIChkb2MgJiYgZS0+aXNSYWRpb0J1dHRv
bigpICYmICFlLT5uYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsKiBjdXJyZW50Q2hlY2tlZFJhZGlvID0gZG9jLT5jaGVja2VkUmFkaW9CdXR0b25G
b3JHcm91cChlLT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDApOwotICAg
ICAgICBpZiAoY3VycmVudENoZWNrZWRSYWRpbyA9PSBlKQotICAgICAgICAgICAgZG9jLT5yZW1v
dmVSYWRpb0J1dHRvbkdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIChIVE1MRm9ybUVsZW1lbnRJbXBs
KikgMCk7Ci0gICAgICAgIGlmIChlLT5pc0NoZWNrZWQoKSkKLSAgICAgICAgICAgIGRvYy0+cmFk
aW9CdXR0b25DaGVja2VkKChIVE1MSW5wdXRFbGVtZW50SW1wbCopIGUsIHRoaXMpOwotICAgIH0K
LSAgICBpbnNlcnRJbnRvVmVjdG9yKGZvcm1FbGVtZW50cywgZm9ybUVsZW1lbnRJbmRleChlKSwg
ZSk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVtb3ZlRm9ybUVsZW1lbnQoSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgaWYgKCFlLT5uYW1lKCkuaXNFbXB0
eSgpICYmIGdldERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwqIGN1cnJlbnRDaGVja2VkUmFkaW8gPSBnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0
b25Gb3JHcm91cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAgICAgICAgaWYgKGN1cnJlbnRD
aGVja2VkUmFkaW8gPT0gZSkKLSAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlv
QnV0dG9uR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgfQotICAgIHJlbW92ZUZy
b21WZWN0b3IoZm9ybUVsZW1lbnRzLCBlKTsKLX0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBs
Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAgIHJldHVy
biBhdHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cjsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjpyZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKmUpCi17Ci0gICAg
YXBwZW5kVG9WZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVu
dEltcGw6OnJlbW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKmUpCi17Ci0gICAg
cmVtb3ZlRnJvbVZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVj
dGlvbkltcGw+IEhUTUxGb3JtRWxlbWVudEltcGw6OmVsZW1lbnRzKCkKLXsKLSAgICByZXR1cm4g
UmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxGb3JtQ29sbGVjdGlvbkltcGwodGhp
cykpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1F
bGVtZW50SW1wbDo6c2V0TmFtZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50
SW1wbDo6YWNjZXB0Q2hhcnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShh
Y2NlcHRfY2hhcnNldEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFj
Y2VwdENoYXJzZXQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
YWNjZXB0X2NoYXJzZXRBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1l
bnRJbXBsOjphY3Rpb24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWN0aW9u
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0QWN0aW9uKGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjdGlvbkF0dHIsIHZhbHVlKTsK
LX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRFbmN0eXBlKGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGVuY3R5cGVBdHRyLCB2YWx1ZSk7Ci19Ci0K
LURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjptZXRob2QoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUobWV0aG9kQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50
SW1wbDo6c2V0TWV0aG9kKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKG1ldGhvZEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudElt
cGw6OnRhcmdldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0YXJnZXRBdHRy
KTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRUYXJnZXQoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFyZ2V0QXR0ciwgdmFsdWUpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxFbGVtZW50
SW1wbCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9kaXNhYmxlZCA9IG1fcmVhZE9ubHkgPSBmYWxz
ZTsKLQotICAgIGlmIChmKQotCW1fZm9ybSA9IGY7Ci0gICAgZWxzZQotCW1fZm9ybSA9IGdldEZv
cm0oKTsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlZ2lzdGVyRm9ybUVsZW1l
bnQodGhpcyk7Ci19Ci0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwoKQotewotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9ybS0+cmVt
b3ZlRm9ybUVsZW1lbnQodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0g
ICAgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICAvLyBEbyBub3RoaW5n
LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGRpc2FibGVkQXR0cikgewotICAgICAg
ICBib29sIG9sZERpc2FibGVkID0gbV9kaXNhYmxlZDsKLSAgICAgICAgbV9kaXNhYmxlZCA9ICFh
dHRyLT5pc051bGwoKTsKLSAgICAgICAgaWYgKG9sZERpc2FibGVkICE9IG1fZGlzYWJsZWQpIHsK
LSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpICYm
IHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgICAgICB0
aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgRW5hYmxlZFN0YXRlKTsKLSAgICAgICAg
fQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlYWRvbmx5QXR0cikgewotICAgICAg
ICBib29sIG9sZFJlYWRPbmx5ID0gbV9yZWFkT25seTsKLSAgICAgICAgbV9yZWFkT25seSA9ICFh
dHRyLT5pc051bGwoKTsKLSAgICAgICAgaWYgKG9sZFJlYWRPbmx5ICE9IG1fcmVhZE9ubHkpIHNl
dENoYW5nZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotCi0gICAgSFRNTEVsZW1l
bnRJbXBsOjphdHRhY2goKTsKLQotICAgIC8vIFRoZSBjYWxsIHRvIHVwZGF0ZUZyb21FbGVtZW50
KCkgbmVlZHMgdG8gZ28gYWZ0ZXIgdGhlIGNhbGwgdGhyb3VnaAotICAgIC8vIHRvIHRoZSBiYXNl
IGNsYXNzJ3MgYXR0YWNoKCkgYmVjYXVzZSB0aGF0IGNhbiBzb21ldGltZXMgZG8gYSBjbG9zZQot
ICAgIC8vIG9uIHRoZSByZW5kZXJlci4KLSAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAgbV9y
ZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgCi0gICAgICAgIC8vIERlbGF5ZWQgYXR0
YWNobWVudCBpbiBvcmRlciB0byBwcmV2ZW50IEZPVUMgY2FuIHJlc3VsdCBpbiBhbiBvYmplY3Qg
YmVpbmcKLSAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBmb2N1c2VkIGJlZm9yZSBpdCBoYXMg
YSByZW5kZXIgb2JqZWN0LiAgSWYgd2UgaGF2ZSBiZWVuIGZvY3VzZWQKLSAgICAgICAgLy8gKGku
ZS4sIGlmIHdlIGFyZSB0aGUgZm9jdXNOb2RlKSB0aGVuIGdvIGFoZWFkIGFuZCBmb2N1cyBvdXIg
Y29ycmVzcG9uZGluZyBuYXRpdmUgd2lkZ2V0LgotICAgICAgICAvLyAoQXR0YWNoL2RldGFjaCBj
YW4gYWxzbyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgZGlzcGxheSB0eXBlIGNoYW5nZXMsIGUuZy4s
IG1ha2luZyBhIHdpZGdldAotICAgICAgICAvLyBibG9jayBpbnN0ZWFkIG9mIGlubGluZSwgYW5k
IGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZCBpbiB0aGF0IGNhc2UgYXMgd2VsbC4pCi0gICAgICAg
IGlmIChnZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKSA9PSB0aGlzICYmIG1fcmVuZGVyLT5pc1dp
ZGdldCgpICYmIAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVy
ZXIoKSktPndpZGdldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4o
cmVuZGVyZXIoKSktPndpZGdldCgpLT5zZXRGb2N1cygpOwotICAgIH0KLX0KLQotdm9pZCBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApCi17Ci0g
ICAgaWYgKCFtX2Zvcm0pIHsKLSAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIGEg
bmV3IGZvcm0gZWxlbWVudCBiZWluZyBjcmVhdGVkIGJ5Ci0gICAgICAgIC8vIEphdmFTY3JpcHQg
YW5kIGluc2VydGVkIGluc2lkZSBhIGZvcm0uICBJbiB0aGUgY2FzZSBvZiB0aGUgcGFyc2VyCi0g
ICAgICAgIC8vIHNldHRpbmcgYSBmb3JtLCB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBhIG5vbi1udWxs
IHZhbHVlIGZvciBtX2Zvcm0sIAotICAgICAgICAvLyBhbmQgc28gd2UgZG9uJ3QgbmVlZCB0byBk
byBhbnl0aGluZy4KLSAgICAgICAgbV9mb3JtID0gZ2V0Rm9ybSgpOwotCWlmIChtX2Zvcm0pCi0J
ICAgIG1fZm9ybS0+cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgICAgICAg
ICBpZiAoZG9jICYmIGlzUmFkaW9CdXR0b24oKSAmJiAhbmFtZSgpLmlzRW1wdHkoKSAmJiBpc0No
ZWNrZWQoKSkKLSAgICAgICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9uQ2hlY2tlZCgoSFRNTElu
cHV0RWxlbWVudEltcGwqKXRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBI
VE1MRWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoZGVlcCk7Ci19Ci0KLXZvaWQgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApCi17Ci0gICAg
Ly8gV2hlbiBiZWluZyByZW1vdmVkIHdlIGhhdmUgdG8gcG9zc2libHkgbnVsbCBvdXQgb3VyIGZv
cm0gYW5kIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbQotICAgIC8vIHRoZSBmb3JtJ3MgbGlzdCBvZiBl
bGVtZW50cy4KLSAgICBpZiAobV9mb3JtKSB7Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gcmUtYWNx
dWlyZSB0aGUgZm9ybS4gIElmIHdlIGNhbid0IHJlLWFjcXVpcmUsIHRoZW4KLSAgICAgICAgLy8g
cmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBmb3JtLgotICAgICAgICBOb2RlSW1wbCogZm9ybSA9
IHBhcmVudE5vZGUoKTsKLSAgICAgICAgTm9kZUltcGwqIHJvb3QgPSB0aGlzOwotICAgICAgICB3
aGlsZSAoZm9ybSkgewotICAgICAgICAgICAgaWYgKGZvcm0tPmhhc1RhZ05hbWUoZm9ybVRhZykp
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByb290ID0gZm9ybTsKLSAgICAg
ICAgICAgIGZvcm0gPSBmb3JtLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0g
ICAgICAgIC8vIElmIHRoZSBmb3JtIGhhcyBiZWVuIGRlbW90ZWQgdG8gYSBsZWFmLCB0aGVuIHdl
IHdvbid0IGZpbmQgaXQgYXMgYW4gYW5jZXN0b3IuCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBp
ZiB0aGUgcm9vdCBub2RlIG9mIG91ciBjdXJyZW50IGZvcm0gYW5kIG91ciByb290IG5vZGUKLSAg
ICAgICAgLy8gbWF0Y2guICBJZiBzbywgcHJlc2VydmUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGZv
cm0uCi0gICAgICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgTm9kZUltcGwqIGZvcm1Sb290
ID0gbV9mb3JtOwotICAgICAgICAgICAgd2hpbGUgKGZvcm1Sb290LT5wYXJlbnQoKSkgZm9ybVJv
b3QgPSBmb3JtUm9vdC0+cGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoZm9ybVJvb3QgPT0gcm9v
dCkKLSAgICAgICAgICAgICAgICBmb3JtID0gbV9mb3JtOwotICAgICAgICB9IAotICAgICAgICAK
LSAgICAgICAgaWYgKCFmb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1FbGVt
ZW50KHRoaXMpOwotICAgICAgICAgICAgbV9mb3JtID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICBhc3NlcnQoZm9ybSA9PSBtX2Zvcm0pOyAvLyBUaGUgcmUtYWNxdWlyZWQgZm9ybSBz
aG91bGQgYmUgdGhlIHNhbWUuIElmIG5vdCwgc29tZXRoaW5nIHJlYWxseSBzdHJhbmdlIGhhcHBl
bmVkLgotICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21UcmVlKGRl
ZXApOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6Z2V0Rm9ybSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7Ci0g
ICAgd2hpbGUocCkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAg
ICAgICBwID0gcC0+cGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotRE9N
U3RyaW5nIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAgICBE
T01TdHJpbmcgbiA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0gICAgcmV0dXJuIG4uaXNOdWxs
KCkgPyAiIiA6IG47Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldE5h
bWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobmFtZUF0dHIs
IHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25TZWxlY3Qo
KQotewotICAgIC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNo
aXRlY3R1cmUKLSAgICBkaXNwYXRjaEhUTUxFdmVudChzZWxlY3RFdmVudCx0cnVlLGZhbHNlKTsK
LX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25DaGFuZ2UoKQotewotICAg
IC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUK
LSAgICBkaXNwYXRjaEhUTUxFdmVudChjaGFuZ2VFdmVudCx0cnVlLGZhbHNlKTsKLX0KLQotYm9v
bCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGlzYWJsZWQoKSBjb25zdAotewotICAgIHJl
dHVybiBtX2Rpc2FibGVkOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpz
ZXREaXNhYmxlZChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKGRpc2FibGVkQXR0ciwgYiA/
ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFJlYWRP
bmx5KGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyLCBiID8gIiIgOiAw
KTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0
eWxlQ2hhbmdlIGNoICkKLXsKLSAgICAvL2Jvb2wgY2hhbmdlZCA9IGNoYW5nZWQoKTsKLSAgICBI
VE1MRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotCi0gICAgaWYgKG1fcmVuZGVyIC8q
JiYgY2hhbmdlZCovKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0K
LQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAot
ewotICAgIGlmIChkaXNhYmxlZCgpIHx8ICFtX3JlbmRlciB8fCAKLSAgICAgICAgKG1fcmVuZGVy
LT5zdHlsZSgpICYmIG1fcmVuZGVyLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkg
fHwgCi0gICAgICAgIG1fcmVuZGVyLT53aWR0aCgpID09IDAgfHwgbV9yZW5kZXItPmhlaWdodCgp
ID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9v
bCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0
Ci17Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyLT5pc1dp
ZGdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4o
bV9yZW5kZXIpLT53aWRnZXQoKSAmJgotICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxSZW5k
ZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpLT5mb2N1c1BvbGljeSgpICYgUVdpZGdldDo6
VGFiRm9jdXMpOwotICAgICAgICB9Ci0JaWYgKGdldERvY3VtZW50KCktPmZyYW1lKCkpCi0JICAg
IHJldHVybiBnZXREb2N1bWVudCgpLT5mcmFtZSgpLT50YWJzVG9BbGxDb250cm9scygpOwotICAg
IH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmlzTW91c2VGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7
Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewotICAgICAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCkgJiYKLSAgICAg
ICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQo
KS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OkNsaWNrRm9jdXMpOwotICAgICAgICB9Ci0gICAg
ICAgIC8vIEZvciA8aW5wdXQgdHlwZT1pbWFnZT4gYW5kIDxidXR0b24+LCB3ZSB3aWxsIGFzc3Vt
ZSBubyBtb3VzZSBmb2N1c2FiaWxpdHkuICBUaGlzIGlzCi0gICAgICAgIC8vIGNvbnNpc3RlbnQg
d2l0aCBPUyBYIGJlaGF2aW9yIGZvciBidXR0b25zLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBTcGVjaWFs
IGNoYXJzIHVzZWQgdG8gZW5jb2RlIGZvcm0gc3RhdGUgc3RyaW5ncy4KLS8vIFdlIHBpY2sgY2hh
cnMgdGhhdCBhcmUgdW5saWtlbHkgdG8gYmUgdXNlZCBpbiBhbiBIVE1MIGF0dHIsIHNvIHdlIHJh
cmVseSBoYXZlIHRvIHJlYWxseSBlbmNvZGUuCi1jb25zdCBjaGFyIHN0YXRlU2VwYXJhdG9yID0g
JyYnOwotY29uc3QgY2hhciBzdGF0ZUVzY2FwZSA9ICc8JzsKLXN0YXRpYyBjb25zdCBjaGFyIHN0
YXRlU2VwYXJhdG9yTWFya2VyW10gPSAiPEEiOwotc3RhdGljIGNvbnN0IGNoYXIgc3RhdGVFc2Nh
cGVNYXJrZXJbXSA9ICI8PCI7Ci0KLS8vIEVuY29kZSBhbiBlbGVtZW50IG5hbWUgc28gd2UgY2Fu
IHB1dCBpdCBpbiBhIHN0YXRlIHN0cmluZyB3aXRob3V0IGNvbGxpZGluZwotLy8gd2l0aCBvdXIg
c2VwYXJhdG9yIGNoYXIuCi1zdGF0aWMgUVN0cmluZyBlbmNvZGVkRWxlbWVudE5hbWUoUVN0cmlu
ZyBzdHIpCi17Ci0gICAgaW50IHNlcExvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAg
ICBpbnQgZXNjTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IpOwotICAgIGlmIChzZXBMb2Mg
Pj0gMCB8fCBlc2NMb2MgPj0gMCkgewotICAgICAgICBRU3RyaW5nIG5ld1N0ciA9IHN0cjsKLSAg
ICAgICAgLy8gICByZXBsYWNlICI8IiB3aXRoICI8PCIKLSAgICAgICAgd2hpbGUgKGVzY0xvYyA+
PSAwKSB7Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFjZShlc2NMb2MsIDEsIHN0YXRlRXNjYXBl
TWFya2VyKTsKLSAgICAgICAgICAgIGVzY0xvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBl
c2NMb2MrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICByZXBsYWNlICImIiB3aXRoICI8QSIK
LSAgICAgICAgd2hpbGUgKHNlcExvYyA+PSAwKSB7Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFj
ZShzZXBMb2MsIDEsIHN0YXRlU2VwYXJhdG9yTWFya2VyKTsKLSAgICAgICAgICAgIHNlcExvYyA9
IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXBMb2MrMSk7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIG5ld1N0cjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0K
LX0KLQotUVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAg
ICAvLyBCdWlsZCBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIEVsZW1lbnROYW1lJkVsZW1lbnRUeXBl
JgotICAgIHJldHVybiBlbmNvZGVkRWxlbWVudE5hbWUobmFtZSgpLnFzdHJpbmcoKSkgKyBzdGF0
ZVNlcGFyYXRvciArIHR5cGUoKS5xc3RyaW5nKCkgKyBzdGF0ZVNlcGFyYXRvcjsKLX0KLQotUVN0
cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoUVN0cmlu
Z0xpc3QgJnN0YXRlcykKLXsKLSAgICBRU3RyaW5nIGVuY05hbWUgPSBlbmNvZGVkRWxlbWVudE5h
bWUobmFtZSgpLnFzdHJpbmcoKSk7Ci0gICAgUVN0cmluZyB0eXBlU3RyID0gdHlwZSgpLnFzdHJp
bmcoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IHN0YXRlcy5iZWdpbigp
OyBpdCAhPSBzdGF0ZXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgUVN0cmluZyBzdGF0ZSA9ICpp
dDsKLSAgICAgICAgaW50IHNlcDEgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICAg
ICAgaW50IHNlcDIgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXAxKzEpOwotICAgICAg
ICBhc3NlcnQoc2VwMSA+PSAwKTsKLSAgICAgICAgYXNzZXJ0KHNlcDIgPj0gMCk7Ci0KLSAgICAg
ICAgUVN0cmluZyBuYW1lQW5kVHlwZSA9IHN0YXRlLmxlZnQoc2VwMik7Ci0gICAgICAgIGlmIChl
bmNOYW1lLmxlbmd0aCgpICsgdHlwZVN0ci5sZW5ndGgoKSArIDEgPT0gKHVpbnQpc2VwMgotICAg
ICAgICAgICAgJiYgbmFtZUFuZFR5cGUuc3RhcnRzV2l0aChlbmNOYW1lKQotICAgICAgICAgICAg
JiYgbmFtZUFuZFR5cGUuZW5kc1dpdGgodHlwZVN0cikpCi0gICAgICAgIHsKLSAgICAgICAgICAg
IHN0YXRlcy5yZW1vdmUoaXQpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLm1pZChzZXAyKzEp
OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBRU3RyaW5nOjpudWxsOwotfQotCi1pbnQg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnRhYkluZGV4KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKHRhYmluZGV4QXR0cikudG9JbnQoKTsKLX0KLQotdm9pZCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0VGFiSW5kZXgoaW50IHZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZSh0YWJpbmRleEF0dHIsIFFTdHJpbmc6Om51bWJlcih2YWx1ZSkpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6SFRNTEJ1dHRvbkVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDog
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoYnV0dG9uVGFnLCBkb2MsIGYpCi17Ci0gICAgbV90
eXBlID0gU1VCTUlUOwotICAgIG1fZGlydHkgPSB0cnVlOwotICAgIG1fYWN0aXZlU3VibWl0ID0g
ZmFsc2U7Ci19Ci0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6fkhUTUxCdXR0b25FbGVtZW50SW1w
bCgpCi17Ci19Ci0KLVJlbmRlck9iamVjdCogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpjcmVhdGVS
ZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICBy
ZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRN
TEJ1dHRvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKHR5cGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHIt
Pm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0
dHItPnZhbHVlKCksICJzdWJtaXQiKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAg
ICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInJlc2V0Iikp
Ci0gICAgICAgICAgICBtX3R5cGUgPSBSRVNFVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25v
cmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImJ1dHRvbiIpKQotICAgICAgICAgICAgbV90eXBlID0g
QlVUVE9OOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAg
ICAgICBtX3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgbV9jdXJyVmFsdWUgPSBtX3Zh
bHVlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAg
ICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZv
Y3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRy
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAg
IHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRy
KTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIo
RXZlbnRJbXBsICpldnQpCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBCVVRUT04gJiYgKGV2dC0+dHlw
ZSgpID09IERPTUFjdGl2YXRlRXZlbnQpKSB7Ci0KLSAgICAgICAgaWYobV9mb3JtICYmIG1fdHlw
ZSA9PSBTVUJNSVQpIHsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsKLSAgICAg
ICAgICAgIG1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpOwotICAgICAgICAgICAgbV9hY3RpdmVTdWJt
aXQgPSBmYWxzZTsgLy8gaW4gY2FzZSB3ZSB3ZXJlIGNhbmNlbGVkCi0gICAgICAgIH0KLSAgICAg
ICAgaWYobV9mb3JtICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgpOwotICAgIH0K
LSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQp
OwotfQotCi1ib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0
dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBo
YXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBv
dGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVy
ZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVu
dCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gUmVt
b3ZlIHRoZSBuYW1lIGNvbnN0cmFpbnQgZm9yIG5vdy4KLSAgICAvLyBXYXM6IG1fdHlwZSA9PSBT
VUJNSVQgJiYgIW1fZGlzYWJsZWQgJiYgIW5hbWUoKS5pc0VtcHR5KCkKLSAgICByZXR1cm4gbV90
eXBlID09IFNVQk1JVCAmJiAhbV9kaXNhYmxlZDsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVu
dEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVT
dWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJt
aXQoYm9vbCBmbGFnKQotewotICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBI
VE1MQnV0dG9uRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2Rp
bmcsIGJvb2wgLyptdWx0aXBhcnQqLykKLXsKLSAgICBpZiAobV90eXBlICE9IFNVQk1JVCB8fCBu
YW1lKCkuaXNFbXB0eSgpIHx8ICFtX2FjdGl2ZVN1Ym1pdCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBtX2N1cnJWYWx1ZSk7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rp
b24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQoteyAgIAotICAgIC8vIHNlbmQgdGhlIG1vdXNlIGJ1
dHRvbiBldmVudHMgaWZmIHRoZQotICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2VuZFRvQW55RWxl
bWVudAotICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1
dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpz
ZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
YWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJ
bXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIp
OwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OkhUTUxGaWVs
ZFNldEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
KQotICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChmaWVsZHNldFRhZywgZG9jLCBmKQot
ewotfQotCi1IVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6fkhUTUxGaWVsZFNldEVsZW1lbnRJbXBs
KCkKLXsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3Qg
Tm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShs
ZWdlbmRUYWcpIHx8IEhUTUxFbGVtZW50SW1wbDo6Y2hlY2tEVEQobmV3Q2hpbGQpOwotfQotCi1i
b29sIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OnR5
cGUoKSBjb25zdAotewotICAgIHJldHVybiAiZmllbGRzZXQiOwotfQotCi1SZW5kZXJPYmplY3Qq
IEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJl
bmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVy
RmllbGRzZXQodGhpcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElucHV0RWxl
bWVudEltcGw6OkhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoaW5wdXRU
YWcsIGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpI
VE1MSW5wdXRFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1faW1hZ2VMb2FkZXIgPSAwOwot
ICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3R5cGUgPSBURVhUOwot
ICAgIG1fbWF4TGVuID0gLTE7Ci0gICAgbV9zaXplID0gMjA7Ci0gICAgbV9jaGVja2VkID0gZmFs
c2U7Ci0gICAgbV9kZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1fdXNlRGVmYXVsdENoZWNr
ZWQgPSB0cnVlOwotICAgIG1faW5kZXRlcm1pbmF0ZSA9IGZhbHNlOwotCi0gICAgbV9oYXZlVHlw
ZSA9IGZhbHNlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci0gICAgbV9hdXRvY29tcGxl
dGUgPSB0cnVlOwotICAgIG1faW5pdGVkID0gZmFsc2U7Ci0KLSAgICB4UG9zID0gMDsKLSAgICB5
UG9zID0gMDsKLQotICAgIG1fbWF4UmVzdWx0cyA9IC0xOwotCi0gICAgaWYgKG1fZm9ybSkKLSAg
ICAgICAgbV9hdXRvY29tcGxldGUgPSBtX2Zvcm0tPmF1dG9Db21wbGV0ZSgpOwotfQotCi1IVE1M
SW5wdXRFbGVtZW50SW1wbDo6fkhUTUxJbnB1dEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0
RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMp
OwotICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxl
bWVudEltcGw6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBtX25hbWUuaXNOdWxsKCkgPyAi
IiA6IG1fbmFtZTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNLZXlib2FyZEZv
Y3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIGJhc2UgY2xhc3Mgc2F5cyB3ZSBjYW4n
dCBiZSBmb2N1c2VkLCB0aGVuIHdlIGNhbiBzdG9wIG5vdy4KLSAgICBpZiAoIUhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGlmIChtX3R5cGUgPT0gUkFESU8pIHsKLSAgICAgICAgLy8gVW5uYW1lZCBy
YWRpbyBidXR0b25zIGFyZSBuZXZlciBmb2N1c2FibGUgKG1hdGNoZXMgV2luSUUpLgotICAgICAg
ICBpZiAobmFtZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICAgICAvLyBOZXZlciBhbGxvdyBrZXlib2FyZCB0YWJiaW5nIHRvIGxlYXZlIHlvdSBpbiB0aGUg
c2FtZSByYWRpbyBncm91cC4gIEFsd2F5cwotICAgICAgICAvLyBza2lwIGFueSBvdGhlciBlbGVt
ZW50cyBpbiB0aGUgZ3JvdXAuCi0gICAgICAgIE5vZGVJbXBsKiBjdXJyZW50Rm9jdXNOb2RlID0g
Z2V0RG9jdW1lbnQoKS0+Zm9jdXNOb2RlKCk7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9jdXNOb2Rl
ICYmIGN1cnJlbnRGb2N1c05vZGUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAg
ICBIVE1MSW5wdXRFbGVtZW50SW1wbCogZm9jdXNlZElucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudEltcGwqPihjdXJyZW50Rm9jdXNOb2RlKTsKLSAgICAgICAgICAgIGlmIChmb2N1
c2VkSW5wdXQtPmlucHV0VHlwZSgpID09IFJBRElPICYmIGZvY3VzZWRJbnB1dC0+Zm9ybSgpID09
IG1fZm9ybSAmJgotICAgICAgICAgICAgICAgIGZvY3VzZWRJbnB1dC0+bmFtZSgpID09IG5hbWUo
KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0g
ICAgICAgIC8vIEFsbG93IGtleWJvYXJkIGZvY3VzIGlmIHdlJ3JlIGNoZWNrZWQgb3IgaWYgbm90
aGluZyBpbiB0aGUgZ3JvdXAgaXMgY2hlY2tlZC4KLSAgICAgICAgcmV0dXJuIGNoZWNrZWQoKSB8
fCAhZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwo
KSwgbV9mb3JtKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OnNldFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIGlm
ICh0LmlzRW1wdHkoKSkgewotICAgICAgICBpbnQgZXhjY29kZTsKLSAgICAgICAgcmVtb3ZlQXR0
cmlidXRlKHR5cGVBdHRyLCBleGNjb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzZXRB
dHRyaWJ1dGUodHlwZUF0dHIsIHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXRJbnB1dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIHR5cGVFbnVtIG5ld1R5cGU7
Ci0gICAgCi0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJwYXNzd29yZCIpKQotICAgICAg
ICBuZXdUeXBlID0gUEFTU1dPUkQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwg
ImNoZWNrYm94IikpCi0gICAgICAgIG5ld1R5cGUgPSBDSEVDS0JPWDsKLSAgICBlbHNlIGlmIChl
cXVhbElnbm9yaW5nQ2FzZSh0LCAicmFkaW8iKSkKLSAgICAgICAgbmV3VHlwZSA9IFJBRElPOwot
ICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJzdWJtaXQiKSkKLSAgICAgICAgbmV3
VHlwZSA9IFNVQk1JVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmVzZXQi
KSkKLSAgICAgICAgbmV3VHlwZSA9IFJFU0VUOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKHQsICJmaWxlIikpCi0gICAgICAgIG5ld1R5cGUgPSBGSUxFOwotICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHQsICJoaWRkZW4iKSkKLSAgICAgICAgbmV3VHlwZSA9IEhJRERFTjsK
LSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaW1hZ2UiKSkKLSAgICAgICAgbmV3
VHlwZSA9IElNQUdFOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJidXR0b24i
KSkKLSAgICAgICAgbmV3VHlwZSA9IEJVVFRPTjsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZSh0LCAia2h0bWxfaXNpbmRleCIpKQotICAgICAgICBuZXdUeXBlID0gSVNJTkRFWDsKLSAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic2VhcmNoIikpCi0gICAgICAgIG5ld1R5
cGUgPSBTRUFSQ0g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhbmdlIikp
Ci0gICAgICAgIG5ld1R5cGUgPSBSQU5HRTsKLSAgICBlbHNlCi0gICAgICAgIG5ld1R5cGUgPSBU
RVhUOwotCi0gICAgLy8gIyMjIElNUE9SVEFOVDogRG9uJ3QgYWxsb3cgdGhlIHR5cGUgdG8gYmUg
Y2hhbmdlZCB0byBGSUxFIGFmdGVyIHRoZSBmaXJzdAotICAgIC8vIHR5cGUgY2hhbmdlLCBvdGhl
cndpc2UgYSBKYXZhU2NyaXB0IHByb2dyYW1tZXIgd291bGQgYmUgYWJsZSB0byBzZXQgYSB0ZXh0
Ci0gICAgLy8gZmllbGQncyB2YWx1ZSB0byBzb21ldGhpbmcgbGlrZSAvZXRjL3Bhc3N3ZCBhbmQg
dGhlbiBjaGFuZ2UgaXQgdG8gYSBmaWxlIGZpZWxkLgotICAgIGlmIChtX3R5cGUgIT0gbmV3VHlw
ZSkgewotICAgICAgICBpZiAobmV3VHlwZSA9PSBGSUxFICYmIG1faGF2ZVR5cGUpIHsKLSAgICAg
ICAgICAgIC8vIFNldCB0aGUgYXR0cmlidXRlIGJhY2sgdG8gdGhlIG9sZCB2YWx1ZS4KLSAgICAg
ICAgICAgIC8vIFVzZWZ1bCBpbiBjYXNlIHdlIHdlcmUgY2FsbGVkIGZyb20gaW5zaWRlIHBhcnNl
TWFwcGVkQXR0cmlidXRlLgotICAgICAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0eXBl
KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAm
JiAhbmFtZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmIChnZXREb2N1bWVudCgp
LT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pID09IHRo
aXMpCi0gICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9u
R3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGJvb2wgd2FzQXR0YWNoZWQgPSBtX2F0dGFjaGVkOwotICAgICAgICAgICAgaWYgKHdhc0F0dGFj
aGVkKQotICAgICAgICAgICAgICAgIGRldGFjaCgpOwotICAgICAgICAgICAgYm9vbCBkaWRTdG9y
ZVZhbHVlID0gc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAg
IG1fdHlwZSA9IG5ld1R5cGU7Ci0gICAgICAgICAgICBib29sIHdpbGxTdG9yZVZhbHVlID0gc3Rv
cmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIGlmIChkaWRTdG9y
ZVZhbHVlICYmICF3aWxsU3RvcmVWYWx1ZSAmJiAhbV92YWx1ZS5pc051bGwoKSkgewotICAgICAg
ICAgICAgICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIG1fdmFsdWUpOwotICAgICAgICAgICAg
ICAgIG1fdmFsdWUgPSBET01TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
ICghZGlkU3RvcmVWYWx1ZSAmJiB3aWxsU3RvcmVWYWx1ZSkgewotICAgICAgICAgICAgICAgIG1f
dmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGlmICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIG91ciB0eXBlIG1vcnBocyBpbnRvIGEgcmFkaW8g
YnV0dG9uIGFuZCB3ZSBhcmUgY2hlY2tlZCwgdGhlbiBnbyBhaGVhZAotICAgICAgICAgICAgLy8g
YW5kIHNpZ25hbCB0aGlzIHRvIHRoZSBmb3JtLgotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBS
QURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmFkaW9C
dXR0b25DaGVja2VkKHRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9oYXZl
VHlwZSA9IHRydWU7Ci0gICAgCi0gICAgaWYgKG1fdHlwZSAhPSBJTUFHRSAmJiBtX2ltYWdlTG9h
ZGVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotICAgICAgICBtX2ltYWdlTG9h
ZGVyID0gMDsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dHlw
ZSgpIGNvbnN0Ci17Ci0gICAgLy8gbmVlZHMgdG8gYmUgbG93ZXJjYXNlIGFjY29yZGluZyB0byBE
T00gc3BlYwotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBURVhUOiByZXR1cm4gInRl
eHQiOwotICAgIGNhc2UgUEFTU1dPUkQ6IHJldHVybiAicGFzc3dvcmQiOwotICAgIGNhc2UgQ0hF
Q0tCT1g6IHJldHVybiAiY2hlY2tib3giOwotICAgIGNhc2UgUkFESU86IHJldHVybiAicmFkaW8i
OwotICAgIGNhc2UgU1VCTUlUOiByZXR1cm4gInN1Ym1pdCI7Ci0gICAgY2FzZSBSRVNFVDogcmV0
dXJuICJyZXNldCI7Ci0gICAgY2FzZSBGSUxFOiByZXR1cm4gImZpbGUiOwotICAgIGNhc2UgSElE
REVOOiByZXR1cm4gImhpZGRlbiI7Ci0gICAgY2FzZSBJTUFHRTogcmV0dXJuICJpbWFnZSI7Ci0g
ICAgY2FzZSBCVVRUT046IHJldHVybiAiYnV0dG9uIjsKLSAgICBjYXNlIFNFQVJDSDogcmV0dXJu
ICJzZWFyY2giOwotICAgIGNhc2UgUkFOR0U6IHJldHVybiAicmFuZ2UiOwotICAgIGNhc2UgSVNJ
TkRFWDogcmV0dXJuICIiOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLVFTdHJpbmcgSFRN
TElucHV0RWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgYXNzZXJ0KG1fdHlwZSAhPSBQQVNT
V09SRCk7CQkvLyBzaG91bGQgbmV2ZXIgc2F2ZS9yZXN0b3JlIHBhc3N3b3JkIGZpZWxkcwotCi0g
ICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpOwot
ICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElP
OgotICAgICAgICByZXR1cm4gc3RhdGUgKyAoY2hlY2tlZCgpID8gIm9uIiA6ICJvZmYiKTsKLSAg
ICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gc3RhdGUgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7
IC8vIE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICB9Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQot
ewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUv
cmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLSAgICAKLSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKHN0YXRlcyk7Ci0gICAgaWYg
KHN0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgc2V0Q2hlY2tlZCgoc3RhdGUg
PT0gIm9uIikpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBzZXRWYWx1
ZShET01TdHJpbmcoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSkpOwotICAgICAgICBicmVh
azsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmNhbkhhdmVTZWxlY3Rp
b24oKQotewotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0aW9u
U3RhcnQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3aXRj
aCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNI
OgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVu
ZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25TdGFydCgpOwotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYgKCFtX3JlbmRl
cikgcmV0dXJuIDA7Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQ
QVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNl
bGVjdGlvbkVuZCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
fQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxl
Y3Rpb25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAg
IAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAg
IGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQo
aW50IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNo
IChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6
Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVF
ZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmKCFtX3JlbmRlcikg
cmV0dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGSUxFOgotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbio+KG1fcmVuZGVyKS0+c2VsZWN0
KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAg
Y2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlckxpbmVFZGl0Kj4obV9yZW5kZXIpLT5zZWxlY3QoKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAg
Y2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoK
LSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBS
RVNFVDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19
Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFy
dCwgaW50IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dp
dGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFS
Q0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxp
bmVFZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAg
IH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y2xpY2soYm9vbCBzZW5kTW91c2VF
dmVudHMsIGJvb2wgc2hvd1ByZXNzZWRMb29rKQotewotICAgIHN3aXRjaCAoaW5wdXRUeXBlKCkp
IHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAvLyBhIG5vLW9wIGZvciB0aGlz
IHR5cGUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAg
Y2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2sp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1
dHRvbiAqPihyZW5kZXJlcigpKS0+Y2xpY2soc2VuZE1vdXNlRXZlbnRzKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJ
TzoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICBj
YXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToK
LSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5
QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgp
KSB7Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhp
cyB0eXBlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBj
YXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBJU0lOREVY
OgotICAgICAgICAgICAgZm9jdXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIFNVQk1JVDoKLSAg
ICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBCVVRU
T046Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAg
IC8vIGZvY3VzCi0gICAgICAgICAgICBmb2N1cygpOwotCi0gICAgICAgICAgICAvLyBzZW5kIHRo
ZSBtb3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAgICAgICAgIC8vIGNhbGxlciBzcGVj
aWZpZWQgc2VuZFRvQW55RWxlbWVudAotICAgICAgICAgICAgY2xpY2soc2VuZFRvQW55RWxlbWVu
dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVu
dEltcGw6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0
dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRo
QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyIHx8Ci0gICAgICAgIGF0dHJO
YW1lID09IHZzcGFjZUF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaHNwYWNlQXR0cikgewot
ICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fSAKLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3Vs
dCA9IGVSZXBsYWNlZDsgLy8gU2hhcmUgd2l0aCA8aW1nPiBzaW5jZSB0aGUgYWxpZ25tZW50IGJl
aGF2aW9yIGlzIHRoZSBzYW1lLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAot
ICAgIHJldHVybiBIVE1MRWxlbWVudEltcGw6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7
Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1l
QXR0cikgewotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSAmJiBtX2Zv
cm0pIHsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmFkaW8gZnJvbSBpdHMgb2xkIGdyb3Vw
LgotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAhbV9uYW1lLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG1f
bmFtZS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFVw
ZGF0ZSBvdXIgY2FjaGVkIHJlZmVyZW5jZSB0byB0aGUgbmFtZS4KLSAgICAgICAgbV9uYW1lID0g
YXR0ci0+dmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCBpdCB0byBpdHMgbmV3IGdy
b3VwLgotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSkKLSAgICAgICAg
ICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAg
bV9hdXRvY29tcGxldGUgPSAhZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09ICB0eXBlQXR0cikgewotICAgICAgICBz
ZXRJbnB1dFR5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gdmFsdWVBdHRyKSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBzZXRDaGFuZ2VkIGlm
IHRoZSBmb3JtIGlzIGxvb2tpbmcgYXQgdGhlIGRlZmF1bHQgdmFsdWUgcmlnaHQgbm93LgotICAg
ICAgICBpZiAobV92YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAg
ICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGNoZWNrZWRBdHRyKSB7Ci0gICAgICAgIG1fZGVmYXVsdENoZWNrZWQgPSAh
YXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlmIChtX3VzZURlZmF1bHRDaGVja2VkKSB7Ci0gICAg
ICAgICAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNrZWQpOwotICAgICAgICAgICAgbV91c2VE
ZWZhdWx0Q2hlY2tlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBtYXhsZW5ndGhBdHRyKSB7Ci0gICAgICAgIG1fbWF4TGVuID0gIWF0dHItPmlzTnVs
bCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogLTE7Ci0gICAgICAgIHNldENoYW5nZWQoKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3Np
emUgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAyMDsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbHRBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRl
ciAmJiBtX3R5cGUgPT0gSU1BR0UpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJJbWFn
ZSo+KG1fcmVuZGVyKS0+dXBkYXRlQWx0VGV4dCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IHNyY0F0dHIpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyICYmIG1fdHlwZSA9PSBJTUFH
RSkgewotICAgICAgICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgICAgIG1f
aW1hZ2VMb2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICAgICAgbV9p
bWFnZUxvYWRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IHVzZW1hcEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5h
bWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRo
ZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2c3BhY2VBdHRyKSB7Ci0g
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fVE9QLCBhdHRyLT52YWx1
ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9CT1RUT00s
IGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhzcGFjZUF0
dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9MRUZULCBh
dHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJ
Tl9SSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YWxpZ25BdHRyKSB7Ci0gICAgICAgIGFkZEhUTUxBbGlnbm1lbnQoYXR0cik7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChh
dHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfSEVJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxF
dmVudExpc3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hh
bmdlRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uaW5wdXRB
dHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGlucHV0RXZlbnQsIGF0dHIpOwot
ICAgIH0KLSAgICAvLyBTZWFyY2ggZmllbGQgYW5kIHNsaWRlciBhdHRyaWJ1dGVzIGFsbCBqdXN0
IGNhdXNlIHVwZGF0ZUZyb21FbGVtZW50IHRvIGJlIGNhbGxlZCB0aHJvdWdoIHN0eWxlCi0gICAg
Ly8gcmVjYWxjaW5nLgotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlYXJjaEF0dHIp
IHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc2VhcmNoRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlc3VsdHNBdHRyKSB7Ci0gICAgICAgIG1fbWF4
UmVzdWx0cyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwot
ICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYXV0
b3NhdmVBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gaW5jcmVtZW50YWxB
dHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcGxhY2Vob2xkZXJBdHRyIHx8
Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbWluQXR0ciB8fAotICAgICAgICAgICAg
ICAgYXR0ci0+bmFtZSgpID09IG1heEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUo
KSA9PSBwcmVjaXNpb25BdHRyKSB7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KGF0dHIpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVk
KFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBj
YXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNl
IFJBTkdFOgotICAgIGNhc2UgSVNJTkRFWDoKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2Ug
UkFESU86Ci0gICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBJTUFHRToKLSAgICBjYXNlIFJFU0VU
OgotICAgIGNhc2UgRklMRToKLSAgICBjYXNlIEJVVFRPTjogICByZXR1cm4gSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnJlbmRlcmVySXNOZWVkZWQoc3R5bGUpOwotICAgIGNhc2UgSElEREVO
OiAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTElucHV0RWxlbWVudEltcGw6OmNyZWF0ZVJl
bmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHN3
aXRjaChtX3R5cGUpCi0gICAgewotICAgIGNhc2UgVEVYVDoKLSAgICBjYXNlIFBBU1NXT1JEOgot
ICAgIGNhc2UgU0VBUkNIOgotICAgIGNhc2UgSVNJTkRFWDogIHJldHVybiBuZXcgKGFyZW5hKSBS
ZW5kZXJMaW5lRWRpdCh0aGlzKTsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86
Ci0gICAgICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7
Ci0gICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEJVVFRPTjoKLSAg
ICAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLSAgICBjYXNlIElN
QUdFOiAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVySW1hZ2VCdXR0b24odGhpcyk7Ci0gICAg
Y2FzZSBGSUxFOiAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpbGVCdXR0b24odGhpcyk7
Ci0gICAgY2FzZSBSQU5HRTogICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclNsaWRlcih0aGlz
KTsKLSAgICBjYXNlIEhJRERFTjogICBicmVhazsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsK
LSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YXR0YWNoKCkK
LXsKLSAgICBpZiAoIW1faW5pdGVkKSB7Ci0gICAgICAgIGlmICghbV9oYXZlVHlwZSkKLSAgICAg
ICAgICAgIHNldElucHV0VHlwZShnZXRBdHRyaWJ1dGUodHlwZUF0dHIpKTsKLQotICAgICAgICAv
LyBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBkeW5hbWljLCBkb2Vzbid0IGl0LCBzaW5jZSBzb21l
b25lIGNvdWxkIHNldCB0aGlzCi0gICAgICAgIC8vIGFmdGVyIGF0dGFjaG1lbnQ/Ci0gICAgICAg
IERPTVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgaWYgKCh1
aW50KSBtX3R5cGUgPD0gSVNJTkRFWCAmJiAhdmFsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
Ly8gcmVtb3ZlIG5ld2xpbmUgc3R1ZmYuLgotICAgICAgICAgICAgUVN0cmluZyBudmFsdWU7Ci0g
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZhbC5sZW5ndGgoKTsgKytp
KQotICAgICAgICAgICAgICAgIGlmICh2YWxbaV0gPj0gJyAnKQotICAgICAgICAgICAgICAgICAg
ICBudmFsdWUgKz0gdmFsW2ldOwotCi0gICAgICAgICAgICBpZiAodmFsLmxlbmd0aCgpICE9IG52
YWx1ZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBu
dmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9pbml0ZWQgPSB0cnVlOwotICAgIH0KLQot
ICAgIC8vIERpc2FsbG93IHRoZSB3aWR0aCBhdHRyaWJ1dGUgb24gaW5wdXRzIG90aGVyIHRoYW4g
SElEREVOIGFuZCBJTUFHRS4KLSAgICAvLyBEdW1iIFdlYiBzaXRlcyB3aWxsIHRyeSB0byBzZXQg
dGhlIHdpZHRoIGFzIGFuIGF0dHJpYnV0ZSBvbiBmb3JtIGNvbnRyb2xzIHRoYXQgYXJlbid0Ci0g
ICAgLy8gaW1hZ2VzIG9yIGhpZGRlbi4KLSAgICBpZiAoaGFzTWFwcGVkQXR0cmlidXRlcygpICYm
IG1fdHlwZSAhPSBISURERU4gJiYgbV90eXBlICE9IElNQUdFICYmICFnZXRBdHRyaWJ1dGUod2lk
dGhBdHRyKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y0NvZGU7Ci0gICAgICAgIHJlbW92
ZUF0dHJpYnV0ZSh3aWR0aEF0dHIsIGV4Y0NvZGUpOwotICAgIH0KLQotICAgIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIGlmIChtX3R5cGUgPT0gSU1BR0UpIHsK
LSAgICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgbV9pbWFnZUxvYWRlciA9
IG5ldyBIVE1MSW1hZ2VMb2FkZXIodGhpcyk7Ci0gICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0
ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICBS
ZW5kZXJJbWFnZSogaW1hZ2VPYmogPSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVy
KCkpOwotICAgICAgICAgICAgaW1hZ2VPYmotPnNldEltYWdlKG1faW1hZ2VMb2FkZXItPmltYWdl
KCkpOyAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3
aXRoIGNhbGxpbmcgcGFzc3dvcmRGaWVsZFJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhl
IHRpbWluZwotICAgIC8vIHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVh
cmx5Ci0gICAgaWYgKG1fdHlwZSA9PSBQQVNTV09SRCkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+
cGFzc3dvcmRGaWVsZEFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmRl
dGFjaCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwotICAg
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjphbHRUZXh0KCkgY29uc3QKLXsKLSAgICAvLyBodHRwOi8vd3d3LnczLm9y
Zy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvYXBwZW5kaXgvbm90ZXMuaHRtbCNhbHRnZW4K
LSAgICAvLyBhbHNvIGhlYXZpbHkgZGlzY3Vzc2VkIGJ5IEhpeGllIG9uIGJ1Z3ppbGxhCi0gICAg
Ly8gbm90ZSB0aGlzIGlzIGludGVudGlvbmFsbHkgZGlmZmVyZW50IHRvIEhUTUxJbWFnZUVsZW1l
bnRJbXBsOjphbHRUZXh0KCkKLSAgICBET01TdHJpbmcgYWx0ID0gZ2V0QXR0cmlidXRlKGFsdEF0
dHIpOwotICAgIC8vIGZhbGwgYmFjayB0byB0aXRsZSBhdHRyaWJ1dGUKLSAgICBpZiAoYWx0Lmlz
TnVsbCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICBpZiAo
YWx0LmlzTnVsbCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAg
ICBpZiAoYWx0LmlzRW1wdHkoKSkKLSAgICAgICAgYWx0ID0gaW5wdXRFbGVtZW50QWx0VGV4dCgp
OwotCi0gICAgcmV0dXJuIGFsdDsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNT
dWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0
aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNj
ZXNzZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhp
cyBjb25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFu
ZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRl
bmRlZC4gCi0gICAgLy8gV2FzOiAobV90eXBlID09IFNVQk1JVCAmJiAhbmFtZSgpLmlzRW1wdHko
KSkKLSAgICByZXR1cm4gIW1fZGlzYWJsZWQgJiYgKG1fdHlwZSA9PSBJTUFHRSB8fCBtX3R5cGUg
PT0gU1VCTUlUKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNBY3RpdmF0ZWRT
dWJtaXQoKSBjb25zdAotewotICAgIHJldHVybiBtX2FjdGl2ZVN1Ym1pdDsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAg
ICBtX2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6
OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCAmZW5jb2RpbmcsIGJvb2wgbXVsdGlwYXJ0KQot
ewotICAgIC8vIGltYWdlIGdlbmVyYXRlcyBpdHMgb3duIG5hbWVzCi0gICAgaWYgKG5hbWUoKS5p
c0VtcHR5KCkgJiYgbV90eXBlICE9IElNQUdFKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBzd2l0Y2gg
KG1fdHlwZSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgY2FzZSBURVhUOgotICAg
ICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBQQVNT
V09SRDoKLSAgICAgICAgICAgIC8vIGFsd2F5cyBzdWNjZXNzZnVsCi0gICAgICAgICAgICBlbmNv
ZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLQotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAg
ICAgICAgaWYgKGNoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERh
dGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlVUVE9OOgotICAg
ICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgLy8gdGhvc2UgYnV0dG9ucyBhcmUgbmV2ZXIg
c3VjY2Vzc2Z1bAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNhc2UgSU1B
R0U6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBl
bmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieCIgOiAobmFtZSgpICsgIi54
IiksIGNsaWNrWCgpKTsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUo
KS5pc0VtcHR5KCkgPyAieSIgOiAobmFtZSgpICsgIi55IiksIGNsaWNrWSgpKTsKLSAgICAgICAg
ICAgICAgICBpZiAoIW5hbWUoKS5pc0VtcHR5KCkgJiYgIXZhbHVlKCkuaXNFbXB0eSgpKQotICAg
ICAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVN1
Ym1pdCkgewotICAgICAgICAgICAgICAgIERPTVN0cmluZyBlbmNfc3RyID0gdmFsdWVXaXRoRGVm
YXVsdCgpOwotICAgICAgICAgICAgICAgIGlmICghZW5jX3N0ci5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIGVuY19zdHIpOwotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAg
IHsKLSAgICAgICAgICAgIC8vIGNhbid0IHN1Ym1pdCBmaWxlIG9uIEdFVAotICAgICAgICAgICAg
Ly8gZG9uJ3Qgc3VibWl0IGlmIGRpc3BsYXk6IG5vbmUgb3IgZGlzcGxheTogaGlkZGVuCi0gICAg
ICAgICAgICBpZighbXVsdGlwYXJ0IHx8ICFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCktPnN0eWxl
KCktPnZpc2liaWxpdHkoKSAhPSBraHRtbDo6VklTSUJMRSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIGlmIG5vIGZpbGVuYW1lIGF0IGFsbCBpcyBlbnRl
cmVkLCByZXR1cm4gc3VjY2Vzc2Z1bCwgaG93ZXZlciBlbXB0eQotICAgICAgICAgICAgLy8gbnVs
bCB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgYnV0IG5ldHNjYXBlIHBvc3RzIGFuIGVtcHR5IGZpbGUu
IGFyZ2guCi0gICAgICAgICAgICBpZiAodmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAg
ICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgUVN0cmluZygiIikpOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmNvZGlu
Zy5hcHBlbmRGaWxlKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgfQotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBlbmNvZGluZy5h
cHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpy
ZXNldCgpCi17Ci0gICAgaWYgKHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkpCi0g
ICAgICAgIHNldFZhbHVlKERPTVN0cmluZygpKTsKLSAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENo
ZWNrZWQpOwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZXRDaGVja2VkKGJvb2wgX2NoZWNrZWQpCi17Ci0gICAgLy8gV2lu
SUUgZG9lcyBub3QgYWxsb3cgdW5uYW1lZCByYWRpbyBidXR0b25zIHRvIGV2ZW4gYmUgY2hlY2tl
ZC4KLSAgICBpZiAoY2hlY2tlZCgpID09IF9jaGVja2VkIHx8IChtX3R5cGUgPT0gUkFESU8gJiYg
bmFtZSgpLmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3R5cGUgPT0g
UkFESU8gJiYgX2NoZWNrZWQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hl
Y2tlZCh0aGlzLCBtX2Zvcm0pOwotCi0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwot
ICAgIG1fY2hlY2tlZCA9IF9jaGVja2VkOwotICAgIHNldENoYW5nZWQoKTsKLSAgICBpZiAocmVu
ZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAg
IHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotICAgIG9u
Q2hhbmdlKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEluZGV0ZXJtaW5h
dGUoYm9vbCBfaW5kZXRlcm1pbmF0ZSkKLXsKLSAgICAvLyBPbmx5IGNoZWNrYm94ZXMgaG9ub3Ig
aW5kZXRlcm1pbmF0ZS4KLSAgICBpZiAobV90eXBlICE9IENIRUNLQk9YIHx8IGluZGV0ZXJtaW5h
dGUoKSA9PSBfaW5kZXRlcm1pbmF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9pbmRldGVy
bWluYXRlID0gX2luZGV0ZXJtaW5hdGU7Ci0KLSAgICBzZXRDaGFuZ2VkKCk7Ci0KLSAgICBpZiAo
cmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAg
ICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjb3B5Tm9uQXR0cmlidXRlUHJvcGVydGllcyhj
b25zdCBFbGVtZW50SW1wbCAqc291cmNlKQotewotICAgIGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJ
bXBsICpzb3VyY2VFbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudEltcGwg
Kj4oc291cmNlKTsKLQotICAgIG1fdmFsdWUgPSBzb3VyY2VFbGVtLT5tX3ZhbHVlOwotICAgIG1f
Y2hlY2tlZCA9IHNvdXJjZUVsZW0tPm1fY2hlY2tlZDsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBz
b3VyY2VFbGVtLT5tX2luZGV0ZXJtaW5hdGU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIERPTVN0cmluZyB2YWx1ZSA9IG1fdmFsdWU7
Ci0KLSAgICAvLyBJdCdzIGltcG9ydGFudCAqbm90KiB0byBmYWxsIGJhY2sgdG8gdGhlIHZhbHVl
IGF0dHJpYnV0ZSBmb3IgZmlsZSBpbnB1dHMsCi0gICAgLy8gYmVjYXVzZSB0aGF0IHdvdWxkIGFs
bG93IGEgbWFsaWNpb3VzIHdlYiBwYWdlIHRvIHVwbG9hZCBmaWxlcyBieSBzZXR0aW5nIHRoZQot
ICAgIC8vIHZhbHVlIGF0dHJpYnV0ZSBpbiBtYXJrdXAuCi0gICAgaWYgKHZhbHVlLmlzTnVsbCgp
ICYmIG1fdHlwZSAhPSBGSUxFKQotICAgICAgICB2YWx1ZSA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0
dHIpOwotCi0gICAgLy8gSWYgbm8gYXR0cmlidXRlIGV4aXN0cywgdGhlbiBqdXN0IHVzZSAib24i
IG9yICIiIGJhc2VkIG9mZiB0aGUgY2hlY2tlZCgpIHN0YXRlIG9mIHRoZSBjb250cm9sLgotICAg
IGlmICh2YWx1ZS5pc051bGwoKSAmJiAobV90eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9PSBS
QURJTykpCi0gICAgICAgIHJldHVybiBET01TdHJpbmcoY2hlY2tlZCgpID8gIm9uIiA6ICIiKTsK
LQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBs
Ojp2YWx1ZVdpdGhEZWZhdWx0KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdiA9IHZhbHVlKCk7
Ci0gICAgaWYgKHYuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAg
ICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIHYgPSByZXNldEJ1dHRvbkRlZmF1
bHRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNV
Qk1JVDoKLSAgICAgICAgICAgICAgICB2ID0gc3VibWl0QnV0dG9uRGVmYXVsdExhYmVsKCk7Ci0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAg
IGNhc2UgSElEREVOOgotICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgIGNhc2Ug
SVNJTkRFWDoKLSAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICBjYXNlIFJB
RElPOgotICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgIGNhc2UgU0VBUkNIOgot
ICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiB2OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIGlmIChtX3R5cGUgPT0gRklM
RSkgcmV0dXJuOwotCi0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIGlm
IChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKSB7Ci0gICAgICAgIG1fdmFsdWUg
PSB2YWx1ZTsKLSAgICAgICAgaWYgKG1fcmVuZGVyKQotICAgICAgICAgICAgbV9yZW5kZXItPnVw
ZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJp
bmcgJnZhbHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1Jl
bmRlcmVyID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGaXJlIHRoZSAiaW5wdXQiIERPTSBldmVudC4K
LSAgICBkaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLWJv
b2wgSFRNTElucHV0RWxlbWVudEltcGw6OnN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRl
KCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIEJVVFRPTjoK
LSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICBjYXNl
IEhJRERFTjoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAg
ICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAg
ICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVY
VDoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXZvaWQqIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwcmVEaXNwYXRjaEV2ZW50SGFuZGxlcihF
dmVudEltcGwgKmV2dCkKLXsKLSAgICAvLyBwcmV2ZW50RGVmYXVsdCBvciAicmV0dXJuIGZhbHNl
IiBhcmUgdXNlZCB0byByZXZlcnNlIHRoZSBhdXRvbWF0aWMgY2hlY2tpbmcvc2VsZWN0aW9uIHdl
IGRvIGhlcmUuCi0gICAgLy8gVGhpcyByZXN1bHQgZ2l2ZXMgdXMgZW5vdWdoIGluZm8gdG8gcGVy
Zm9ybSB0aGUgInVuZG8iIGluIHBvc3REaXNwYXRjaCBvZiB0aGUgYWN0aW9uIHdlIHRha2UgaGVy
ZS4KLSAgICB2b2lkKiByZXN1bHQgPSAwOyAKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JPWCB8
fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkg
PT0gY2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihl
dnQpLT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gpIHsK
LSAgICAgICAgICAgIC8vIEFzIGEgd2F5IHRvIHN0b3JlIHRoZSBzdGF0ZSwgd2UgcmV0dXJuIDAg
aWYgd2Ugd2VyZSB1bmNoZWNrZWQsIDEgaWYgd2Ugd2VyZSBjaGVja2VkLCBhbmQgMiBmb3IKLSAg
ICAgICAgICAgIC8vIGluZGV0ZXJtaW5hdGUuCi0gICAgICAgICAgICBpZiAoaW5kZXRlcm1pbmF0
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKTB4MjsKLSAgICAgICAgICAg
ICAgICBzZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0g
KHZvaWQqKTB4MTsKLSAgICAgICAgICAgICAgICBzZXRDaGVja2VkKCFjaGVja2VkKCkpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIHJhZGlvIGJ1
dHRvbnMsIHN0b3JlIHRoZSBjdXJyZW50IHNlbGVjdGVkIHJhZGlvIG9iamVjdC4KLSAgICAgICAg
ICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpIHx8IGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsgLy8gVW5uYW1lZCByYWRpbyBidXR0b25zIGRvbnQgZ2V0IGNoZWNrZWQuIENoZWNr
ZWQgYnV0dG9ucyBqdXN0IHN0YXkgY2hlY2tlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gRklYTUU6IE5lZWQgdG8gbGVhcm4gdG8gd29yayB3aXRob3V0IGEgZm9ybS4KLQotICAgICAg
ICAgICAgLy8gV2UgcmVhbGx5IHdhbnQgcmFkaW8gZ3JvdXBzIHRvIGVuZCB1cCBpbiBzYW5lIHN0
YXRlcywgaS5lLiwgdG8gaGF2ZSBzb21ldGhpbmcgY2hlY2tlZC4KLSAgICAgICAgICAgIC8vIFRo
ZXJlZm9yZSBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSBzZWxlY3RlZCwgd2Ugd29uJ3QgYWxsb3cg
dGhpcyBhY3Rpb24gdG8gYmUgInVuZG9uZSIsIHNpbmNlCi0gICAgICAgICAgICAvLyB3ZSB3YW50
IHNvbWUgb2JqZWN0IGluIHRoZSByYWRpbyBncm91cCB0byBhY3R1YWxseSBnZXQgc2VsZWN0ZWQu
Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY3VyclJhZGlvID0gZ2V0RG9jdW1l
bnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsK
LSAgICAgICAgICAgIGlmIChjdXJyUmFkaW8pIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZl
IGEgcmFkaW8gYnV0dG9uIHNlbGVjdGVkIHRoYXQgaXMgbm90IHVzLiAgQ2FjaGUgaXQgaW4gb3Vy
IHJlc3VsdCBmaWVsZCBhbmQgcmVmIGl0IHNvCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBj
YW4ndCBiZSBkZXN0cm95ZWQuCi0gICAgICAgICAgICAgICAgY3VyclJhZGlvLT5yZWYoKTsKLSAg
ICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyUmFkaW87Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBzZXRDaGVja2VkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBvc3REaXNwYXRjaEV2ZW50SGFu
ZGxlcihFdmVudEltcGwgKmV2dCwgdm9pZCogZGF0YSkKLXsKLSAgICBpZiAoKG1fdHlwZSA9PSBD
SEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0
LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVu
dEltcGwqPihldnQpLT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hF
Q0tCT1gpIHsKLSAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIGNoZWNraW5nIHdlIGRpZCBpbiBw
cmVEaXNwYXRjaC4KLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBl
dnQtPmRlZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSAodm9p
ZCopMHgyKQotICAgICAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKHRydWUpOwotICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZChkYXRhKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBI
VE1MSW5wdXRFbGVtZW50SW1wbCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
SW1wbCo+KGRhdGEpOwotICAgICAgICAgICAgaWYgKGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpIHx8
IGV2dC0+ZGVmYXVsdEhhbmRsZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhl
IG9yaWdpbmFsIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBpZiBwb3NzaWJsZS4KLSAgICAgICAgICAg
ICAgICAvLyBNYWtlIHN1cmUgaXQgaXMgc3RpbGwgYSByYWRpbyBidXR0b24gYW5kIG9ubHkgZG8g
dGhlIHJlc3RvcmF0aW9uIGlmIGl0IHN0aWxsCi0gICAgICAgICAgICAgICAgLy8gYmVsb25ncyB0
byBvdXIgZ3JvdXAuCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0LT5mb3JtKCkgPT0gZm9ybSgp
ICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1dC0+bmFtZSgpID09IG5hbWUo
KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPaywgdGhlIG9sZCByYWRpbyBidXR0b24gaXMg
c3RpbGwgaW4gb3VyIGZvcm0gYW5kIGluIG91ciBncm91cCBhbmQgaXMgc3RpbGwgYSAKLSAgICAg
ICAgICAgICAgICAgICAgLy8gcmFkaW8gYnV0dG9uLCBzbyBpdCdzIHNhZmUgdG8gcmVzdG9yZSBz
ZWxlY3Rpb24gdG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LT5zZXRDaGVja2VkKHRy
dWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0
LT5kZXJlZigpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlmIChtX3R5
cGUgPT0gSU1BR0UgJiYgZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9PSBjbGlj
a0V2ZW50ICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIC8vIHJlY29yZCB0aGUgbW91c2UgcG9zaXRp
b24gZm9yIHdoZW4gd2UgZ2V0IHRoZSBET01BY3RpdmF0ZSBldmVudAotICAgICAgICBNb3VzZUV2
ZW50SW1wbCAqbWUgPSBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2dCk7Ci0gICAgICAg
IGludCBvZmZzZXRYLCBvZmZzZXRZOwotICAgICAgICBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlv
bihvZmZzZXRYLG9mZnNldFkpOwotICAgICAgICB4UG9zID0gbWUtPmNsaWVudFgoKS1vZmZzZXRY
OwotICAgICAgICB5UG9zID0gbWUtPmNsaWVudFkoKS1vZmZzZXRZOwotCi0JbWUtPnNldERlZmF1
bHRIYW5kbGVkKCk7Ci0gICAgfQotCi0gICAgLy8gRE9NQWN0aXZhdGUgZXZlbnRzIGNhdXNlIHRo
ZSBpbnB1dCB0byBiZSAiYWN0aXZhdGVkIiAtIGluIHRoZSBjYXNlIG9mIGltYWdlIGFuZCBzdWJt
aXQgaW5wdXRzLCB0aGlzIG1lYW5zCi0gICAgLy8gYWN0dWFsbHkgc3VibWl0dGluZyB0aGUgZm9y
bS4gRm9yIHJlc2V0IGlucHV0cywgdGhlIGZvcm0gaXMgcmVzZXQuIFRoZXNlIGV2ZW50cyBhcmUg
c2VudCB3aGVuIHRoZSB1c2VyIGNsaWNrcwotICAgIC8vIG9uIHRoZSBlbGVtZW50LCBvciBwcmVz
c2VzIGVudGVyIHdoaWxlIGl0IGlzIHRoZSBhY3RpdmUgZWxlbWVudC4gSmF2YWNzcmlwdCBjb2Rl
IHdpc2hpbmcgdG8gYWN0aXZhdGUgdGhlIGVsZW1lbnQKLSAgICAvLyBtdXN0IGRpc3BhdGNoIGEg
RE9NQWN0aXZhdGUgZXZlbnQgLSBhIGNsaWNrIGV2ZW50IHdpbGwgbm90IGRvIHRoZSBqb2IuCi0g
ICAgaWYgKGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQpIHsKLSAgICAgICAgaWYgKG1f
dHlwZSA9PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCkgewot
ICAgICAgICAgICAgaWYgKCFtX2Zvcm0pCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICAgICAgaWYgKG1fdHlwZSA9PSBSRVNFVCkKLSAgICAgICAgICAgICAgICBtX2Zvcm0tPnJlc2V0
KCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKSkgewot
ICAgICAgICAgICAgICAgICAgICB4UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgeVBvcyA9
IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0g
ZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgLy8gVXNlIGtl
eSBwcmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNlIGV2ZW50cwot
ICAgIC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2YgdGhlIGtleSBw
cmVzcyBldmVudC4KLSAgICBpZiAoZXZ0LT50eXBlKCkgPT0ga2V5cHJlc3NFdmVudCAmJiBldnQt
PmlzS2V5Ym9hcmRFdmVudCgpKSB7Ci0gICAgICAgIGJvb2wgY2xpY2tFbGVtZW50ID0gZmFsc2U7
Ci0gICAgICAgIGJvb2wgY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IGZhbHNlOwotCi0gICAgICAg
IERPTVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpLT5r
ZXlJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSAiVSswMDAwMjAiKSB7Ci0gICAg
ICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgot
ICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxF
OgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNF
VDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8g
U2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIHNwYWNlYmFyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVt
ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEFwcEtpdCBhbHJlYWR5IGRvZXMgdGhp
cyBmb3Igc29tZSwgYnV0IG5vdCBhbGwsIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgIGNs
aWNrRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIHVuc2VsZWN0
ZWQgcmFkaW8gaXMgdGFiYmVkIGludG8gKGJlY2F1c2UgdGhlIGVudGlyZSBncm91cCBoYXMgbm90
aGluZwotICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkLCBvciBiZWNhdXNlIG9mIHNvbWUg
ZXhwbGljaXQgLmZvY3VzKCkgY2FsbCksIHRoZW4gYWxsb3cgc3BhY2UgdG8gY2hlY2sgaXQuCi0g
ICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgot
ICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSQU5H
RToKLSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgICAgICBjYXNlIFRF
WFQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKGtleSA9PSAiRW50ZXIiKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1f
dHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAg
ICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAg
ICAgICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1v
dXNlIGNsaWNrIG9uIHRoZSBkZWZhdWx0IGZvcm0gYnV0dG9uIGZvciBlbnRlciBmb3IgdGhlc2Ug
dHlwZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrRGVmYXVsdEZvcm1C
dXR0b24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgICAg
ICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAg
ICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVz
IG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgot
ICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIGVudGVy
IG9uIGEgcmFkaW8gYnV0dG9uLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKG1fdHlwZSA9PSBSQURJTyAmJiAoa2V5ID09ICJVcCIgfHwga2V5ID09ICJEb3duIiB8fCBr
ZXkgPT0gIkxlZnQiIHx8IGtleSA9PSAiUmlnaHQiKSkgewotICAgICAgICAgICAgLy8gTGVmdCBh
bmQgdXAgbWVhbiAicHJldmlvdXMgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFJpZ2h0
IGFuZCBkb3duIG1lYW4gIm5leHQgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFRlc3Rl
ZCBpbiBXaW5JRSwgYW5kIGV2ZW4gZm9yIFJUTCwgbGVmdCBzdGlsbCBtZWFucyBwcmV2aW91cyBy
YWRpbyBidXR0b24gKGFuZCBzbyBtb3ZlcwotICAgICAgICAgICAgLy8gdG8gdGhlIHJpZ2h0KS4g
IFNlZW1zIHN0cmFuZ2UsIGJ1dCB3ZSdsbCBtYXRjaCBpdC4KLSAgICAgICAgICAgIGJvb2wgZm9y
d2FyZCA9IChrZXkgPT0gIkRvd24iIHx8IGtleSA9PSAiUmlnaHQiKTsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgLy8gV2UgY2FuIG9ubHkgc3RheSB3aXRoaW4gdGhlIGZvcm0ncyBjaGlsZHJl
biBpZiB0aGUgZm9ybSBoYXNuJ3QgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiBiZWNhdXNlCi0gICAg
ICAgICAgICAvLyBvZiBtYWxmb3JtZWQgSFRNTC4KLSAgICAgICAgICAgIE5vZGVJbXBsKiBuID0g
dGhpczsKLSAgICAgICAgICAgIHdoaWxlICgobiA9IChmb3J3YXJkID8gbi0+dHJhdmVyc2VOZXh0
Tm9kZSgpIDogbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkpKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gT25jZSB3ZSBlbmNvdW50ZXIgYSBmb3JtIGVsZW1lbnQsIHdlIGtub3cgd2UncmUgdGhyb3Vn
aC4KLSAgICAgICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
IC8vIExvb2sgZm9yIG1vcmUgcmFkaW8gYnV0dG9ucy4KLSAgICAgICAgICAgICAgICBpZiAobi0+
aGFzVGFnTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxl
bWVudEltcGwqIGVsdCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4obik7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChlbHQtPmZvcm0oKSAhPSBtX2Zvcm0pCi0gICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05h
bWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50
SW1wbCogaW5wdXRFbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwot
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWx0LT5pbnB1dFR5cGUoKSA9PSBSQURJ
TyAmJiBpbnB1dEVsdC0+bmFtZSgpID09IG5hbWUoKSAmJgotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlucHV0RWx0LT5pc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW5wdXRFbHQtPnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+c2V0Rm9jdXNOb2RlKGlucHV0RWx0KTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+Y2xpY2soZmFsc2UsIGZhbHNlKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoY2xpY2tFbGVtZW50KSB7Ci0gICAgICAgICAgICBjbGljayhm
YWxzZSk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0g
ZWxzZSBpZiAoY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiAmJiBtX2Zvcm0pIHsKLSAgICAgICAgICAg
IG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudElt
cGw6OmlzRWRpdGFibGUoKQotewotICAgIHJldHVybiAoKG1fdHlwZSA9PSBURVhUKSB8fCAobV90
eXBlID09IFBBU1NXT1JEKSB8fAotICAgICAgICAgICAgKG1fdHlwZSA9PSBTRUFSQ0gpIHx8ICht
X3R5cGUgPT0gSVNJTkRFWCkgfHwgKG1fdHlwZSA9PSBGSUxFKSk7Ci19Ci0KLWJvb2wgSFRNTElu
cHV0RWxlbWVudEltcGw6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIChhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cik7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OnNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6ZGVmYXVsdENoZWNrZWQoKSBjb25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKGNo
ZWNrZWRBdHRyKS5pc051bGwoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0
RGVmYXVsdENoZWNrZWQoYm9vbCBkZWZhdWx0Q2hlY2tlZCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
Y2hlY2tlZEF0dHIsIGRlZmF1bHRDaGVja2VkID8gIiIgOiAwKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjphY2NlcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoYWNjZXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFj
Y2VwdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2NlcHRB
dHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNz
S2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwot
fQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFsaWduKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxl
bWVudEltcGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVu
dEltcGw6OmFsdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbHRBdHRyKTsK
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWx0KGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsdEF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0TWF4TGVuZ3RoKGludCBfbWF4TGVuZ3RoKQotewotICAg
IHNldEF0dHJpYnV0ZShtYXhsZW5ndGhBdHRyLCBRU3RyaW5nOjpudW1iZXIoX21heExlbmd0aCkp
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTaXplKHVuc2lnbmVkIF9zaXpl
KQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9zaXplKSk7
Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3JjKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoZ2V0QXR0cmlidXRlKHNyY0F0dHIp
KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U3JjKGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp1c2VNYXAoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUodXNlbWFwQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OnNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh1c2VtYXBBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExh
YmVsRWxlbWVudEltcGw6OkhUTUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQot
ICAgIDogSFRNTEVsZW1lbnRJbXBsKGxhYmVsVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxMYWJlbEVs
ZW1lbnRJbXBsOjp+SFRNTExhYmVsRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMYWJl
bEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBw
ZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1
c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBz
ZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAg
ICBIVE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1FbGVt
ZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm1FbGVtZW50KCkKLXsKLSAgICBET01T
dHJpbmcgZm9ybUVsZW1lbnRJZCA9IGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLSAgICBpZiAoZm9y
bUVsZW1lbnRJZC5pc051bGwoKSkgewotICAgICAgICAvLyBTZWFyY2ggY2hpbGRyZW4gb2YgdGhl
IGxhYmVsIGVsZW1lbnQgZm9yIGEgZm9ybSBlbGVtZW50LgotICAgICAgICBOb2RlSW1wbCAqbm9k
ZSA9IHRoaXM7Ci0gICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUo
dGhpcykpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAg
ICAgICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVs
ZW1lbnRJbXBsICo+KG5vZGUpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5pc0dlbmVy
aWNGb3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYg
KGZvcm1FbGVtZW50SWQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4g
Z2V0RG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZm9ybUVsZW1lbnRJZCk7Ci19Ci0KLXZvaWQg
SFRNTExhYmVsRWxlbWVudEltcGw6OmZvY3VzKCkKLXsKLSAgICBpZiAoRWxlbWVudEltcGwgKmVs
ZW1lbnQgPSBmb3JtRWxlbWVudCgpKQotICAgICAgICBlbGVtZW50LT5mb2N1cygpOwotfQotCi12
b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlF
bGVtZW50KQotewotICAgIEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKTsKLSAg
ICBpZiAoZWxlbWVudCkKLSAgICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0Fu
eUVsZW1lbnQpOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MTGFiZWxFbGVtZW50SW1w
bDo6Zm9ybSgpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKTsgcCAhPSAw
OyBwID0gcC0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChwLT5oYXNUYWdOYW1lKGZvcm1U
YWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudEltcGwg
Kj4ocCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotCi1ET01TdHJpbmcgSFRNTExh
YmVsRWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0
QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFj
Y2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBs
OjpodG1sRm9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZvckF0dHIpOwot
fQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpzZXRIdG1sRm9yKGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGZvckF0dHIsIHZhbHVlKTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MTGVnZW5kRWxlbWVudEltcGw6OkhUTUxMZWdlbmRFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLTogSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwobGVnZW5kVGFnLCBkb2MsIGYpCi17Ci19Ci0KLUhUTUxM
ZWdlbmRFbGVtZW50SW1wbDo6fkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wg
SFRNTExlZ2VuZEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Y3JlYXRl
UmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAg
cmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckxlZ2VuZCh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxMZWdlbmRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJsZWdlbmQi
OwotfQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQg
SFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01T
dHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1w
bDo6c2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLUVsZW1lbnRJbXBsICpIVE1MTGVnZW5kRWxlbWVudElt
cGw6OmZvcm1FbGVtZW50KCkKLXsKLSAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgZmllbGRzZXQg
YmVsb25naW5nIHRvIHRoaXMgbGVnZW5kLgotICAgIE5vZGVJbXBsICpmaWVsZHNldCA9IHBhcmVu
dE5vZGUoKTsKLSAgICB3aGlsZSAoZmllbGRzZXQgJiYgIWZpZWxkc2V0LT5oYXNUYWdOYW1lKGZp
ZWxkc2V0VGFnKSkKLSAgICAgICAgZmllbGRzZXQgPSBmaWVsZHNldC0+cGFyZW50Tm9kZSgpOwot
ICAgIGlmICghZmllbGRzZXQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gRmluZCBmaXJz
dCBmb3JtIGVsZW1lbnQgaW5zaWRlIHRoZSBmaWVsZHNldC4KLSAgICAvLyBGSVhNRTogU2hvdWxk
IHdlIGNhcmUgYWJvdXQgdGFiaW5kZXg/Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBmaWVsZHNldDsK
LSAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKGZpZWxkc2V0KSkpIHsK
LSAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgSFRNTEVs
ZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUp
OwotICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5oYXNMb2NhbE5hbWUobGVnZW5kVGFnKSAmJiBl
bGVtZW50LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBl
bGVtZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRN
TExlZ2VuZEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVt
ZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9p
ZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVs
ZW1lbnQpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkK
LSAgICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNlbGVj
dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQot
ICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoc2VsZWN0VGFnLCBkb2MsIGYpLCBtX29w
dGlvbnMoMCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRN
TFNlbGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwodGFnTmFtZSwgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgp
OwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5pdCgpCi17Ci0gICAgbV9vcHRp
b25zID0gMDsKLSAgICBtX211bHRpcGxlID0gZmFsc2U7Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMg
PSBmYWxzZTsKLSAgICAvLyAwIG1lYW5zIGludmFsaWQgKGkuZS4gbm90IHNldCkKLSAgICBtX3Np
emUgPSAwOwotICAgIG1fbWlud2lkdGggPSAwOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6
On5IVE1MU2VsZWN0RWxlbWVudEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXRE
b2N1bWVudCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci0gICAgaWYgKG1fb3B0
aW9ucykgewotICAgICAgICBtX29wdGlvbnMtPmRldGFjaCgpOwotICAgICAgICBtX29wdGlvbnMt
PmRlcmVmKCk7Ci0gICAgfQotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hlY2tE
VEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aXNU
ZXh0Tm9kZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgbmV3Q2hpbGQt
Pmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGhyVGFnKSB8
fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi12b2lk
IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsK
LSAgICBpZiAoaGFzQ2hhbmdlZENoaWxkKCkgJiYgbV9yZW5kZXIpIHsKLSAgICAgICAgc3RhdGlj
X2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQo
dHJ1ZSk7Ci0gICAgfQotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0
eWxlKCBjaCApOwotfQotCi0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnR5cGUo
KSBjb25zdAotewotICAgIHJldHVybiAobV9tdWx0aXBsZSA/ICJzZWxlY3QtbXVsdGlwbGUiIDog
InNlbGVjdC1vbmUiKTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2VsZWN0ZWRJ
bmRleCgpIGNvbnN0Ci17Ci0gICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG9w
dGlvbiBzZWxlY3RlZAotICAgIHVpbnQgbyA9IDA7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50
SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7
IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlv
bkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgICAgIHJl
dHVybiBvOwotICAgICAgICAgICAgbysrOwotICAgICAgICB9Ci0gICAgfQotICAgIFFfQVNTRVJU
KG1fbXVsdGlwbGUpOwotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OnNldFNlbGVjdGVkSW5kZXgoIGludCAgaW5kZXggKQotewotICAgIC8vIGRlc2VsZWN0
IGFsbCBvdGhlciBvcHRpb25zIGFuZCBzZWxlY3Qgb25seSB0aGUgbmV3IG9uZQotICAgIFFNZW1B
cnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBsaXN0
SW5kZXg7Ci0gICAgZm9yIChsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBpbnQoaXRlbXMuc2l6
ZSgpKTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVs
ZW1lbnRJbXBsKj4oaXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICB9
Ci0gICAgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoaW5kZXgpOwotICAgIGlmIChsaXN0
SW5kZXggPj0gMCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4o
aXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKHRydWUpOwotCi0gICAgc2V0Q2hhbmdlZCh0
cnVlKTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsK
LSAgICBpbnQgbGVuID0gMDsKLSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50
SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNp
emUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRh
ZykpCi0gICAgICAgICAgICBsZW4rKzsKLSAgICB9Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZCggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBI
VE1MRWxlbWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBSZWZQ
dHI8SFRNTEVsZW1lbnRJbXBsPiBwcm90ZWN0TmV3Q2hpbGQoZWxlbWVudCk7IC8vIG1ha2Ugc3Vy
ZSB0aGUgZWxlbWVudCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0K
LSAgICBpZiAoIWVsZW1lbnQgfHwgIShlbGVtZW50LT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSB8
fCBlbGVtZW50LT5oYXNMb2NhbE5hbWUoaHJUYWcpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
aW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGJlZm9yZSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCFl
eGNlcHRpb25jb2RlKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotdm9pZCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZSggaW50IGluZGV4ICkKLXsKLSAgICBpbnQgZXhj
ZXB0aW9uY29kZSA9IDA7Ci0gICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGlu
ZGV4KTsKLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVt
cygpOwotICAgIGlmKGxpc3RJbmRleCA8IDAgfHwgaW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkp
Ci0gICAgICAgIHJldHVybjsgLy8gIyMjIHdoYXQgc2hvdWxkIHdlIGRvID8gcmVtb3ZlIHRoZSBs
YXN0IGl0ZW0/Ci0KLSAgICBOb2RlSW1wbCAqaXRlbSA9IGl0ZW1zW2xpc3RJbmRleF07Ci0gICAg
aXRlbS0+cmVmKCk7Ci0gICAgcmVtb3ZlQ2hpbGQoaXRlbSwgZXhjZXB0aW9uY29kZSk7Ci0gICAg
aXRlbS0+ZGVyZWYoKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNh
bGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6dmFs
dWUoKQotewotICAgIHVpbnQgaTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKysp
IHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0g
ICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRl
bXNbaV0pLT52YWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gRE9NU3RyaW5nKCIiKTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8g
ZmluZCB0aGUgb3B0aW9uIHdpdGggdmFsdWUoKSBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVy
Ci0gICAgLy8gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgIFFNZW1BcnJh
eTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5o
YXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihpdGVtc1tpXSktPnZhbHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQotUVN0cmluZyBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnN0YXRlKCkKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4g
aXRlbXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKLQotICAg
IFFDaGFyIHN0YXRlQ2hhcnNbbF07Ci0gICAgCi0gICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkr
KykKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpICYmIHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAg
ICAgICAgICAgIHN0YXRlQ2hhcnNbaV0gPSAnWCc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHN0YXRlQ2hhcnNbaV0gPSAnLic7Ci0gICAgUVN0cmluZyBzdGF0ZShzdGF0ZUNoYXJzLCBsKTsK
LQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKSArIHN0YXRl
OwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdM
aXN0ICZfc3RhdGVzKQotewotICAgIFFTdHJpbmcgX3N0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKF9zdGF0ZXMpOwotICAgIGlmIChfc3RhdGUuaXNO
dWxsKCkpIHJldHVybjsKLQotICAgIHJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgUVN0cmluZyBz
dGF0ZSA9IF9zdGF0ZTsKLSAgICBpZighc3RhdGUuaXNFbXB0eSgpICYmICFzdGF0ZS5jb250YWlu
cygnWCcpICYmICFtX211bHRpcGxlKSB7Ci0gICAgICAgIHFXYXJuaW5nKCJzaG91bGQgbm90IGhh
cHBlbiBpbiByZXN0b3JlU3RhdGUhIik7Ci0gICAgICAgIC8vIEtXUVN0cmluZyBkb2Vzbid0IHN1
cHBvcnQgdGhpcyBvcGVyYXRpb24uIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhbnl3YXkuCi0gICAg
ICAgIC8vc3RhdGVbMF0gPSAnWCc7Ci0gICAgfQotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50
SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7
Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotICAgICAgICBpZihpdGVtc1tpXS0+
aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50
SW1wbCogb2UgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7
Ci0gICAgICAgICAgICBvZS0+c2V0U2VsZWN0ZWQoc3RhdGVbaV0gPT0gJ1gnKTsKLSAgICAgICAg
fQotICAgIH0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBs
ICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0
ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdDaGlsZCxyZWZD
aGlsZCwgZXhjZXB0aW9uY29kZSApOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAg
c2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwg
KkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxk
LCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUlt
cGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQobmV3
Q2hpbGQsb2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSAp
Ci0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0K
LU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwg
Km9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQg
PSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2Vw
dGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xp
c3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0
RWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAh
ZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHNldENo
YW5nZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwqIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHNldFJl
Y2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
YWRkQ2hpbGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAo
YXR0ci0+bmFtZSgpID09IHNpemVBdHRyKSB7Ci0gICAgICAgIG1fc2l6ZSA9IGtNYXgoYXR0ci0+
dmFsdWUoKS50b0ludCgpLCAxKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0
aEF0dHIpIHsKLSAgICAgICAgbV9taW53aWR0aCA9IGtNYXgoIGF0dHItPnZhbHVlKCkudG9JbnQo
KSwgMCApOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG11bHRpcGxlQXR0cikgewot
ICAgICAgICBtX211bHRpcGxlID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3Jl
IGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihj
aGFuZ2VFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2JqZWN0
ICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVu
YSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJT
ZWxlY3QodGhpcyk7Ci19Ci0KLWJvb2wgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRGb3Jt
RGF0YShGb3JtRGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIGJvb2wgc3Vj
Y2Vzc2Z1bCA9IGZhbHNlOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9
IGxpc3RJdGVtcygpOwotCi0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5z
aXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25U
YWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGlm
IChvcHRpb24tPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5h
cHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBzdWNj
ZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8v
ICMjIyB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4uIG1ha2Ugc3VyZSB0aGF0IHdlIHNlbGVj
dCB0aGUgZmlyc3Qgb3B0aW9uCi0gICAgLy8gaW4gYW55IGNhc2UuIG90aGVyd2lzZSB3ZSBoYXZl
IG5vIGNvbnNpc3RlbmN5IHdpdGggdGhlIERPTSBpbnRlcmZhY2UuIEZJWE1FIQotICAgIC8vIHdl
IHJldHVybiB0aGUgZmlyc3Qgb25lIGlmIGl0IHdhcyBhIGNvbWJvYm94IHNlbGVjdAotICAgIGlm
ICghc3VjY2Vzc2Z1bCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSAmJiBpdGVtcy5zaXpl
KCkgJiYKLSAgICAgICAgKGl0ZW1zWzBdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkpIHsKLSAg
ICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudEltcGwqPihpdGVtc1swXSk7Ci0gICAgICAgIGlmIChvcHRpb24tPnZhbHVlKCku
aXNOdWxsKCkpCi0gICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwg
b3B0aW9uLT50ZXh0KCkucXN0cmluZygpLnN0cmlwV2hpdGVTcGFjZSgpKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+
dmFsdWUoKSk7Ci0gICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVy
biBzdWNjZXNzZnVsOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25Ub0xp
c3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKG9wdGlvbkluZGV4IDwgMCB8
fCBvcHRpb25JbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSkKLSAgICAgICAgcmV0dXJuIC0xOwot
Ci0gICAgaW50IGxpc3RJbmRleCA9IDA7Ci0gICAgaW50IG9wdGlvbkluZGV4MiA9IDA7Ci0gICAg
Zm9yICg7Ci0gICAgICAgICBvcHRpb25JbmRleDIgPCBpbnQoaXRlbXMuc2l6ZSgpKSAmJiBvcHRp
b25JbmRleDIgPD0gb3B0aW9uSW5kZXg7Ci0gICAgICAgICBsaXN0SW5kZXgrKykgeyAvLyBub3Qg
YSB0eXBvIQotICAgICAgICBpZiAoaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpCi0gICAgICAgICAgICBvcHRpb25JbmRleDIrKzsKLSAgICB9Ci0gICAgbGlzdEluZGV4
LS07Ci0gICAgcmV0dXJuIGxpc3RJbmRleDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6bGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3QKLXsKLSAgICBRTWVtQXJy
YXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZiAobGlzdElu
ZGV4IDwgMCB8fCBsaXN0SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkgfHwKLSAgICAgICAgIWl0
ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICByZXR1cm4g
LTE7Ci0KLSAgICBpbnQgb3B0aW9uSW5kZXggPSAwOyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9u
IG5vdCBjb3VudGluZyBPUFRHUk9VUCBlbnRyaWVzIHRoYXQgbWF5IGJlIGluIGxpc3QKLSAgICBp
bnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdEluZGV4OyBpKyspCi0gICAgICAgIGlmIChp
dGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBvcHRpb25JbmRl
eCsrOwotICAgIHJldHVybiBvcHRpb25JbmRleDsKLX0KLQotLy8gRklYTUUgNDE5Nzk5NzogdGhp
cyBtZXRob2QgaXMgdXNlZCBieSB0aGUgcHVibGljIEFQSSAtW0RPTUhUTUxTZWxlY3RFbGVtZW50
IG9wdGlvbnNdLCBidXQgYWx3YXlzIHJldHVybnMKLS8vIGFuIGVtcHR5IGxpc3QuCi1IVE1MT3B0
aW9uc0NvbGxlY3Rpb25JbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6Om9wdGlvbnMoKQotewot
ICAgIGlmICghbV9vcHRpb25zKSB7Ci0gICAgICAgIG1fb3B0aW9ucyA9IG5ldyBIVE1MT3B0aW9u
c0NvbGxlY3Rpb25JbXBsKHRoaXMpOwotICAgICAgICBtX29wdGlvbnMtPnJlZigpOwotICAgIH0K
LSAgICByZXR1cm4gbV9vcHRpb25zOwotfQotCi0vLyBGSVhNRTogRGVsZXRlIG9uY2UgdGhlIGFi
b3ZlIGZ1bmN0aW9uIGlzIHdvcmtpbmcgd2VsbCBlbm91Z2ggdG8gdXNlIGZvciByZWFsLgotUmVm
UHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zSFRN
TENvbGxlY3Rpb24oKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihu
ZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6U0VMRUNUX09Q
VElPTlMpKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlY2FsY0xpc3RJdGVt
cygpCi17Ci0gICAgTm9kZUltcGwqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7Ci0gICAgbV9saXN0
SXRlbXMucmVzaXplKDApOwotICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCogZm91bmRTZWxlY3Rl
ZCA9IDA7Ci0gICAgd2hpbGUoY3VycmVudCkgewotICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFn
TmFtZShvcHRncm91cFRhZykgJiYgY3VycmVudC0+Zmlyc3RDaGlsZCgpKSB7Ci0gICAgICAgICAg
ICAvLyAjIyMgd2hhdCBpZiBvcHRncm91cCBjb250YWlucyBqdXN0IGNvbW1lbnRzPyBkb24ndCB3
YW50IG9uZSBvZiBubyBvcHRpb25zIGluIGl0Li4uCi0gICAgICAgICAgICBtX2xpc3RJdGVtcy5y
ZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9s
aXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVu
dCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAg
ICB9Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAg
ICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAg
ICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1M
RWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIGlmICghZm91bmRTZWxlY3RlZCAm
JiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSkgewotICAgICAgICAgICAgICAgIGZvdW5kU2Vs
ZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAg
ICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUg
JiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCktPnNlbGVjdGVk
KCkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gZmFsc2U7
Ci0gICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAg
IGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKGhyVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRl
bXMucmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1z
W21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1
cnJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsICpwYXJlbnQgPSBjdXJyZW50LT5w
YXJlbnROb2RlKCk7Ci0gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOwot
ICAgICAgICBpZiAoIWN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gdGhpcykK
LSAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50LT5uZXh0U2libGluZygpOwotICAgICAg
ICB9Ci0gICAgfQotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFJlY2FsY0xp
c3RJdGVtcygpOwotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hh
bmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0UmVjYWxjTGlzdEl0
ZW1zKCkKLXsKLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVy
KQotICAgICAgICBzdGF0aWNfY2FzdDxraHRtbDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5z
ZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50
SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7
IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9w
dGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAg
ICAgICAgICAgIGJvb2wgc2VsZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0QXR0cmlidXRlKHNlbGVjdGVk
QXR0cikuaXNOdWxsKCkpOwotICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZChzZWxlY3Rl
ZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCBtX3JlbmRlciApCi0gICAgICAgIHN0YXRp
Y19jYXN0PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVl
KTsKLSAgICBzZXRDaGFuZ2VkKCB0cnVlICk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjpub3RpZnlPcHRpb25TZWxlY3RlZChIVE1MT3B0aW9uRWxlbWVudEltcGwgKnNlbGVjdGVk
T3B0aW9uLCBib29sIHNlbGVjdGVkKQotewotICAgIGlmIChzZWxlY3RlZCAmJiAhbV9tdWx0aXBs
ZSkgewotICAgICAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucwotICAgICAgICBRTWVt
QXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICAgICAgdWlu
dCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAg
ICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5tX3Nl
bGVjdGVkID0gKGl0ZW1zW2ldID09IHNlbGVjdGVkT3B0aW9uKTsKLSAgICAgICAgfQotICAgIH0K
LSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNlbGVjdCo+KG1f
cmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1
ZSk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVy
KEV2ZW50SW1wbCAqZXZ0KQotewotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5j
ZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9j
a3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2
dC0+dHlwZSgpID09IGtleXByZXNzRXZlbnQpIHsKLSAgICAKLSAgICAgICAgaWYgKCFtX2Zvcm0g
fHwgIW1fcmVuZGVyIHx8ICFldnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAKLSAgICAgICAgRE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtleWJv
YXJkRXZlbnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsKLSAgICAgICAgCi0gICAgICAg
IGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgbV9mb3JtLT5zdWJtaXRDbGljaygp
OwotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAg
fQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2
dCk7Ci19CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSFRNTEtleWdlbkVsZW1lbnRJ
bXBsLmgiCisjaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiZG9t
X3RleHRpbXBsLmgiCisjaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJGcmFtZS5o
IgorI2luY2x1ZGUgIkZvcm1EYXRhTGlzdC5oIgogCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygp
OwotfQorI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KIAotdm9pZCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OnNldE11bHRpcGxlKGJvb2wgbXVsdGlwbGUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG11bHRp
cGxlQXR0ciwgbXVsdGlwbGUgPyAiIiA6IDApOwotfQordXNpbmcgbmFtZXNwYWNlIGtodG1sOwog
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0U2l6ZShpbnQgc2l6ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihzaXplKSk7Ci19CituYW1lc3Bh
Y2UgRE9NIHsKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1l
czsKIAogSFRNTEtleWdlbkVsZW1lbnRJbXBsOjpIVE1MS2V5Z2VuRWxlbWVudEltcGwoRG9jdW1l
bnRJbXBsKiBkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwqIGYpCiAgICAgOiBIVE1MU2VsZWN0RWxl
bWVudEltcGwoa2V5Z2VuVGFnLCBkb2MsIGYpCkBAIC0zMDAzLDU2NiArNzksNCBAQCBib29sIEhU
TUxLZXlnZW5FbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhCiAgICAgcmV0dXJuIHRydWU7CiB9CiAK
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OkhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
KQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0Z3JvdXBUYWcsIGRvYywgZikK
LXsKLX0KLQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6On5IVE1MT3B0R3JvdXBFbGVtZW50SW1w
bCgpCi17Ci19Ci0KLWJvb2wgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3JvdXBF
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJvcHRncm91cCI7Ci19Ci0K
LU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUlt
cGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17
Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNl
cnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICggIWV4
Y2VwdGlvbmNvZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJu
IHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZXBsYWNl
Q2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNl
cHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7
Ci0gICAgaWYoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsK
LSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudElt
cGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9u
Y29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFwcGVuZENoaWxkICgg
Tm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBs
ICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hp
bGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJl
Y2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCog
SFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsK
LSAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBF
bGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0
cikKLXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoYXR0cik7Ci0gICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotfQotCi12b2lkIEhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsOjpyZWNhbGNTZWxlY3RPcHRpb25zKCkKLXsKLSAgICBOb2RlSW1wbCAq
c2VsZWN0ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFz
VGFnTmFtZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUo
KTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVu
dEltcGwqPihzZWxlY3QpLT5zZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxPcHRHcm91cEVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShsYWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpz
ZXRMYWJlbChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsYWJl
bEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0aW9uRWxl
bWVudEltcGw6OkhUTUxPcHRpb25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGlv
blRhZywgZG9jLCBmKQotewotICAgIG1fc2VsZWN0ZWQgPSBmYWxzZTsKLX0KLQotYm9vbCBIVE1M
T3B0aW9uRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAot
ewotICAgIHJldHVybiAib3B0aW9uIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50
SW1wbDo6dGV4dCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHRleHQ7Ci0KLSAgICAvLyBXaW5J
RSBkb2VzIG5vdCB1c2UgdGhlIGxhYmVsIGF0dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdu
b3JlIGl0LgotICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBh
dE1vZGUoKSkgewotICAgICAgICBET01TdHJpbmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0
dHIpOwotICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRl
eHQ7Ci0gICAgfQotCi0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzLT5maXJzdENoaWxkKCk7
Ci0gICAgd2hpbGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVY
VF9OT0RFIHx8IG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFKQotICAg
ICAgICAgICAgdGV4dCArPSBuLT5ub2RlVmFsdWUoKTsKLSAgICAgICAgLy8gc2tpcCBzY3JpcHQg
Y29udGVudAotICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgpICYmIG4tPmhhc1RhZ05hbWUo
SFRNTE5hbWVzOjpzY3JpcHRUYWcpKQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dFNp
YmxpbmcodGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5l
eHROb2RlKHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB0ZXh0OwotfQotCi12b2lkIEhUTUxP
cHRpb25FbGVtZW50SW1wbDo6c2V0VGV4dChjb25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhj
ZXB0aW9uKQotewotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSB3aGVyZSB0
aGVyZSdzIGV4YWN0bHkgMSBjaGlsZCBub2RlLCBhbmQgaXQncyBhIHRleHQgbm9kZS4KLSAgICBO
b2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKGNoaWxkICYmIGNoaWxkLT5p
c1RleHROb2RlKCkgJiYgIWNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIHN0YXRpY19j
YXN0PFRleHRJbXBsICo+KGNoaWxkKS0+c2V0RGF0YSh0ZXh0LCBleGNlcHRpb24pOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGls
ZChuZXcgVGV4dEltcGwoZ2V0RG9jdW1lbnQoKSwgdGV4dCksIGV4Y2VwdGlvbik7Ci19Ci0KLWlu
dCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmluZGV4KCkgY29uc3QKLXsKLSAgICAvLyBMZXQncyBk
byB0aGlzIGR5bmFtaWNhbGx5LiBNaWdodCBiZSBhIGJpdCBzbG93LCBidXQgd2UncmUgc3VyZQot
ICAgIC8vIHdlIHdvbid0IGZvcmdldCB0byB1cGRhdGUgYSBtZW1iZXIgdmFyaWFibGUgaW4gc29t
ZSBjYXNlcy4uLgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0
KCk7Ci0gICAgaWYgKHNlbGVjdCkgewotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBs
Kj4gaXRlbXMgPSBzZWxlY3QtPmxpc3RJdGVtcygpOwotICAgICAgICBpbnQgbCA9IGl0ZW1zLmNv
dW50KCk7Ci0gICAgICAgIGludCBvcHRpb25JbmRleCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9
IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1l
KG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlv
bkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBvcHRpb25JbmRleDsKLSAgICAgICAgICAgICAgICBvcHRpb25JbmRleCsrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxP
cHRpb25FbGVtZW50SW1wbDo6c2V0SW5kZXgoaW50LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAgICBl
eGNlcHRpb24gPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAg
ICAvLyAjIyMKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSBzZWxlY3RlZEF0dHIpCi0gICAgICAgIG1fc2VsZWN0ZWQgPSAoIWF0dHItPmlzTnVsbCgp
KTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKQotICAgICAgICBtX3Zh
bHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxPcHRpb25FbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIGlmICggIW1fdmFsdWUu
aXNOdWxsKCkgKQotICAgICAgICByZXR1cm4gbV92YWx1ZTsKLSAgICAvLyBVc2UgdGhlIHRleHQg
aWYgdGhlIHZhbHVlIHdhc24ndCBzZXQuCi0gICAgcmV0dXJuIHRleHQoKS5xc3RyaW5nKCkuc3Ry
aXBXaGl0ZVNwYWNlKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRWYWx1
ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIs
IHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFNlbGVjdGVkKGJv
b2wgX3NlbGVjdGVkKQotewotICAgIGlmKG1fc2VsZWN0ZWQgPT0gX3NlbGVjdGVkKQotICAgICAg
ICByZXR1cm47Ci0gICAgbV9zZWxlY3RlZCA9IF9zZWxlY3RlZDsKLSAgICBIVE1MU2VsZWN0RWxl
bWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgIGlmIChzZWxlY3QpCi0gICAgICAg
IHNlbGVjdC0+bm90aWZ5T3B0aW9uU2VsZWN0ZWQodGhpcyxfc2VsZWN0ZWQpOwotfQotCi12b2lk
IEhUTUxPcHRpb25FbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICBpZiAoc2VsZWN0KQotICAg
ICAgIHNlbGVjdC0+Y2hpbGRyZW5DaGFuZ2VkKCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1w
bCAqSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpnZXRTZWxlY3QoKSBjb25zdAotewotICAgIE5vZGVJ
bXBsICpzZWxlY3QgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0
LT5oYXNUYWdOYW1lKHNlbGVjdFRhZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50
Tm9kZSgpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihz
ZWxlY3QpOwotfQotCi1ib29sIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6ZGVmYXVsdFNlbGVjdGVk
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVs
bCgpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0RGVmYXVsdFNlbGVjdGVk
KGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyLCBiID8gIiIgOiAwKTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobGFiZWxBdHRyKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9u
RWxlbWVudEltcGw6OnNldExhYmVsKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGxhYmVsQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LUhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpIVE1MVGV4dEFyZWFFbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsKHRleHRhcmVhVGFnLCBkb2MsIGYpLCBtX3ZhbHVlSXNWYWxpZChmYWxzZSks
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIoZmFsc2UpCi17Ci0gICAgLy8gRFREIHJlcXVpcmVzIHJv
d3MgJiBjb2xzIGJlIHNwZWNpZmllZCwgYnV0IHdlIHdpbGwgcHJvdmlkZSByZWFzb25hYmxlIGRl
ZmF1bHRzCi0gICAgbV9yb3dzID0gMjsKLSAgICBtX2NvbHMgPSAyMDsKLSAgICBtX3dyYXAgPSB0
YV9WaXJ0dWFsOwotfQotCi1IVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6fkhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVy
ZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAidGV4dGFyZWEiOwotfQot
Ci1RU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIC8vIE1h
a2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3Rh
dGVzKQotewotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
ZmluZE1hdGNoaW5nU3RhdGUoc3RhdGVzKTsKLSAgICBpZiAoc3RhdGUuaXNOdWxsKCkpIHJldHVy
bjsKLSAgICBzZXREZWZhdWx0VmFsdWUoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSk7Ci0g
ICAgLy8gdGhlIGNsb3NlKCkgaW4gdGhlIHJlbmRlcnRyZWUgd2lsbCB0YWtlIGNhcmUgb2YgdHJh
bnNmZXJyaW5nIGRlZmF1bHR2YWx1ZSB0byAndmFsdWUnCi19Ci0KLWludCBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0
aW9uU3RhcnQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsOjpzZWxlY3Rpb25FbmQoKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uRW5kKCk7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNl
bGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uU3RhcnQo
c3RhcnQpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25F
bmQoaW50IGVuZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJl
bmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZiAobV9yZW5k
ZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4obV9yZW5kZXIpLT5zZWxl
Y3QoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uUmFu
Z2UoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25SYW5nZShz
dGFydCwgZW5kKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6Y2hpbGRyZW5D
aGFuZ2VkKCkKLXsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUoKSk7Ci19Ci0gICAgCi12b2lk
IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcm93c0F0dHIpIHsK
LSAgICAgICAgbV9yb3dzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgp
IDogMzsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5z
ZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGNvbHNBdHRyKSB7Ci0gICAgICAgIG1fY29scyA9ICFhdHRyLT5pc051bGwoKSA/IGF0
dHItPnZhbHVlKCkudG9JbnQoKSA6IDYwOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAg
ICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd3JhcEF0dHIpIHsKLSAgICAgICAgLy8gdmlydHVh
bCAvIHBoeXNpY2FsIGlzIE5ldHNjYXBlIGV4dGVuc2lvbiBvZiBIVE1MIDMuMCwgbm93IGRlcHJl
Y2F0ZWQKLSAgICAgICAgLy8gc29mdC8gaGFyZCAvIG9mZiBpcyByZWNvbW1lbmRhdGlvbiBmb3Ig
SFRNTCA0IGV4dGVuc2lvbiBieSBJRSBhbmQgTlMgNAotICAgICAgICBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoYXR0ci0+dmFsdWUoKSwgInZpcnR1YWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRy
LT52YWx1ZSgpLCAic29mdCIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFfVmlydHVhbDsKLSAg
ICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInBoeXNpY2Fs
IikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImhhcmQiKSkKLSAgICAgICAg
ICAgIG1fd3JhcCA9IHRhX1BoeXNpY2FsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShhdHRyLT52YWx1ZSgpLCAib24iICkpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9QaHlz
aWNhbDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwg
Im9mZiIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFfTm9XcmFwOwotICAgICAgICBpZiAocmVu
ZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4
UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikg
ewotICAgICAgICAvLyBpZ25vcmUgZm9yIHRoZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihm
b2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJB
dHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNl
dEhUTUxFdmVudExpc3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVu
ZXIoY2hhbmdlRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9i
amVjdCAqSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
ICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBS
ZW5kZXJUZXh0QXJlYSh0aGlzKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCkKLXsKLSAgICBpZiAo
bmFtZSgpLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEo
bmFtZSgpLCB2YWx1ZSgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsK
LX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dXBkYXRlVmFsdWUoKQotewotICAg
IGlmICggIW1fdmFsdWVJc1ZhbGlkICkgewotICAgICAgICBpZiAoIG1fcmVuZGVyICkgewotICAg
ICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4oIG1fcmVuZGVy
ICktPnRleHQoKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBkZWZhdWx0
VmFsdWUoKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0g
ZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAgIH0K
LX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp2YWx1ZSgpCi17Ci0gICAg
dXBkYXRlVmFsdWUoKTsKLSAgICByZXR1cm4gbV92YWx1ZS5pc051bGwoKSA/IERPTVN0cmluZygi
IikgOiBtX3ZhbHVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRWYWx1
ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZS5xc3RyaW5n
KCk7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIG1fdmFsdWVJc1Zh
bGlkID0gdHJ1ZTsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVG
cm9tRWxlbWVudCgpOwotICAgIC8vIEZJWE1FOiBGb3JjZSByZWxvYWQgZnJvbSByZW5kZXJlciwg
YXMgcmVuZGVyZXIgbWF5IGhhdmUgbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MuCi0gICAgbV92YWx1
ZUlzVmFsaWQgPSBmYWxzZTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi0KLURPTVN0cmlu
ZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkKLXsKLSAgICBET01TdHJp
bmcgdmFsID0gIiI7Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNvbW1lbnRzIC0ganVzdCBncmFiIHRo
ZSB0ZXh0IG5vZGVzCi0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gZmlyc3RDaGlsZCgp
OyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKG4tPmlzVGV4dE5vZGUoKSkK
LSAgICAgICAgICAgIHZhbCArPSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KG4pLT5kYXRhKCk7Ci0g
ICAgCi0gICAgaWYgKHZhbFswXSA9PSAnXHInICYmIHZhbFsxXSA9PSAnXG4nKSB7Ci0gICAgICAg
IHZhbCA9IHZhbC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwyKTsKLSAgICB9IGVsc2Ug
aWYgKHZhbFswXSA9PSAnXHInIHx8IHZhbFswXSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9IHZh
bC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
dmFsOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUo
Y29uc3QgRE9NU3RyaW5nICZkZWZhdWx0VmFsdWUpCi17Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNv
bW1lbnRzIC0gcmVtb3ZlIGFsbCB0aGUgdGV4dCBub2RlcyBhbmQgcmVwbGFjZSB0aGVtIHdpdGgg
b25lCi0gICAgUVB0ckxpc3Q8Tm9kZUltcGw+IHRvUmVtb3ZlOwotICAgIE5vZGVJbXBsICpuOwot
ICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAg
ICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQobik7
Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxOb2RlSW1wbD4gaXQodG9SZW1vdmUpOwotICAgIGludCBl
eGNlcHRpb25jb2RlID0gMDsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KSB7Ci0gICAg
ICAgIE5vZGVJbXBsICpuID0gaXQuY3VycmVudCgpOwotICAgICAgICBuLT5yZWYoKTsKLSAgICAg
ICAgcmVtb3ZlQ2hpbGQobiwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgIG4tPmRlcmVmKCk7Ci0g
ICAgfQotICAgIGluc2VydEJlZm9yZShnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZShkZWZh
dWx0VmFsdWUpLGZpcnN0Q2hpbGQoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgc2V0VmFsdWUoZGVm
YXVsdFZhbHVlKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6aXNFZGl0YWJs
ZSgpCi17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgZm9jdXMo
KTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBt
X3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0
dGFjaCgpOwotICAgIHVwZGF0ZVZhbHVlKCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OmRldGFjaCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFj
aCgpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5n
IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxl
bWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnNldENvbHMoaW50IGNvbHMpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNB
dHRyLCBRU3RyaW5nOjpudW1iZXIoY29scykpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpzZXRSb3dzKGludCByb3dzKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwg
UVN0cmluZzo6bnVtYmVyKHJvd3MpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1M
SXNJbmRleEVsZW1lbnRJbXBsOjpIVE1MSXNJbmRleEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAq
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTElucHV0RWxlbWVudEltcGwo
aXNpbmRleFRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFRFWFQ7Ci0gICAgbV9uYW1lID0g
ImlzaW5kZXgiOwotfQotCi12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSBwcm9tcHRBdHRyKQotCXNldFZhbHVlKGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UK
LSAgICAgICAgLy8gZG9uJ3QgY2FsbCBIVE1MSW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZSBoZXJlLCBhcyBpdCB3b3VsZAotICAgICAgICAvLyBhY2NlcHQgYXR0cmlidXRlcyB0aGlz
IGVsZW1lbnQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MSXNJ
bmRleEVsZW1lbnRJbXBsOjpwcm9tcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUocHJvbXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6c2V0UHJv
bXB0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHByb21wdEF0
dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11bnNpZ25lZCBIVE1MT3B0
aW9uc0NvbGxlY3Rpb25JbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1w
bGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbnNDb2xsZWN0aW9u
SW1wbDo6c2V0TGVuZ3RoKHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxl
bWVudGVkLgotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6aXRlbSh1
bnNpZ25lZCBpbmRleCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAg
IHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6bmFt
ZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGlt
cGxlbWVudGVkLgotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZv
cm1EYXRhTGlzdDo6Rm9ybURhdGFMaXN0KFFUZXh0Q29kZWMgKmMpCi0gICAgOiBtX2NvZGVjKGMp
Ci17Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJpbmcoY29uc3QgUUNTdHJpbmcg
JnMpCi17Ci0gICAgbV9saXN0LmFwcGVuZChzKTsKLX0KLQotdm9pZCBGb3JtRGF0YUxpc3Q6OmFw
cGVuZFN0cmluZyhjb25zdCBRU3RyaW5nICZzKQotewotICAgIFFDU3RyaW5nIGNzdHIgPSBmaXhM
aW5lQnJlYWtzKG1fY29kZWMtPmZyb21Vbmljb2RlKHMsIHRydWUpKTsKLSAgICBjc3RyLnRydW5j
YXRlKGNzdHIubGVuZ3RoKCkpOwotICAgIG1fbGlzdC5hcHBlbmQoY3N0cik7Ci19Ci0KLXZvaWQg
Rm9ybURhdGFMaXN0OjphcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01T
dHJpbmcgJmZpbGVuYW1lKQotewotICAgIGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsKLSAg
ICBtX2xpc3QuYXBwZW5kKGZpbGVuYW1lLnFzdHJpbmcoKSk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNl
CkluZGV4OiBraHRtbC9odG1sL2h0bWxwYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0
bWwvaHRtbHBhcnNlci5jcHAJKHJldmlzaW9uIDExOTc4KQorKysga2h0bWwvaHRtbC9odG1scGFy
c2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgImh0bWwv
aHRtbF9jYW52YXNpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgog
I2luY2x1ZGUgImh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9m
b3JtaW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9oZWFkaW1wbC5oIgogI2luY2x1ZGUgImh0
bWwvaHRtbF9pbWFnZWltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfaW5saW5laW1wbC5oIgpA
QCAtNDUsNiArNDQsOCBAQAogI2luY2x1ZGUgImh0bWwvaHRtbF9taXNjaW1wbC5oIgogI2luY2x1
ZGUgImh0bWwvaHRtbF90YWJsZWltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfb2JqZWN0aW1w
bC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MSXNJ
bmRleEVsZW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiaHRtbGZhY3RvcnkuaCIKICNpbmNsdWRlICJ4
bWwvZG9tX3RleHRpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgpJbmRleDog
a2h0bWwvaHRtbC9IVE1MRm9ybUVsZW1lbnRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRt
bC9IVE1MRm9ybUVsZW1lbnRJbXBsLmgJKHJldmlzaW9uIDExOTc2KQorKysga2h0bWwvaHRtbC9I
VE1MRm9ybUVsZW1lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBD
b3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAg
ICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAg
ICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAo
QykgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1
LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDQz
ICsyMiwyMiBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZu
ZGVmIEhUTUxfRk9STUlNUExfSAotI2RlZmluZSBIVE1MX0ZPUk1JTVBMX0gKKyNpZm5kZWYgSFRN
TF9IVE1MRm9ybUVsZW1lbnRJbXBsX0gKKyNkZWZpbmUgSFRNTF9IVE1MRm9ybUVsZW1lbnRJbXBs
X0gKIAogI2luY2x1ZGUgImh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWwv
aHRtbF9taXNjaW1wbC5oIgorI2luY2x1ZGUgImh0bWwvaHRtbF9taXNjaW1wbC5oIiAvLyBmb3Ig
Q29sbGVjdGlvbkluZm8KIAogI2luY2x1ZGUgPHFwdHJ2ZWN0b3IuaD4KLSNpbmNsdWRlIDxxbWVt
YXJyYXkuaD4KLSNpbmNsdWRlIDxreG1sY29yZS9IYXNoTWFwLmg+CiAKLWNsYXNzIEtIVE1MVmll
dzsKLWNsYXNzIFFUZXh0Q29kZWM7Ci0KLW5hbWVzcGFjZSBraHRtbAoteworbmFtZXNwYWNlIGto
dG1sIHsKICAgICBjbGFzcyBGb3JtRGF0YTsKLSAgICBjbGFzcyBSZW5kZXJGb3JtRWxlbWVudDsK
LSAgICBjbGFzcyBSZW5kZXJUZXh0QXJlYTsKLSAgICBjbGFzcyBSZW5kZXJTZWxlY3Q7Ci0gICAg
Y2xhc3MgUmVuZGVyTGluZUVkaXQ7Ci0gICAgY2xhc3MgUmVuZGVyRmlsZUJ1dHRvbjsKLSAgICBj
bGFzcyBSZW5kZXJTbGlkZXI7Ci19Cit9OwogCiBuYW1lc3BhY2UgRE9NIHsKIAotY2xhc3MgRE9N
U3RyaW5nOwotY2xhc3MgRm9ybURhdGFMaXN0OwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwogY2xh
c3MgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1w
bDsKIGNsYXNzIEhUTUxJbWFnZUVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTEltYWdlTG9hZGVyOwot
Y2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9u
SW1wbDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBs
IDogcHVibGljIEhUTUxFbGVtZW50SW1wbAogewpAQCAtMTQ5LDY4NSArMTI4LDYgQEAgcHJpdmF0
ZToKICAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7CiB9OwogCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50
SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZyaWVu
ZCBjbGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMg
ZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAg
SFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAgdmly
dHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0Nv
bnRyb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5hYmxl
ZCgpIGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVh
bCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wg
ZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0g
ICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAgICB2
b2lkIG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXREaXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2Fi
bGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0
OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGJv
b2wgcmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBzZXRS
ZWFkT25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUo
IFN0eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmly
dHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAg
LyoKLSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNvZGVk
IG5hbWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJuIHRy
dWUgZm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAgKi8K
LSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkgeyBy
ZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAgICB2
aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRlKFFT
dHJpbmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1p
dEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQWN0
aXZhdGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgoKSBj
b25zdDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJ
bXBsICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVhZE9u
bHk6IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhU
TUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAgIFNV
Qk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBET01T
dHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJP
YmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxlKik7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3Qm
LCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9u
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdmly
dHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAg
RE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERPTVN0
cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51bSAg
bV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAgIG1f
YWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRN
TEZpZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwK
LXsKLXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVsZFNl
dEVsZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25z
dCB7IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBs
KiBuZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAg
ICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRl
ckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5n
IHR5cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElu
cHV0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAg
ICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFzcyBr
aHRtbDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0RWxl
bWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1Ymxp
YzoKLSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVtIHsK
LSAgICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0gICAg
ICAgIENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAgICBS
RVNFVCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwKLSAg
ICAgICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsKLQot
ICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVk
TmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYg
PSAwKTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5p
dCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29u
c3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2Fy
ZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNv
bnN0IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0
cmluZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29u
c3QgeyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0
ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHRC
dXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNF
VCB8fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24o
KSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29sKTsK
LSAgICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5hdGU7
IH0KLSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0aCgp
IGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVy
biBtX3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VHlw
ZShjb25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdmFs
dWVXaXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihj
b25zdCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0
Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAg
dmlydHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NXT1JE
OyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3Rv
cmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigpOwot
Ci0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAg
IHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChp
bnQpOwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGlu
dCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVu
dHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZv
aWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0
cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lk
IGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpOwot
Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklz
TmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJP
YmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAq
KTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZv
cm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vz
c2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRlZFN1
Ym1pdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBm
bGFnKTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsg
fQotICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0gICAg
dmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlwZT1p
bWFnZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBvczsg
fQotICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0dWFs
IHZvaWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0
dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBk
YXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2
dCk7Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBhbHRU
ZXh0KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7IHJl
dHVybiBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBjb25z
dDsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAgCi0g
ICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENoZWNr
ZWQoYm9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRB
Y2NlcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNv
bnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERP
TVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBET01T
dHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAoKSBj
b25zdDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7Ci0K
LSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGlu
dCAgICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAgbV9z
aXplOwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0czsK
LQotICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVtIG1f
dHlwZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0Q2hl
Y2tlZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1f
aW5kZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29sIG1f
YWN0aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBib29s
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsK
LXB1YmxpYzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0g
ICAgdmlydHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgaW50IHRh
Z1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9j
dXNhYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5
QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZm9y
bSBlbGVtZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8KLSAgICBFbGVt
ZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0o
KTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vz
c0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZvcigpIGNvbnN0
OwotICAgIHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIGZv
Y3VzKCk7Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50SUQ7Ci19Owot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdlbmRFbGVtZW50SW1wbCA6IHB1
YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxMZWdl
bmRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9
IDApOwotICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVh
bCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBraHRtbDo6UmVu
ZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVyU3R5
bGUgKik7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAv
KioKLSAgICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRoZSBsZWdlbmQncyBmaWVsZHNl
dCAKLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIERPTVN0
cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01T
dHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFs
aWduKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lkIGZvY3VzKCk7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbCA6IHB1Ymxp
YyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6
UmVuZGVyU2VsZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAq
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgfkhUTUxTZWxlY3RFbGVtZW50
SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHko
KSBjb25zdCB7IHJldHVybiA2OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5v
ZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotCi0gICAg
dmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSApOwotCi0gICAgaW50IHNlbGVj
dGVkSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoIGludCBpbmRleCAp
OwotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotCi0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgaW50IG1pbldpZHRoKCkgY29u
c3QgeyByZXR1cm4gbV9taW53aWR0aDsgfQotCi0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVy
biBtX3NpemU7IH0KLQotICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211bHRp
cGxlOyB9Ci0KLSAgICB2b2lkIGFkZCAoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVs
ZW1lbnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZvaWQgcmVtb3Zl
ICggaW50IGluZGV4ICk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZh
bHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25J
bXBsICpvcHRpb25zKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gb3B0aW9uc0hU
TUxDb2xsZWN0aW9uKCk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBhbmQgbWlncmF0ZSB0byBvcHRp
b25zKCkuCi0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0cnVl
OyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3Rv
cmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJl
Zm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1w
bCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGlu
dCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICgg
Tm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5v
ZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIGtodG1sOjpS
ZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJT
dHlsZSAqKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0Jiwg
Ym9vbCk7Ci0KLSAgICAvLyBnZXQgdGhlIGFjdHVhbCBsaXN0Ym94IGluZGV4IG9mIHRoZSBvcHRp
b25JbmRleHRoIG9wdGlvbgotICAgIGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5k
ZXgpIGNvbnN0OwotICAgIC8vIHJldmVyc2Ugb2Ygb3B0aW9uVG9MaXN0SW5kZXggLSBnZXQgb3B0
aW9uSW5kZXggZnJvbSBsaXN0Ym94SW5kZXgKLSAgICBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoaW50
IGxpc3RJbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFJlY2FsY0xpc3RJdGVtcygpOwotCi0g
ICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGxpc3RJdGVtcygpIGNvbnN0Ci0gICAgIHsK
LSAgICAgICAgIGlmIChtX3JlY2FsY0xpc3RJdGVtcykgY29uc3RfY2FzdDxIVE1MU2VsZWN0RWxl
bWVudEltcGwqPih0aGlzKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgICByZXR1cm4gbV9s
aXN0SXRlbXM7Ci0gICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIG5v
dGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24s
IGJvb2wgc2VsZWN0ZWQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIo
RXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBz
ZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIHZvaWQgc2V0TXVsdGlwbGUoYm9vbCk7Ci0KLSAgICB2
b2lkIHNldFNpemUoaW50KTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlY2FsY0xpc3RJdGVtcygp
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgbXV0YWJsZSBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4g
bV9saXN0SXRlbXM7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqbV9vcHRpb25zOwot
ICAgIHNob3J0IG1fbWlud2lkdGg7Ci0gICAgc2hvcnQgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0
aXBsZTsKLSAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBIVE1MS2V5Z2VuRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIGlu
dCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIERPTVN0cmluZyB0eXBl
KCkgY29uc3Q7Ci0KLSAgICAvLyAjIyMgdGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MKLSAgICB2
aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0g
ICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwg
KmF0dHIpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBi
b29sKTsKLXByb3RlY3RlZDoKLSAgICBBdG9taWNTdHJpbmcgbV9jaGFsbGVuZ2U7Ci0gICAgQXRv
bWljU3RyaW5nIG1fa2V5VHlwZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
SFRNTE9wdEdyb3VwRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9k
ZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6
Om9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpoclRhZyk7IH0K
LQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRCZWZvcmUg
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5l
d0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZp
cnR1YWwgTm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAoIE5vZGVJ
bXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1w
bCAqYWRkQ2hpbGQoIE5vZGVJbXBsKiBuZXdDaGlsZCApOwotICAgIHZpcnR1YWwgdm9pZCBwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2b2lkIHJl
Y2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIERPTVN0cmluZyBsYWJlbCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICYpOwotfTsKLQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTZWxl
Y3Q7Ci0gICAgZnJpZW5kIGNsYXNzIERPTTo6SFRNTFNlbGVjdEVsZW1lbnRJbXBsOwotCi1wdWJs
aWM6Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFn
UmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMjsgfQotICAgIHZpcnR1YWwg
Ym9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxk
LT5pc1RleHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3JpcHRU
YWcpOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLQotICAgIERP
TVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgdGV4dCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0VGV4dChjb25zdCBET01TdHJpbmcgJiwgaW50ICZleGNlcHRpb24pOwotCi0gICAg
aW50IGluZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRJbmRleChpbnQsIGludCAmZXhjZXB0aW9u
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNl
dFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIGJvb2wgc2VsZWN0ZWQoKSBjb25zdCB7
IHJldHVybiBtX3NlbGVjdGVkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3RlZChib29sIF9zZWxlY3Rl
ZCk7Ci0KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKmdldFNlbGVjdCgpIGNvbnN0OwotCi0g
ICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgYm9vbCBkZWZhdWx0U2Vs
ZWN0ZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRTZWxlY3RlZCggYm9vbCApOwotCi0g
ICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbCggY29uc3QgRE9N
U3RyaW5nICYgKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGJv
b2wgbV9zZWxlY3RlZDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAot
ewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4dEFyZWE7Ci0KLXB1YmxpYzoKLSAg
ICBlbnVtIFdyYXBNZXRob2QgewotICAgICAgICB0YV9Ob1dyYXAsCi0gICAgICAgIHRhX1ZpcnR1
YWwsCi0gICAgICAgIHRhX1BoeXNpY2FsCi0gICAgfTsKLQotICAgIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0g
ICAgfkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tE
VEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+aXNUZXh0Tm9k
ZSgpOyB9Ci0KLSAgICBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQotICAgIGlu
dCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICBXcmFwTWV0aG9kIHdyYXAo
KSBjb25zdCB7IHJldHVybiBtX3dyYXA7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0
YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29u
c3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0cnVlOyB9
Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVT
dGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGlu
dCBzZWxlY3Rpb25FbmQoKTsKLQotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAg
ICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3QgKCAgKTsKLSAg
ICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLQotICAgIHZpcnR1YWwgdm9pZCBj
aGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBraHRtbDo6UmVuZGVyT2Jq
ZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVyU3R5bGUgKik7
Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsK
LSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCk7Ci0g
ICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0gICAgRE9NU3RyaW5nIHZhbHVlKCk7Ci0gICAgdm9p
ZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLSAgICBET01TdHJpbmcgZGVmYXVs
dFZhbHVlKCk7Ci0gICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSk7Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsgbV92YWx1ZUlzVmFsaWQgPSBmYWxz
ZTsgfQotICAgIHZvaWQgdXBkYXRlVmFsdWUoKTsKLQotICAgIGJvb2wgdmFsdWVNYXRjaGVzUmVu
ZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOyB9Ci0gICAgdm9p
ZCBzZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpIHsgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRy
dWU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0gICAgCi0gICAgdmlydHVh
bCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotICAgIAotICAg
IERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25z
dCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldENvbHMoaW50KTsKLQotICAgIHZvaWQgc2V0
Um93cyhpbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1fcm93czsKLSAgICBpbnQgbV9jb2xz
OwotICAgIFdyYXBNZXRob2QgbV93cmFwOwotICAgIFFTdHJpbmcgbV92YWx1ZTsKLSAgICBib29s
IG1fdmFsdWVJc1ZhbGlkOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5kZXJlcjsKLX07Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElzSW5kZXhFbGVtZW50SW1wbCA6IHB1
YmxpYyBIVE1MSW5wdXRFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxJc0luZGV4RWxl
bWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsK
LQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsg
cmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5
KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgRE9NU3RyaW5nIHByb21w
dCgpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJvbXB0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotcHJv
dGVjdGVkOgotICAgIERPTVN0cmluZyBtX3Byb21wdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCA6IHB1YmxpYyBraHRtbDo6U2hh
cmVkPEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw+Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTE9wdGlv
bnNDb2xsZWN0aW9uSW1wbChIVE1MU2VsZWN0RWxlbWVudEltcGwgKmltcGwpIDogbV9zZWxlY3Qo
aW1wbCkgeyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAgICB2b2lkIHNldExl
bmd0aCh1bnNpZ25lZCk7Ci0gICAgTm9kZUltcGwgKml0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0
OwotICAgIE5vZGVJbXBsICpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBjb25zdDsK
LQotICAgIHZvaWQgZGV0YWNoKCkgeyBtX3NlbGVjdCA9IDA7IH0KLQotcHJpdmF0ZToKLSAgICBI
VE1MU2VsZWN0RWxlbWVudEltcGwgKm1fc2VsZWN0OwotfTsKLQogfSAvL25hbWVzcGFjZQogCiAj
ZW5kaWYKSW5kZXg6IGtodG1sL2h0bWwvRm9ybURhdGFMaXN0LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC9odG1sL0Zvcm1EYXRhTGlzdC5jcHAJKHJldmlzaW9uIDExOTc2KQorKysga2h0bWwvaHRt
bC9Gb3JtRGF0YUxpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBAQAogICogQ29w
eXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAg
KEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAgKiAgICAgICAgICAg
KEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDQsIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwg
MjAwNSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgogICogICAgICAgICAgIChDKSAyMDA2IEFs
ZXhleSBQcm9za3VyeWFrb3YgKGFwQG55cG9wLmNvbSkKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNCwyMjYg
KzI0LDIwIEBACiAgKgogICovCiAKLSN1bmRlZiBGT1JNU19ERUJVRwotLy8jZGVmaW5lIEZPUk1T
X0RFQlVHCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZm9ybWlt
cGwuaCIKLQotI2luY2x1ZGUgImtodG1sdmlldy5oIgotI2luY2x1ZGUgIk1hY0ZyYW1lLmgiCi0j
aW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWxfaW1hZ2Vp
bXBsLmgiCi0jaW5jbHVkZSAia2h0bWxfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJtaXNjL2Zvcm1k
YXRhLmgiCi0KLSNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgotI2luY2x1ZGUgImNzcy9j
c3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiY3NzcHJvcGVydGllcy5oIgotI2luY2x1ZGUg
ImNzc2hlbHBlci5oIgotI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKLSNpbmNsdWRlICJ4
bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAieG1sL0V2ZW50TmFtZXMuaCIKLSNpbmNs
dWRlICJraHRtbF9leHQuaCIKLQotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5oIgot
I2luY2x1ZGUgInJlbmRlcl9idXR0b24uaCIKLSNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIKLQot
I2luY2x1ZGUgPGtsb2NhbGUuaD4KLSNpbmNsdWRlIDxxZmlsZS5oPgorI2luY2x1ZGUgIkZvcm1E
YXRhTGlzdC5oIgogI2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KIAotLy8gZm9yIGtleWdlbgotI2lu
Y2x1ZGUgPHFzdHJpbmcuaD4KLSNpbmNsdWRlIDxrc3Nsa2V5Z2VuLmg+Ci0KLSNpbmNsdWRlIDxh
c3NlcnQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGtodG1sOwotCiBuYW1lc3BhY2UgRE9NIHsKIAot
dXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwot
Ci1zdHJ1Y3QgRm9ybURhdGFMaXN0SXRlbSB7Ci0gICAgRm9ybURhdGFMaXN0SXRlbShjb25zdCBR
Q1N0cmluZyAmZGF0YSkgOiBtX2RhdGEoZGF0YSkgeyB9Ci0gICAgRm9ybURhdGFMaXN0SXRlbShj
b25zdCBRU3RyaW5nICZwYXRoKSA6IG1fcGF0aChwYXRoKSB7IH0KLQotICAgIFFTdHJpbmcgbV9w
YXRoOwotICAgIFFDU3RyaW5nIG1fZGF0YTsKLX07Ci0KLWNsYXNzIEZvcm1EYXRhTGlzdCB7Ci1w
dWJsaWM6Ci0gICAgRm9ybURhdGFMaXN0KFFUZXh0Q29kZWMgKik7Ci0KLSAgICB2b2lkIGFwcGVu
ZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi0gICAg
ICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFsdWUucXN0
cmluZygpKTsgfQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgY29u
c3QgUVN0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkp
OyBhcHBlbmRTdHJpbmcodmFsdWUpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0
cmluZyAma2V5LCBjb25zdCBRQ1N0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5n
KGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFsdWUpOyB9Ci0gICAgdm9pZCBhcHBlbmRE
YXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBpbnQgdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3Ry
aW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcoUVN0cmluZzo6bnVtYmVyKHZhbHVlKSk7
IH0KLSAgICB2b2lkIGFwcGVuZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0
cmluZyAmZmlsZW5hbWUpOwotCi0gICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFM
aXN0SXRlbT4gYmVnaW4oKSBjb25zdAotICAgICAgICB7IHJldHVybiBtX2xpc3QuYmVnaW4oKTsg
fQotICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+IGVuZCgpIGNv
bnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5lbmQoKTsgfQotCi1wcml2YXRlOgotICAgIHZv
aWQgYXBwZW5kU3RyaW5nKGNvbnN0IFFDU3RyaW5nICZzKTsKLSAgICB2b2lkIGFwcGVuZFN0cmlu
Zyhjb25zdCBRU3RyaW5nICZzKTsKLQotICAgIFFUZXh0Q29kZWMgKm1fY29kZWM7Ci0gICAgUVZh
bHVlTGlzdDxGb3JtRGF0YUxpc3RJdGVtPiBtX2xpc3Q7Ci19OwotCi1IVE1MRm9ybUVsZW1lbnRJ
bXBsOjpIVE1MRm9ybUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAgIDogSFRNTEVs
ZW1lbnRJbXBsKGZvcm1UYWcsIGRvYykKLXsKLSAgICBjb2xsZWN0aW9uSW5mbyA9IDA7Ci0gICAg
bV9wb3N0ID0gZmFsc2U7Ci0gICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICBtX2F1dG9jb21w
bGV0ZSA9IHRydWU7Ci0gICAgbV9pbnN1Ym1pdCA9IGZhbHNlOwotICAgIG1fZG9pbmdzdWJtaXQg
PSBmYWxzZTsKLSAgICBtX2lucmVzZXQgPSBmYWxzZTsKLSAgICBtX2VuY3R5cGUgPSAiYXBwbGlj
YXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgICBtX2JvdW5kYXJ5ID0gIi0tLS0tLS0t
LS0weEtoVG1MYk91TmRBclkiOwotICAgIG1fYWNjZXB0Y2hhcnNldCA9ICJVTktOT1dOIjsKLSAg
ICBtX21hbGZvcm1lZCA9IGZhbHNlOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEZv
cm1FbGVtZW50SW1wbCgpCi17Ci0gICAgZGVsZXRlIGNvbGxlY3Rpb25JbmZvOwotICAgIAotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotICAg
ICAgICBmb3JtRWxlbWVudHNbaV0tPm1fZm9ybSA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGltZ0VsZW1lbnRzLmNvdW50KCk7ICsraSkKLSAgICAgICAgaW1nRWxlbWVudHNbaV0t
Pm1fZm9ybSA9IDA7Ci19Ci0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtV291bGRI
YXZlU2VjdXJlU3VibWlzc2lvbihjb25zdCBET01TdHJpbmcgJnVybCkKLXsKLSAgICBpZiAodXJs
LmlzTnVsbCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGdl
dERvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpLnN0YXJ0c1dpdGgoImh0dHBz
OiIsIGZhbHNlKTsKLX0KLQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCi17
Ci0gICAgSFRNTEVsZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIC8vIG5vdGUgd2UgZG9uJ3Qg
ZGVhbCB3aXRoIGNhbGxpbmcgc2VjdXJlRm9ybVJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2Ug
dGhlIHRpbWluZwotICAgIC8vIHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9v
IGVhcmx5Ci0gICAgaWYgKGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKSkKLSAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1
bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQg
PSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3Vt
ZW50LT5hZGROYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLQotICAgIEhUTUxFbGVtZW50
SW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNI
VE1MRG9jdW1lbnQoKSkgewotCUhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nh
c3Q8SFRNTERvY3VtZW50SW1wbCAqPihnZXREb2N1bWVudCgpKTsKLQlkb2N1bWVudC0+cmVtb3Zl
TmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6
OnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLX0KLQotaW50IEhUTUxGb3JtRWxlbWVudEltcGw6Omxl
bmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0JaWYgKGZvcm1FbGVtZW50c1tpXS0+
aXNFbnVtZXJhdGFibGUoKSkKLQkgICAgKytsZW47Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi0K
LXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c3VibWl0Q2xpY2soKQorRm9ybURhdGFMaXN0OjpG
b3JtRGF0YUxpc3QoUVRleHRDb2RlYyAqYykKKyAgICA6IG1fY29kZWMoYykKIHsKLSAgICBib29s
IHN1Ym1pdEZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1F
bGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgaWYgKGZvcm1FbGVtZW50c1tpXS0+aGFz
TG9jYWxOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwg
KmVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihmb3JtRWxlbWVu
dHNbaV0pOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRv
bigpICYmIGVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgICAgICAgICBzdWJtaXRGb3Vu
ZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC0+Y2xpY2soZmFsc2UpOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlm
ICghc3VibWl0Rm91bmQpIC8vIHN1Ym1pdCB0aGUgZm9ybSB3aXRob3V0IGEgc3VibWl0IG9yIGlt
YWdlIGlucHV0Ci0gICAgICAgIHByZXBhcmVTdWJtaXQoKTsKIH0KIAotCi1zdGF0aWMgUUNTdHJp
bmcgZW5jb2RlQ1N0cmluZyhjb25zdCBRQ1N0cmluZyYgZSkKK3ZvaWQgRm9ybURhdGFMaXN0Ojph
cHBlbmRTdHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpCiB7Ci0gICAgLy8gaHR0cDovL3d3dy53My5v
cmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQotICAgIC8vIHNhZmUg
Y2hhcmFjdGVycyBsaWtlIE5TIGhhbmRsZXMgdGhlbSBmb3IgY29tcGF0aWJpbGl0eQotICAgIHN0
YXRpYyBjb25zdCBjaGFyICpzYWZlID0gIi0uXyoiOwotICAgIGludCBlbGVuID0gZS5sZW5ndGgo
KTsKLSAgICBRQ1N0cmluZyBlbmNvZGVkKCggZWxlbitlLmNvbnRhaW5zKCAnXG4nICkgKSozKzEp
OwotICAgIGludCBlbmNsZW4gPSAwOwotCi0gICAgLy9RQ1N0cmluZyBvcmlnKGUuZGF0YSgpLCBl
LnNpemUoKSk7Ci0KLSAgICBmb3IoaW50IHBvcyA9IDA7IHBvcyA8IGVsZW47IHBvcysrKSB7Ci0g
ICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IGVbcG9zXTsKLQotICAgICAgICBpZiAoICgoIGMgPj0g
J0EnKSAmJiAoIGMgPD0gJ1onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49ICdhJykgJiYgKCBj
IDw9ICd6JykpIHx8Ci0gICAgICAgICAgICAgKCggYyA+PSAnMCcpICYmICggYyA8PSAnOScpKSB8
fAotICAgICAgICAgICAgIChzdHJjaHIoc2FmZSwgYykpCi0gICAgICAgICAgICApCi0gICAgICAg
ICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGM7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICcgJyAp
Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcrJzsKLSAgICAgICAgZWxzZSBpZiAo
IGMgPT0gJ1xuJyB8fCAoIGMgPT0gJ1xyJyAmJiBlW3BvcysxXSAhPSAnXG4nICkgKQotICAgICAg
ICB7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVu
Y29kZWRbZW5jbGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAn
RCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVu
Y29kZWRbZW5jbGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAn
QSc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGMgIT0gJ1xyJyApCi0gICAgICAgIHsK
LSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAgdW5zaWdu
ZWQgaW50IGggPSBjIC8gMTY7Ci0gICAgICAgICAgICBoICs9IChoID4gOSkgPyAoJ0EnIC0gMTAp
IDogJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBoOwotCi0gICAgICAgICAg
ICB1bnNpZ25lZCBpbnQgbCA9IGMgJSAxNjsKLSAgICAgICAgICAgIGwgKz0gKGwgPiA5KSA/ICgn
QScgLSAxMCkgOiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGw7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnXDAnOwotICAgIGVuY29kZWQu
dHJ1bmNhdGUoZW5jbGVuKTsKLQotICAgIHJldHVybiBlbmNvZGVkOworICAgIG1fbGlzdC5hcHBl
bmQocyk7CiB9CiAKIC8vIENoYW5nZSBwbGFpbiBDUiBhbmQgcGxhaW4gTEYgdG8gQ1JMRiBwYWly
cy4KQEAgLTI5NSwzMjYzICs4OSw2IEBAIHN0YXRpYyBRQ1N0cmluZyBmaXhMaW5lQnJlYWtzKGNv
bnN0IFFDU3QKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0KLWJvb2wgSFRNTEZvcm1FbGVtZW50
SW1wbDo6Zm9ybURhdGEoRm9ybURhdGEgJmZvcm1fZGF0YSkgY29uc3QKLXsKLSAgICBRQ1N0cmlu
ZyBlbmNfc3RyaW5nID0gIiI7IC8vIHVzZWQgZm9yIG5vbi1tdWx0aXBhcnQgZGF0YQotCi0gICAg
Ly8gZmluZCBvdXQgdGhlIFFUZXh0Y29kZWMgdG8gdXNlCi0gICAgUVN0cmluZyBzdHIgPSBtX2Fj
Y2VwdGNoYXJzZXQucXN0cmluZygpOwotICAgIHN0ci5yZXBsYWNlKCcsJywgJyAnKTsKLSAgICBR
U3RyaW5nTGlzdCBjaGFyc2V0cyA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnICcsIHN0cik7Ci0gICAg
UVRleHRDb2RlYyogY29kZWMgPSAwOwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCkt
PmZyYW1lKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBjaGFyc2V0cy5i
ZWdpbigpOyBpdCAhPSBjaGFyc2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5nIGVu
YyA9ICgqaXQpOwotICAgICAgICBpZiAoZW5jLmNvbnRhaW5zKCJVTktOT1dOIikpIHsKLSAgICAg
ICAgICAgIC8vIHVzZSBzdGFuZGFyZCBkb2N1bWVudCBlbmNvZGluZwotICAgICAgICAgICAgZW5j
ID0gIklTTy04ODU5LTEiOwotICAgICAgICAgICAgaWYgKGZyYW1lKQotICAgICAgICAgICAgICAg
IGVuYyA9IGZyYW1lLT5lbmNvZGluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY29kZWMg
PSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoZW5jLmxhdGluMSgpKSkpCi0gICAgICAgICAgICBi
cmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIWNvZGVjKQotICAgICAgICBjb2RlYyA9IFFUZXh0Q29k
ZWM6OmNvZGVjRm9yTG9jYWxlKCk7Ci0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBm
b3JtRWxlbWVudHMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKiBjdXJyZW50ID0gZm9ybUVsZW1lbnRzW2ldOwotICAgICAgICBGb3JtRGF0YUxpc3Qg
bHN0KGNvZGVjKTsKLQotICAgICAgICBpZiAoIWN1cnJlbnQtPmRpc2FibGVkKCkgJiYgY3VycmVu
dC0+YXBwZW5kRm9ybURhdGEobHN0LCBtX211bHRpcGFydCkpIHsKLSAgICAgICAgICAgIGZvciAo
UVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gaXQgPSBsc3QuYmVnaW4o
KTsgaXQgIT0gbHN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX211bHRp
cGFydCkgewotICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgSVNJTkRFWCAvIDxpbnB1dCBu
YW1lPWlzaW5kZXg+IHNwZWNpYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYg
aXRzIHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgICAgICAgICBpZiAoIGVuY19zdHJpbmcu
aXNFbXB0eSgpICYmICgqaXQpLm1fZGF0YSA9PSAiaXNpbmRleCIgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICArK2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBl
bmNvZGVDU3RyaW5nKCAoKml0KS5tX2RhdGEgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbmNf
c3RyaW5nLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5n
ICs9ICcmJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVD
U3RyaW5nKCgqaXQpLm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5n
ICs9ICI9IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRQ1N0cmluZyBoc3RyKCIt
LSIpOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1fYm91bmRhcnkucXN0cmluZygpLmxh
dGluMSgpOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuIjsKLSAgICAgICAgICAg
ICAgICAgICAgaHN0ciArPSAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwi
IjsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAoKml0KS5tX2RhdGEuZGF0YSgpOwotICAg
ICAgICAgICAgICAgICAgICBoc3RyICs9ICJcIiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8g
aWYgdGhlIGN1cnJlbnQgdHlwZSBpcyBGSUxFLCB0aGVuIHdlIGFsc28gbmVlZCB0bwotICAgICAg
ICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBmaWxlbmFtZQotICAgICAgICAgICAgICAgICAg
ICBpZiAoY3VycmVudC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSAmJgotICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+aW5w
dXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OkZJTEUpCi0gICAgICAgICAgICAgICAg
ICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgcGF0aCA9IHN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCktPnZhbHVlKCkucXN0cmluZygpOwotCi0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGlmIHRoZSBm
aWxlbmFtZSBpbmNsdWRlcyBhICIgbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9y
IGNvbnRyb2wgY2hhcmFjdGVycyBsaWtlIENSIG9yIExGLiBUaGlzIGFsc28gZG9lcyBzdHJhbmdl
Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluZ3MgaWYgdGhlIGZpbGVuYW1lIGluY2x1
ZGVzIGNoYXJhY3RlcnMgeW91IGNhbid0IGVuY29kZQotICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gaW4gdGhlIHdlYnNpdGUncyBjaGFyYWN0ZXIgc2V0LgotICAgICAgICAgICAgICAgICAgICAg
ICAgaHN0ciArPSAiOyBmaWxlbmFtZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoc3Ry
ICs9IGNvZGVjLT5mcm9tVW5pY29kZShwYXRoLm1pZChwYXRoLmZpbmRSZXYoJy8nKSArIDEpLCB0
cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYoIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3Vy
cmVudCktPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgbWltZVR5cGUgPSBmcmFtZSA/IE1hYyhm
cmFtZSktPm1pbWVUeXBlRm9yRmlsZU5hbWUocGF0aCkgOiBRU3RyaW5nKCk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCFtaW1lVHlwZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXHJcbkNvbnRlbnQtVHlwZTogIjsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSBtaW1lVHlwZS5hc2NpaSgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG5c
clxuIjsKLSAgICAgICAgICAgICAgICAgICAgKytpdDsKLQotICAgICAgICAgICAgICAgICAgICAv
LyBhcHBlbmQgYm9keQotICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YSho
c3RyLmRhdGEoKSwgaHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZv
cm1EYXRhTGlzdEl0ZW0gJml0ZW0gPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBk
YXRhU2l6ZSA9IGl0ZW0ubV9kYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRh
dGFTaXplICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0
YShpdGVtLm1fZGF0YSwgZGF0YVNpemUgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBp
ZiAoIWl0ZW0ubV9wYXRoLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1f
ZGF0YS5hcHBlbmRGaWxlKGl0ZW0ubV9wYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9ybV9k
YXRhLmFwcGVuZERhdGEoIlxyXG4iLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmIChtX211bHRpcGFydCkKLSAgICAgICAg
ZW5jX3N0cmluZyA9ICgiLS0iICsgbV9ib3VuZGFyeS5xc3RyaW5nKCkgKyAiLS1cclxuIikuYXNj
aWkoKTsKLQotICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGVuY19zdHJpbmcuZGF0YSgpLCBlbmNf
c3RyaW5nLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5nJiB0eXBlKQotewotICAgIGlm
KHR5cGUuY29udGFpbnMoIm11bHRpcGFydCIsIGZhbHNlKSB8fCB0eXBlLmNvbnRhaW5zKCJmb3Jt
LWRhdGEiLCBmYWxzZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gIm11bHRpcGFydC9mb3JtLWRh
dGEiOwotICAgICAgICBtX211bHRpcGFydCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh0eXBlLmNv
bnRhaW5zKCJ0ZXh0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFpbnMoInBsYWluIiwgZmFsc2UpKSB7
Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJ0ZXh0L3BsYWluIjsKLSAgICAgICAgbV9tdWx0aXBhcnQg
PSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRpb24v
eC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAg
ICB9Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0Qm91bmRhcnkoIGNvbnN0IERP
TVN0cmluZyYgYm91bmQgKQotewotICAgIG1fYm91bmRhcnkgPSBib3VuZDsKLX0KLQotYm9vbCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjpwcmVwYXJlU3VibWl0KCkKLXsKLSAgICBGcmFtZSAqZnJhbWUg
PSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmKG1faW5zdWJtaXQgfHwgIWZyYW1lIHx8
IGZyYW1lLT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkpCi0gICAgICAgIHJldHVybiBtX2luc3VibWl0
OwotCi0gICAgbV9pbnN1Ym1pdCA9IHRydWU7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwot
Ci0gICAgaWYgKCBkaXNwYXRjaEhUTUxFdmVudChzdWJtaXRFdmVudCxmYWxzZSx0cnVlKSAmJiAh
bV9kb2luZ3N1Ym1pdCApCi0gICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotCi0gICAgbV9p
bnN1Ym1pdCA9IGZhbHNlOwotCi0gICAgaWYgKCBtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgc3Vi
bWl0KHRydWUpOwotCi0gICAgcmV0dXJuIG1fZG9pbmdzdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6c3VibWl0KCBib29sIGFjdGl2YXRlU3VibWl0QnV0dG9uICkKLXsKLSAg
ICBLSFRNTFZpZXcgKnZpZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgRnJhbWUgKmZy
YW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWZyYW1lKSB7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIG1faW5zdWJtaXQgKSB7Ci0gICAg
ICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
bV9pbnN1Ym1pdCA9IHRydWU7Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogZmly
c3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gMDsKLSAgICBib29sIG5lZWRCdXR0b25BY3RpdmF0
aW9uID0gYWN0aXZhdGVTdWJtaXRCdXR0b247CS8vIGRvIHdlIG5lZWQgdG8gYWN0aXZhdGUgYSBz
dWJtaXQgYnV0dG9uPwotICAgIAotICAgIE1hYyhmcmFtZSktPmNsZWFyUmVjb3JkZWRGb3JtVmFs
dWVzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgp
OyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBm
b3JtRWxlbWVudHNbaV07Ci0gICAgICAgIC8vIE91ciBhcHAgbmVlZHMgdG8gZ2V0IGZvcm0gdmFs
dWVzIGZvciBwYXNzd29yZCBmaWVsZHMgZm9yIGRvaW5nIHBhc3N3b3JkIGF1dG9jb21wbGV0ZSwK
LSAgICAgICAgLy8gc28gd2UgYXJlIG1vcmUgbGVuaWVudCBpbiBwdXNoaW5nIHZhbHVlcywgYW5k
IGxldCB0aGUgYXBwIGRlY2lkZSB3aGF0IHRvIHNhdmUgd2hlbi4KLSAgICAgICAgaWYgKGN1cnJl
bnQtPmhhc0xvY2FsTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1l
bnRJbXBsICppbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVu
dCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpURVhUCi0gICAgICAgICAgICAgICAgfHwgaW5wdXQtPmlucHV0VHlwZSgpID09ICBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6UEFTU1dPUkQKLSAgICAgICAgICAgICAgICB8fCBpbnB1dC0+
aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAgICAgICAgICAg
IHsKLSAgICAgICAgICAgICAgICBNYWMoZnJhbWUpLT5yZWNvcmRGb3JtVmFsdWUoaW5wdXQtPm5h
bWUoKS5xc3RyaW5nKCksIGlucHV0LT52YWx1ZSgpLnFzdHJpbmcoKSwgdGhpcyk7Ci0gICAgICAg
ICAgICAgICAgaWYgKGlucHV0LT5yZW5kZXJlcigpICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9PSBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxSZW5kZXJMaW5lRWRpdCo+KGlucHV0LT5yZW5kZXJlcigpKS0+YWRkU2VhcmNoUmVzdWx0
KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZEJ1dHRvbkFj
dGl2YXRpb24pIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5pc0FjdGl2YXRlZFN1Ym1pdCgp
KSB7Ci0gICAgICAgICAgICAgICAgbmVlZEJ1dHRvbkFjdGl2YXRpb24gPSBmYWxzZTsKLSAgICAg
ICAgICAgIH0gZWxzZSBpZiAoZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID09IDAgJiYgY3Vy
cmVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkpIHsKLSAgICAgICAgICAgICAgICBmaXJz
dFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uICYmIGZpcnN0U3VjY2Vz
c2Z1bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24t
PnNldEFjdGl2YXRlZFN1Ym1pdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fcG9zdCkKLSAg
ICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICAKLSAgICBGb3JtRGF0YSBmb3JtX2RhdGE7
Ci0gICAgaWYgKGZvcm1EYXRhKGZvcm1fZGF0YSkpIHsKLSAgICAgICAgaWYobV9wb3N0KSB7Ci0g
ICAgICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggInBvc3QiLCBtX3VybC5xc3RyaW5nKCksIGZv
cm1fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQu
cXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN0eXBl
KCkucXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3Vu
ZGFyeSgpLnFzdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgZnJhbWUtPnN1Ym1pdEZvcm0oICJnZXQiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0YSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmluZygp
ICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYg
Zmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1
Ym1pdEJ1dHRvbi0+c2V0QWN0aXZhdGVkU3VibWl0KGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAg
bV9kb2luZ3N1Ym1pdCA9IG1faW5zdWJtaXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpyZXNldCggICkKLXsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgp
LT5mcmFtZSgpOwotICAgIGlmKG1faW5yZXNldCB8fCAhZnJhbWUpIHJldHVybjsKLQotICAgIG1f
aW5yZXNldCA9IHRydWU7Ci0KLSAgICAvLyAjIyMgRE9NMiBsYWJlbHMgdGhpcyBldmVudCBhcyBu
b3QgY2FuY2VsYWJsZSwgaG93ZXZlcgotICAgIC8vIGNvbW1vbiBicm93c2Vycyggc2ljayEgKSBh
bGxvdyBpdCBiZSBjYW5jZWxsZWQuCi0gICAgaWYgKCAhZGlzcGF0Y2hIVE1MRXZlbnQocmVzZXRF
dmVudCx0cnVlLCB0cnVlKSApIHsKLSAgICAgICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1l
bnRzLmNvdW50KCk7ICsraSkKLSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5yZXNldCgpOwotCi0g
ICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAo
YXR0ci0+bmFtZSgpID09IGFjdGlvbkF0dHIpIAotICAgIHsKLSAgICAgICAgYm9vbCBvbGRVUkxX
YXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7Ci0gICAgICAg
IG1fdXJsID0ga2h0bWw6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBib29sIG5l
d1VSTElzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpOwotCi0g
ICAgICAgIGlmIChtX2F0dGFjaGVkICYmIChvbGRVUkxXYXNTZWN1cmUgIT0gbmV3VVJMSXNTZWN1
cmUpKQotICAgICAgICAgICAgaWYgKG5ld1VSTElzU2VjdXJlKQotICAgICAgICAgICAgICAgIGdl
dERvY3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1SZW1vdmVkKCk7Ci0gICAgfQotICAg
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB0YXJnZXRBdHRyKSB7Ci0gICAgICAgIG1fdGFyZ2V0
ID0gYXR0ci0+dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtZXRob2RB
dHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicG9z
dCIpKQotICAgICAgICAgICAgbV9wb3N0ID0gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJ
Z25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImdldCIpKQotICAgICAgICAgICAgbV9wb3N0ID0g
ZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZW5jdHlwZUF0dHIpIHsKLSAg
ICAgICAgcGFyc2VFbmN0eXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGFjY2VwdF9jaGFyc2V0QXR0cikgewotICAgICAgICAvLyBzcGFjZSBzZXBhcmF0
ZWQgbGlzdCBvZiBjaGFyc2V0cyB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFjY2VwdHMgLSBzZWUg
cmZjMjA0NQotICAgICAgICBtX2FjY2VwdGNoYXJzZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2VwdEF0dHIpIHsKLSAgICAgICAgLy8gaWdub3Jl
IHRoaXMgb25lIGZvciB0aGUgbW9tZW50Li4uCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gYXV0b2NvbXBsZXRlQXR0cikgewotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9ICFlcXVhbEln
bm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25zdWJtaXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHN1
Ym1pdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnJlc2V0
QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihyZXNldEV2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBET01T
dHJpbmcgbmV3TmFtZUF0dHIgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoaW5Eb2N1bWVu
dCgpICYmIGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIEhU
TUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAq
PihnZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgIGRvY3VtZW50LT5yZW1vdmVOYW1lZEl0ZW0o
b2xkTmFtZUF0dHIpOwotICAgICAgICAgICAgZG9jdW1lbnQtPmFkZE5hbWVkSXRlbShuZXdOYW1l
QXR0cik7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1lQXR0cjsKLSAg
ICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShh
dHRyKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5zZXJ0SW50b1ZlY3Rv
cihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIHVuc2lnbmVkIHBvcywgVCogaXRlbSkKLXsKLSAgICB1bnNp
Z25lZCBzaXplID0gdmVjLnNpemUoKTsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgp
OwotICAgIGFzc2VydChwb3MgPD0gY291bnQpOwotICAgIGlmIChzaXplID09IGNvdW50KQotICAg
ICAgICB2ZWMucmVzaXplKHNpemUgPT0gMCA/IDggOiBzaXplICogMyAvIDIpOwotICAgIGZvciAo
dW5zaWduZWQgaSA9IGNvdW50OyBpID4gcG9zOyAtLWkpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwg
dmVjW2kgLSAxXSk7ICAgIAotICAgIHZlYy5pbnNlcnQocG9zLCBpdGVtKTsKLX0KLQotdGVtcGxh
dGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgYXBwZW5kVG9WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVj
LCBUICppdGVtKQotewotICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2ln
bmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAgICAg
IHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAgdmVjLmluc2Vy
dChjb3VudCwgaXRlbSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJlbW92
ZUZyb21WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCBUICppdGVtKQotewotICAgIGludCBwb3Mg
PSB2ZWMuZmluZFJlZihpdGVtKTsKLSAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgcmV0dXJuOwot
ICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
cG9zOyBpIDwgY291bnQgLSAxOyArK2kpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwgdmVjW2kgKyAx
XSk7Ci0gICAgdmVjLnJlbW92ZShjb3VudCAtIDEpOwotfQotCi11bnNpZ25lZCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpmb3JtRWxlbWVudEluZGV4KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICpl
KQotewotICAgIC8vIENoZWNrIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHRoaXMgZWxlbWVu
dCBpcyB0aGUgdmVyeSBsYXN0IHRoaW5nIGluCi0gICAgLy8gdGhlIGZvcm0ncyB0cmVlIG9mIGNo
aWxkcmVuOyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhlIGVudGlyZSB0cmVlIGluIHRoYXQKLSAg
ICAvLyBjb21tb24gY2FzZSB0aGF0IG9jY3VycyBkdXJpbmcgcGFyc2luZzsgaW5zdGVhZCB3ZSds
bCBqdXN0IHJldHVybiBhIHZhbHVlCi0gICAgLy8gdGhhdCBzYXlzICJhZGQgdGhpcyBmb3JtIGVs
ZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkiLgotICAgIGlmIChlLT50cmF2ZXJzZU5leHRO
b2RlKHRoaXMpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAgICBmb3IgKE5vZGVJ
bXBsICpub2RlID0gdGhpczsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhp
cykpIHsKLSAgICAgICAgICAgIGlmIChub2RlID09IGUpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGk7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpCi0gICAgICAgICAgICAg
ICAgICAgICYmIHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKS0+aXNHZW5lcmlj
Rm9ybUVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbCAqPihub2RlKS0+Zm9ybSgpID09IHRoaXMpCi0gICAgICAgICAg
ICAgICAgKytpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtRWxlbWVudHMuY291
bnQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZWdpc3RlckZvcm1FbGVtZW50
KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICplKQotewotICAgIERvY3VtZW50SW1wbCAqZG9j
ID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jICYmIGUtPmlzUmFkaW9CdXR0b24oKSAmJiAh
ZS0+bmFtZSgpLmlzRW1wdHkoKSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCogY3VycmVudENoZWNrZWRSYWRpbyA9IGRvYy0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAo
ZS0+bmFtZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAgaWYg
KGN1cnJlbnRDaGVja2VkUmFkaW8gPT0gZSkKLSAgICAgICAgICAgIGRvYy0+cmVtb3ZlUmFkaW9C
dXR0b25Hcm91cChlLT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDApOwot
ICAgICAgICBpZiAoZS0+aXNDaGVja2VkKCkpCi0gICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9u
Q2hlY2tlZCgoSFRNTElucHV0RWxlbWVudEltcGwqKSBlLCB0aGlzKTsKLSAgICB9Ci0gICAgaW5z
ZXJ0SW50b1ZlY3Rvcihmb3JtRWxlbWVudHMsIGZvcm1FbGVtZW50SW5kZXgoZSksIGUpOwotfQot
Ci12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92ZUZvcm1FbGVtZW50KEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsICplKQotewotICAgIGlmICghZS0+bmFtZSgpLmlzRW1wdHkoKSAmJiBn
ZXREb2N1bWVudCgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJy
ZW50Q2hlY2tlZFJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3Jv
dXAoZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJh
ZGlvID09IGUpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdy
b3VwKGUtPm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAgIH0KLSAgICByZW1vdmVGcm9tVmVjdG9y
KGZvcm1FbGVtZW50cywgZSk7Ci19Ci0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6aXNVUkxB
dHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+
bmFtZSgpID09IGFjdGlvbkF0dHI7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVn
aXN0ZXJJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIGFwcGVuZFRv
VmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpy
ZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIHJlbW92ZUZy
b21WZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBs
PiBIVE1MRm9ybUVsZW1lbnRJbXBsOjplbGVtZW50cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxI
VE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsKHRoaXMpKTsKLX0K
LQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om5hbWUoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudElt
cGw6OnNldE5hbWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
bmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6OmFj
Y2VwdENoYXJzZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0X2No
YXJzZXRBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRBY2NlcHRDaGFy
c2V0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2VwdF9j
aGFyc2V0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6
YWN0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjdGlvbkF0dHIpOwot
fQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFjdGlvbihjb25zdCBET01TdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY3Rpb25BdHRyLCB2YWx1ZSk7Ci19Ci0KLXZv
aWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0RW5jdHlwZShjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShlbmN0eXBlQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJp
bmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6bWV0aG9kKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKG1ldGhvZEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNl
dE1ldGhvZChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShtZXRo
b2RBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjp0YXJn
ZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodGFyZ2V0QXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHRhcmdldEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6SFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBs
ICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MRWxlbWVudEltcGwodGFn
TmFtZSwgZG9jKQotewotICAgIG1fZGlzYWJsZWQgPSBtX3JlYWRPbmx5ID0gZmFsc2U7Ci0KLSAg
ICBpZiAoZikKLQltX2Zvcm0gPSBmOwotICAgIGVsc2UKLQltX2Zvcm0gPSBnZXRGb3JtKCk7Ci0g
ICAgaWYgKG1fZm9ybSkKLSAgICAgICAgbV9mb3JtLT5yZWdpc3RlckZvcm1FbGVtZW50KHRoaXMp
OwotfQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6fkhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKCkKLXsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1F
bGVtZW50KHRoaXMpOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChh
dHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBkaXNhYmxlZEF0dHIpIHsKLSAgICAgICAgYm9vbCBv
bGREaXNhYmxlZCA9IG1fZGlzYWJsZWQ7Ci0gICAgICAgIG1fZGlzYWJsZWQgPSAhYXR0ci0+aXNO
dWxsKCk7Ci0gICAgICAgIGlmIChvbGREaXNhYmxlZCAhPSBtX2Rpc2FibGVkKSB7Ci0gICAgICAg
ICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJl
cigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgICAgICAgICAgdGhlbWUoKS0+
c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIEVuYWJsZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZWFkb25seUF0dHIpIHsKLSAgICAgICAgYm9vbCBv
bGRSZWFkT25seSA9IG1fcmVhZE9ubHk7Ci0gICAgICAgIG1fcmVhZE9ubHkgPSAhYXR0ci0+aXNO
dWxsKCk7Ci0gICAgICAgIGlmIChvbGRSZWFkT25seSAhPSBtX3JlYWRPbmx5KSBzZXRDaGFuZ2Vk
KCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFj
aCgpCi17Ci0gICAgYXNzZXJ0KCFhdHRhY2hlZCgpKTsKLQotICAgIEhUTUxFbGVtZW50SW1wbDo6
YXR0YWNoKCk7Ci0KLSAgICAvLyBUaGUgY2FsbCB0byB1cGRhdGVGcm9tRWxlbWVudCgpIG5lZWRz
IHRvIGdvIGFmdGVyIHRoZSBjYWxsIHRocm91Z2gKLSAgICAvLyB0byB0aGUgYmFzZSBjbGFzcydz
IGF0dGFjaCgpIGJlY2F1c2UgdGhhdCBjYW4gc29tZXRpbWVzIGRvIGEgY2xvc2UKLSAgICAvLyBv
biB0aGUgcmVuZGVyZXIuCi0gICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAgICAgIG1fcmVuZGVyLT51
cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIAotICAgICAgICAvLyBEZWxheWVkIGF0dGFjaG1lbnQg
aW4gb3JkZXIgdG8gcHJldmVudCBGT1VDIGNhbiByZXN1bHQgaW4gYW4gb2JqZWN0IGJlaW5nCi0g
ICAgICAgIC8vIHByb2dyYW1tYXRpY2FsbHkgZm9jdXNlZCBiZWZvcmUgaXQgaGFzIGEgcmVuZGVy
IG9iamVjdC4gIElmIHdlIGhhdmUgYmVlbiBmb2N1c2VkCi0gICAgICAgIC8vIChpLmUuLCBpZiB3
ZSBhcmUgdGhlIGZvY3VzTm9kZSkgdGhlbiBnbyBhaGVhZCBhbmQgZm9jdXMgb3VyIGNvcnJlc3Bv
bmRpbmcgbmF0aXZlIHdpZGdldC4KLSAgICAgICAgLy8gKEF0dGFjaC9kZXRhY2ggY2FuIGFsc28g
aGFwcGVuIGFzIGEgcmVzdWx0IG9mIGRpc3BsYXkgdHlwZSBjaGFuZ2VzLCBlLmcuLCBtYWtpbmcg
YSB3aWRnZXQKLSAgICAgICAgLy8gYmxvY2sgaW5zdGVhZCBvZiBpbmxpbmUsIGFuZCBmb2N1cyBz
aG91bGQgYmUgcmVzdG9yZWQgaW4gdGhhdCBjYXNlIGFzIHdlbGwuKQotICAgICAgICBpZiAoZ2V0
RG9jdW1lbnQoKS0+Zm9jdXNOb2RlKCkgPT0gdGhpcyAmJiBtX3JlbmRlci0+aXNXaWRnZXQoKSAm
JiAKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53
aWRnZXQoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVy
KCkpLT53aWRnZXQoKS0+c2V0Rm9jdXMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQotewotICAgIGlmICgh
bV9mb3JtKSB7Ci0gICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBmb3Jt
IGVsZW1lbnQgYmVpbmcgY3JlYXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBpbnNl
cnRlZCBpbnNpZGUgYSBmb3JtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAgICAv
LyBzZXR0aW5nIGEgZm9ybSwgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1ZSBm
b3IgbV9mb3JtLCAKLSAgICAgICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhp
bmcuCi0gICAgICAgIG1fZm9ybSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBtX2Zv
cm0tPnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRv
YyAmJiBpc1JhZGlvQnV0dG9uKCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2VkKCkp
Ci0gICAgICAgICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1l
bnRJbXBsKil0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEVsZW1l
bnRJbXBsOjppbnNlcnRlZEludG9UcmVlKGRlZXApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpyZW1vdmVkRnJvbVRyZWUoYm9vbCBkZWVwKQotewotICAgIC8vIFdoZW4g
YmVpbmcgcmVtb3ZlZCB3ZSBoYXZlIHRvIHBvc3NpYmx5IG51bGwgb3V0IG91ciBmb3JtIGFuZCBy
ZW1vdmUgb3Vyc2VsdmVzIGZyb20KLSAgICAvLyB0aGUgZm9ybSdzIGxpc3Qgb2YgZWxlbWVudHMu
Ci0gICAgaWYgKG1fZm9ybSkgewotICAgICAgICAvLyBBdHRlbXB0IHRvIHJlLWFjcXVpcmUgdGhl
IGZvcm0uICBJZiB3ZSBjYW4ndCByZS1hY3F1aXJlLCB0aGVuCi0gICAgICAgIC8vIHJlbW92ZSBv
dXJzZWx2ZXMgZnJvbSB0aGUgZm9ybS4KLSAgICAgICAgTm9kZUltcGwqIGZvcm0gPSBwYXJlbnRO
b2RlKCk7Ci0gICAgICAgIE5vZGVJbXBsKiByb290ID0gdGhpczsKLSAgICAgICAgd2hpbGUgKGZv
cm0pIHsKLSAgICAgICAgICAgIGlmIChmb3JtLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcm9vdCA9IGZvcm07Ci0gICAgICAgICAgICBm
b3JtID0gZm9ybS0+cGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAv
LyBJZiB0aGUgZm9ybSBoYXMgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiwgdGhlbiB3ZSB3b24ndCBm
aW5kIGl0IGFzIGFuIGFuY2VzdG9yLgotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJv
b3Qgbm9kZSBvZiBvdXIgY3VycmVudCBmb3JtIGFuZCBvdXIgcm9vdCBub2RlCi0gICAgICAgIC8v
IG1hdGNoLiAgSWYgc28sIHByZXNlcnZlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBmb3JtLgotICAg
ICAgICBpZiAoIWZvcm0pIHsKLSAgICAgICAgICAgIE5vZGVJbXBsKiBmb3JtUm9vdCA9IG1fZm9y
bTsKLSAgICAgICAgICAgIHdoaWxlIChmb3JtUm9vdC0+cGFyZW50KCkpIGZvcm1Sb290ID0gZm9y
bVJvb3QtPnBhcmVudCgpOwotICAgICAgICAgICAgaWYgKGZvcm1Sb290ID09IHJvb3QpCi0gICAg
ICAgICAgICAgICAgZm9ybSA9IG1fZm9ybTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAg
IGlmICghZm9ybSkgewotICAgICAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlz
KTsKLSAgICAgICAgICAgIG1fZm9ybSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
YXNzZXJ0KGZvcm0gPT0gbV9mb3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVkIGZvcm0gc2hvdWxkIGJl
IHRoZSBzYW1lLiBJZiBub3QsIHNvbWV0aGluZyByZWFsbHkgc3RyYW5nZSBoYXBwZW5lZC4KLSAg
ICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsKLX0K
LQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmdldEZv
cm0oKSBjb25zdAotewotICAgIE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxl
KHApIHsKLSAgICAgICAgaWYgKHAtPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAgICAgICAgcCA9
IHAtPnBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURPTVN0cmluZyBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5n
IG4gPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIHJldHVybiBuLmlzTnVsbCgpID8gIiIg
OiBuOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNvbnN0
IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7
Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uU2VsZWN0KCkKLXsKLSAg
ICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJl
Ci0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoc2VsZWN0RXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLXZv
aWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uQ2hhbmdlKCkKLXsKLSAgICAvLyAjIyMg
bWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJlCi0gICAgZGlz
cGF0Y2hIVE1MRXZlbnQoY2hhbmdlRXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLWJvb2wgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9k
aXNhYmxlZDsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0RGlzYWJs
ZWQoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShkaXNhYmxlZEF0dHIsIGIgPyAiIiA6IDAp
OwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRSZWFkT25seShib29s
IGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0K
LXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5n
ZSBjaCApCi17Ci0gICAgLy9ib29sIGNoYW5nZWQgPSBjaGFuZ2VkKCk7Ci0gICAgSFRNTEVsZW1l
bnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLQotICAgIGlmIChtX3JlbmRlciAvKiYmIGNoYW5n
ZWQqLykKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLWJvb2wg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBp
ZiAoZGlzYWJsZWQoKSB8fCAhbV9yZW5kZXIgfHwgCi0gICAgICAgIChtX3JlbmRlci0+c3R5bGUo
KSAmJiBtX3JlbmRlci0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHx8IAotICAg
ICAgICBtX3JlbmRlci0+d2lkdGgoKSA9PSAwIHx8IG1fcmVuZGVyLT5oZWlnaHQoKSA9PSAwKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAg
IGlmIChpc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkg
ewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVy
KS0+d2lkZ2V0KCkgJiYKLSAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0
Kj4obV9yZW5kZXIpLT53aWRnZXQoKS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OlRhYkZvY3Vz
KTsKLSAgICAgICAgfQotCWlmIChnZXREb2N1bWVudCgpLT5mcmFtZSgpKQotCSAgICByZXR1cm4g
Z2V0RG9jdW1lbnQoKS0+ZnJhbWUoKS0+dGFic1RvQWxsQ29udHJvbHMoKTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc01v
dXNlRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAg
ICBpZiAobV9yZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAg
ICAgKHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3Vz
UG9saWN5KCkgJiBRV2lkZ2V0OjpDbGlja0ZvY3VzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBG
b3IgPGlucHV0IHR5cGU9aW1hZ2U+IGFuZCA8YnV0dG9uPiwgd2Ugd2lsbCBhc3N1bWUgbm8gbW91
c2UgZm9jdXNhYmlsaXR5LiAgVGhpcyBpcwotICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggT1Mg
WCBiZWhhdmlvciBmb3IgYnV0dG9ucy4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omlz
RWRpdGFibGUoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gU3BlY2lhbCBjaGFycyB1
c2VkIHRvIGVuY29kZSBmb3JtIHN0YXRlIHN0cmluZ3MuCi0vLyBXZSBwaWNrIGNoYXJzIHRoYXQg
YXJlIHVubGlrZWx5IHRvIGJlIHVzZWQgaW4gYW4gSFRNTCBhdHRyLCBzbyB3ZSByYXJlbHkgaGF2
ZSB0byByZWFsbHkgZW5jb2RlLgotY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvciA9ICcmJzsKLWNv
bnN0IGNoYXIgc3RhdGVFc2NhcGUgPSAnPCc7Ci1zdGF0aWMgY29uc3QgY2hhciBzdGF0ZVNlcGFy
YXRvck1hcmtlcltdID0gIjxBIjsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlRXNjYXBlTWFya2Vy
W10gPSAiPDwiOwotCi0vLyBFbmNvZGUgYW4gZWxlbWVudCBuYW1lIHNvIHdlIGNhbiBwdXQgaXQg
aW4gYSBzdGF0ZSBzdHJpbmcgd2l0aG91dCBjb2xsaWRpbmcKLS8vIHdpdGggb3VyIHNlcGFyYXRv
ciBjaGFyLgotc3RhdGljIFFTdHJpbmcgZW5jb2RlZEVsZW1lbnROYW1lKFFTdHJpbmcgc3RyKQot
ewotICAgIGludCBzZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaW50IGVz
Y0xvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICBpZiAoc2VwTG9jID49IDAgfHwg
ZXNjTG9jID49IDApIHsKLSAgICAgICAgUVN0cmluZyBuZXdTdHIgPSBzdHI7Ci0gICAgICAgIC8v
ICAgcmVwbGFjZSAiPCIgd2l0aCAiPDwiCi0gICAgICAgIHdoaWxlIChlc2NMb2MgPj0gMCkgewot
ICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2UoZXNjTG9jLCAxLCBzdGF0ZUVzY2FwZU1hcmtlcik7
Ci0gICAgICAgICAgICBlc2NMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgZXNjTG9jKzEp
OwotICAgICAgICB9Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiJiIgd2l0aCAiPEEiCi0gICAgICAg
IHdoaWxlIChzZXBMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2Uoc2VwTG9j
LCAxLCBzdGF0ZVNlcGFyYXRvck1hcmtlcik7Ci0gICAgICAgICAgICBzZXBMb2MgPSBzdHIuZmlu
ZChzdGF0ZVNlcGFyYXRvciwgc2VwTG9jKzEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBu
ZXdTdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19Ci0KLVFT
dHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gQnVp
bGQgYSBzdHJpbmcgdGhhdCBjb250YWlucyBFbGVtZW50TmFtZSZFbGVtZW50VHlwZSYKLSAgICBy
ZXR1cm4gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpICsgc3RhdGVTZXBhcmF0
b3IgKyB0eXBlKCkucXN0cmluZygpICsgc3RhdGVTZXBhcmF0b3I7Ci19Ci0KLVFTdHJpbmcgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZz
dGF0ZXMpCi17Ci0gICAgUVN0cmluZyBlbmNOYW1lID0gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUo
KS5xc3RyaW5nKCkpOwotICAgIFFTdHJpbmcgdHlwZVN0ciA9IHR5cGUoKS5xc3RyaW5nKCk7Ci0g
ICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBzdGF0ZXMuYmVnaW4oKTsgaXQgIT0g
c3RhdGVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgc3RhdGUgPSAqaXQ7Ci0gICAg
ICAgIGludCBzZXAxID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgICAgIGludCBz
ZXAyID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwMSsxKTsKLSAgICAgICAgYXNzZXJ0
KHNlcDEgPj0gMCk7Ci0gICAgICAgIGFzc2VydChzZXAyID49IDApOwotCi0gICAgICAgIFFTdHJp
bmcgbmFtZUFuZFR5cGUgPSBzdGF0ZS5sZWZ0KHNlcDIpOwotICAgICAgICBpZiAoZW5jTmFtZS5s
ZW5ndGgoKSArIHR5cGVTdHIubGVuZ3RoKCkgKyAxID09ICh1aW50KXNlcDIKLSAgICAgICAgICAg
ICYmIG5hbWVBbmRUeXBlLnN0YXJ0c1dpdGgoZW5jTmFtZSkKLSAgICAgICAgICAgICYmIG5hbWVB
bmRUeXBlLmVuZHNXaXRoKHR5cGVTdHIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZXMu
cmVtb3ZlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5taWQoc2VwMisxKTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKLX0KLQotaW50IEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjp0YWJJbmRleCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZSh0YWJpbmRleEF0dHIpLnRvSW50KCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnNldFRhYkluZGV4KGludCB2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
dGFiaW5kZXhBdHRyLCBRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6OkhUTUxCdXR0b25FbGVtZW50SW1wbChE
b2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsKGJ1dHRvblRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFNV
Qk1JVDsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwot
fQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6On5IVE1MQnV0dG9uRWxlbWVudEltcGwoKQotewot
fQotCi1SZW5kZXJPYmplY3QqIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIo
UmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5l
dyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25F
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0eXBl
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkg
PT0gIHR5cGVBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1
ZSgpLCAic3VibWl0IikpCi0gICAgICAgICAgICBtX3R5cGUgPSBTVUJNSVQ7Ci0gICAgICAgIGVs
c2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJyZXNldCIpKQotICAgICAg
ICAgICAgbV90eXBlID0gUkVTRVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KGF0dHItPnZhbHVlKCksICJidXR0b24iKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IEJVVFRPTjsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKLSAgICAgICAgbV92
YWx1ZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIG1fY3VyclZhbHVlID0gbV92YWx1ZTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8v
IERvIG5vdGhpbmcuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIp
IHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1M
RXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1w
bCAqZXZ0KQotewotICAgIGlmIChtX3R5cGUgIT0gQlVUVE9OICYmIChldnQtPnR5cGUoKSA9PSBE
T01BY3RpdmF0ZUV2ZW50KSkgewotCi0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gU1VC
TUlUKSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAgICBt
X2Zvcm0tPnByZXBhcmVTdWJtaXQoKTsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFs
c2U7IC8vIGluIGNhc2Ugd2Ugd2VyZSBjYW5jZWxlZAotICAgICAgICB9Ci0gICAgICAgIGlmKG1f
Zm9ybSAmJiBtX3R5cGUgPT0gUkVTRVQpIG1fZm9ybS0+cmVzZXQoKTsKLSAgICB9Ci0gICAgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQot
Ym9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNv
bnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1l
cwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJv
d3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3
ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9u
cyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFJlbW92ZSB0aGUg
bmFtZSBjb25zdHJhaW50IGZvciBub3cuCi0gICAgLy8gV2FzOiBtX3R5cGUgPT0gU1VCTUlUICYm
ICFtX2Rpc2FibGVkICYmICFuYW1lKCkuaXNFbXB0eSgpCi0gICAgcmV0dXJuIG1fdHlwZSA9PSBT
VUJNSVQgJiYgIW1fZGlzYWJsZWQ7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpp
c0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0Owot
fQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wg
ZmxhZykKLXsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRv
bkVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29s
IC8qbXVsdGlwYXJ0Ki8pCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBTVUJNSVQgfHwgbmFtZSgpLmlz
RW1wdHkoKSB8fCAhbV9hY3RpdmVTdWJtaXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBl
bmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgbV9jdXJyVmFsdWUpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wg
c2VuZFRvQW55RWxlbWVudCkKLXsgICAKLSAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24gZXZl
bnRzIGlmZiB0aGUKLSAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAg
ICBjbGljayhzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVt
ZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFj
Y2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tl
eUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dmFs
dWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0KLQot
dm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpIVE1MRmllbGRTZXRFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgIDog
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoZmllbGRzZXRUYWcsIGRvYywgZikKLXsKLX0KLQot
SFRNTEZpZWxkU2V0RWxlbWVudEltcGw6On5IVE1MRmllbGRTZXRFbGVtZW50SW1wbCgpCi17Ci19
Ci0KLWJvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBs
KiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUobGVnZW5kVGFn
KSB8fCBIVE1MRWxlbWVudEltcGw6OmNoZWNrRFREKG5ld0NoaWxkKTsKLX0KLQotYm9vbCBIVE1M
RmllbGRTZXRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp0eXBlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gImZpZWxkc2V0IjsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MRmll
bGRTZXRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5k
ZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpZWxkc2V0
KHRoaXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpIVE1MSW5wdXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGlucHV0VGFnLCBkb2Ms
IGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0
RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpk
b2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbCh0YWdOYW1lLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjppbml0KCkKLXsKLSAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICBtX3Zh
bHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX21h
eExlbiA9IC0xOwotICAgIG1fc2l6ZSA9IDIwOwotICAgIG1fY2hlY2tlZCA9IGZhbHNlOwotICAg
IG1fZGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1
ZTsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTsKLQotICAgIG1faGF2ZVR5cGUgPSBmYWxz
ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1
ZTsKLSAgICBtX2luaXRlZCA9IGZhbHNlOwotCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7
Ci0KLSAgICBtX21heFJlc3VsdHMgPSAtMTsKLQotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1f
YXV0b2NvbXBsZXRlID0gbV9mb3JtLT5hdXRvQ29tcGxldGUoKTsKLX0KLQotSFRNTElucHV0RWxl
bWVudEltcGw6On5IVE1MSW5wdXRFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50
KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAgICBk
ZWxldGUgbV9pbWFnZUxvYWRlcjsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBtX25h
bWU7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUo
KSBjb25zdAotewotICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3QgYmUgZm9j
dXNlZCwgdGhlbiB3ZSBjYW4gc3RvcCBub3cuCi0gICAgaWYgKCFIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAobV90eXBlID09IFJBRElPKSB7Ci0gICAgICAgIC8vIFVubmFtZWQgcmFkaW8gYnV0
dG9ucyBhcmUgbmV2ZXIgZm9jdXNhYmxlIChtYXRjaGVzIFdpbklFKS4KLSAgICAgICAgaWYgKG5h
bWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8g
TmV2ZXIgYWxsb3cga2V5Ym9hcmQgdGFiYmluZyB0byBsZWF2ZSB5b3UgaW4gdGhlIHNhbWUgcmFk
aW8gZ3JvdXAuICBBbHdheXMKLSAgICAgICAgLy8gc2tpcCBhbnkgb3RoZXIgZWxlbWVudHMgaW4g
dGhlIGdyb3VwLgotICAgICAgICBOb2RlSW1wbCogY3VycmVudEZvY3VzTm9kZSA9IGdldERvY3Vt
ZW50KCktPmZvY3VzTm9kZSgpOwotICAgICAgICBpZiAoY3VycmVudEZvY3VzTm9kZSAmJiBjdXJy
ZW50Rm9jdXNOb2RlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElu
cHV0RWxlbWVudEltcGwqIGZvY3VzZWRJbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnRJbXBsKj4oY3VycmVudEZvY3VzTm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNlZElucHV0
LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBmb2N1c2VkSW5wdXQtPmZvcm0oKSA9PSBtX2Zvcm0g
JiYKLSAgICAgICAgICAgICAgICBmb2N1c2VkSW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAv
LyBBbGxvdyBrZXlib2FyZCBmb2N1cyBpZiB3ZSdyZSBjaGVja2VkIG9yIGlmIG5vdGhpbmcgaW4g
dGhlIGdyb3VwIGlzIGNoZWNrZWQuCi0gICAgICAgIHJldHVybiBjaGVja2VkKCkgfHwgIWdldERv
Y3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9y
bSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICBpZiAodC5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y2NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh0
eXBlQXR0ciwgZXhjY29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc2V0QXR0cmlidXRl
KHR5cGVBdHRyLCB0KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5wdXRU
eXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICB0eXBlRW51bSBuZXdUeXBlOwotICAgIAot
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicGFzc3dvcmQiKSkKLSAgICAgICAgbmV3VHlw
ZSA9IFBBU1NXT1JEOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJjaGVja2Jv
eCIpKQotICAgICAgICBuZXdUeXBlID0gQ0hFQ0tCT1g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25v
cmluZ0Nhc2UodCwgInJhZGlvIikpCi0gICAgICAgIG5ld1R5cGUgPSBSQURJTzsKLSAgICBlbHNl
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic3VibWl0IikpCi0gICAgICAgIG5ld1R5cGUgPSBT
VUJNSVQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJlc2V0IikpCi0gICAg
ICAgIG5ld1R5cGUgPSBSRVNFVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAi
ZmlsZSIpKQotICAgICAgICBuZXdUeXBlID0gRklMRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9y
aW5nQ2FzZSh0LCAiaGlkZGVuIikpCi0gICAgICAgIG5ld1R5cGUgPSBISURERU47Ci0gICAgZWxz
ZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImltYWdlIikpCi0gICAgICAgIG5ld1R5cGUgPSBJ
TUFHRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiYnV0dG9uIikpCi0gICAg
ICAgIG5ld1R5cGUgPSBCVVRUT047Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwg
ImtodG1sX2lzaW5kZXgiKSkKLSAgICAgICAgbmV3VHlwZSA9IElTSU5ERVg7Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInNlYXJjaCIpKQotICAgICAgICBuZXdUeXBlID0gU0VB
UkNIOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYW5nZSIpKQotICAgICAg
ICBuZXdUeXBlID0gUkFOR0U7Ci0gICAgZWxzZQotICAgICAgICBuZXdUeXBlID0gVEVYVDsKLQot
ICAgIC8vICMjIyBJTVBPUlRBTlQ6IERvbid0IGFsbG93IHRoZSB0eXBlIHRvIGJlIGNoYW5nZWQg
dG8gRklMRSBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyB0eXBlIGNoYW5nZSwgb3RoZXJ3aXNlIGEg
SmF2YVNjcmlwdCBwcm9ncmFtbWVyIHdvdWxkIGJlIGFibGUgdG8gc2V0IGEgdGV4dAotICAgIC8v
IGZpZWxkJ3MgdmFsdWUgdG8gc29tZXRoaW5nIGxpa2UgL2V0Yy9wYXNzd2QgYW5kIHRoZW4gY2hh
bmdlIGl0IHRvIGEgZmlsZSBmaWVsZC4KLSAgICBpZiAobV90eXBlICE9IG5ld1R5cGUpIHsKLSAg
ICAgICAgaWYgKG5ld1R5cGUgPT0gRklMRSAmJiBtX2hhdmVUeXBlKSB7Ci0gICAgICAgICAgICAv
LyBTZXQgdGhlIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAgICAv
LyBVc2VmdWwgaW4gY2FzZSB3ZSB3ZXJlIGNhbGxlZCBmcm9tIGluc2lkZSBwYXJzZU1hcHBlZEF0
dHJpYnV0ZS4KLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdHlwZSgpKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW5hbWUo
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Y2hlY2tl
ZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKSA9PSB0aGlzKQotICAg
ICAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG5h
bWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdh
c0F0dGFjaGVkID0gbV9hdHRhY2hlZDsKLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkKLSAg
ICAgICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIGJvb2wgZGlkU3RvcmVWYWx1ZSA9
IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBtX3R5cGUg
PSBuZXdUeXBlOwotICAgICAgICAgICAgYm9vbCB3aWxsU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVl
U2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoZGlkU3RvcmVWYWx1ZSAm
JiAhd2lsbFN0b3JlVmFsdWUgJiYgIW1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAg
ICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBtX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBtX3Zh
bHVlID0gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpZFN0
b3JlVmFsdWUgJiYgd2lsbFN0b3JlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0g
Z2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAo
d2FzQXR0YWNoZWQpCi0gICAgICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAvLyBJZiBvdXIgdHlwZSBtb3JwaHMgaW50byBhIHJhZGlvIGJ1dHRvbiBh
bmQgd2UgYXJlIGNoZWNrZWQsIHRoZW4gZ28gYWhlYWQKLSAgICAgICAgICAgIC8vIGFuZCBzaWdu
YWwgdGhpcyB0byB0aGUgZm9ybS4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYg
Y2hlY2tlZCgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hl
Y2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotICAgIG1faGF2ZVR5cGUgPSB0
cnVlOwotICAgIAotICAgIGlmIChtX3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikgewot
ICAgICAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLSAgICAgICAgbV9pbWFnZUxvYWRlciA9IDA7
Ci0gICAgfQotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnR5cGUoKSBjb25z
dAotewotICAgIC8vIG5lZWRzIHRvIGJlIGxvd2VyY2FzZSBhY2NvcmRpbmcgdG8gRE9NIHNwZWMK
LSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgVEVYVDogcmV0dXJuICJ0ZXh0IjsKLSAg
ICBjYXNlIFBBU1NXT1JEOiByZXR1cm4gInBhc3N3b3JkIjsKLSAgICBjYXNlIENIRUNLQk9YOiBy
ZXR1cm4gImNoZWNrYm94IjsKLSAgICBjYXNlIFJBRElPOiByZXR1cm4gInJhZGlvIjsKLSAgICBj
YXNlIFNVQk1JVDogcmV0dXJuICJzdWJtaXQiOwotICAgIGNhc2UgUkVTRVQ6IHJldHVybiAicmVz
ZXQiOwotICAgIGNhc2UgRklMRTogcmV0dXJuICJmaWxlIjsKLSAgICBjYXNlIEhJRERFTjogcmV0
dXJuICJoaWRkZW4iOwotICAgIGNhc2UgSU1BR0U6IHJldHVybiAiaW1hZ2UiOwotICAgIGNhc2Ug
QlVUVE9OOiByZXR1cm4gImJ1dHRvbiI7Ci0gICAgY2FzZSBTRUFSQ0g6IHJldHVybiAic2VhcmNo
IjsKLSAgICBjYXNlIFJBTkdFOiByZXR1cm4gInJhbmdlIjsKLSAgICBjYXNlIElTSU5ERVg6IHJl
dHVybiAiIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi1RU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJ
Ly8gc2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLQotICAgIFFTdHJp
bmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKTsKLSAgICBzd2l0
Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAg
ICAgcmV0dXJuIHN0YXRlICsgKGNoZWNrZWQoKSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgZGVmYXVs
dDoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOyAvLyBNYWtl
IHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBh
c3NlcnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUg
cGFzc3dvcmQgZmllbGRzCi0gICAgCi0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5p
c051bGwoKSkgcmV0dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNL
Qk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHNldENoZWNrZWQoKHN0YXRlID09ICJvbiIp
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc2V0VmFsdWUoRE9NU3Ry
aW5nKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjYW5IYXZlU2VsZWN0aW9uKCkKLXsK
LSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkK
LXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVF
ZGl0ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZWxlY3Rpb25FbmQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVy
biAwOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6
Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25F
bmQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3Rh
cnQoaW50IHN0YXJ0KQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBz
d2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNF
QVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
TGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0K
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQp
Ci17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBl
KSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAg
ICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPiht
X3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZighbV9yZW5kZXIpIHJldHVybjsK
LQotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24qPihtX3JlbmRlciktPnNlbGVjdCgpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VB
UkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJM
aW5lRWRpdCo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgSElE
REVOOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAg
IGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0g
ICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBl
bmQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90
eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAq
PihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzLCBi
b29sIHNob3dQcmVzc2VkTG9vaykKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAg
ICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVT
RVQ6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBpZiAocmVuZGVy
ZXIoKSkgewotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24gKj4o
cmVuZGVyZXIoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAg
ICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNT
V09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGlj
ayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihi
b29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewotICAg
ICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlwZQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNT
V09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAg
ICAgICAgIGZvY3VzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JP
WDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNh
c2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAg
ICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAvLyBmb2N1
cwotICAgICAgICAgICAgZm9jdXMoKTsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgbW91c2Ug
YnV0dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgICAgICAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNl
bmRUb0FueUVsZW1lbnQKLSAgICAgICAgICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwK
LSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2
c3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAg
cmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAg
Ci0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlUmVw
bGFjZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlvciBp
cyB0aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gSFRNTEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsK
LSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkgJiYgbV9mb3JtKSB7Ci0g
ICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJhZGlvIGZyb20gaXRzIG9sZCBncm91cC4KLSAgICAg
ICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW1fbmFtZS5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChtX25hbWUuaW1w
bCgpLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUgb3Vy
IGNhY2hlZCByZWZlcmVuY2UgdG8gdGhlIG5hbWUuCi0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZh
bHVlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgaXQgdG8gaXRzIG5ldyBncm91cC4KLSAg
ICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICBnZXRE
b2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2Nv
bXBsZXRlID0gIWVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgc2V0SW5wdXRU
eXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVl
QXR0cikgewotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9y
bSBpcyBsb29raW5nIGF0IHRoZSBkZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KLSAgICAgICAgaWYg
KG1fdmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG1f
dmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBjaGVja2VkQXR0cikgewotICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHItPmlz
TnVsbCgpOwotICAgICAgICBpZiAobV91c2VEZWZhdWx0Q2hlY2tlZCkgewotICAgICAgICAgICAg
c2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICAgICAgICAgIG1fdXNlRGVmYXVsdENo
ZWNrZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
bWF4bGVuZ3RoQXR0cikgewotICAgICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0
dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0gIWF0
dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMjA7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYWx0QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90
eXBlID09IElNQUdFKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3Jl
bmRlciktPnVwZGF0ZUFsdFRleHQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBz
cmNBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsKLSAg
ICAgICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgICAgICBtX2ltYWdlTG9h
ZGVyID0gbmV3IEhUTUxJbWFnZUxvYWRlcih0aGlzKTsKLSAgICAgICAgICAgIG1faW1hZ2VMb2Fk
ZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSB1c2VtYXBBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0g
YWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBh
ZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52
YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0g
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFs
dWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQs
IGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0
cikgewotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hF
SUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25m
b2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0
cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAg
ICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0
ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmlucHV0QXR0cikgewot
ICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRyKTsKLSAgICB9Ci0g
ICAgLy8gU2VhcmNoIGZpZWxkIGFuZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwganVzdCBjYXVzZSB1
cGRhdGVGcm9tRWxlbWVudCB0byBiZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQotICAgIC8vIHJlY2Fs
Y2luZy4KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWFyY2hBdHRyKSB7Ci0gICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSByZXN1bHRzQXR0cikgewotICAgICAgICBtX21heFJlc3VsdHMg
PSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAgICAg
c2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0
ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAot
ICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0ciB8fAotICAgICAg
ICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHIt
Pm5hbWUoKSA9PSBtYXhBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJl
Y2lzaW9uQXR0cikgewotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsK
LX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJT
dHlsZSAqc3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBURVhU
OgotICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBSQU5HRToK
LSAgICBjYXNlIElTSU5ERVg6Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgot
ICAgIGNhc2UgU1VCTUlUOgotICAgIGNhc2UgSU1BR0U6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBj
YXNlIEZJTEU6Ci0gICAgY2FzZSBCVVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKHN0eWxlKTsKLSAgICBjYXNlIEhJRERFTjogICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1SZW5kZXJPYmplY3QgKkhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihS
ZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90
eXBlKQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNl
IFNFQVJDSDoKLSAgICBjYXNlIElTSU5ERVg6ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyTGlu
ZUVkaXQodGhpcyk7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAg
ICByZXR1cm4gUmVuZGVyT2JqZWN0OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotICAgIGNh
c2UgU1VCTUlUOgotICAgIGNhc2UgUkVTRVQ6Ci0gICAgY2FzZSBCVVRUT046Ci0gICAgICAgIHJl
dHVybiBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBJTUFHRTogICAg
cmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckltYWdlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgRklM
RTogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGaWxlQnV0dG9uKHRoaXMpOwotICAgIGNh
c2UgUkFOR0U6ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTbGlkZXIodGhpcyk7Ci0gICAg
Y2FzZSBISURERU46ICAgYnJlYWs7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAg
aWYgKCFtX2luaXRlZCkgewotICAgICAgICBpZiAoIW1faGF2ZVR5cGUpCi0gICAgICAgICAgICBz
ZXRJbnB1dFR5cGUoZ2V0QXR0cmlidXRlKHR5cGVBdHRyKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6
IFRoaXMgbmVlZHMgdG8gYmUgZHluYW1pYywgZG9lc24ndCBpdCwgc2luY2Ugc29tZW9uZSBjb3Vs
ZCBzZXQgdGhpcwotICAgICAgICAvLyBhZnRlciBhdHRhY2htZW50PwotICAgICAgICBET01TdHJp
bmcgdmFsID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgIGlmICgodWludCkgbV90
eXBlIDw9IElTSU5ERVggJiYgIXZhbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJlbW92
ZSBuZXdsaW5lIHN0dWZmLi4KLSAgICAgICAgICAgIFFTdHJpbmcgbnZhbHVlOwotICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoKCk7ICsraSkKLSAgICAg
ICAgICAgICAgICBpZiAodmFsW2ldID49ICcgJykKLSAgICAgICAgICAgICAgICAgICAgbnZhbHVl
ICs9IHZhbFtpXTsKLQotICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSBudmFsdWUubGVu
Z3RoKCkpCi0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbnZhbHVlKTsK
LSAgICAgICAgfQotCi0gICAgICAgIG1faW5pdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBE
aXNhbGxvdyB0aGUgd2lkdGggYXR0cmlidXRlIG9uIGlucHV0cyBvdGhlciB0aGFuIEhJRERFTiBh
bmQgSU1BR0UuCi0gICAgLy8gRHVtYiBXZWIgc2l0ZXMgd2lsbCB0cnkgdG8gc2V0IHRoZSB3aWR0
aCBhcyBhbiBhdHRyaWJ1dGUgb24gZm9ybSBjb250cm9scyB0aGF0IGFyZW4ndAotICAgIC8vIGlt
YWdlcyBvciBoaWRkZW4uCi0gICAgaWYgKGhhc01hcHBlZEF0dHJpYnV0ZXMoKSAmJiBtX3R5cGUg
IT0gSElEREVOICYmIG1fdHlwZSAhPSBJTUFHRSAmJiAhZ2V0QXR0cmlidXRlKHdpZHRoQXR0ciku
aXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBleGNDb2RlOwotICAgICAgICByZW1vdmVBdHRyaWJ1
dGUod2lkdGhBdHRyLCBleGNDb2RlKTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAobV90eXBlID09IElNQUdFKSB7Ci0gICAgICAg
IGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRN
TEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAgUmVuZGVySW1h
Z2UqIGltYWdlT2JqID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJlcigpKTsKLSAg
ICAgICAgICAgIGltYWdlT2JqLT5zZXRJbWFnZShtX2ltYWdlTG9hZGVyLT5pbWFnZSgpKTsgICAg
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxs
aW5nIHBhc3N3b3JkRmllbGRSZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcK
LSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAg
IGlmIChtX3R5cGUgPT0gUEFTU1dPUkQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnBhc3N3b3Jk
RmllbGRBZGRlZCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZXRhY2goKQot
ewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3ZhbHVl
TWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6YWx0VGV4dCgpIGNvbnN0Ci17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMTk5
OC9SRUMtaHRtbDQwLTE5OTgwNDI0L2FwcGVuZGl4L25vdGVzLmh0bWwjYWx0Z2VuCi0gICAgLy8g
YWxzbyBoZWF2aWx5IGRpc2N1c3NlZCBieSBIaXhpZSBvbiBidWd6aWxsYQotICAgIC8vIG5vdGUg
dGhpcyBpcyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCB0byBIVE1MSW1hZ2VFbGVtZW50SW1wbDo6
YWx0VGV4dCgpCi0gICAgRE9NU3RyaW5nIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLSAg
ICAvLyBmYWxsIGJhY2sgdG8gdGl0bGUgYXR0cmlidXRlCi0gICAgaWYgKGFsdC5pc051bGwoKSkK
LSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgaWYgKGFsdC5pc051
bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgaWYgKGFs
dC5pc0VtcHR5KCkpCi0gICAgICAgIGFsdCA9IGlucHV0RWxlbWVudEFsdFRleHQoKTsKLQotICAg
IHJldHVybiBhbHQ7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0
b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4g
SG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3Ry
YWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVz
ZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAot
ICAgIC8vIFdhczogKG1fdHlwZSA9PSBTVUJNSVQgJiYgIW5hbWUoKS5pc0VtcHR5KCkpCi0gICAg
cmV0dXJuICFtX2Rpc2FibGVkICYmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1J
VCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9hY3Rp
dmVTdWJtaXQgPSBmbGFnOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBlbmRG
b3JtRGF0YShGb3JtRGF0YUxpc3QgJmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKLXsKLSAgICAv
LyBpbWFnZSBnZW5lcmF0ZXMgaXRzIG93biBuYW1lcwotICAgIGlmIChuYW1lKCkuaXNFbXB0eSgp
ICYmIG1fdHlwZSAhPSBJTUFHRSkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoIChtX3R5cGUp
IHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2Fz
ZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0g
ICAgICAgICAgICAvLyBhbHdheXMgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZW5jb2RpbmcuYXBw
ZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGlm
IChjaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUo
KSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2Fz
ZSBSRVNFVDoKLSAgICAgICAgICAgIC8vIHRob3NlIGJ1dHRvbnMgYXJlIG5ldmVyIHN1Y2Nlc3Nm
dWwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjYXNlIElNQUdFOgotICAg
ICAgICAgICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2Rpbmcu
YXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBjbGlj
a1goKSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0
eSgpID8gInkiIDogKG5hbWUoKSArICIueSIpLCBjbGlja1koKSk7Ci0gICAgICAgICAgICAgICAg
aWYgKCFuYW1lKCkuaXNFbXB0eSgpICYmICF2YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsK
LSAgICAgICAgICAgICAgICBET01TdHJpbmcgZW5jX3N0ciA9IHZhbHVlV2l0aERlZmF1bHQoKTsK
LSAgICAgICAgICAgICAgICBpZiAoIWVuY19zdHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBlbmNfc3RyKTsKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICB7Ci0gICAg
ICAgICAgICAvLyBjYW4ndCBzdWJtaXQgZmlsZSBvbiBHRVQKLSAgICAgICAgICAgIC8vIGRvbid0
IHN1Ym1pdCBpZiBkaXNwbGF5OiBub25lIG9yIGRpc3BsYXk6IGhpZGRlbgotICAgICAgICAgICAg
aWYoIW11bHRpcGFydCB8fCAhcmVuZGVyZXIoKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNp
YmlsaXR5KCkgIT0ga2h0bWw6OlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgICAgICAgICAvLyBpZiBubyBmaWxlbmFtZSBhdCBhbGwgaXMgZW50ZXJlZCwgcmV0
dXJuIHN1Y2Nlc3NmdWwsIGhvd2V2ZXIgZW1wdHkKLSAgICAgICAgICAgIC8vIG51bGwgd291bGQg
YmUgbW9yZSBsb2dpY2FsIGJ1dCBuZXRzY2FwZSBwb3N0cyBhbiBlbXB0eSBmaWxlLiBhcmdoLgot
ICAgICAgICAgICAgaWYgKHZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZW5j
b2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIFFTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5k
RmlsZShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0
YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQoKQot
ewotICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKQotICAgICAgICBz
ZXRWYWx1ZShET01TdHJpbmcoKSk7Ci0gICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsK
LSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c2V0Q2hlY2tlZChib29sIF9jaGVja2VkKQotewotICAgIC8vIFdpbklFIGRvZXMg
bm90IGFsbG93IHVubmFtZWQgcmFkaW8gYnV0dG9ucyB0byBldmVuIGJlIGNoZWNrZWQuCi0gICAg
aWYgKGNoZWNrZWQoKSA9PSBfY2hlY2tlZCB8fCAobV90eXBlID09IFJBRElPICYmIG5hbWUoKS5p
c0VtcHR5KCkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPICYm
IF9jaGVja2VkKQotICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhp
cywgbV9mb3JtKTsKLQotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2No
ZWNrZWQgPSBfY2hlY2tlZDsKLSAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkg
JiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgp
LT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLSAgICBvbkNoYW5nZSgp
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJvb2wg
X2luZGV0ZXJtaW5hdGUpCi17Ci0gICAgLy8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0ZXJt
aW5hdGUuCi0gICAgaWYgKG1fdHlwZSAhPSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkgPT0g
X2luZGV0ZXJtaW5hdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5kZXRlcm1pbmF0ZSA9
IF9pbmRldGVybWluYXRlOwotCi0gICAgc2V0Q2hhbmdlZCgpOwotCi0gICAgaWYgKHJlbmRlcmVy
KCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVt
ZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxl
bWVudEltcGwgKnNvdXJjZSkKLXsKLSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAqc291
cmNlRWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KHNvdXJj
ZSk7Ci0KLSAgICBtX3ZhbHVlID0gc291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQg
PSBzb3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0gc291cmNlRWxl
bS0+bV9pbmRldGVybWluYXRlOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6
OnZhbHVlKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdmFsdWUgPSBtX3ZhbHVlOwotCi0gICAg
Ly8gSXQncyBpbXBvcnRhbnQgKm5vdCogdG8gZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1
dGUgZm9yIGZpbGUgaW5wdXRzLAotICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBhIG1h
bGljaW91cyB3ZWIgcGFnZSB0byB1cGxvYWQgZmlsZXMgYnkgc2V0dGluZyB0aGUKLSAgICAvLyB2
YWx1ZSBhdHRyaWJ1dGUgaW4gbWFya3VwLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiBtX3R5
cGUgIT0gRklMRSkKLSAgICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLQot
ICAgIC8vIElmIG5vIGF0dHJpYnV0ZSBleGlzdHMsIHRoZW4ganVzdCB1c2UgIm9uIiBvciAiIiBi
YXNlZCBvZmYgdGhlIGNoZWNrZWQoKSBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLSAgICBpZiAodmFs
dWUuaXNOdWxsKCkgJiYgKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pKQot
ICAgICAgICByZXR1cm4gRE9NU3RyaW5nKGNoZWNrZWQoKSA/ICJvbiIgOiAiIik7Ci0KLSAgICBy
ZXR1cm4gdmFsdWU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWVX
aXRoRGVmYXVsdCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHYgPSB2YWx1ZSgpOwotICAgIGlm
ICh2LmlzRW1wdHkoKSkgewotICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAg
Y2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAgICB2ID0gcmVzZXRCdXR0b25EZWZhdWx0TGFiZWwo
KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0g
ICAgICAgICAgICAgICAgdiA9IHN1Ym1pdEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBjYXNlIEhJ
RERFTjoKLSAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBjYXNlIElTSU5ERVg6
Ci0gICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAg
ICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAg
ICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0K
LSAgICByZXR1cm4gdjsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWUo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBpZiAobV90eXBlID09IEZJTEUpIHJldHVy
bjsKLQotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBpZiAoc3RvcmVz
VmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7
Ci0gICAgICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9t
RWxlbWVudCgpOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
c2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9
IHRydWU7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgZGlz
cGF0Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi1ib29sIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpIGNvbnN0
Ci17Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAg
IGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBISURERU46
Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2Ug
UkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lk
KiBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBs
ICpldnQpCi17Ci0gICAgLy8gcHJldmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJlIHVz
ZWQgdG8gcmV2ZXJzZSB0aGUgYXV0b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJl
LgotICAgIC8vIFRoaXMgcmVzdWx0IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhl
ICJ1bmRvIiBpbiBwb3N0RGlzcGF0Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCi0gICAg
dm9pZCogcmVzdWx0ID0gMDsgCi0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBl
ID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNr
RXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0
dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAg
ICAgICAvLyBBcyBhIHdheSB0byBzdG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdlIHdl
cmUgdW5jaGVja2VkLCAxIGlmIHdlIHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCi0gICAgICAgICAg
ICAvLyBpbmRldGVybWluYXRlLgotICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkgewot
ICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDI7Ci0gICAgICAgICAgICAgICAgc2V0
SW5kZXRlcm1pbmF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIGlmIChjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikw
eDE7Ci0gICAgICAgICAgICAgICAgc2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBz
dG9yZSB0aGUgY3VycmVudCBzZWxlY3RlZCByYWRpbyBvYmplY3QuCi0gICAgICAgICAgICBpZiAo
bmFtZSgpLmlzRW1wdHkoKSB8fCBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7
IC8vIFVubmFtZWQgcmFkaW8gYnV0dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1dHRv
bnMganVzdCBzdGF5IGNoZWNrZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGxlYXJuIHRvIHdvcmsgd2l0aG91dCBhIGZvcm0uCi0KLSAgICAgICAgICAgIC8v
IFdlIHJlYWxseSB3YW50IHJhZGlvIGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGku
ZS4sIHRvIGhhdmUgc29tZXRoaW5nIGNoZWNrZWQuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUg
aWYgbm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMgYWN0
aW9uIHRvIGJlICJ1bmRvbmUiLCBzaW5jZQotICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21lIG9i
amVjdCBpbiB0aGUgcmFkaW8gZ3JvdXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgotICAgICAg
ICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCktPmNo
ZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAg
ICAgICBpZiAoY3VyclJhZGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlv
IGJ1dHRvbiBzZWxlY3RlZCB0aGF0IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1bHQg
ZmllbGQgYW5kIHJlZiBpdCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUg
ZGVzdHJveWVkLgotICAgICAgICAgICAgICAgIGN1cnJSYWRpby0+cmVmKCk7Ci0gICAgICAgICAg
ICAgICAgcmVzdWx0ID0gY3VyclJhZGlvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0
Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZl
bnRJbXBsICpldnQsIHZvaWQqIGRhdGEpCi17Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1gg
fHwgbV90eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgp
ID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4o
ZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7
Ci0gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBjaGVja2luZyB3ZSBkaWQgaW4gcHJlRGlzcGF0
Y2guCi0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZh
dWx0SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gKHZvaWQqKTB4MikK
LSAgICAgICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICAgICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWQoZGF0YSk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkgewotICAgICAgICAgICAgSFRNTElucHV0
RWxlbWVudEltcGwqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihk
YXRhKTsKLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRl
ZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5h
bCBzZWxlY3RlZCByYWRpbyBidXR0b24gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgLy8g
TWFrZSBzdXJlIGl0IGlzIHN0aWxsIGEgcmFkaW8gYnV0dG9uIGFuZCBvbmx5IGRvIHRoZSByZXN0
b3JhdGlvbiBpZiBpdCBzdGlsbAotICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gb3VyIGdy
b3VwLgotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+Zm9ybSgpID09IGZvcm0oKSAmJiBpbnB1
dC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gT2ssIHRoZSBvbGQgcmFkaW8gYnV0dG9uIGlzIHN0aWxsIGlu
IG91ciBmb3JtIGFuZCBpbiBvdXIgZ3JvdXAgYW5kIGlzIHN0aWxsIGEgCi0gICAgICAgICAgICAg
ICAgICAgIC8vIHJhZGlvIGJ1dHRvbiwgc28gaXQncyBzYWZlIHRvIHJlc3RvcmUgc2VsZWN0aW9u
IHRvIGl0LgotICAgICAgICAgICAgICAgICAgICBpbnB1dC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC0+ZGVyZWYo
KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVm
YXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlID09IElN
QUdFICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAm
JiBtX3JlbmRlcikgewotICAgICAgICAvLyByZWNvcmQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB3
aGVuIHdlIGdldCB0aGUgRE9NQWN0aXZhdGUgZXZlbnQKLSAgICAgICAgTW91c2VFdmVudEltcGwg
Km1lID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpOwotICAgICAgICBpbnQgb2Zm
c2V0WCwgb2Zmc2V0WTsKLSAgICAgICAgbV9yZW5kZXItPmFic29sdXRlUG9zaXRpb24ob2Zmc2V0
WCxvZmZzZXRZKTsKLSAgICAgICAgeFBvcyA9IG1lLT5jbGllbnRYKCktb2Zmc2V0WDsKLSAgICAg
ICAgeVBvcyA9IG1lLT5jbGllbnRZKCktb2Zmc2V0WTsKLQotCW1lLT5zZXREZWZhdWx0SGFuZGxl
ZCgpOwotICAgIH0KLQotICAgIC8vIERPTUFjdGl2YXRlIGV2ZW50cyBjYXVzZSB0aGUgaW5wdXQg
dG8gYmUgImFjdGl2YXRlZCIgLSBpbiB0aGUgY2FzZSBvZiBpbWFnZSBhbmQgc3VibWl0IGlucHV0
cywgdGhpcyBtZWFucwotICAgIC8vIGFjdHVhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm0uIEZvciBy
ZXNldCBpbnB1dHMsIHRoZSBmb3JtIGlzIHJlc2V0LiBUaGVzZSBldmVudHMgYXJlIHNlbnQgd2hl
biB0aGUgdXNlciBjbGlja3MKLSAgICAvLyBvbiB0aGUgZWxlbWVudCwgb3IgcHJlc3NlcyBlbnRl
ciB3aGlsZSBpdCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQuIEphdmFjc3JpcHQgY29kZSB3aXNoaW5n
IHRvIGFjdGl2YXRlIHRoZSBlbGVtZW50Ci0gICAgLy8gbXVzdCBkaXNwYXRjaCBhIERPTUFjdGl2
YXRlIGV2ZW50IC0gYSBjbGljayBldmVudCB3aWxsIG5vdCBkbyB0aGUgam9iLgotICAgIGlmIChl
dnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0g
SU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQpIHsKLSAgICAgICAg
ICAgIGlmICghbV9mb3JtKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlm
IChtX3R5cGUgPT0gUkVTRVQpCi0gICAgICAgICAgICAgICAgbV9mb3JtLT5yZXNldCgpOwotICAg
ICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIGlmICghbV9mb3JtLT5wcmVwYXJlU3VibWl0KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgeFBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHlQb3MgPSAwOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0KLQotICAgIC8vIFVzZSBrZXkgcHJlc3Mg
ZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBv
biBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZl
bnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXByZXNzRXZlbnQgJiYgZXZ0LT5pc0tleWJv
YXJkRXZlbnQoKSkgewotICAgICAgICBib29sIGNsaWNrRWxlbWVudCA9IGZhbHNlOwotICAgICAg
ICBib29sIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSBmYWxzZTsKLQotICAgICAgICBET01TdHJp
bmcga2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRp
ZmllcigpOwotCi0gICAgICAgIGlmIChrZXkgPT0gIlUrMDAwMDIwIikgewotICAgICAgICAgICAg
c3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAg
ICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAg
ICAgICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRl
IG1vdXNlIGNsaWNrIGZvciBzcGFjZWJhciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0g
ICAgICAgICAgICAgICAgICAgIC8vIFRoZSBBcHBLaXQgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHNv
bWUsIGJ1dCBub3QgYWxsLCBvZiB0aGVtLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1l
bnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIFJBRElPOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiB1bnNlbGVjdGVkIHJhZGlv
IGlzIHRhYmJlZCBpbnRvIChiZWNhdXNlIHRoZSBlbnRpcmUgZ3JvdXAgaGFzIG5vdGhpbmcKLSAg
ICAgICAgICAgICAgICAgICAgLy8gY2hlY2tlZCwgb3IgYmVjYXVzZSBvZiBzb21lIGV4cGxpY2l0
IC5mb2N1cygpIGNhbGwpLCB0aGVuIGFsbG93IHNwYWNlIHRvIGNoZWNrIGl0LgotICAgICAgICAg
ICAgICAgICAgICBpZiAoIWNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNr
RWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAg
ICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsK
LSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNL
Qk9YOgotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2Ug
SVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAg
IGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGlj
ayBvbiB0aGUgZGVmYXVsdCBmb3JtIGJ1dHRvbiBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9m
IGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBG
SUxFOgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBS
RVNFVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAg
Ly8gU2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVt
ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7IC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBlbnRlciBvbiBhIHJh
ZGlvIGJ1dHRvbi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3R5
cGUgPT0gUkFESU8gJiYgKGtleSA9PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09ICJM
ZWZ0IiB8fCBrZXkgPT0gIlJpZ2h0IikpIHsKLSAgICAgICAgICAgIC8vIExlZnQgYW5kIHVwIG1l
YW4gInByZXZpb3VzIHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBSaWdodCBhbmQgZG93
biBtZWFuICJuZXh0IHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBUZXN0ZWQgaW4gV2lu
SUUsIGFuZCBldmVuIGZvciBSVEwsIGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0
dG9uIChhbmQgc28gbW92ZXMKLSAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVtcyBz
dHJhbmdlLCBidXQgd2UnbGwgbWF0Y2ggaXQuCi0gICAgICAgICAgICBib29sIGZvcndhcmQgPSAo
a2V5ID09ICJEb3duIiB8fCBrZXkgPT0gIlJpZ2h0Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIC8vIFdlIGNhbiBvbmx5IHN0YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhl
IGZvcm0gaGFzbid0IGJlZW4gZGVtb3RlZCB0byBhIGxlYWYgYmVjYXVzZQotICAgICAgICAgICAg
Ly8gb2YgbWFsZm9ybWVkIEhUTUwuCi0gICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7Ci0g
ICAgICAgICAgICB3aGlsZSAoKG4gPSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6
IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpKSkgewotICAgICAgICAgICAgICAgIC8vIE9uY2Ug
d2UgZW5jb3VudGVyIGEgZm9ybSBlbGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCi0gICAg
ICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBMb29r
IGZvciBtb3JlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05h
bWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBs
KiBlbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAg
ICAgICAgICAgICBpZiAoZWx0LT5mb3JtKCkgIT0gbV9mb3JtKQotICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0
VGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlu
cHV0RWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5w
dXRFbHQtPm5hbWUoKSA9PSBuYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnB1dEVsdC0+aXNGb2N1c2FibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
cHV0RWx0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdl
dERvY3VtZW50KCktPnNldEZvY3VzTm9kZShpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW5wdXRFbHQtPmNsaWNrKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGNsaWNrRWxlbWVudCkgewotICAgICAgICAgICAgY2xpY2soZmFsc2UpOwot
ICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2UgaWYg
KGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0t
PnN1Ym1pdENsaWNrKCk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVs
dEV2ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0Vk
aXRhYmxlKCkKLXsKLSAgICByZXR1cm4gKChtX3R5cGUgPT0gVEVYVCkgfHwgKG1fdHlwZSA9PSBQ
QVNTV09SRCkgfHwKLSAgICAgICAgICAgIChtX3R5cGUgPT0gU0VBUkNIKSB8fCAobV90eXBlID09
IElTSU5ERVgpIHx8IChtX3R5cGUgPT0gRklMRSkpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAg
IHJldHVybiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElu
cHV0RWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRE
ZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
dmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1
bHRDaGVja2VkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShjaGVja2VkQXR0
cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRD
aGVja2VkKGJvb2wgZGVmYXVsdENoZWNrZWQpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoZWNrZWRB
dHRyLCBkZWZhdWx0Q2hlY2tlZCA/ICIiIDogMCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6YWNjZXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFj
Y2VwdEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0QXR0ciwgdmFs
dWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShh
bGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjph
bHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldE1heExlbmd0aChpbnQgX21heExlbmd0aCkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUobWF4bGVuZ3RoQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9tYXhMZW5ndGgpKTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihfc2l6ZSkpOwotfQotCi1E
T01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShzcmNBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6dXNlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKHVzZW1hcEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRV
c2VNYXAoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodXNlbWFw
QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMYWJlbEVsZW1l
bnRJbXBsOjpIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhU
TUxFbGVtZW50SW1wbChsYWJlbFRhZywgZG9jKQotewotfQotCi1IVE1MTGFiZWxFbGVtZW50SW1w
bDo6fkhUTUxMYWJlbEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGFiZWxFbGVtZW50
SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9p
ZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2
ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRWxlbWVudEltcGwg
KkhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgRE9NU3RyaW5nIGZv
cm1FbGVtZW50SWQgPSBnZXRBdHRyaWJ1dGUoZm9yQXR0cik7Ci0gICAgaWYgKGZvcm1FbGVtZW50
SWQuaXNOdWxsKCkpIHsKLSAgICAgICAgLy8gU2VhcmNoIGNoaWxkcmVuIG9mIHRoZSBsYWJlbCBl
bGVtZW50IGZvciBhIGZvcm0gZWxlbWVudC4KLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSB0aGlz
OwotICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSkg
ewotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAg
ICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1w
bCAqPihub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNHZW5lcmljRm9ybUVs
ZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3JtRWxl
bWVudElkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdldERvY3Vt
ZW50KCktPmdldEVsZW1lbnRCeUlkKGZvcm1FbGVtZW50SWQpOwotfQotCi12b2lkIEhUTUxMYWJl
bEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0g
Zm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1M
TGFiZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkK
LXsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCk7Ci0gICAgaWYgKGVs
ZW1lbnQpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50
KTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm0o
KQotewotICAgIGZvciAoTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7IHAgIT0gMDsgcCA9IHAt
PnBhcmVudE5vZGUoKSkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAg
ICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwot
ICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1l
bnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNj
ZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEFjY2Vzc0tl
eShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlB
dHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aHRtbEZv
cigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShmb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpIVE1MTGVnZW5kRWxlbWVudEltcGwo
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi06IEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsKGxlZ2VuZFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MTGVnZW5kRWxl
bWVudEltcGw6On5IVE1MTGVnZW5kRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVybiBu
ZXcgKGFyZW5hKSBSZW5kZXJMZWdlbmQodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5k
RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAibGVnZW5kIjsKLX0KLQot
RE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxMZWdlbmRFbGVtZW50SW1wbDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNldEFs
aWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0
ciwgdmFsdWUpOwotfQotCi1FbGVtZW50SW1wbCAqSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpmb3Jt
RWxlbWVudCgpCi17Ci0gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGZpZWxkc2V0IGJlbG9uZ2lu
ZyB0byB0aGlzIGxlZ2VuZC4KLSAgICBOb2RlSW1wbCAqZmllbGRzZXQgPSBwYXJlbnROb2RlKCk7
Ci0gICAgd2hpbGUgKGZpZWxkc2V0ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNldFRh
ZykpCi0gICAgICAgIGZpZWxkc2V0ID0gZmllbGRzZXQtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAo
IWZpZWxkc2V0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgZmlyc3QgZm9ybSBl
bGVtZW50IGluc2lkZSB0aGUgZmllbGRzZXQuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBjYXJl
IGFib3V0IHRhYmluZGV4PwotICAgIE5vZGVJbXBsICpub2RlID0gZmllbGRzZXQ7Ci0gICAgd2hp
bGUgKChub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShmaWVsZHNldCkpKSB7Ci0gICAgICAg
IGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50SW1w
bCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAg
ICAgICAgIGlmICghZWxlbWVudC0+aGFzTG9jYWxOYW1lKGxlZ2VuZFRhZykgJiYgZWxlbWVudC0+
aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZv
cm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExl
Z2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQot
ewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAg
IGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50
SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHNlbGVjdFRhZywgZG9jLCBmKSwgbV9vcHRpb25zKDAp
Ci17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RF
bGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKHRhZ05hbWUsIGRvYywgZiksIG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1fb3B0aW9ucyA9IDA7
Ci0gICAgbV9tdWx0aXBsZSA9IGZhbHNlOwotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7
Ci0gICAgLy8gMCBtZWFucyBpbnZhbGlkIChpLmUuIG5vdCBzZXQpCi0gICAgbV9zaXplID0gMDsK
LSAgICBtX21pbndpZHRoID0gMDsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp+SFRNTFNl
bGVjdEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQo
KS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotICAgIGlmIChtX29wdGlvbnMpIHsK
LSAgICAgICAgbV9vcHRpb25zLT5kZXRhY2goKTsKLSAgICAgICAgbV9vcHRpb25zLT5kZXJlZigp
OwotICAgIH0KLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0
IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUo
KSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdO
YW1lKG9wdGdyb3VwVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShoclRhZykgfHwKLSAgICAg
ICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotdm9pZCBIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYg
KGhhc0NoYW5nZWRDaGlsZCgpICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PGto
dG1sOjpSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwot
ICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2gg
KTsKLX0KLQotCi1ET01TdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gKG1fbXVsdGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qt
b25lIik7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNlbGVjdGVkSW5kZXgoKSBj
b25zdAotewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2Vs
ZWN0ZWQKLSAgICB1aW50IG8gPSAwOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXRl
bXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbzsK
LSAgICAgICAgICAgIG8rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBRX0FTU0VSVChtX211bHRp
cGxlKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpz
ZXRTZWxlY3RlZEluZGV4KCBpbnQgIGluZGV4ICkKLXsKLSAgICAvLyBkZXNlbGVjdCBhbGwgb3Ro
ZXIgb3B0aW9ucyBhbmQgc2VsZWN0IG9ubHkgdGhlIG5ldyBvbmUKLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpbnQgbGlzdEluZGV4Owot
ICAgIGZvciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4IDwgaW50KGl0ZW1zLnNpemUoKSk7IGxp
c3RJbmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1w
bCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgfQotICAgIGxp
c3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsKLSAgICBpZiAobGlzdEluZGV4ID49
IDApCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xp
c3RJbmRleF0pLT5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19
Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50
IGxlbiA9IDA7Ci0gICAgdWludCBpOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkr
KykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAg
ICAgICAgICAgbGVuKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjphZGQoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1l
bnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgUmVmUHRyPEhUTUxF
bGVtZW50SW1wbD4gcHJvdGVjdE5ld0NoaWxkKGVsZW1lbnQpOyAvLyBtYWtlIHN1cmUgdGhlIGVs
ZW1lbnQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYg
KCFlbGVtZW50IHx8ICEoZWxlbWVudC0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVu
dC0+aGFzTG9jYWxOYW1lKGhyVGFnKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGluc2VydEJl
Zm9yZShlbGVtZW50LCBiZWZvcmUsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXhjZXB0aW9u
Y29kZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpyZW1vdmUoIGludCBpbmRleCApCi17Ci0gICAgaW50IGV4Y2VwdGlvbmNv
ZGUgPSAwOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7Ci0K
LSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAg
ICBpZihsaXN0SW5kZXggPCAwIHx8IGluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAgICAg
ICByZXR1cm47IC8vICMjIyB3aGF0IHNob3VsZCB3ZSBkbyA/IHJlbW92ZSB0aGUgbGFzdCBpdGVt
PwotCi0gICAgTm9kZUltcGwgKml0ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgIGl0ZW0tPnJl
ZigpOwotICAgIHJlbW92ZUNoaWxkKGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOwotICAgIGl0ZW0tPmRl
cmVmKCk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0
ZW1zKCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkKLXsK
LSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAg
ICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8
SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+
dmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIERPTVN0cmluZygiIik7Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewot
ICAgIGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIGZpbmQgdGhl
IG9wdGlvbiB3aXRoIHZhbHVlKCkgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcgotICAgIC8v
IGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICBRTWVtQXJyYXk8SFRNTEVs
ZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxO
YW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRl
bXNbaV0pLT52YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
T3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNldFNlbGVjdGVkKHRydWUpOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjpzdGF0ZSgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0g
bGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0KLSAgICBRQ2hhciBz
dGF0ZUNoYXJzW2xdOwotICAgIAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspCi0gICAg
ICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxI
VE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAg
ICBzdGF0ZUNoYXJzW2ldID0gJ1gnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZUNo
YXJzW2ldID0gJy4nOwotICAgIFFTdHJpbmcgc3RhdGUoc3RhdGVDaGFycywgbCk7Ci0KLSAgICBy
ZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyBzdGF0ZTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmX3N0
YXRlcykKLXsKLSAgICBRU3RyaW5nIF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpmaW5kTWF0Y2hpbmdTdGF0ZShfc3RhdGVzKTsKLSAgICBpZiAoX3N0YXRlLmlzTnVsbCgpKSBy
ZXR1cm47Ci0KLSAgICByZWNhbGNMaXN0SXRlbXMoKTsKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBf
c3RhdGU7Ci0gICAgaWYoIXN0YXRlLmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gnKSAm
JiAhbV9tdWx0aXBsZSkgewotICAgICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4gaW4g
cmVzdG9yZVN0YXRlISIpOwotICAgICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0IHRo
aXMgb3BlcmF0aW9uLiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgotICAgICAgICAvL3N0
YXRlWzBdID0gJ1gnOwotICAgIH0KLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotCi0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgIGZv
cihpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG9l
ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAg
ICAgICAgb2UtPnNldFNlbGVjdGVkKHN0YXRlW2ldID09ICdYJyk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4
Y2VwdGlvbmNvZGUgKTsKLSAgICBpZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJlY2Fs
Y0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUlt
cGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1
bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9s
ZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAg
ICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1w
bCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2Rl
KTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMo
KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlv
bmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICBzZXRDaGFuZ2VkKHRy
dWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0
SXRlbXMoKTsKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxk
KG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSBrTWF4KGF0dHItPnZhbHVlKCku
dG9JbnQoKSwgMSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7
Ci0gICAgICAgIG1fbWlud2lkdGggPSBrTWF4KCBhdHRyLT52YWx1ZSgpLnRvSW50KCksIDAgKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpIHsKLSAgICAgICAg
bV9tdWx0aXBsZSA9ICghYXR0ci0+aXNOdWxsKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3IgdGhl
IG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50
TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZl
bnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRl
clN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2VsZWN0KHRo
aXMpOwotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9y
bURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICBib29sIHN1Y2Nlc3NmdWwg
PSBmYWxzZTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRl
bXMoKTsKLQotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBp
KyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewot
ICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxI
VE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9u
LT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0
YShuYW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9
IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAjIyMgdGhp
cyBjYXNlIHNob3VsZCBub3QgaGFwcGVuLiBtYWtlIHN1cmUgdGhhdCB3ZSBzZWxlY3QgdGhlIGZp
cnN0IG9wdGlvbgotICAgIC8vIGluIGFueSBjYXNlLiBvdGhlcndpc2Ugd2UgaGF2ZSBubyBjb25z
aXN0ZW5jeSB3aXRoIHRoZSBET00gaW50ZXJmYWNlLiBGSVhNRSEKLSAgICAvLyB3ZSByZXR1cm4g
dGhlIGZpcnN0IG9uZSBpZiBpdCB3YXMgYSBjb21ib2JveCBzZWxlY3QKLSAgICBpZiAoIXN1Y2Nl
c3NmdWwgJiYgIW1fbXVsdGlwbGUgJiYgbV9zaXplIDw9IDEgJiYgaXRlbXMuc2l6ZSgpICYmCi0g
ICAgICAgIChpdGVtc1swXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpKSB7Ci0gICAgICAgIEhU
TUxPcHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnRJbXBsKj4oaXRlbXNbMF0pOwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVsbCgp
KQotICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+
dGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkp
OwotICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vz
c2Z1bDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5kZXgo
aW50IG9wdGlvbkluZGV4KSBjb25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9u
SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlu
dCBsaXN0SW5kZXggPSAwOwotICAgIGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAoOwot
ICAgICAgICAgb3B0aW9uSW5kZXgyIDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5kZXgy
IDw9IG9wdGlvbkluZGV4OwotICAgICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlwbyEK
LSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQot
ICAgICAgICAgICAgb3B0aW9uSW5kZXgyKys7Ci0gICAgfQotICAgIGxpc3RJbmRleC0tOwotICAg
IHJldHVybiBsaXN0SW5kZXg7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxpc3RU
b09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxF
bGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAg
fHwgbGlzdEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0
SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0g
ICAgaW50IG9wdGlvbkluZGV4ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291
bnRpbmcgT1BUR1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgaW50IGk7Ci0g
ICAgZm9yIChpID0gMDsgaSA8IGxpc3RJbmRleDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0t
Pmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAg
ICByZXR1cm4gb3B0aW9uSW5kZXg7Ci19Ci0KLS8vIEZJWE1FIDQxOTc5OTc6IHRoaXMgbWV0aG9k
IGlzIHVzZWQgYnkgdGhlIHB1YmxpYyBBUEkgLVtET01IVE1MU2VsZWN0RWxlbWVudCBvcHRpb25z
XSwgYnV0IGFsd2F5cyByZXR1cm5zCi0vLyBhbiBlbXB0eSBsaXN0LgotSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zKCkKLXsKLSAgICBpZiAo
IW1fb3B0aW9ucykgewotICAgICAgICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xsZWN0
aW9uSW1wbCh0aGlzKTsKLSAgICAgICAgbV9vcHRpb25zLT5yZWYoKTsKLSAgICB9Ci0gICAgcmV0
dXJuIG1fb3B0aW9uczsKLX0KLQotLy8gRklYTUU6IERlbGV0ZSBvbmNlIHRoZSBhYm92ZSBmdW5j
dGlvbiBpcyB3b3JraW5nIHdlbGwgZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4KLVJlZlB0cjxIVE1M
Q29sbGVjdGlvbkltcGw+IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uc0hUTUxDb2xsZWN0
aW9uKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxD
b2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OlNFTEVDVF9PUFRJT05TKSk7
Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNMaXN0SXRlbXMoKQotewot
ICAgIE5vZGVJbXBsKiBjdXJyZW50ID0gZmlyc3RDaGlsZCgpOwotICAgIG1fbGlzdEl0ZW1zLnJl
c2l6ZSgwKTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIGZvdW5kU2VsZWN0ZWQgPSAwOwot
ICAgIHdoaWxlKGN1cnJlbnQpIHsKLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0
Z3JvdXBUYWcpICYmIGN1cnJlbnQtPmZpcnN0Q2hpbGQoKSkgewotICAgICAgICAgICAgLy8gIyMj
IHdoYXQgaWYgb3B0Z3JvdXAgY29udGFpbnMganVzdCBjb21tZW50cz8gZG9uJ3Qgd2FudCBvbmUg
b2Ygbm8gb3B0aW9ucyBpbiBpdC4uLgotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1f
bGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1z
LnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAg
ICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBt
X2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9s
aXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJ
bXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVs
dGlwbGUgJiYgbV9zaXplIDw9IDEpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0g
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAg
ICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBlbHNlIGlmIChmb3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAgICAg
ICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3Vy
cmVudC0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6
ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJ
dGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsK
LSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCAqcGFyZW50ID0gY3VycmVudC0+cGFyZW50Tm9k
ZSgpOwotICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAg
aWYgKCFjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMpCi0gICAgICAg
ICAgICAgICAgY3VycmVudCA9IHBhcmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQotICAg
IH0KLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMo
KTsKLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKTsK
LX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygpCi17
Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9u
c0NoYW5nZWQodHJ1ZSk7Ci0gICAgc2V0Q2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRl
bXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAg
ICBib29sIHNlbGVjdGVkID0gKCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlz
TnVsbCgpKTsKLSAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotICAg
ICAgICB9Ci0gICAgfQotICAgIGlmICggbV9yZW5kZXIgKQotICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0gICAg
c2V0Q2hhbmdlZCggdHJ1ZSApOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bm90
aWZ5T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwg
Ym9vbCBzZWxlY3RlZCkKLXsKLSAgICBpZiAoc2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUpIHsKLSAg
ICAgICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKLSAgICAgICAgUU1lbUFycmF5PEhU
TUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgICAgIHVpbnQgaTsKLSAg
ICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBp
ZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9
IChpdGVtc1tpXSA9PSBzZWxlY3RlZE9wdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYg
KG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRlcikt
PnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudElt
cGwgKmV2dCkKLXsKLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGlu
ZyBzaW11bGF0ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBw
cm9wZXIgc2VuZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5cGUo
KSA9PSBrZXlwcmVzc0V2ZW50KSB7Ci0gICAgCi0gICAgICAgIGlmICghbV9mb3JtIHx8ICFtX3Jl
bmRlciB8fCAhZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgICAgIERPTVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50
SW1wbCAqPihldnQpLT5rZXlJZGVudGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoa2V5
ID09ICJFbnRlciIpIHsKLSAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAg
ICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRv
QW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6c2V0TXVsdGlwbGUoYm9vbCBtdWx0aXBsZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobXVs
dGlwbGVBdHRyLCBtdWx0aXBsZSA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpzZXRTaXplKGludCBzaXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwg
UVN0cmluZzo6bnVtYmVyKHNpemUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1M
S2V5Z2VuRWxlbWVudEltcGw6OkhUTUxLZXlnZW5FbGVtZW50SW1wbChEb2N1bWVudEltcGwqIGRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCogZikKLSAgICA6IEhUTUxTZWxlY3RFbGVtZW50SW1wbChr
ZXlnZW5UYWcsIGRvYywgZikKLXsKLSAgICBRU3RyaW5nTGlzdCBrZXlzID0gS1NTTEtleUdlbjo6
c3VwcG9ydGVkS2V5U2l6ZXMoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpID0g
a2V5cy5iZWdpbigpOyBpICE9IGtleXMuZW5kKCk7ICsraSkgewotICAgICAgICBIVE1MT3B0aW9u
RWxlbWVudEltcGwqIG8gPSBuZXcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKGRvYywgZm9ybSgpKTsK
LSAgICAgICAgYWRkQ2hpbGQobyk7Ci0gICAgICAgIG8tPmFkZENoaWxkKG5ldyBUZXh0SW1wbChk
b2MsIERPTVN0cmluZygqaSkpKTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MS2V5Z2VuRWxl
bWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAia2V5Z2VuIjsKLX0KLQotdm9p
ZCBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGFsbGVuZ2VBdHRy
KQotICAgICAgICBtX2NoYWxsZW5nZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGtleXR5cGVBdHRyKQotICAgICAgICBtX2tleVR5cGUgPSBhdHRyLT52YWx1
ZSgpOwotICAgIGVsc2UKLSAgICAgICAgLy8gc2tpcCBIVE1MU2VsZWN0RWxlbWVudEltcGwgcGFy
c2luZyEKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6YXBwZW5kRm9y
bURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICAvLyBPbmx5
IFJTQSBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgotICAgIGlmICghbV9rZXlUeXBlLmlzTnVs
bCgpICYmICFlcXVhbElnbm9yaW5nQ2FzZShtX2tleVR5cGUsICJyc2EiKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIFFTdHJpbmcgdmFsdWUgPSBLU1NMS2V5R2VuOjpzaWduZWRQdWJsaWNL
ZXlBbmRDaGFsbGVuZ2VTdHJpbmcoc2VsZWN0ZWRJbmRleCgpLCBtX2NoYWxsZW5nZS5xc3RyaW5n
KCksIGdldERvY3VtZW50KCktPmZyYW1lKCktPmJhc2VVUkwoKSk7Ci0gICAgaWYgKHZhbHVlLmlz
TnVsbCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5k
RGF0YShuYW1lKCksIHZhbHVlLnV0ZjgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OkhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAg
IDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0Z3JvdXBUYWcsIGRvYywgZikKLXsKLX0K
LQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6On5IVE1MT3B0R3JvdXBFbGVtZW50SW1wbCgpCi17
Ci19Ci0KLWJvb2wgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJvcHRncm91cCI7Ci19Ci0KLU5vZGVJ
bXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5l
d0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAg
Tm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZv
cmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICggIWV4Y2VwdGlv
bmNvZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3Vs
dDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQg
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAg
aWYoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICBy
ZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJl
bW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewot
ICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3Zl
Q2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSAp
Ci0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUlt
cGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1
bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4
Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1Nl
bGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCogSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBy
ZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsK
LSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0
cik7Ci0gICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsOjpyZWNhbGNTZWxlY3RPcHRpb25zKCkKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0
ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFt
ZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAg
ICBpZiAoc2VsZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwq
PihzZWxlY3QpLT5zZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShsYWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpzZXRMYWJl
bChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsYWJlbEF0dHIs
IHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0aW9uRWxlbWVudElt
cGw6OkhUTUxPcHRpb25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVt
ZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGlvblRhZywg
ZG9jLCBmKQotewotICAgIG1fc2VsZWN0ZWQgPSBmYWxzZTsKLX0KLQotYm9vbCBIVE1MT3B0aW9u
RWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAg
IHJldHVybiAib3B0aW9uIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6
dGV4dCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHRleHQ7Ci0KLSAgICAvLyBXaW5JRSBkb2Vz
IG5vdCB1c2UgdGhlIGxhYmVsIGF0dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdub3JlIGl0
LgotICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUo
KSkgewotICAgICAgICBET01TdHJpbmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwot
ICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0g
ICAgfQotCi0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzLT5maXJzdENoaWxkKCk7Ci0gICAg
d2hpbGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RF
IHx8IG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFKQotICAgICAgICAg
ICAgdGV4dCArPSBuLT5ub2RlVmFsdWUoKTsKLSAgICAgICAgLy8gc2tpcCBzY3JpcHQgY29udGVu
dAotICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgpICYmIG4tPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjpzY3JpcHRUYWcpKQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dFNpYmxpbmco
dGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2Rl
KHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB0ZXh0OwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0VGV4dChjb25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhjZXB0aW9u
KQotewotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVyZSdz
IGV4YWN0bHkgMSBjaGlsZCBub2RlLCBhbmQgaXQncyBhIHRleHQgbm9kZS4KLSAgICBOb2RlSW1w
bCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1RleHRO
b2RlKCkgJiYgIWNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFRl
eHRJbXBsICo+KGNoaWxkKS0+c2V0RGF0YSh0ZXh0LCBleGNlcHRpb24pOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGlsZChuZXcg
VGV4dEltcGwoZ2V0RG9jdW1lbnQoKSwgdGV4dCksIGV4Y2VwdGlvbik7Ci19Ci0KLWludCBIVE1M
T3B0aW9uRWxlbWVudEltcGw6OmluZGV4KCkgY29uc3QKLXsKLSAgICAvLyBMZXQncyBkbyB0aGlz
IGR5bmFtaWNhbGx5LiBNaWdodCBiZSBhIGJpdCBzbG93LCBidXQgd2UncmUgc3VyZQotICAgIC8v
IHdlIHdvbid0IGZvcmdldCB0byB1cGRhdGUgYSBtZW1iZXIgdmFyaWFibGUgaW4gc29tZSBjYXNl
cy4uLgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0g
ICAgaWYgKHNlbGVjdCkgewotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBzZWxlY3QtPmxpc3RJdGVtcygpOwotICAgICAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7
Ci0gICAgICAgIGludCBvcHRpb25JbmRleCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkg
PCBsOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnRJbXBsKj4oaXRlbXNbaV0pID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBv
cHRpb25JbmRleDsKLSAgICAgICAgICAgICAgICBvcHRpb25JbmRleCsrOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0SW5kZXgoaW50LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAgICBleGNlcHRp
b24gPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAvLyAj
IyMKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBz
ZWxlY3RlZEF0dHIpCi0gICAgICAgIG1fc2VsZWN0ZWQgPSAoIWF0dHItPmlzTnVsbCgpKTsKLSAg
ICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKQotICAgICAgICBtX3ZhbHVlID0g
YXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRp
b25FbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIGlmICggIW1fdmFsdWUuaXNOdWxs
KCkgKQotICAgICAgICByZXR1cm4gbV92YWx1ZTsKLSAgICAvLyBVc2UgdGhlIHRleHQgaWYgdGhl
IHZhbHVlIHdhc24ndCBzZXQuCi0gICAgcmV0dXJuIHRleHQoKS5xc3RyaW5nKCkuc3RyaXBXaGl0
ZVNwYWNlKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVl
KTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFNlbGVjdGVkKGJvb2wgX3Nl
bGVjdGVkKQotewotICAgIGlmKG1fc2VsZWN0ZWQgPT0gX3NlbGVjdGVkKQotICAgICAgICByZXR1
cm47Ci0gICAgbV9zZWxlY3RlZCA9IF9zZWxlY3RlZDsKLSAgICBIVE1MU2VsZWN0RWxlbWVudElt
cGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgIGlmIChzZWxlY3QpCi0gICAgICAgIHNlbGVj
dC0+bm90aWZ5T3B0aW9uU2VsZWN0ZWQodGhpcyxfc2VsZWN0ZWQpOwotfQotCi12b2lkIEhUTUxP
cHRpb25FbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICBpZiAoc2VsZWN0KQotICAgICAgIHNl
bGVjdC0+Y2hpbGRyZW5DaGFuZ2VkKCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbCAqSFRN
TE9wdGlvbkVsZW1lbnRJbXBsOjpnZXRTZWxlY3QoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpz
ZWxlY3QgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNU
YWdOYW1lKHNlbGVjdFRhZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgp
OwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3Qp
OwotfQotCi1ib29sIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6ZGVmYXVsdFNlbGVjdGVkKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVsbCgpOwot
fQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0RGVmYXVsdFNlbGVjdGVkKGJvb2wg
YikKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQot
RE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUobGFiZWxBdHRyKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVu
dEltcGw6OnNldExhYmVsKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKGxhYmVsQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpIVE1MVGV4dEFyZWFFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKHRleHRhcmVhVGFnLCBkb2MsIGYpLCBtX3ZhbHVlSXNWYWxpZChmYWxzZSksIG1fdmFs
dWVNYXRjaGVzUmVuZGVyZXIoZmFsc2UpCi17Ci0gICAgLy8gRFREIHJlcXVpcmVzIHJvd3MgJiBj
b2xzIGJlIHNwZWNpZmllZCwgYnV0IHdlIHdpbGwgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHRz
Ci0gICAgbV9yb3dzID0gMjsKLSAgICBtX2NvbHMgPSAyMDsKLSAgICBtX3dyYXAgPSB0YV9WaXJ0
dWFsOwotfQotCi1IVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6fkhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rl
ck1haW50YWluc1N0YXRlKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAidGV4dGFyZWEiOwotfQotCi1RU3Ry
aW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIC8vIE1ha2Ugc3Vy
ZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnN0YXRlKCkgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7Ci19Ci0KLXZvaWQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQot
ewotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1h
dGNoaW5nU3RhdGUoc3RhdGVzKTsKLSAgICBpZiAoc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLSAg
ICBzZXREZWZhdWx0VmFsdWUoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSk7Ci0gICAgLy8g
dGhlIGNsb3NlKCkgaW4gdGhlIHJlbmRlcnRyZWUgd2lsbCB0YWtlIGNhcmUgb2YgdHJhbnNmZXJy
aW5nIGRlZmF1bHR2YWx1ZSB0byAndmFsdWUnCi19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3Rh
cnQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpz
ZWxlY3Rpb25FbmQoKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uRW5kKCk7Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlv
blN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQp
OwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQoaW50
IGVuZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRl
eHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZvaWQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0g
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4obV9yZW5kZXIpLT5zZWxlY3QoKTsK
LX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50
IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nh
c3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwg
ZW5kKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2Vk
KCkKLXsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUoKSk7Ci19Ci0gICAgCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJ
bXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcm93c0F0dHIpIHsKLSAgICAg
ICAgbV9yb3dzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMzsK
LSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVk
c0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGNvbHNBdHRyKSB7Ci0gICAgICAgIG1fY29scyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZh
bHVlKCkudG9JbnQoKSA6IDYwOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAg
IHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gd3JhcEF0dHIpIHsKLSAgICAgICAgLy8gdmlydHVhbCAvIHBo
eXNpY2FsIGlzIE5ldHNjYXBlIGV4dGVuc2lvbiBvZiBIVE1MIDMuMCwgbm93IGRlcHJlY2F0ZWQK
LSAgICAgICAgLy8gc29mdC8gaGFyZCAvIG9mZiBpcyByZWNvbW1lbmRhdGlvbiBmb3IgSFRNTCA0
IGV4dGVuc2lvbiBieSBJRSBhbmQgTlMgNAotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
YXR0ci0+dmFsdWUoKSwgInZpcnR1YWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1
ZSgpLCAic29mdCIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFfVmlydHVhbDsKLSAgICAgICAg
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInBoeXNpY2FsIikgfHwg
ZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImhhcmQiKSkKLSAgICAgICAgICAgIG1f
d3JhcCA9IHRhX1BoeXNpY2FsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShh
dHRyLT52YWx1ZSgpLCAib24iICkpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9QaHlzaWNhbDsK
LSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIp
KQotICAgICAgICAgICAgbV93cmFwID0gdGFfTm9XcmFwOwotICAgICAgICBpZiAocmVuZGVyZXIo
KSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxj
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAg
ICAgICAvLyBpZ25vcmUgZm9yIHRoZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxF
dmVudExpc3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hh
bmdlRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAq
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVu
YSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJU
ZXh0QXJlYSh0aGlzKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXBwZW5k
Rm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCkKLXsKLSAgICBpZiAobmFtZSgp
LmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgp
LCB2YWx1ZSgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6cmVzZXQoKQotewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KLQot
dm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dXBkYXRlVmFsdWUoKQotewotICAgIGlmICgg
IW1fdmFsdWVJc1ZhbGlkICkgewotICAgICAgICBpZiAoIG1fcmVuZGVyICkgewotICAgICAgICAg
ICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4oIG1fcmVuZGVyICktPnRl
eHQoKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1
ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBkZWZhdWx0VmFsdWUo
KS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICAgICAgbV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAgIH0KLX0KLQot
RE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp2YWx1ZSgpCi17Ci0gICAgdXBkYXRl
VmFsdWUoKTsKLSAgICByZXR1cm4gbV92YWx1ZS5pc051bGwoKSA/IERPTVN0cmluZygiIikgOiBt
X3ZhbHVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZS5xc3RyaW5nKCk7Ci0g
ICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIG1fdmFsdWVJc1ZhbGlkID0g
dHJ1ZTsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgIC8vIEZJWE1FOiBGb3JjZSByZWxvYWQgZnJvbSByZW5kZXJlciwgYXMgcmVu
ZGVyZXIgbWF5IGhhdmUgbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MuCi0gICAgbV92YWx1ZUlzVmFs
aWQgPSBmYWxzZTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi0KLURPTVN0cmluZyBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkKLXsKLSAgICBET01TdHJpbmcgdmFs
ID0gIiI7Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNvbW1lbnRzIC0ganVzdCBncmFiIHRoZSB0ZXh0
IG5vZGVzCi0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gZmlyc3RDaGlsZCgpOyBuOyBu
ID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAg
ICAgICAgIHZhbCArPSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KG4pLT5kYXRhKCk7Ci0gICAgCi0g
ICAgaWYgKHZhbFswXSA9PSAnXHInICYmIHZhbFsxXSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9
IHZhbC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwyKTsKLSAgICB9IGVsc2UgaWYgKHZh
bFswXSA9PSAnXHInIHx8IHZhbFswXSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9IHZhbC5jb3B5
KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOwot
fQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3Qg
RE9NU3RyaW5nICZkZWZhdWx0VmFsdWUpCi17Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNvbW1lbnRz
IC0gcmVtb3ZlIGFsbCB0aGUgdGV4dCBub2RlcyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggb25lCi0g
ICAgUVB0ckxpc3Q8Tm9kZUltcGw+IHRvUmVtb3ZlOwotICAgIE5vZGVJbXBsICpuOwotICAgIGZv
ciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlm
IChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQobik7Ci0gICAg
UVB0ckxpc3RJdGVyYXRvcjxOb2RlSW1wbD4gaXQodG9SZW1vdmUpOwotICAgIGludCBleGNlcHRp
b25jb2RlID0gMDsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KSB7Ci0gICAgICAgIE5v
ZGVJbXBsICpuID0gaXQuY3VycmVudCgpOwotICAgICAgICBuLT5yZWYoKTsKLSAgICAgICAgcmVt
b3ZlQ2hpbGQobiwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgIG4tPmRlcmVmKCk7Ci0gICAgfQot
ICAgIGluc2VydEJlZm9yZShnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZShkZWZhdWx0VmFs
dWUpLGZpcnN0Q2hpbGQoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZh
bHVlKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6aXNFZGl0YWJsZSgpCi17
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFj
Y2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgZm9jdXMoKTsKLX0K
LQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBtX3ZhbHVl
SXNWYWxpZCA9IHRydWU7Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgp
OwotICAgIHVwZGF0ZVZhbHVlKCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6
OmRldGFjaCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwot
ICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OnNldENvbHMoaW50IGNvbHMpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNBdHRyLCBR
U3RyaW5nOjpudW1iZXIoY29scykpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBs
OjpzZXRSb3dzKGludCByb3dzKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgUVN0cmlu
Zzo6bnVtYmVyKHJvd3MpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSXNJbmRl
eEVsZW1lbnRJbXBsOjpIVE1MSXNJbmRleEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBI
VE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTElucHV0RWxlbWVudEltcGwoaXNpbmRl
eFRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFRFWFQ7Ci0gICAgbV9uYW1lID0gImlzaW5k
ZXgiOwotfQotCi12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmli
dXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9
PSBwcm9tcHRBdHRyKQotCXNldFZhbHVlKGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UKLSAgICAg
ICAgLy8gZG9uJ3QgY2FsbCBIVE1MSW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZSBo
ZXJlLCBhcyBpdCB3b3VsZAotICAgICAgICAvLyBhY2NlcHQgYXR0cmlidXRlcyB0aGlzIGVsZW1l
bnQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MSXNJbmRleEVs
ZW1lbnRJbXBsOjpwcm9tcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUocHJv
bXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6c2V0UHJvbXB0KGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHByb21wdEF0dHIsIHZh
bHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11bnNpZ25lZCBIVE1MT3B0aW9uc0Nv
bGxlY3Rpb25JbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50
ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6
c2V0TGVuZ3RoKHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVk
LgotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6aXRlbSh1bnNpZ25l
ZCBpbmRleCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAgIHJldHVy
biAwOwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6bmFtZWRJdGVt
KGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVu
dGVkLgotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZvcm1EYXRh
TGlzdDo6Rm9ybURhdGFMaXN0KFFUZXh0Q29kZWMgKmMpCi0gICAgOiBtX2NvZGVjKGMpCi17Ci19
Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpCi17
Ci0gICAgbV9saXN0LmFwcGVuZChzKTsKLX0KLQogdm9pZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZFN0
cmluZyhjb25zdCBRU3RyaW5nICZzKQogewogICAgIFFDU3RyaW5nIGNzdHIgPSBmaXhMaW5lQnJl
YWtzKG1fY29kZWMtPmZyb21Vbmljb2RlKHMsIHRydWUpKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5591</attachid>
            <date>2006-01-10 00:58:49 -0800</date>
            <delta_ts>2006-01-10 00:58:49 -0800</delta_ts>
            <desc>patch (2 of 3) splitting html_formimpl.* into multiple classes.</desc>
            <filename>form2.patch</filename>
            <type>text/plain</type>
            <size>383774</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL2h0bWwvaHRtbGZhY3RvcnkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0
bWwvaHRtbGZhY3RvcnkuY3BwCShyZXZpc2lvbiAxMTk3OCkKKysrIGtodG1sL2h0bWwvaHRtbGZh
Y3RvcnkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAiaHRt
bC9odG1sX2Jsb2NraW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9jYW52YXNpbXBsLmgiCiAj
aW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9m
b3JtaW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9oZWFkaW1wbC5oIgogI2luY2x1ZGUgImh0
bWwvaHRtbF9pbWFnZWltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfbGlzdGltcGwuaCIKQEAg
LTM2LDYgKzM1LDE4IEBACiAjaW5jbHVkZSAiaHRtbC9odG1sX3RhYmxlaW1wbC5oIgogI2luY2x1
ZGUgImh0bWwvaHRtbF9vYmplY3RpbXBsLmgiCiAKKyNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnRJ
bXBsLmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1M
SXNJbmRleEVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiSFRNTEZpZWxkU2V0RWxlbWVudEltcGwu
aCIKKyNpbmNsdWRlICJIVE1MTGFiZWxFbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxMZWdl
bmRFbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxCdXR0b25FbGVtZW50SW1wbC5oIgorI2lu
Y2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiSFRNTFNlbGVjdEVsZW1lbnRJbXBsLmgiCisjaW5jbHVk
ZSAiSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCIKKwogI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hN
YXAuaD4KIAogbmFtZXNwYWNlIERPTQpJbmRleDoga2h0bWwvaHRtbC9IVE1MT3B0aW9uRWxlbWVu
dEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9odG1sL0hUTUxPcHRpb25FbGVtZW50SW1wbC5o
CShyZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0bWwvSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFy
cyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2
aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxs
ZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCBBcHBsZSBDb21wdXRl
ciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDY1MSArMjIsMjAgQEAKICAqIEJvc3Rv
biwgTUEgMDIxMTEtMTMwNywgVVNBLgogICoKICAqLwotI2lmbmRlZiBIVE1MX0ZPUk1JTVBMX0gK
LSNkZWZpbmUgSFRNTF9GT1JNSU1QTF9ICisjaWZuZGVmIEhUTUxfSFRNTE9wdGlvbkVsZW1lbnRJ
bXBsX0gKKyNkZWZpbmUgSFRNTF9IVE1MT3B0aW9uRWxlbWVudEltcGxfSAogCi0jaW5jbHVkZSAi
aHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX21pc2NpbXBsLmgi
CisjaW5jbHVkZSAiSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCIKIAotI2luY2x1ZGUgPHFw
dHJ2ZWN0b3IuaD4KLSNpbmNsdWRlIDxxbWVtYXJyYXkuaD4KLSNpbmNsdWRlIDxreG1sY29yZS9I
YXNoTWFwLmg+Ci0KLWNsYXNzIEtIVE1MVmlldzsKLWNsYXNzIFFUZXh0Q29kZWM7Ci0KLW5hbWVz
cGFjZSBraHRtbAotewotICAgIGNsYXNzIEZvcm1EYXRhOwotICAgIGNsYXNzIFJlbmRlckZvcm1F
bGVtZW50OwotICAgIGNsYXNzIFJlbmRlclRleHRBcmVhOworbmFtZXNwYWNlIGtodG1sIHsKICAg
ICBjbGFzcyBSZW5kZXJTZWxlY3Q7Ci0gICAgY2xhc3MgUmVuZGVyTGluZUVkaXQ7Ci0gICAgY2xh
c3MgUmVuZGVyRmlsZUJ1dHRvbjsKLSAgICBjbGFzcyBSZW5kZXJTbGlkZXI7CiB9CiAKIG5hbWVz
cGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7Ci1jbGFzcyBGb3JtRGF0YUxpc3Q7Ci1jbGFz
cyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsKLWNs
YXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTEltYWdlRWxlbWVudEltcGw7Ci1j
bGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGw7Ci1jbGFz
cyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCi17Ci1wdWJs
aWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmly
dHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVz
IGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0K
LSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0KLQotICAg
IHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9j
dW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotIAotICAg
IFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1lbnRzKCk7Ci0gICAgaW50IGxlbmd0aCgp
IGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUoKSBjb25zdCB7IHJldHVybiBtX2VuY3R5
cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9N
U3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZGFyeTsgfQotICAgIHZvaWQg
c2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBhdXRvQ29tcGxldGUo
KSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdm9p
ZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICopOwotICAg
IHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0g
ICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKik7Ci0gICAg
dm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICopOwotCi0gICAgYm9v
bCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJtaXQoYm9vbCBhY3RpdmF0ZVN1Ym1pdEJ1
dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2b2lkIHNldE1hbGZvcm1l
ZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9IG1hbGZvcm1lZDsgfQotICAgIHZpcnR1
YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1fbWFsZm9ybWVkOyB9Ci0gICAgCi0gICAg
dmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0Owot
ICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAgICBib29sIGZvcm1Xb3VsZEhhdmVTZWN1
cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKTsKLQotICAgIERPTVN0cmluZyBuYW1l
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERP
TVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHRDaGFyc2V0
KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY3Rpb24oKSBjb25zdDsKLSAg
ICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgbWV0
aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICYpOwotCi0g
ICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0IERP
TVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkxOG5EYXRhKCk7Ci0KLSAgICBmcmllbmQg
Y2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUNvbGxlY3Rp
b25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBsOjpDb2xsZWN0aW9uSW5mbyAqY29sbGVj
dGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsPiBm
b3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1MSW1hZ2VFbGVtZW50SW1wbD4gaW1nRWxl
bWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAgIERPTVN0cmluZyBtX3RhcmdldDsKLSAg
ICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0cmluZyBtX2JvdW5kYXJ5OwotICAgIERP
TVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9vbCBtX3Bvc3QgOiAxOwotICAgIGJvb2wg
bV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRvY29tcGxldGUgOiAxOwotICAgIGJvb2wg
bV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5nc3VibWl0IDogMTsKLSAgICBib29sIG1f
aW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1lZCA6IDE7Ci0gICAgCi1wcml2YXRlOgot
ICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICBib29sIGZvcm1E
YXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQotICAgIHVuc2lnbmVkIGZvcm1FbGVtZW50
SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0KLSAgICBET01TdHJpbmcgb2xk
TmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBj
bGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVy
Rm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChj
b25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1F
bGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBj
b25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1By
aW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1wbCAq
Zm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdHlwZSgp
IGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRyb2woKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuICFk
aXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFw
cGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAg
IHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wgZGVlcCk7Ci0gICAgdmlydHVhbCB2
b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0
KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAgICB2b2lkIG9uQ2hhbmdlKCk7Ci0KLSAg
ICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREaXNhYmxlZChib29sIF9kaXNh
YmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBp
c01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxl
KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGJvb2wgcmVhZE9ubHkoKSBjb25zdCB7
IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBzZXRSZWFkT25seShib29sIF9yZWFkT25s
eSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAg
ICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0
IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNHZW5lcmljRm9ybUVsZW1l
bnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0
b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLyoKLSAgICAgKiBvdmVycmlkZSBp
biBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNvZGVkIG5hbWU9dmFsdWUgcGFpcgotICAg
ICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJuIHRydWUgZm9yIGEgc3VjY2Vzc2Z1bCBj
b250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgYXBw
ZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAg
IHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUo
KTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpOwot
Ci0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Qg
eyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZhdGVkU3VibWl0KGJv
b2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFRh
YkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICpnZXRG
b3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICptX2Zvcm07Ci0gICAgYm9v
bCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVhZE9ubHk6IDE7Ci0gICAgYm9vbCBtX2lu
aXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCdXR0b25F
bGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGlj
OgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1F
bGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxCdXR0b25FbGVtZW50SW1wbCgp
OwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAgIFNVQk1JVCwKLSAgICAgICAgUkVTRVQs
Ci0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0Owot
ICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxlKik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmly
dHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1
YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIHZpcnR1
YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0gCi0KLSAgICB2
aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldEFj
dGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFj
dGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIERP
TVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51bSAgbV90eXBlIDogMjsKLSAgICBib29s
ICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAgIG1fYWN0aXZlU3VibWl0IDogMTsKLX07
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEZpZWxkU2V0RWxlbWVudEltcGwg
OiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1M
RmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1w
bCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCk7Ci0gICAg
Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAzOyB9Ci0gICAg
dmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICB2
aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGtodG1s
OjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5k
ZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLX07Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGwgOiBwdWJs
aWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6
OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRmlsZUJ1dHRv
bjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0gICAgZnJpZW5k
IGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1YmxpYzoKLSAgICAvLyBkbyBub3QgY2hh
bmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVtIHsKLSAgICAgICAgVEVYVCwKLSAgICAg
ICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0gICAgICAgIENIRUNLQk9YLAotICAgICAg
ICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAgICBSRVNFVCwKLSAgICAgICAgRklMRSwK
LSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwKLSAgICAgICAgQlVUVE9OCi0gICAgICAg
ICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsKLQotICAgIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAg
SFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB2aXJ0dWFsIH5I
VE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBI
VE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVz
Rm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVy
biAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGlucHV0VHlw
ZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0K
LSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gY2hlY2tlZCgp
OyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGlu
ZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHRCdXR0b24oKSBjb25zdCB7IHJldHVy
biBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCB8fCBtX3R5cGUgPT0gQlVUVE9O
OyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5
cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hl
Y2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29sKTsKLSAgICBib29sIGluZGV0ZXJtaW5h
dGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5hdGU7IH0KLSAgICB2b2lkIHNldEluZGV0
ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4
TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLSAgICBET01T
dHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VHlwZShjb25zdCBET01TdHJpbmcmIHQp
OwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25z
dCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0
OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcgJik7Ci0g
ICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRj
aGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3Zh
bHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIG1haW50YWlu
c1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NXT1JEOyB9Ci0gICAgdmlydHVhbCBRU3Ry
aW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAm
KTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigpOwotCi0gICAgaW50IHNlbGVjdGlvblN0
YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3Rh
cnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxl
Y3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2
aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMgPSBmYWxzZSwgYm9vbCBzaG93
UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJv
b2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9w
ZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIGF0
dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5kZXJT
dHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQg
ZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYs
IGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNv
bnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKTsKLQotICAgIHR5cGVFbnVt
IGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQotICAgIHZvaWQgc2V0SW5wdXRU
eXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7
Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlwZT1pbWFnZSB3YXMgY2xpY2tlZC4KLSAg
ICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBvczsgfQotICAgIGludCBjbGlja1koKSBj
b25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQqIHByZURpc3BhdGNoRXZl
bnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNo
RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKTsKLSAgICB2aXJ0dWFsIHZv
aWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCBib29s
IGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBhbHRUZXh0KCkgY29uc3Q7Ci0gICAgCi0g
ICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0
OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7IHJldHVybiBtX21heFJlc3VsdHM7IH0K
LQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1
bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAgCi0gICAgYm9vbCBkZWZhdWx0Q2hlY2tl
ZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbCk7Ci0KLSAgICBET01T
dHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNj
ZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0
OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5n
IGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBET01TdHJpbmcgc3JjKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXRNYXhMZW5n
dGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAoKSBjb25zdDsKLSAgICB2b2lkIHNldFVz
ZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIHN0b3Jlc1Zh
bHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9u
YW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGludCAgICAgICB4UG9zOwotICAgIHNo
b3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAgbV9zaXplOwotICAgIHNob3J0ICAgICB5
UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0czsKLQotICAgIEhUTUxJbWFnZUxvYWRl
ciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVtIG1fdHlwZSA6IDQ7Ci0gICAgYm9vbCBt
X2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0Q2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBt
X3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1faW5kZXRlcm1pbmF0ZSA6IDE7Ci0g
ICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29sIG1fYWN0aXZlU3VibWl0IDogMTsKLSAg
ICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBib29sIG1fdmFsdWVNYXRjaGVzUmVuZGVy
ZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MTGFiZWxFbGVt
ZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MTGFi
ZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTExhYmVs
RWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyBy
ZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAq
YXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55
RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZm9ybSBlbGVtZW50IHRoaXMgbGFiZWwg
aXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQo
KTsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0oKTsKLQotICAgIERPTVN0cmluZyBh
Y2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0SHRtbEZv
cihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIGZvY3VzKCk7Ci0KLSBwcml2YXRlOgot
ICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50SUQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxMZWdlbmRFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxMZWdlbmRFbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhU
TUxMZWdlbmRFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkg
Y29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBraHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5k
ZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVyU3R5bGUgKik7Ci0KLSAgICB2aXJ0dWFs
IERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0
aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlyc3Qg
Zm9ybSBlbGVtZW50IGluIHRoZSBsZWdlbmQncyBmaWVsZHNldCAKLSAgICAgKi8KLSAgICBFbGVt
ZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25z
dDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01T
dHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IERPTVN0cmluZyAm
KTsKLSAgICAKLSAgICB2b2lkIGZvY3VzKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyU2VsZWN0OwotCi1wdWJs
aWM6Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1
YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmID0gMCk7Ci0gICAgfkhUTUxTZWxlY3RFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5p
dCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA2OyB9
Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0K
LSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0
eWxlKCBTdHlsZUNoYW5nZSApOwotCi0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoIGludCBpbmRleCApOwotCi0gICAgdmlydHVhbCBib29s
IGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgaW50IGxlbmd0
aCgpIGNvbnN0OwotCi0gICAgaW50IG1pbldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9taW53aWR0
aDsgfQotCi0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgIGJv
b2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211bHRpcGxlOyB9Ci0KLSAgICB2b2lkIGFk
ZCAoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJbXBsICpiZWZvcmUsIGlu
dCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZvaWQgcmVtb3ZlICggaW50IGluZGV4ICk7Ci0KLSAg
ICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAm
KTsKLSAgICAKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICpvcHRpb25zKCk7Ci0gICAg
UmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gb3B0aW9uc0hUTUxDb2xsZWN0aW9uKCk7IC8vIEZJ
WE1FOiBSZW1vdmUgdGhpcyBhbmQgbWlncmF0ZSB0byBvcHRpb25zKCkuCi0KLSAgICB2aXJ0dWFs
IGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3Ry
aW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAm
KTsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdD
aGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0
dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBs
ICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAq
cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCggTm9k
ZUltcGwqIG5ld0NoaWxkICk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJl
bmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFs
IGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCk7Ci0KLSAgICAvLyBnZXQg
dGhlIGFjdHVhbCBsaXN0Ym94IGluZGV4IG9mIHRoZSBvcHRpb25JbmRleHRoIG9wdGlvbgotICAg
IGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0OwotICAgIC8vIHJl
dmVyc2Ugb2Ygb3B0aW9uVG9MaXN0SW5kZXggLSBnZXQgb3B0aW9uSW5kZXggZnJvbSBsaXN0Ym94
SW5kZXgKLSAgICBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3Q7Ci0K
LSAgICB2b2lkIHNldFJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGxpc3RJdGVtcygpIGNvbnN0Ci0gICAgIHsKLSAgICAgICAgIGlmIChtX3JlY2Fs
Y0xpc3RJdGVtcykgY29uc3RfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPih0aGlzKS0+cmVj
YWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgICByZXR1cm4gbV9saXN0SXRlbXM7Ci0gICAgIH0KLSAg
ICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIG5vdGlmeU9wdGlvblNlbGVjdGVkKEhU
TUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24sIGJvb2wgc2VsZWN0ZWQpOwotCi0g
ICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAg
IHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQot
ICAgIHZvaWQgc2V0TXVsdGlwbGUoYm9vbCk7Ci0KLSAgICB2b2lkIHNldFNpemUoaW50KTsKLQot
cHJpdmF0ZToKLSAgICB2b2lkIHJlY2FsY0xpc3RJdGVtcygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAg
bXV0YWJsZSBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gbV9saXN0SXRlbXM7Ci0gICAgSFRN
TE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqbV9vcHRpb25zOwotICAgIHNob3J0IG1fbWlud2lkdGg7
Ci0gICAgc2hvcnQgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0aXBsZTsKLSAgICBib29sIG1fcmVj
YWxjTGlzdEl0ZW1zOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MS2V5
Z2VuRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTFNlbGVjdEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6
Ci0gICAgSFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0
IHsgcmV0dXJuIDA7IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICAvLyAj
IyMgdGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MKLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJh
dGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAgIHZpcnR1YWwg
Ym9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLXByb3RlY3RlZDoKLSAg
ICBBdG9taWNTdHJpbmcgbV9jaGFsbGVuZ2U7Ci0gICAgQXRvbWljU3RyaW5nIG1fa2V5VHlwZTsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdEdyb3VwRWxlbWVudElt
cGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBI
VE1MT3B0R3JvdXBFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKCk7Ci0K
LSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJl
dHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Om9wdGlvblRhZykgfHwgbmV3Q2hp
bGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpoclRhZyk7IH0KLQotICAgIERPTVN0cmluZyB0eXBl
KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAK
LSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQs
IE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBO
b2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xk
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlbW92
ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZl
eGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYWRkQ2hpbGQoIE5vZGVJbXBs
KiBuZXdDaGlsZCApOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBw
ZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2b2lkIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsK
LQotICAgIERPTVN0cmluZyBsYWJlbCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TGFiZWwoY29uc3Qg
RE9NU3RyaW5nICYpOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDsKK2NsYXNzIEhUTUxGb3JtRWxlbWVudEltcGw7CitjbGFzcyBNYXBw
ZWRBdHRyaWJ1dGVJbXBsOwogCiBjbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKIHsKQEAgLTcxMiwxMjIgKzgxLDYgQEAgcHJvdGVj
dGVkOgogICAgIGJvb2wgbV9zZWxlY3RlZDsKIH07CiAKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4dEFyZWE7Ci0K
LXB1YmxpYzoKLSAgICBlbnVtIFdyYXBNZXRob2QgewotICAgICAgICB0YV9Ob1dyYXAsCi0gICAg
ICAgIHRhX1ZpcnR1YWwsCi0gICAgICAgIHRhX1BoeXNpY2FsCi0gICAgfTsKLQotICAgIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBs
ICpmID0gMCk7Ci0gICAgfkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGls
ZC0+aXNUZXh0Tm9kZSgpOyB9Ci0KLSAgICBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29s
czsgfQotICAgIGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICBXcmFw
TWV0aG9kIHdyYXAoKSBjb25zdCB7IHJldHVybiBtX3dyYXA7IH0KLQotICAgIHZpcnR1YWwgYm9v
bCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIERPTVN0cmlu
ZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJl
dHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2
b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFy
dCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLQotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3Rh
cnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxl
Y3QgKCAgKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLQotICAgIHZp
cnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBraHRt
bDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVu
ZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9p
ZCBkZXRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0
JiwgYm9vbCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0gICAgRE9NU3RyaW5nIHZhbHVl
KCk7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLSAgICBET01T
dHJpbmcgZGVmYXVsdFZhbHVlKCk7Ci0gICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9N
U3RyaW5nICZ2YWx1ZSk7Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsgbV92YWx1ZUlz
VmFsaWQgPSBmYWxzZTsgfQotICAgIHZvaWQgdXBkYXRlVmFsdWUoKTsKLQotICAgIGJvb2wgdmFs
dWVNYXRjaGVzUmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
OyB9Ci0gICAgdm9pZCBzZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpIHsgbV92YWx1ZU1hdGNoZXNS
ZW5kZXJlciA9IHRydWU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0gICAg
Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQp
OwotICAgIAotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFj
Y2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldENvbHMoaW50KTsKLQot
ICAgIHZvaWQgc2V0Um93cyhpbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1fcm93czsKLSAg
ICBpbnQgbV9jb2xzOwotICAgIFdyYXBNZXRob2QgbV93cmFwOwotICAgIFFTdHJpbmcgbV92YWx1
ZTsKLSAgICBib29sIG1fdmFsdWVJc1ZhbGlkOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5k
ZXJlcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElzSW5kZXhFbGVt
ZW50SW1wbCA6IHB1YmxpYyBIVE1MSW5wdXRFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhU
TUxJc0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudElt
cGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVu
dCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50
IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgRE9N
U3RyaW5nIHByb21wdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJvbXB0KGNvbnN0IERPTVN0cmlu
ZyAmKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3Byb21wdDsKLX07Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCA6IHB1Ymxp
YyBraHRtbDo6U2hhcmVkPEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw+Ci17Ci1wdWJsaWM6Ci0g
ICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbChIVE1MU2VsZWN0RWxlbWVudEltcGwgKmltcGwp
IDogbV9zZWxlY3QoaW1wbCkgeyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAg
ICB2b2lkIHNldExlbmd0aCh1bnNpZ25lZCk7Ci0gICAgTm9kZUltcGwgKml0ZW0odW5zaWduZWQg
aW5kZXgpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZu
YW1lKSBjb25zdDsKLQotICAgIHZvaWQgZGV0YWNoKCkgeyBtX3NlbGVjdCA9IDA7IH0KLQotcHJp
dmF0ZToKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKm1fc2VsZWN0OwotfTsKLQogfSAvL25h
bWVzcGFjZQogCiAjZW5kaWYKSW5kZXg6IGtodG1sL2h0bWwvSFRNTExhYmVsRWxlbWVudEltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTExhYmVsRWxlbWVudEltcGwuY3BwCShy
ZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0bWwvSFRNTExhYmVsRWxlbWVudEltcGwuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMg
S25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlz
dG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVy
IChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgQXBwbGUgQ29t
cHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBBcHBsZSBDb21w
dXRlciwgSW5jLgogICogICAgICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFw
QG55cG9wLmNvbSkKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNCwzNTQ1ICsyNCwxMDUgQEAKICAqCiAgKi8K
IAotI3VuZGVmIEZPUk1TX0RFQlVHCi0vLyNkZWZpbmUgRk9STVNfREVCVUcKLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9mb3JtaW1wbC5oIgotCi0jaW5jbHVkZSAi
a2h0bWx2aWV3LmgiCi0jaW5jbHVkZSAiTWFjRnJhbWUuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxf
ZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbF9pbWFnZWltcGwuaCIKLSNpbmNsdWRlICJr
aHRtbF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgIm1pc2MvZm9ybWRhdGEuaCIKLQotI2luY2x1ZGUg
ImRvbS9kb21fZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIK
LSNpbmNsdWRlICJjc3Nwcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5j
bHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwu
aCIKLSNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgImtodG1sX2V4dC5oIgot
Ci0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1
dHRvbi5oIgotI2luY2x1ZGUgInJlbmRlcl90aGVtZS5oIgotCi0jaW5jbHVkZSA8a2xvY2FsZS5o
PgotI2luY2x1ZGUgPHFmaWxlLmg+Ci0jaW5jbHVkZSA8cXRleHRjb2RlYy5oPgotCi0vLyBmb3Ig
a2V5Z2VuCi0jaW5jbHVkZSA8cXN0cmluZy5oPgotI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KLQot
I2luY2x1ZGUgPGFzc2VydC5oPgotCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci0KLW5hbWVzcGFj
ZSBET00gewotCi11c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKLXVzaW5nIG5hbWVzcGFjZSBI
VE1MTmFtZXM7Ci0KLXN0cnVjdCBGb3JtRGF0YUxpc3RJdGVtIHsKLSAgICBGb3JtRGF0YUxpc3RJ
dGVtKGNvbnN0IFFDU3RyaW5nICZkYXRhKSA6IG1fZGF0YShkYXRhKSB7IH0KLSAgICBGb3JtRGF0
YUxpc3RJdGVtKGNvbnN0IFFTdHJpbmcgJnBhdGgpIDogbV9wYXRoKHBhdGgpIHsgfQotCi0gICAg
UVN0cmluZyBtX3BhdGg7Ci0gICAgUUNTdHJpbmcgbV9kYXRhOwotfTsKLQotY2xhc3MgRm9ybURh
dGFMaXN0IHsKLXB1YmxpYzoKLSAgICBGb3JtRGF0YUxpc3QoUVRleHRDb2RlYyAqKTsKLQotICAg
IHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmlu
Zyh2YWx1ZS5xc3RyaW5nKCkpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmlu
ZyAma2V5LCBjb25zdCBRU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5
LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEo
Y29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IFFDU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBh
cHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2
b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGludCB2YWx1ZSkKLSAgICAgICAg
eyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyhRU3RyaW5nOjpudW1i
ZXIodmFsdWUpKTsgfQotICAgIHZvaWQgYXBwZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwg
Y29uc3QgRE9NU3RyaW5nICZmaWxlbmFtZSk7Ci0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRv
cjxGb3JtRGF0YUxpc3RJdGVtPiBiZWdpbigpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlz
dC5iZWdpbigpOyB9Ci0gICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRl
bT4gZW5kKCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gbV9saXN0LmVuZCgpOyB9Ci0KLXByaXZh
dGU6Ci0gICAgdm9pZCBhcHBlbmRTdHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpOwotICAgIHZvaWQg
YXBwZW5kU3RyaW5nKGNvbnN0IFFTdHJpbmcgJnMpOwotCi0gICAgUVRleHRDb2RlYyAqbV9jb2Rl
YzsKLSAgICBRVmFsdWVMaXN0PEZvcm1EYXRhTGlzdEl0ZW0+IG1fbGlzdDsKLX07Ci0KLUhUTUxG
b3JtRWxlbWVudEltcGw6OkhUTUxGb3JtRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0g
ICAgOiBIVE1MRWxlbWVudEltcGwoZm9ybVRhZywgZG9jKQotewotICAgIGNvbGxlY3Rpb25JbmZv
ID0gMDsKLSAgICBtX3Bvc3QgPSBmYWxzZTsKLSAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAg
IG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAgICBtX2luc3VibWl0ID0gZmFsc2U7Ci0gICAgbV9k
b2luZ3N1Ym1pdCA9IGZhbHNlOwotICAgIG1faW5yZXNldCA9IGZhbHNlOwotICAgIG1fZW5jdHlw
ZSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgIG1fYm91bmRhcnkg
PSAiLS0tLS0tLS0tLTB4S2hUbUxiT3VOZEFyWSI7Ci0gICAgbV9hY2NlcHRjaGFyc2V0ID0gIlVO
S05PV04iOwotICAgIG1fbWFsZm9ybWVkID0gZmFsc2U7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudElt
cGw6On5IVE1MRm9ybUVsZW1lbnRJbXBsKCkKLXsKLSAgICBkZWxldGUgY29sbGVjdGlvbkluZm87
Ci0gICAgCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgp
OyArK2kpCi0gICAgICAgIGZvcm1FbGVtZW50c1tpXS0+bV9mb3JtID0gMDsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgaW1nRWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBpbWdF
bGVtZW50c1tpXS0+bV9mb3JtID0gMDsKLX0KLQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6
OmZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKQotewot
ICAgIGlmICh1cmwuaXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAg
ICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSkuc3RhcnRz
V2l0aCgiaHR0cHM6IiwgZmFsc2UpOwotfQotCi0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6
YXR0YWNoKCkKLXsKLSAgICBIVE1MRWxlbWVudEltcGw6OmF0dGFjaCgpOwotCi0gICAgLy8gbm90
ZSB3ZSBkb24ndCBkZWFsIHdpdGggY2FsbGluZyBzZWN1cmVGb3JtUmVtb3ZlZCgpIG9uIGRldGFj
aCwgYmVjYXVzZSB0aGUgdGltaW5nCi0gICAgLy8gd2FzIHN1Y2ggdGhhdCBpdCBjbGVhcmVkIG91
ciBzdGF0ZSB0b28gZWFybHkKLSAgICBpZiAoZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24o
bV91cmwpKQotICAgICAgICBnZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsKLX0KLQot
dm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAg
aWYgKGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBs
ICpkb2N1bWVudCA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQo
KSk7Ci0JZG9jdW1lbnQtPmFkZE5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAg
SFRNTEVsZW1lbnRJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpOwotfQotCi12b2lkIEhUTUxG
b3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1
bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQg
PSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3Vt
ZW50LT5yZW1vdmVOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLSAgIAotICAgIEhUTUxF
bGVtZW50SW1wbDo6cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotfQotCi1pbnQgSFRNTEZvcm1FbGVt
ZW50SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICBpbnQgbGVuID0gMDsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkKLQlpZiAoZm9ybUVs
ZW1lbnRzW2ldLT5pc0VudW1lcmF0YWJsZSgpKQotCSAgICArK2xlbjsKLQotICAgIHJldHVybiBs
ZW47Ci19Ci0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzdWJtaXRDbGljaygpCi17Ci0g
ICAgYm9vbCBzdWJtaXRGb3VuZCA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIGlmIChmb3JtRWxlbWVudHNb
aV0tPmhhc0xvY2FsTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1l
bnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwgKj4oZm9y
bUVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LT5pc1N1Y2Nlc3NmdWxTdWJt
aXRCdXR0b24oKSAmJiBlbGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3Vi
bWl0Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsZW1lbnQtPmNsaWNrKGZhbHNlKTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LSAgICBpZiAoIXN1Ym1pdEZvdW5kKSAvLyBzdWJtaXQgdGhlIGZvcm0gd2l0aG91dCBhIHN1Ym1p
dCBvciBpbWFnZSBpbnB1dAotICAgICAgICBwcmVwYXJlU3VibWl0KCk7Ci19Ci0KLQotc3RhdGlj
IFFDU3RyaW5nIGVuY29kZUNTdHJpbmcoY29uc3QgUUNTdHJpbmcmIGUpCi17Ci0gICAgLy8gaHR0
cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQot
ICAgIC8vIHNhZmUgY2hhcmFjdGVycyBsaWtlIE5TIGhhbmRsZXMgdGhlbSBmb3IgY29tcGF0aWJp
bGl0eQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpzYWZlID0gIi0uXyoiOwotICAgIGludCBlbGVu
ID0gZS5sZW5ndGgoKTsKLSAgICBRQ1N0cmluZyBlbmNvZGVkKCggZWxlbitlLmNvbnRhaW5zKCAn
XG4nICkgKSozKzEpOwotICAgIGludCBlbmNsZW4gPSAwOwotCi0gICAgLy9RQ1N0cmluZyBvcmln
KGUuZGF0YSgpLCBlLnNpemUoKSk7Ci0KLSAgICBmb3IoaW50IHBvcyA9IDA7IHBvcyA8IGVsZW47
IHBvcysrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IGVbcG9zXTsKLQotICAgICAgICBp
ZiAoICgoIGMgPj0gJ0EnKSAmJiAoIGMgPD0gJ1onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49
ICdhJykgJiYgKCBjIDw9ICd6JykpIHx8Ci0gICAgICAgICAgICAgKCggYyA+PSAnMCcpICYmICgg
YyA8PSAnOScpKSB8fAotICAgICAgICAgICAgIChzdHJjaHIoc2FmZSwgYykpCi0gICAgICAgICAg
ICApCi0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGM7Ci0gICAgICAgIGVsc2UgaWYg
KCBjID09ICcgJyApCi0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcrJzsKLSAgICAg
ICAgZWxzZSBpZiAoIGMgPT0gJ1xuJyB8fCAoIGMgPT0gJ1xyJyAmJiBlW3BvcysxXSAhPSAnXG4n
ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAg
ICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtl
bmNsZW4rK10gPSAnRCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAg
ICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtl
bmNsZW4rK10gPSAnQSc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGMgIT0gJ1xyJyAp
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAg
ICAgICAgdW5zaWduZWQgaW50IGggPSBjIC8gMTY7Ci0gICAgICAgICAgICBoICs9IChoID4gOSkg
PyAoJ0EnIC0gMTApIDogJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBoOwot
Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbCA9IGMgJSAxNjsKLSAgICAgICAgICAgIGwgKz0g
KGwgPiA5KSA/ICgnQScgLSAxMCkgOiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisr
XSA9IGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnXDAnOwot
ICAgIGVuY29kZWQudHJ1bmNhdGUoZW5jbGVuKTsKLQotICAgIHJldHVybiBlbmNvZGVkOwotfQot
Ci0vLyBDaGFuZ2UgcGxhaW4gQ1IgYW5kIHBsYWluIExGIHRvIENSTEYgcGFpcnMuCi1zdGF0aWMg
UUNTdHJpbmcgZml4TGluZUJyZWFrcyhjb25zdCBRQ1N0cmluZyAmcykKLXsKLSAgICAvLyBDb21w
dXRlIHRoZSBsZW5ndGguCi0gICAgdW5zaWduZWQgbmV3TGVuID0gMDsKLSAgICBjb25zdCBjaGFy
ICpwID0gcy5kYXRhKCk7Ci0gICAgd2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKLSAgICAgICAgaWYg
KGMgPT0gJ1xyJykgewotICAgICAgICAgICAgLy8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ug
b2YgdHJhaWxpbmcgJ1wwJy4KLSAgICAgICAgICAgIGlmICgqcCAhPSAnXG4nKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gVHVybiBDUiBpbnRvIENSTEYuCi0gICAgICAgICAgICAgICAgbmV3TGVuICs9
IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7Ci0gICAg
ICAgICAgICAvLyBUdXJuIExGIGludG8gQ1JMRi4KLSAgICAgICAgICAgIG5ld0xlbiArPSAyOwot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTGVhdmUgb3RoZXIgY2hhcmFjdGVycyBh
bG9uZS4KLSAgICAgICAgICAgIG5ld0xlbiArPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlm
IChuZXdMZW4gPT0gcy5sZW5ndGgoKSkgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZy4KLSAgICBwID0gcy5kYXRhKCk7Ci0g
ICAgUUNTdHJpbmcgcmVzdWx0KG5ld0xlbiArIDEpOwotICAgIGNoYXIgKnEgPSByZXN1bHQuZGF0
YSgpOwotICAgIHdoaWxlIChjaGFyIGMgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicp
IHsKLSAgICAgICAgICAgIC8vIFNhZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5n
ICdcMCcuCi0gICAgICAgICAgICBpZiAoKnAgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8v
IFR1cm4gQ1IgaW50byBDUkxGLgotICAgICAgICAgICAgICAgICpxKysgPSAnXHInOwotICAgICAg
ICAgICAgICAgICpxKysgPSAnXG4nOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYg
KGMgPT0gJ1xuJykgewotICAgICAgICAgICAgLy8gVHVybiBMRiBpbnRvIENSTEYuCi0gICAgICAg
ICAgICAqcSsrID0gJ1xyJzsKLSAgICAgICAgICAgICpxKysgPSAnXG4nOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgLy8gTGVhdmUgb3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAg
ICAgICAgICpxKysgPSBjOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19
Ci0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtRGF0YShGb3JtRGF0YSAmZm9ybV9k
YXRhKSBjb25zdAotewotICAgIFFDU3RyaW5nIGVuY19zdHJpbmcgPSAiIjsgLy8gdXNlZCBmb3Ig
bm9uLW11bHRpcGFydCBkYXRhCi0KLSAgICAvLyBmaW5kIG91dCB0aGUgUVRleHRjb2RlYyB0byB1
c2UKLSAgICBRU3RyaW5nIHN0ciA9IG1fYWNjZXB0Y2hhcnNldC5xc3RyaW5nKCk7Ci0gICAgc3Ry
LnJlcGxhY2UoJywnLCAnICcpOwotICAgIFFTdHJpbmdMaXN0IGNoYXJzZXRzID0gUVN0cmluZ0xp
c3Q6OnNwbGl0KCcgJywgc3RyKTsKLSAgICBRVGV4dENvZGVjKiBjb2RlYyA9IDA7Ci0gICAgRnJh
bWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0
OjpJdGVyYXRvciBpdCA9IGNoYXJzZXRzLmJlZ2luKCk7IGl0ICE9IGNoYXJzZXRzLmVuZCgpOyAr
K2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgZW5jID0gKCppdCk7Ci0gICAgICAgIGlmIChlbmMuY29u
dGFpbnMoIlVOS05PV04iKSkgewotICAgICAgICAgICAgLy8gdXNlIHN0YW5kYXJkIGRvY3VtZW50
IGVuY29kaW5nCi0gICAgICAgICAgICBlbmMgPSAiSVNPLTg4NTktMSI7Ci0gICAgICAgICAgICBp
ZiAoZnJhbWUpCi0gICAgICAgICAgICAgICAgZW5jID0gZnJhbWUtPmVuY29kaW5nKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKChjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShlbmMu
bGF0aW4xKCkpKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghY29kZWMp
Ci0gICAgICAgIGNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JMb2NhbGUoKTsKLQotCi0gICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAg
ICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNb
aV07Ci0gICAgICAgIEZvcm1EYXRhTGlzdCBsc3QoY29kZWMpOwotCi0gICAgICAgIGlmICghY3Vy
cmVudC0+ZGlzYWJsZWQoKSAmJiBjdXJyZW50LT5hcHBlbmRGb3JtRGF0YShsc3QsIG1fbXVsdGlw
YXJ0KSkgewotICAgICAgICAgICAgZm9yIChRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0
YUxpc3RJdGVtPiBpdCA9IGxzdC5iZWdpbigpOyBpdCAhPSBsc3QuZW5kKCk7ICsraXQpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoIW1fbXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IGhhbmRsZSBJU0lOREVYIC8gPGlucHV0IG5hbWU9aXNpbmRleD4gc3BlY2lhbAotICAgICAgICAg
ICAgICAgICAgICAvLyBidXQgb25seSBpZiBpdHMgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAg
ICAgICAgICAgIGlmICggZW5jX3N0cmluZy5pc0VtcHR5KCkgJiYgKCppdCkubV9kYXRhID09ICJp
c2luZGV4IiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoICgqaXQpLm1fZGF0YSApOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYoIWVuY19zdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gJyYnOwotCi0gICAgICAgICAgICAgICAgICAg
ICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gIj0iOwotICAgICAgICAgICAgICAgICAgICAg
ICAgKytpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0
cmluZygoKml0KS5tX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAg
ICAgICAgICAgIFFDU3RyaW5nIGhzdHIoIi0tIik7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIg
Kz0gbV9ib3VuZGFyeS5xc3RyaW5nKCkubGF0aW4xKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhz
dHIgKz0gIlxyXG4iOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJDb250ZW50LURpc3Bv
c2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9
ICgqaXQpLm1fZGF0YS5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsK
LQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCB0eXBlIGlzIEZJTEUsIHRo
ZW4gd2UgYWxzbyBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGZp
bGVuYW1lCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5w
dXRUYWcpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50SW1wbCo+KGN1cnJlbnQpLT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6RklMRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAg
UVN0cmluZyBwYXRoID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50
KS0+dmFsdWUoKS5xc3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiBUaGlzIHdvbid0IHdvcmsgaWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgIiBtYXJrLAotICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gb3IgY29udHJvbCBjaGFyYWN0ZXJzIGxpa2UgQ1Igb3Ig
TEYuIFRoaXMgYWxzbyBkb2VzIHN0cmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRo
aW5ncyBpZiB0aGUgZmlsZW5hbWUgaW5jbHVkZXMgY2hhcmFjdGVycyB5b3UgY2FuJ3QgZW5jb2Rl
Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgd2Vic2l0ZSdzIGNoYXJhY3RlciBz
ZXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICI7IGZpbGVuYW1lPVwiIjsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gY29kZWMtPmZyb21Vbmljb2RlKHBhdGgubWlk
KHBhdGguZmluZFJldignLycpICsgMSksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAg
aHN0ciArPSAiXCIiOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmlu
ZyBtaW1lVHlwZSA9IGZyYW1lID8gTWFjKGZyYW1lKS0+bWltZVR5cGVGb3JGaWxlTmFtZShwYXRo
KSA6IFFTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUeXBl
LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJc
clxuQ29udGVudC1UeXBlOiAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3Ry
ICs9IG1pbWVUeXBlLmFzY2lpKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgaHN0ciArPSAiXHJcblxyXG4iOwotICAgICAgICAgICAgICAgICAgICArK2l0
OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBib2R5Ci0gICAgICAgICAgICAgICAg
ICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGhzdHIuZGF0YSgpLCBoc3RyLmxlbmd0aCgpKTsKLSAg
ICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybURhdGFMaXN0SXRlbSAmaXRlbSA9ICppdDsKLSAg
ICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFTaXplID0gaXRlbS5tX2RhdGEuc2l6ZSgpOwot
ICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNpemUgIT0gMCkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGl0ZW0ubV9kYXRhLCBkYXRhU2l6ZSAtIDEpOwot
ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXRlbS5tX3BhdGguaXNFbXB0eSgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZEZpbGUoaXRlbS5tX3BhdGgpOwot
ICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YSgiXHJcbiIsIDIpOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAg
aWYgKG1fbXVsdGlwYXJ0KQotICAgICAgICBlbmNfc3RyaW5nID0gKCItLSIgKyBtX2JvdW5kYXJ5
LnFzdHJpbmcoKSArICItLVxyXG4iKS5hc2NpaSgpOwotCi0gICAgZm9ybV9kYXRhLmFwcGVuZERh
dGEoZW5jX3N0cmluZy5kYXRhKCksIGVuY19zdHJpbmcubGVuZ3RoKCkpOwotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnBhcnNlRW5jdHlwZShjb25zdCBE
T01TdHJpbmcmIHR5cGUpCi17Ci0gICAgaWYodHlwZS5jb250YWlucygibXVsdGlwYXJ0IiwgZmFs
c2UpIHx8IHR5cGUuY29udGFpbnMoImZvcm0tZGF0YSIsIGZhbHNlKSkgewotICAgICAgICBtX2Vu
Y3R5cGUgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gdHJ1
ZTsKLSAgICB9IGVsc2UgaWYgKHR5cGUuY29udGFpbnMoInRleHQiLCBmYWxzZSkgfHwgdHlwZS5j
b250YWlucygicGxhaW4iLCBmYWxzZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gInRleHQvcGxh
aW4iOwotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgICAg
ICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjpzZXRCb3VuZGFyeSggY29uc3QgRE9NU3RyaW5nJiBib3VuZCApCi17Ci0gICAgbV9ib3Vu
ZGFyeSA9IGJvdW5kOwotfQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OnByZXBhcmVTdWJt
aXQoKQotewotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAg
aWYobV9pbnN1Ym1pdCB8fCAhZnJhbWUgfHwgZnJhbWUtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSkK
LSAgICAgICAgcmV0dXJuIG1faW5zdWJtaXQ7Ci0KLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLSAg
ICBtX2RvaW5nc3VibWl0ID0gZmFsc2U7Ci0KLSAgICBpZiAoIGRpc3BhdGNoSFRNTEV2ZW50KHN1
Ym1pdEV2ZW50LGZhbHNlLHRydWUpICYmICFtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgbV9kb2lu
Z3N1Ym1pdCA9IHRydWU7Ci0KLSAgICBtX2luc3VibWl0ID0gZmFsc2U7Ci0KLSAgICBpZiAoIG1f
ZG9pbmdzdWJtaXQgKQotICAgICAgICBzdWJtaXQodHJ1ZSk7Ci0KLSAgICByZXR1cm4gbV9kb2lu
Z3N1Ym1pdDsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzdWJtaXQoIGJvb2wgYWN0
aXZhdGVTdWJtaXRCdXR0b24gKQotewotICAgIEtIVE1MVmlldyAqdmlldyA9IGdldERvY3VtZW50
KCktPnZpZXcoKTsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwot
ICAgIGlmICghdmlldyB8fCAhZnJhbWUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGlmICggbV9pbnN1Ym1pdCApIHsKLSAgICAgICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLQotICAgIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSAwOwot
ICAgIGJvb2wgbmVlZEJ1dHRvbkFjdGl2YXRpb24gPSBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbjsJLy8g
ZG8gd2UgbmVlZCB0byBhY3RpdmF0ZSBhIHN1Ym1pdCBidXR0b24/Ci0gICAgCi0gICAgTWFjKGZy
YW1lKS0+Y2xlYXJSZWNvcmRlZEZvcm1WYWx1ZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbCogY3VycmVudCA9IGZvcm1FbGVtZW50c1tpXTsKLSAgICAgICAgLy8gT3Vy
IGFwcCBuZWVkcyB0byBnZXQgZm9ybSB2YWx1ZXMgZm9yIHBhc3N3b3JkIGZpZWxkcyBmb3IgZG9p
bmcgcGFzc3dvcmQgYXV0b2NvbXBsZXRlLAotICAgICAgICAvLyBzbyB3ZSBhcmUgbW9yZSBsZW5p
ZW50IGluIHB1c2hpbmcgdmFsdWVzLCBhbmQgbGV0IHRoZSBhcHAgZGVjaWRlIHdoYXQgdG8gc2F2
ZSB3aGVuLgotICAgICAgICBpZiAoY3VycmVudC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSkgewot
ICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwgKmlucHV0ID0gc3RhdGljX2Nhc3Q8SFRN
TElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChpbnB1dC0+aW5w
dXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlRFWFQKLSAgICAgICAgICAgICAgICB8
fCBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpQQVNTV09SRAot
ICAgICAgICAgICAgICAgIHx8IGlucHV0LT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hYyhmcmFtZSkt
PnJlY29yZEZvcm1WYWx1ZShpbnB1dC0+bmFtZSgpLnFzdHJpbmcoKSwgaW5wdXQtPnZhbHVlKCku
cXN0cmluZygpLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQtPnJlbmRlcmVyKCkg
JiYgaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpTRUFSQ0gpCi0g
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0Kj4oaW5wdXQtPnJl
bmRlcmVyKCkpLT5hZGRTZWFyY2hSZXN1bHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIGlmIChuZWVkQnV0dG9uQWN0aXZhdGlvbikgewotICAgICAgICAgICAgaWYgKGN1
cnJlbnQtPmlzQWN0aXZhdGVkU3VibWl0KCkpIHsKLSAgICAgICAgICAgICAgICBuZWVkQnV0dG9u
QWN0aXZhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFN1Y2Nlc3Nm
dWxTdWJtaXRCdXR0b24gPT0gMCAmJiBjdXJyZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24o
KSkgewotICAgICAgICAgICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IGN1cnJl
bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRv
bkFjdGl2YXRpb24gJiYgZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZp
cnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbi0+c2V0QWN0aXZhdGVkU3VibWl0KHRydWUpOwotICAg
IH0KLQotICAgIGlmICghbV9wb3N0KQotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAg
IAotICAgIEZvcm1EYXRhIGZvcm1fZGF0YTsKLSAgICBpZiAoZm9ybURhdGEoZm9ybV9kYXRhKSkg
ewotICAgICAgICBpZihtX3Bvc3QpIHsKLSAgICAgICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAi
cG9zdCIsIG1fdXJsLnFzdHJpbmcoKSwgZm9ybV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX3RhcmdldC5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGVuY3R5cGUoKS5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5KCkucXN0cmluZygpICk7Ci0gICAgICAgIH0K
LSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggImdldCIsIG1f
dXJsLnFzdHJpbmcoKSwgZm9ybV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX3RhcmdldC5xc3RyaW5nKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlm
IChuZWVkQnV0dG9uQWN0aXZhdGlvbiAmJiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsK
LSAgICAgICAgZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQo
ZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBtX2RvaW5nc3VibWl0ID0gbV9pbnN1Ym1pdCA9IGZh
bHNlOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlc2V0KCAgKQotewotICAgIEZy
YW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYobV9pbnJlc2V0IHx8
ICFmcmFtZSkgcmV0dXJuOwotCi0gICAgbV9pbnJlc2V0ID0gdHJ1ZTsKLQotICAgIC8vICMjIyBE
T00yIGxhYmVscyB0aGlzIGV2ZW50IGFzIG5vdCBjYW5jZWxhYmxlLCBob3dldmVyCi0gICAgLy8g
Y29tbW9uIGJyb3dzZXJzKCBzaWNrISApIGFsbG93IGl0IGJlIGNhbmNlbGxlZC4KLSAgICBpZiAo
ICFkaXNwYXRjaEhUTUxFdmVudChyZXNldEV2ZW50LHRydWUsIHRydWUpICkgewotICAgICAgICBt
X2lucmVzZXQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3Jt
RWxlbWVudHNbaV0tPnJlc2V0KCk7Ci0KLSAgICBtX2lucmVzZXQgPSBmYWxzZTsKLX0KLQotdm9p
ZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cikgCi0g
ICAgewotICAgICAgICBib29sIG9sZFVSTFdhc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVT
dWJtaXNzaW9uKG1fdXJsKTsKLSAgICAgICAgbV91cmwgPSBraHRtbDo6cGFyc2VVUkwoYXR0ci0+
dmFsdWUoKSk7Ci0gICAgICAgIGJvb2wgbmV3VVJMSXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2Vj
dXJlU3VibWlzc2lvbihtX3VybCk7Ci0KLSAgICAgICAgaWYgKG1fYXR0YWNoZWQgJiYgKG9sZFVS
TFdhc1NlY3VyZSAhPSBuZXdVUkxJc1NlY3VyZSkpCi0gICAgICAgICAgICBpZiAobmV3VVJMSXNT
ZWN1cmUpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJl
Rm9ybVJlbW92ZWQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHRhcmdl
dEF0dHIpIHsKLSAgICAgICAgbV90YXJnZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG1ldGhvZEF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKGF0dHItPnZhbHVlKCksICJwb3N0IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSB0cnVl
OwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiZ2V0
IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBlbmN0eXBlQXR0cikgewotICAgICAgICBwYXJzZUVuY3R5cGUoYXR0ci0+dmFsdWUo
KSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0X2NoYXJzZXRBdHRyKSB7
Ci0gICAgICAgIC8vIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJzZXRzIHRoZSBzZXJ2ZXIK
LSAgICAgICAgLy8gYWNjZXB0cyAtIHNlZSByZmMyMDQ1Ci0gICAgICAgIG1fYWNjZXB0Y2hhcnNl
dCA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0
QXR0cikgewotICAgICAgICAvLyBpZ25vcmUgdGhpcyBvbmUgZm9yIHRoZSBtb21lbnQuLi4KLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAg
IG1fYXV0b2NvbXBsZXRlID0gIWVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYi
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnN1Ym1pdEF0dHIpIHsKLSAgICAg
ICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc3VibWl0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG9ucmVzZXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKHJlc2V0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG5hbWVBdHRyKSB7Ci0gICAgICAgIERPTVN0cmluZyBuZXdOYW1lQXR0ciA9IGF0dHItPnZhbHVl
KCk7Ci0gICAgICAgIGlmIChpbkRvY3VtZW50KCkgJiYgZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9j
dW1lbnQoKSkgewotICAgICAgICAgICAgSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0
aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotICAgICAgICAgICAg
ZG9jdW1lbnQtPnJlbW92ZU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2N1
bWVudC0+YWRkTmFtZWRJdGVtKG5ld05hbWVBdHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGRO
YW1lQXR0ciA9IG5ld05hbWVBdHRyOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudElt
cGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBz
dGF0aWMgdm9pZCBpbnNlcnRJbnRvVmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgdW5zaWduZWQg
cG9zLCBUKiBpdGVtKQotewotICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVu
c2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgYXNzZXJ0KHBvcyA8PSBjb3VudCk7Ci0g
ICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6
IHNpemUgKiAzIC8gMik7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gY291bnQ7IGkgPiBwb3M7IC0t
aSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2ZWNbaSAtIDFdKTsgICAgCi0gICAgdmVjLmluc2Vy
dChwb3MsIGl0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBhcHBlbmRU
b1ZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAgdW5zaWduZWQgc2l6
ZSA9IHZlYy5zaXplKCk7Ci0gICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBp
ZiAoc2l6ZSA9PSBjb3VudCkKLSAgICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6
ZSAqIDMgLyAyKTsKLSAgICB2ZWMuaW5zZXJ0KGNvdW50LCBpdGVtKTsKLX0KLQotdGVtcGxhdGU8
Y2xhc3MgVD4gc3RhdGljIHZvaWQgcmVtb3ZlRnJvbVZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMs
IFQgKml0ZW0pCi17Ci0gICAgaW50IHBvcyA9IHZlYy5maW5kUmVmKGl0ZW0pOwotICAgIGlmIChw
b3MgPCAwKQotICAgICAgICByZXR1cm47Ci0gICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQo
KTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBwb3M7IGkgPCBjb3VudCAtIDE7ICsraSkKLSAgICAg
ICAgdmVjLmluc2VydChpLCB2ZWNbaSArIDFdKTsKLSAgICB2ZWMucmVtb3ZlKGNvdW50IC0gMSk7
Ci19Ci0KLXVuc2lnbmVkIEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1FbGVtZW50SW5kZXgoSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgLy8gQ2hlY2sgZm9yIHRoZSBzcGVj
aWFsIGNhc2Ugd2hlcmUgdGhpcyBlbGVtZW50IGlzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgaW4KLSAg
ICAvLyB0aGUgZm9ybSdzIHRyZWUgb2YgY2hpbGRyZW47IHdlIGRvbid0IHdhbnQgdG8gd2FsayB0
aGUgZW50aXJlIHRyZWUgaW4gdGhhdAotICAgIC8vIGNvbW1vbiBjYXNlIHRoYXQgb2NjdXJzIGR1
cmluZyBwYXJzaW5nOyBpbnN0ZWFkIHdlJ2xsIGp1c3QgcmV0dXJuIGEgdmFsdWUKLSAgICAvLyB0
aGF0IHNheXMgImFkZCB0aGlzIGZvcm0gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSIu
Ci0gICAgaWYgKGUtPnRyYXZlcnNlTmV4dE5vZGUodGhpcykpIHsKLSAgICAgICAgdW5zaWduZWQg
aSA9IDA7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKm5vZGUgPSB0aGlzOyBub2RlOyBub2RlID0g
bm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKSkgewotICAgICAgICAgICAgaWYgKG5vZGUgPT0g
ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIGlmIChub2RlLT5pc0hU
TUxFbGVtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgc3RhdGljX2Nhc3Q8SFRNTEVsZW1l
bnRJbXBsICo+KG5vZGUpLT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpCi0gICAgICAgICAgICAgICAg
ICAgICYmIHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICo+KG5vZGUpLT5m
b3JtKCkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIGZvcm1FbGVtZW50cy5jb3VudCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVu
dEltcGw6OnJlZ2lzdGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUp
Ci17Ci0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGlmIChkb2Mg
JiYgZS0+aXNSYWRpb0J1dHRvbigpICYmICFlLT5uYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50Q2hlY2tlZFJhZGlvID0gZG9jLT5j
aGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChlLT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVt
ZW50SW1wbCopIDApOwotICAgICAgICBpZiAoY3VycmVudENoZWNrZWRSYWRpbyA9PSBlKQotICAg
ICAgICAgICAgZG9jLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIChI
VE1MRm9ybUVsZW1lbnRJbXBsKikgMCk7Ci0gICAgICAgIGlmIChlLT5pc0NoZWNrZWQoKSkKLSAg
ICAgICAgICAgIGRvYy0+cmFkaW9CdXR0b25DaGVja2VkKChIVE1MSW5wdXRFbGVtZW50SW1wbCop
IGUsIHRoaXMpOwotICAgIH0KLSAgICBpbnNlcnRJbnRvVmVjdG9yKGZvcm1FbGVtZW50cywgZm9y
bUVsZW1lbnRJbmRleChlKSwgZSk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVt
b3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgaWYg
KCFlLT5uYW1lKCkuaXNFbXB0eSgpICYmIGdldERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnRDaGVja2VkUmFkaW8gPSBnZXREb2N1bWVudCgp
LT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAg
ICAgICAgaWYgKGN1cnJlbnRDaGVja2VkUmFkaW8gPT0gZSkKLSAgICAgICAgICAgIGdldERvY3Vt
ZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0g
ICAgfQotICAgIHJlbW92ZUZyb21WZWN0b3IoZm9ybUVsZW1lbnRzLCBlKTsKLX0KLQotYm9vbCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBj
b25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cjsKLX0KLQotdm9p
ZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVu
dEltcGwgKmUpCi17Ci0gICAgYXBwZW5kVG9WZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi12
b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVu
dEltcGwgKmUpCi17Ci0gICAgcmVtb3ZlRnJvbVZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0K
LVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IEhUTUxGb3JtRWxlbWVudEltcGw6OmVsZW1lbnRz
KCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxGb3Jt
Q29sbGVjdGlvbkltcGwodGhpcykpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1w
bDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci19
Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0TmFtZShjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJp
bmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6YWNjZXB0Q2hhcnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShhY2NlcHRfY2hhcnNldEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3Jt
RWxlbWVudEltcGw6OnNldEFjY2VwdENoYXJzZXQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0X2NoYXJzZXRBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0
cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjphY3Rpb24oKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUoYWN0aW9uQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6
c2V0QWN0aW9uKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFj
dGlvbkF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRFbmN0
eXBlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGVuY3R5cGVB
dHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjptZXRob2Qo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobWV0aG9kQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0TWV0aG9kKGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKG1ldGhvZEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5n
IEhUTUxGb3JtRWxlbWVudEltcGw6OnRhcmdldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZSh0YXJnZXRBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRU
YXJnZXQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFyZ2V0
QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWRO
YW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikK
LSAgICA6IEhUTUxFbGVtZW50SW1wbCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9kaXNhYmxlZCA9
IG1fcmVhZE9ubHkgPSBmYWxzZTsKLQotICAgIGlmIChmKQotCW1fZm9ybSA9IGY7Ci0gICAgZWxz
ZQotCW1fZm9ybSA9IGdldEZvcm0oKTsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0t
PnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhpcyk7Ci19Ci0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjp+SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoKQotewotICAgIGlmIChtX2Zvcm0pCi0g
ICAgICAgIG1fZm9ybS0+cmVtb3ZlRm9ybUVsZW1lbnQodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAg
ICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGRpc2Fi
bGVkQXR0cikgewotICAgICAgICBib29sIG9sZERpc2FibGVkID0gbV9kaXNhYmxlZDsKLSAgICAg
ICAgbV9kaXNhYmxlZCA9ICFhdHRyLT5pc051bGwoKTsKLSAgICAgICAgaWYgKG9sZERpc2FibGVk
ICE9IG1fZGlzYWJsZWQpIHsKLSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgICAg
IGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkK
LSAgICAgICAgICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgRW5hYmxl
ZFN0YXRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlYWRv
bmx5QXR0cikgewotICAgICAgICBib29sIG9sZFJlYWRPbmx5ID0gbV9yZWFkT25seTsKLSAgICAg
ICAgbV9yZWFkT25seSA9ICFhdHRyLT5pc051bGwoKTsKLSAgICAgICAgaWYgKG9sZFJlYWRPbmx5
ICE9IG1fcmVhZE9ubHkpIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkp
OwotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIC8vIFRoZSBjYWxsIHRv
IHVwZGF0ZUZyb21FbGVtZW50KCkgbmVlZHMgdG8gZ28gYWZ0ZXIgdGhlIGNhbGwgdGhyb3VnaAot
ICAgIC8vIHRvIHRoZSBiYXNlIGNsYXNzJ3MgYXR0YWNoKCkgYmVjYXVzZSB0aGF0IGNhbiBzb21l
dGltZXMgZG8gYSBjbG9zZQotICAgIC8vIG9uIHRoZSByZW5kZXJlci4KLSAgICBpZiAobV9yZW5k
ZXIpIHsKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgCi0gICAg
ICAgIC8vIERlbGF5ZWQgYXR0YWNobWVudCBpbiBvcmRlciB0byBwcmV2ZW50IEZPVUMgY2FuIHJl
c3VsdCBpbiBhbiBvYmplY3QgYmVpbmcKLSAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBmb2N1
c2VkIGJlZm9yZSBpdCBoYXMgYSByZW5kZXIgb2JqZWN0LiAgSWYgd2UgaGF2ZSBiZWVuIGZvY3Vz
ZWQKLSAgICAgICAgLy8gKGkuZS4sIGlmIHdlIGFyZSB0aGUgZm9jdXNOb2RlKSB0aGVuIGdvIGFo
ZWFkIGFuZCBmb2N1cyBvdXIgY29ycmVzcG9uZGluZyBuYXRpdmUgd2lkZ2V0LgotICAgICAgICAv
LyAoQXR0YWNoL2RldGFjaCBjYW4gYWxzbyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgZGlzcGxheSB0
eXBlIGNoYW5nZXMsIGUuZy4sIG1ha2luZyBhIHdpZGdldAotICAgICAgICAvLyBibG9jayBpbnN0
ZWFkIG9mIGlubGluZSwgYW5kIGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZCBpbiB0aGF0IGNhc2Ug
YXMgd2VsbC4pCi0gICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKSA9PSB0aGlz
ICYmIG1fcmVuZGVyLT5pc1dpZGdldCgpICYmIAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyV2lkZ2V0Kj4ocmVuZGVyZXIoKSktPndpZGdldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVyZXIoKSktPndpZGdldCgpLT5zZXRGb2N1cygpOwotICAg
IH0KLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJl
ZShib29sIGRlZXApCi17Ci0gICAgaWYgKCFtX2Zvcm0pIHsKLSAgICAgICAgLy8gVGhpcyBoYW5k
bGVzIHRoZSBjYXNlIG9mIGEgbmV3IGZvcm0gZWxlbWVudCBiZWluZyBjcmVhdGVkIGJ5Ci0gICAg
ICAgIC8vIEphdmFTY3JpcHQgYW5kIGluc2VydGVkIGluc2lkZSBhIGZvcm0uICBJbiB0aGUgY2Fz
ZSBvZiB0aGUgcGFyc2VyCi0gICAgICAgIC8vIHNldHRpbmcgYSBmb3JtLCB3ZSB3aWxsIGFscmVh
ZHkgaGF2ZSBhIG5vbi1udWxsIHZhbHVlIGZvciBtX2Zvcm0sIAotICAgICAgICAvLyBhbmQgc28g
d2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KLSAgICAgICAgbV9mb3JtID0gZ2V0Rm9ybSgp
OwotCWlmIChtX2Zvcm0pCi0JICAgIG1fZm9ybS0+cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsK
LSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3Vt
ZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jICYmIGlzUmFkaW9CdXR0b24oKSAmJiAhbmFtZSgp
LmlzRW1wdHkoKSAmJiBpc0NoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICBkb2MtPnJhZGlvQnV0
dG9uQ2hlY2tlZCgoSFRNTElucHV0RWxlbWVudEltcGwqKXRoaXMsIG1fZm9ybSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoZGVlcCk7
Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShi
b29sIGRlZXApCi17Ci0gICAgLy8gV2hlbiBiZWluZyByZW1vdmVkIHdlIGhhdmUgdG8gcG9zc2li
bHkgbnVsbCBvdXQgb3VyIGZvcm0gYW5kIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbQotICAgIC8vIHRo
ZSBmb3JtJ3MgbGlzdCBvZiBlbGVtZW50cy4KLSAgICBpZiAobV9mb3JtKSB7Ci0gICAgICAgIC8v
IEF0dGVtcHQgdG8gcmUtYWNxdWlyZSB0aGUgZm9ybS4gIElmIHdlIGNhbid0IHJlLWFjcXVpcmUs
IHRoZW4KLSAgICAgICAgLy8gcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBmb3JtLgotICAgICAg
ICBOb2RlSW1wbCogZm9ybSA9IHBhcmVudE5vZGUoKTsKLSAgICAgICAgTm9kZUltcGwqIHJvb3Qg
PSB0aGlzOwotICAgICAgICB3aGlsZSAoZm9ybSkgewotICAgICAgICAgICAgaWYgKGZvcm0tPmhh
c1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBy
b290ID0gZm9ybTsKLSAgICAgICAgICAgIGZvcm0gPSBmb3JtLT5wYXJlbnROb2RlKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBmb3JtIGhhcyBiZWVuIGRlbW90ZWQg
dG8gYSBsZWFmLCB0aGVuIHdlIHdvbid0IGZpbmQgaXQgYXMgYW4gYW5jZXN0b3IuCi0gICAgICAg
IC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcm9vdCBub2RlIG9mIG91ciBjdXJyZW50IGZvcm0gYW5k
IG91ciByb290IG5vZGUKLSAgICAgICAgLy8gbWF0Y2guICBJZiBzbywgcHJlc2VydmUgdGhlIGNv
bm5lY3Rpb24gdG8gdGhlIGZvcm0uCi0gICAgICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAg
Tm9kZUltcGwqIGZvcm1Sb290ID0gbV9mb3JtOwotICAgICAgICAgICAgd2hpbGUgKGZvcm1Sb290
LT5wYXJlbnQoKSkgZm9ybVJvb3QgPSBmb3JtUm9vdC0+cGFyZW50KCk7Ci0gICAgICAgICAgICBp
ZiAoZm9ybVJvb3QgPT0gcm9vdCkKLSAgICAgICAgICAgICAgICBmb3JtID0gbV9mb3JtOwotICAg
ICAgICB9IAotICAgICAgICAKLSAgICAgICAgaWYgKCFmb3JtKSB7Ci0gICAgICAgICAgICBtX2Zv
cm0tPnJlbW92ZUZvcm1FbGVtZW50KHRoaXMpOwotICAgICAgICAgICAgbV9mb3JtID0gMDsKLSAg
ICAgICAgfSBlbHNlCi0gICAgICAgICAgICBhc3NlcnQoZm9ybSA9PSBtX2Zvcm0pOyAvLyBUaGUg
cmUtYWNxdWlyZWQgZm9ybSBzaG91bGQgYmUgdGhlIHNhbWUuIElmIG5vdCwgc29tZXRoaW5nIHJl
YWxseSBzdHJhbmdlIGhhcHBlbmVkLgotICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6
cmVtb3ZlZEZyb21UcmVlKGRlZXApOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6Z2V0Rm9ybSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnAg
PSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUocCkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFt
ZShmb3JtVGFnKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1l
bnRJbXBsICo+KHApOwotICAgICAgICBwID0gcC0+cGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpuYW1l
KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgbiA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0g
ICAgcmV0dXJuIG4uaXNOdWxsKCkgPyAiIiA6IG47Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnNldE5hbWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUobmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6b25TZWxlY3QoKQotewotICAgIC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5l
dyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUKLSAgICBkaXNwYXRjaEhUTUxFdmVudChzZWxlY3RF
dmVudCx0cnVlLGZhbHNlKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
b25DaGFuZ2UoKQotewotICAgIC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2
ZW50cyBhcmNoaXRlY3R1cmUKLSAgICBkaXNwYXRjaEhUTUxFdmVudChjaGFuZ2VFdmVudCx0cnVl
LGZhbHNlKTsKLX0KLQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGlzYWJsZWQo
KSBjb25zdAotewotICAgIHJldHVybiBtX2Rpc2FibGVkOwotfQotCi12b2lkIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpzZXREaXNhYmxlZChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRl
KGRpc2FibGVkQXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnNldFJlYWRPbmx5KGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocmVhZG9u
bHlBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAgICAvL2Jvb2wgY2hhbmdlZCA9
IGNoYW5nZWQoKTsKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotCi0g
ICAgaWYgKG1fcmVuZGVyIC8qJiYgY2hhbmdlZCovKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRl
RnJvbUVsZW1lbnQoKTsKLX0KLQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNG
b2N1c2FibGUoKSBjb25zdAotewotICAgIGlmIChkaXNhYmxlZCgpIHx8ICFtX3JlbmRlciB8fCAK
LSAgICAgICAgKG1fcmVuZGVyLT5zdHlsZSgpICYmIG1fcmVuZGVyLT5zdHlsZSgpLT52aXNpYmls
aXR5KCkgIT0gVklTSUJMRSkgfHwgCi0gICAgICAgIG1fcmVuZGVyLT53aWR0aCgpID09IDAgfHwg
bV9yZW5kZXItPmhlaWdodCgpID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2Fy
ZEZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAg
aWYgKG1fcmVuZGVyLT5pc1dpZGdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQoKSAmJgotICAgICAgICAgICAgICAg
IChzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpLT5mb2N1c1Bv
bGljeSgpICYgUVdpZGdldDo6VGFiRm9jdXMpOwotICAgICAgICB9Ci0JaWYgKGdldERvY3VtZW50
KCktPmZyYW1lKCkpCi0JICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5mcmFtZSgpLT50YWJzVG9B
bGxDb250cm9scygpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmlzTW91c2VGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlm
IChpc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewot
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+
d2lkZ2V0KCkgJiYKLSAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4o
bV9yZW5kZXIpLT53aWRnZXQoKS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OkNsaWNrRm9jdXMp
OwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciA8aW5wdXQgdHlwZT1pbWFnZT4gYW5kIDxidXR0
b24+LCB3ZSB3aWxsIGFzc3VtZSBubyBtb3VzZSBmb2N1c2FiaWxpdHkuICBUaGlzIGlzCi0gICAg
ICAgIC8vIGNvbnNpc3RlbnQgd2l0aCBPUyBYIGJlaGF2aW9yIGZvciBidXR0b25zLgotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi0vLyBTcGVjaWFsIGNoYXJzIHVzZWQgdG8gZW5jb2RlIGZvcm0gc3RhdGUgc3RyaW5n
cy4KLS8vIFdlIHBpY2sgY2hhcnMgdGhhdCBhcmUgdW5saWtlbHkgdG8gYmUgdXNlZCBpbiBhbiBI
VE1MIGF0dHIsIHNvIHdlIHJhcmVseSBoYXZlIHRvIHJlYWxseSBlbmNvZGUuCi1jb25zdCBjaGFy
IHN0YXRlU2VwYXJhdG9yID0gJyYnOwotY29uc3QgY2hhciBzdGF0ZUVzY2FwZSA9ICc8JzsKLXN0
YXRpYyBjb25zdCBjaGFyIHN0YXRlU2VwYXJhdG9yTWFya2VyW10gPSAiPEEiOwotc3RhdGljIGNv
bnN0IGNoYXIgc3RhdGVFc2NhcGVNYXJrZXJbXSA9ICI8PCI7Ci0KLS8vIEVuY29kZSBhbiBlbGVt
ZW50IG5hbWUgc28gd2UgY2FuIHB1dCBpdCBpbiBhIHN0YXRlIHN0cmluZyB3aXRob3V0IGNvbGxp
ZGluZwotLy8gd2l0aCBvdXIgc2VwYXJhdG9yIGNoYXIuCi1zdGF0aWMgUVN0cmluZyBlbmNvZGVk
RWxlbWVudE5hbWUoUVN0cmluZyBzdHIpCi17Ci0gICAgaW50IHNlcExvYyA9IHN0ci5maW5kKHN0
YXRlU2VwYXJhdG9yKTsKLSAgICBpbnQgZXNjTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3Ip
OwotICAgIGlmIChzZXBMb2MgPj0gMCB8fCBlc2NMb2MgPj0gMCkgewotICAgICAgICBRU3RyaW5n
IG5ld1N0ciA9IHN0cjsKLSAgICAgICAgLy8gICByZXBsYWNlICI8IiB3aXRoICI8PCIKLSAgICAg
ICAgd2hpbGUgKGVzY0xvYyA+PSAwKSB7Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFjZShlc2NM
b2MsIDEsIHN0YXRlRXNjYXBlTWFya2VyKTsKLSAgICAgICAgICAgIGVzY0xvYyA9IHN0ci5maW5k
KHN0YXRlU2VwYXJhdG9yLCBlc2NMb2MrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICByZXBs
YWNlICImIiB3aXRoICI8QSIKLSAgICAgICAgd2hpbGUgKHNlcExvYyA+PSAwKSB7Ci0gICAgICAg
ICAgICBuZXdTdHIucmVwbGFjZShzZXBMb2MsIDEsIHN0YXRlU2VwYXJhdG9yTWFya2VyKTsKLSAg
ICAgICAgICAgIHNlcExvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXBMb2MrMSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld1N0cjsKLSAgICB9IGVsc2UgewotICAgICAgICBy
ZXR1cm4gc3RyOwotICAgIH0KLX0KLQotUVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6c3RhdGUoICkKLXsKLSAgICAvLyBCdWlsZCBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIEVsZW1l
bnROYW1lJkVsZW1lbnRUeXBlJgotICAgIHJldHVybiBlbmNvZGVkRWxlbWVudE5hbWUobmFtZSgp
LnFzdHJpbmcoKSkgKyBzdGF0ZVNlcGFyYXRvciArIHR5cGUoKS5xc3RyaW5nKCkgKyBzdGF0ZVNl
cGFyYXRvcjsKLX0KLQotUVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1h
dGNoaW5nU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBRU3RyaW5nIGVuY05hbWUg
PSBlbmNvZGVkRWxlbWVudE5hbWUobmFtZSgpLnFzdHJpbmcoKSk7Ci0gICAgUVN0cmluZyB0eXBl
U3RyID0gdHlwZSgpLnFzdHJpbmcoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBp
dCA9IHN0YXRlcy5iZWdpbigpOyBpdCAhPSBzdGF0ZXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAg
UVN0cmluZyBzdGF0ZSA9ICppdDsKLSAgICAgICAgaW50IHNlcDEgPSBzdGF0ZS5maW5kKHN0YXRl
U2VwYXJhdG9yKTsKLSAgICAgICAgaW50IHNlcDIgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9y
LCBzZXAxKzEpOwotICAgICAgICBhc3NlcnQoc2VwMSA+PSAwKTsKLSAgICAgICAgYXNzZXJ0KHNl
cDIgPj0gMCk7Ci0KLSAgICAgICAgUVN0cmluZyBuYW1lQW5kVHlwZSA9IHN0YXRlLmxlZnQoc2Vw
Mik7Ci0gICAgICAgIGlmIChlbmNOYW1lLmxlbmd0aCgpICsgdHlwZVN0ci5sZW5ndGgoKSArIDEg
PT0gKHVpbnQpc2VwMgotICAgICAgICAgICAgJiYgbmFtZUFuZFR5cGUuc3RhcnRzV2l0aChlbmNO
YW1lKQotICAgICAgICAgICAgJiYgbmFtZUFuZFR5cGUuZW5kc1dpdGgodHlwZVN0cikpCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIHN0YXRlcy5yZW1vdmUoaXQpOwotICAgICAgICAgICAgcmV0dXJu
IHN0YXRlLm1pZChzZXAyKzEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBRU3RyaW5n
OjpudWxsOwotfQotCi1pbnQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnRhYkluZGV4KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHRhYmluZGV4QXR0cikudG9JbnQoKTsK
LX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0VGFiSW5kZXgoaW50IHZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh0YWJpbmRleEF0dHIsIFFTdHJpbmc6Om51bWJlcih2
YWx1ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxCdXR0b25FbGVtZW50SW1w
bDo6SFRNTEJ1dHRvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoYnV0dG9uVGFnLCBk
b2MsIGYpCi17Ci0gICAgbV90eXBlID0gU1VCTUlUOwotICAgIG1fZGlydHkgPSB0cnVlOwotICAg
IG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci19Ci0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6fkhU
TUxCdXR0b25FbGVtZW50SW1wbCgpCi17Ci19Ci0KLVJlbmRlck9iamVjdCogSFRNTEJ1dHRvbkVs
ZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxl
KiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRoaXMpOwot
fQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKHR5cGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxl
bWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIp
Ci17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJzdWJtaXQiKSkKLSAgICAgICAgICAgIG1f
dHlwZSA9IFNVQk1JVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+
dmFsdWUoKSwgInJlc2V0IikpCi0gICAgICAgICAgICBtX3R5cGUgPSBSRVNFVDsKLSAgICAgICAg
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImJ1dHRvbiIpKQotICAg
ICAgICAgICAgbV90eXBlID0gQlVUVE9OOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IHZhbHVlQXR0cikgewotICAgICAgICBtX3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAg
bV9jdXJyVmFsdWUgPSBtX3ZhbHVlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFj
Y2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJs
dXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7
Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmRl
ZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBC
VVRUT04gJiYgKGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQpKSB7Ci0KLSAgICAgICAg
aWYobV9mb3JtICYmIG1fdHlwZSA9PSBTVUJNSVQpIHsKLSAgICAgICAgICAgIG1fYWN0aXZlU3Vi
bWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpOwotICAgICAg
ICAgICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsgLy8gaW4gY2FzZSB3ZSB3ZXJlIGNhbmNlbGVk
Ci0gICAgICAgIH0KLSAgICAgICAgaWYobV9mb3JtICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3Jt
LT5yZXNldCgpOwotICAgIH0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVs
dEV2ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNT
dWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0
aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNj
ZXNzZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhp
cyBjb25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFu
ZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRl
bmRlZC4gCi0gICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGNvbnN0cmFpbnQgZm9yIG5vdy4KLSAgICAv
LyBXYXM6IG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJsZWQgJiYgIW5hbWUoKS5pc0VtcHR5
KCkKLSAgICByZXR1cm4gbV90eXBlID09IFNVQk1JVCAmJiAhbV9kaXNhYmxlZDsKLX0KLQotYm9v
bCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
OjpzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKQotewotICAgIG1fYWN0aXZlU3VibWl0ID0g
ZmxhZzsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZv
cm1EYXRhTGlzdCYgZW5jb2RpbmcsIGJvb2wgLyptdWx0aXBhcnQqLykKLXsKLSAgICBpZiAobV90
eXBlICE9IFNVQk1JVCB8fCBuYW1lKCkuaXNFbXB0eSgpIHx8ICFtX2FjdGl2ZVN1Ym1pdCkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBtX2N1
cnJWYWx1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJ
bXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQoteyAgIAotICAgIC8v
IHNlbmQgdGhlIG1vdXNlIGJ1dHRvbiBldmVudHMgaWZmIHRoZQotICAgIC8vIGNhbGxlciBzcGVj
aWZpZWQgc2VuZFRvQW55RWxlbWVudAotICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotfQot
Ci1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1
dHRvbkVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcg
SFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0
VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVB
dHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEZpZWxkU2V0RWxl
bWVudEltcGw6OkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmKQotICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChmaWVs
ZHNldFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6fkhUTUxG
aWVsZFNldEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1w
bDo6Y2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdD
aGlsZC0+aGFzVGFnTmFtZShsZWdlbmRUYWcpIHx8IEhUTUxFbGVtZW50SW1wbDo6Y2hlY2tEVEQo
bmV3Q2hpbGQpOwotfQotCi1ib29sIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJs
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTEZpZWxk
U2V0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAiZmllbGRzZXQiOwot
fQotCi1SZW5kZXJPYmplY3QqIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJl
cihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4g
bmV3IChhcmVuYSkgUmVuZGVyRmllbGRzZXQodGhpcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotSFRNTElucHV0RWxlbWVudEltcGw6OkhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwoaW5wdXRUYWcsIGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpIVE1MSW5wdXRFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAg
ICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywgZikKLXsKLSAgICBp
bml0KCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1f
aW1hZ2VMb2FkZXIgPSAwOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAg
ICBtX3R5cGUgPSBURVhUOwotICAgIG1fbWF4TGVuID0gLTE7Ci0gICAgbV9zaXplID0gMjA7Ci0g
ICAgbV9jaGVja2VkID0gZmFsc2U7Ci0gICAgbV9kZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAg
IG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotICAgIG1faW5kZXRlcm1pbmF0ZSA9IGZhbHNl
OwotCi0gICAgbV9oYXZlVHlwZSA9IGZhbHNlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7
Ci0gICAgbV9hdXRvY29tcGxldGUgPSB0cnVlOwotICAgIG1faW5pdGVkID0gZmFsc2U7Ci0KLSAg
ICB4UG9zID0gMDsKLSAgICB5UG9zID0gMDsKLQotICAgIG1fbWF4UmVzdWx0cyA9IC0xOwotCi0g
ICAgaWYgKG1fZm9ybSkKLSAgICAgICAgbV9hdXRvY29tcGxldGUgPSBtX2Zvcm0tPmF1dG9Db21w
bGV0ZSgpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6fkhUTUxJbnB1dEVsZW1lbnRJbXBs
KCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1h
aW50YWluc1N0YXRlKHRoaXMpOwotICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotfQotCi1ET01T
dHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBt
X25hbWUuaXNOdWxsKCkgPyAiIiA6IG1fbmFtZTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIGJhc2Ug
Y2xhc3Mgc2F5cyB3ZSBjYW4ndCBiZSBmb2N1c2VkLCB0aGVuIHdlIGNhbiBzdG9wIG5vdy4KLSAg
ICBpZiAoIUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChtX3R5cGUgPT0gUkFESU8pIHsKLSAg
ICAgICAgLy8gVW5uYW1lZCByYWRpbyBidXR0b25zIGFyZSBuZXZlciBmb2N1c2FibGUgKG1hdGNo
ZXMgV2luSUUpLgotICAgICAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICAvLyBOZXZlciBhbGxvdyBrZXlib2FyZCB0YWJiaW5nIHRv
IGxlYXZlIHlvdSBpbiB0aGUgc2FtZSByYWRpbyBncm91cC4gIEFsd2F5cwotICAgICAgICAvLyBz
a2lwIGFueSBvdGhlciBlbGVtZW50cyBpbiB0aGUgZ3JvdXAuCi0gICAgICAgIE5vZGVJbXBsKiBj
dXJyZW50Rm9jdXNOb2RlID0gZ2V0RG9jdW1lbnQoKS0+Zm9jdXNOb2RlKCk7Ci0gICAgICAgIGlm
IChjdXJyZW50Rm9jdXNOb2RlICYmIGN1cnJlbnRGb2N1c05vZGUtPmhhc1RhZ05hbWUoaW5wdXRU
YWcpKSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogZm9jdXNlZElucHV0ID0g
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50Rm9jdXNOb2RlKTsKLSAg
ICAgICAgICAgIGlmIChmb2N1c2VkSW5wdXQtPmlucHV0VHlwZSgpID09IFJBRElPICYmIGZvY3Vz
ZWRJbnB1dC0+Zm9ybSgpID09IG1fZm9ybSAmJgotICAgICAgICAgICAgICAgIGZvY3VzZWRJbnB1
dC0+bmFtZSgpID09IG5hbWUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFsbG93IGtleWJvYXJkIGZvY3VzIGlmIHdlJ3Jl
IGNoZWNrZWQgb3IgaWYgbm90aGluZyBpbiB0aGUgZ3JvdXAgaXMgY2hlY2tlZC4KLSAgICAgICAg
cmV0dXJuIGNoZWNrZWQoKSB8fCAhZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9y
R3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFR5cGUoY29uc3QgRE9NU3Ry
aW5nJiB0KQotewotICAgIGlmICh0LmlzRW1wdHkoKSkgewotICAgICAgICBpbnQgZXhjY29kZTsK
LSAgICAgICAgcmVtb3ZlQXR0cmlidXRlKHR5cGVBdHRyLCBleGNjb2RlKTsKLSAgICB9Ci0gICAg
ZWxzZQotICAgICAgICBzZXRBdHRyaWJ1dGUodHlwZUF0dHIsIHQpOwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZXRJbnB1dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAg
IHR5cGVFbnVtIG5ld1R5cGU7Ci0gICAgCi0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJw
YXNzd29yZCIpKQotICAgICAgICBuZXdUeXBlID0gUEFTU1dPUkQ7Ci0gICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UodCwgImNoZWNrYm94IikpCi0gICAgICAgIG5ld1R5cGUgPSBDSEVDS0JP
WDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmFkaW8iKSkKLSAgICAgICAg
bmV3VHlwZSA9IFJBRElPOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJzdWJt
aXQiKSkKLSAgICAgICAgbmV3VHlwZSA9IFNVQk1JVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9y
aW5nQ2FzZSh0LCAicmVzZXQiKSkKLSAgICAgICAgbmV3VHlwZSA9IFJFU0VUOwotICAgIGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJmaWxlIikpCi0gICAgICAgIG5ld1R5cGUgPSBGSUxF
OwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJoaWRkZW4iKSkKLSAgICAgICAg
bmV3VHlwZSA9IEhJRERFTjsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaW1h
Z2UiKSkKLSAgICAgICAgbmV3VHlwZSA9IElNQUdFOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKHQsICJidXR0b24iKSkKLSAgICAgICAgbmV3VHlwZSA9IEJVVFRPTjsKLSAgICBlbHNl
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAia2h0bWxfaXNpbmRleCIpKQotICAgICAgICBuZXdU
eXBlID0gSVNJTkRFWDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic2VhcmNo
IikpCi0gICAgICAgIG5ld1R5cGUgPSBTRUFSQ0g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgInJhbmdlIikpCi0gICAgICAgIG5ld1R5cGUgPSBSQU5HRTsKLSAgICBlbHNlCi0g
ICAgICAgIG5ld1R5cGUgPSBURVhUOwotCi0gICAgLy8gIyMjIElNUE9SVEFOVDogRG9uJ3QgYWxs
b3cgdGhlIHR5cGUgdG8gYmUgY2hhbmdlZCB0byBGSUxFIGFmdGVyIHRoZSBmaXJzdAotICAgIC8v
IHR5cGUgY2hhbmdlLCBvdGhlcndpc2UgYSBKYXZhU2NyaXB0IHByb2dyYW1tZXIgd291bGQgYmUg
YWJsZSB0byBzZXQgYSB0ZXh0Ci0gICAgLy8gZmllbGQncyB2YWx1ZSB0byBzb21ldGhpbmcgbGlr
ZSAvZXRjL3Bhc3N3ZCBhbmQgdGhlbiBjaGFuZ2UgaXQgdG8gYSBmaWxlIGZpZWxkLgotICAgIGlm
IChtX3R5cGUgIT0gbmV3VHlwZSkgewotICAgICAgICBpZiAobmV3VHlwZSA9PSBGSUxFICYmIG1f
aGF2ZVR5cGUpIHsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgYXR0cmlidXRlIGJhY2sgdG8gdGhl
IG9sZCB2YWx1ZS4KLSAgICAgICAgICAgIC8vIFVzZWZ1bCBpbiBjYXNlIHdlIHdlcmUgY2FsbGVk
IGZyb20gaW5zaWRlIHBhcnNlTWFwcGVkQXR0cmlidXRlLgotICAgICAgICAgICAgc2V0QXR0cmli
dXRlKHR5cGVBdHRyLCB0eXBlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYg
KG1fdHlwZSA9PSBSQURJTyAmJiAhbmFtZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAg
IGlmIChnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCkuaW1w
bCgpLCBtX2Zvcm0pID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCkt
PnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGJvb2wgd2FzQXR0YWNoZWQgPSBtX2F0dGFjaGVkOwotICAgICAg
ICAgICAgaWYgKHdhc0F0dGFjaGVkKQotICAgICAgICAgICAgICAgIGRldGFjaCgpOwotICAgICAg
ICAgICAgYm9vbCBkaWRTdG9yZVZhbHVlID0gc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1
dGUoKTsKLSAgICAgICAgICAgIG1fdHlwZSA9IG5ld1R5cGU7Ci0gICAgICAgICAgICBib29sIHdp
bGxTdG9yZVZhbHVlID0gc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAg
ICAgICAgIGlmIChkaWRTdG9yZVZhbHVlICYmICF3aWxsU3RvcmVWYWx1ZSAmJiAhbV92YWx1ZS5p
c051bGwoKSkgewotICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIG1fdmFs
dWUpOwotICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBET01TdHJpbmcoKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGlmICghZGlkU3RvcmVWYWx1ZSAmJiB3aWxsU3RvcmVWYWx1ZSkgewot
ICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBh
dHRhY2goKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIG91ciB0eXBlIG1v
cnBocyBpbnRvIGEgcmFkaW8gYnV0dG9uIGFuZCB3ZSBhcmUgY2hlY2tlZCwgdGhlbiBnbyBhaGVh
ZAotICAgICAgICAgICAgLy8gYW5kIHNpZ25hbCB0aGlzIHRvIHRoZSBmb3JtLgotICAgICAgICAg
ICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgZ2V0
RG9jdW1lbnQoKS0+cmFkaW9CdXR0b25DaGVja2VkKHRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgbV9oYXZlVHlwZSA9IHRydWU7Ci0gICAgCi0gICAgaWYgKG1fdHlwZSAhPSBJ
TUFHRSAmJiBtX2ltYWdlTG9hZGVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwot
ICAgICAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgLy8gbmVlZHMgdG8gYmUgbG93ZXJj
YXNlIGFjY29yZGluZyB0byBET00gc3BlYwotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2Fz
ZSBURVhUOiByZXR1cm4gInRleHQiOwotICAgIGNhc2UgUEFTU1dPUkQ6IHJldHVybiAicGFzc3dv
cmQiOwotICAgIGNhc2UgQ0hFQ0tCT1g6IHJldHVybiAiY2hlY2tib3giOwotICAgIGNhc2UgUkFE
SU86IHJldHVybiAicmFkaW8iOwotICAgIGNhc2UgU1VCTUlUOiByZXR1cm4gInN1Ym1pdCI7Ci0g
ICAgY2FzZSBSRVNFVDogcmV0dXJuICJyZXNldCI7Ci0gICAgY2FzZSBGSUxFOiByZXR1cm4gImZp
bGUiOwotICAgIGNhc2UgSElEREVOOiByZXR1cm4gImhpZGRlbiI7Ci0gICAgY2FzZSBJTUFHRTog
cmV0dXJuICJpbWFnZSI7Ci0gICAgY2FzZSBCVVRUT046IHJldHVybiAiYnV0dG9uIjsKLSAgICBj
YXNlIFNFQVJDSDogcmV0dXJuICJzZWFyY2giOwotICAgIGNhc2UgUkFOR0U6IHJldHVybiAicmFu
Z2UiOwotICAgIGNhc2UgSVNJTkRFWDogcmV0dXJuICIiOwotICAgIH0KLSAgICByZXR1cm4gIiI7
Ci19Ci0KLVFTdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgYXNz
ZXJ0KG1fdHlwZSAhPSBQQVNTV09SRCk7CQkvLyBzaG91bGQgbmV2ZXIgc2F2ZS9yZXN0b3JlIHBh
c3N3b3JkIGZpZWxkcwotCi0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpzdGF0ZSgpOwotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBDSEVDS0JP
WDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICByZXR1cm4gc3RhdGUgKyAoY2hlY2tlZCgpID8g
Im9uIiA6ICJvZmYiKTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gc3RhdGUgKyB2YWx1
ZSgpLnFzdHJpbmcoKSsnLic7IC8vIE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3Ry
aW5nTGlzdCAmc3RhdGVzKQotewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8g
c2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLSAgICAKLSAgICBRU3Ry
aW5nIHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRl
KHN0YXRlcyk7Ci0gICAgaWYgKHN0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICBzd2l0Y2gg
KG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAg
c2V0Q2hlY2tlZCgoc3RhdGUgPT0gIm9uIikpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0
OgotICAgICAgICBzZXRWYWx1ZShET01TdHJpbmcoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0x
KSkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudElt
cGw6OmNhbkhhdmVTZWxlY3Rpb24oKQotewotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg
IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAw
OwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0g
ICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25TdGFy
dCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJl
dHVybiAwOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvbkVuZCgpCi17
Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuIDA7Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUp
IHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRp
dCAqPihtX3JlbmRlciktPnNlbGVjdGlvbkVuZCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgaWYgKCFtX3Jl
bmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAg
ICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVj
dGlvblN0YXJ0KHN0YXJ0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0Ogot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47
Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAg
ICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRp
Y19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewot
ICAgIGlmKCFtX3JlbmRlcikgcmV0dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAg
ICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbio+
KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQ
QVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0Kj4obV9yZW5kZXIpLT5zZWxlY3QoKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBD
SEVDS0JPWDoKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAg
ICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBSQU5H
RToKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVj
dGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1
cm47Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoK
LSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uo
c3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y2xp
Y2soYm9vbCBzZW5kTW91c2VFdmVudHMsIGJvb2wgc2hvd1ByZXNzZWRMb29rKQotewotICAgIHN3
aXRjaCAoaW5wdXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAv
LyBhIG5vLW9wIGZvciB0aGlzIHR5cGUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFNVQk1JVDoKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAg
ICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRz
LCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklM
RToKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbiAqPihyZW5kZXJlcigpKS0+Y2xpY2soc2VuZE1vdXNlRXZl
bnRzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQ
cmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoK
LSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBJ
U0lOREVYOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAg
ICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRM
b29rKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBz
d2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAg
Ly8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBURVhUOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAg
ICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgZm9jdXMoKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAg
ICBjYXNlIFNVQk1JVDoKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBJTUFHRToK
LSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBS
QU5HRToKLSAgICAgICAgICAgIC8vIGZvY3VzCi0gICAgICAgICAgICBmb2N1cygpOwotCi0gICAg
ICAgICAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAgICAg
ICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2VuZFRvQW55RWxlbWVudAotICAgICAgICAgICAgY2xp
Y2soc2VuZFRvQW55RWxlbWVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJv
b2wgSFRNTElucHV0RWxlbWVudEltcGw6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYg
YXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYg
KGF0dHJOYW1lID09IHdpZHRoQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoZWlnaHRBdHRy
IHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZzcGFjZUF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUg
PT0gaHNwYWNlQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfSAKLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRy
KSB7Ci0gICAgICAgIHJlc3VsdCA9IGVSZXBsYWNlZDsgLy8gU2hhcmUgd2l0aCA8aW1nPiBzaW5j
ZSB0aGUgYWxpZ25tZW50IGJlaGF2aW9yIGlzIHRoZSBzYW1lLgotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBIVE1MRWxlbWVudEltcGw6Om1hcFRvRW50cnko
YXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0
dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYm
IGNoZWNrZWQoKSAmJiBtX2Zvcm0pIHsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmFkaW8g
ZnJvbSBpdHMgb2xkIGdyb3VwLgotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAh
bV9uYW1lLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVS
YWRpb0J1dHRvbkdyb3VwKG1fbmFtZS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIC8vIFVwZGF0ZSBvdXIgY2FjaGVkIHJlZmVyZW5jZSB0byB0aGUgbmFtZS4K
LSAgICAgICAgbV9uYW1lID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFk
ZCBpdCB0byBpdHMgbmV3IGdyb3VwLgotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNo
ZWNrZWQoKSkKLSAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0
aGlzLCBtX2Zvcm0pOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9jb21wbGV0
ZUF0dHIpIHsKLSAgICAgICAgbV9hdXRvY29tcGxldGUgPSAhZXF1YWxJZ25vcmluZ0Nhc2UoYXR0
ci0+dmFsdWUoKSwgIm9mZiIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09ICB0eXBl
QXR0cikgewotICAgICAgICBzZXRJbnB1dFR5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgbmVl
ZCB0byBzZXRDaGFuZ2VkIGlmIHRoZSBmb3JtIGlzIGxvb2tpbmcgYXQgdGhlIGRlZmF1bHQgdmFs
dWUgcmlnaHQgbm93LgotICAgICAgICBpZiAobV92YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAg
IHNldENoYW5nZWQoKTsKLSAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNoZWNrZWRBdHRyKSB7Ci0gICAgICAgIG1f
ZGVmYXVsdENoZWNrZWQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlmIChtX3VzZURlZmF1
bHRDaGVja2VkKSB7Ci0gICAgICAgICAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNrZWQpOwot
ICAgICAgICAgICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXhsZW5ndGhBdHRyKSB7Ci0gICAgICAgIG1fbWF4
TGVuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogLTE7Ci0gICAg
ICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0
cikgewotICAgICAgICBtX3NpemUgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRv
SW50KCkgOiAyMDsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbHRBdHRyKSB7Ci0g
ICAgICAgIGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpCi0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJJbWFnZSo+KG1fcmVuZGVyKS0+dXBkYXRlQWx0VGV4dCgpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVy
ICYmIG1fdHlwZSA9PSBJTUFHRSkgewotICAgICAgICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQot
ICAgICAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMp
OwotICAgICAgICAgICAgbV9pbWFnZUxvYWRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHVzZW1hcEF0dHIgfHwKLSAgICAg
ICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIEZJ
WE1FOiBpZ25vcmUgZm9yIHRoZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSB2c3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJH
SU5fVE9QLCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19Q
Uk9QX01BUkdJTl9CT1RUT00sIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19Q
Uk9QX01BUkdJTl9MRUZULCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0
dHIsIENTU19QUk9QX01BUkdJTl9SSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIGFkZEhUTUxBbGlnbm1lbnQo
YXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAg
ICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBhZGRD
U1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfSEVJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZl
bnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRN
TEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG9uaW5wdXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGlu
cHV0RXZlbnQsIGF0dHIpOwotICAgIH0KLSAgICAvLyBTZWFyY2ggZmllbGQgYW5kIHNsaWRlciBh
dHRyaWJ1dGVzIGFsbCBqdXN0IGNhdXNlIHVwZGF0ZUZyb21FbGVtZW50IHRvIGJlIGNhbGxlZCB0
aHJvdWdoIHN0eWxlCi0gICAgLy8gcmVjYWxjaW5nLgotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbnNlYXJjaEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc2VhcmNo
RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlc3VsdHNBdHRy
KSB7Ci0gICAgICAgIG1fbWF4UmVzdWx0cyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVl
KCkudG9JbnQoKSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYXV0b3NhdmVBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1l
KCkgPT0gaW5jcmVtZW50YWxBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0g
cGxhY2Vob2xkZXJBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbWluQXR0
ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1heEF0dHIgfHwKLSAgICAgICAg
ICAgICAgIGF0dHItPm5hbWUoKSA9PSBwcmVjaXNpb25BdHRyKSB7Ci0gICAgICAgIHNldENoYW5n
ZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBh
cnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpyZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90
eXBlKQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNl
IFNFQVJDSDoKLSAgICBjYXNlIFJBTkdFOgotICAgIGNhc2UgSVNJTkRFWDoKLSAgICBjYXNlIENI
RUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBJTUFH
RToKLSAgICBjYXNlIFJFU0VUOgotICAgIGNhc2UgRklMRToKLSAgICBjYXNlIEJVVFRPTjogICBy
ZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbmRlcmVySXNOZWVkZWQoc3R5bGUp
OwotICAgIGNhc2UgSElEREVOOiAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXNzZXJ0KGZh
bHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTElucHV0RWxl
bWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUg
KnN0eWxlKQotewotICAgIHN3aXRjaChtX3R5cGUpCi0gICAgewotICAgIGNhc2UgVEVYVDoKLSAg
ICBjYXNlIFBBU1NXT1JEOgotICAgIGNhc2UgU0VBUkNIOgotICAgIGNhc2UgSVNJTkRFWDogIHJl
dHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMaW5lRWRpdCh0aGlzKTsKLSAgICBjYXNlIENIRUNLQk9Y
OgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNyZWF0ZU9i
amVjdCh0aGlzLCBzdHlsZSk7Ci0gICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBSRVNFVDoKLSAg
ICBjYXNlIEJVVFRPTjoKLSAgICAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0
aGlzKTsKLSAgICBjYXNlIElNQUdFOiAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVySW1hZ2VC
dXR0b24odGhpcyk7Ci0gICAgY2FzZSBGSUxFOiAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRl
ckZpbGVCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBSQU5HRTogICAgcmV0dXJuIG5ldyAoYXJlbmEp
IFJlbmRlclNsaWRlcih0aGlzKTsKLSAgICBjYXNlIEhJRERFTjogICBicmVhazsKLSAgICB9Ci0g
ICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBpZiAoIW1faW5pdGVkKSB7Ci0gICAgICAgIGlmICgh
bV9oYXZlVHlwZSkKLSAgICAgICAgICAgIHNldElucHV0VHlwZShnZXRBdHRyaWJ1dGUodHlwZUF0
dHIpKTsKLQotICAgICAgICAvLyBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBkeW5hbWljLCBkb2Vz
bid0IGl0LCBzaW5jZSBzb21lb25lIGNvdWxkIHNldCB0aGlzCi0gICAgICAgIC8vIGFmdGVyIGF0
dGFjaG1lbnQ/Ci0gICAgICAgIERPTVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRy
KTsKLSAgICAgICAgaWYgKCh1aW50KSBtX3R5cGUgPD0gSVNJTkRFWCAmJiAhdmFsLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG5ld2xpbmUgc3R1ZmYuLgotICAgICAgICAgICAg
UVN0cmluZyBudmFsdWU7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8
IHZhbC5sZW5ndGgoKTsgKytpKQotICAgICAgICAgICAgICAgIGlmICh2YWxbaV0gPj0gJyAnKQot
ICAgICAgICAgICAgICAgICAgICBudmFsdWUgKz0gdmFsW2ldOwotCi0gICAgICAgICAgICBpZiAo
dmFsLmxlbmd0aCgpICE9IG52YWx1ZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBzZXRBdHRy
aWJ1dGUodmFsdWVBdHRyLCBudmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9pbml0ZWQg
PSB0cnVlOwotICAgIH0KLQotICAgIC8vIERpc2FsbG93IHRoZSB3aWR0aCBhdHRyaWJ1dGUgb24g
aW5wdXRzIG90aGVyIHRoYW4gSElEREVOIGFuZCBJTUFHRS4KLSAgICAvLyBEdW1iIFdlYiBzaXRl
cyB3aWxsIHRyeSB0byBzZXQgdGhlIHdpZHRoIGFzIGFuIGF0dHJpYnV0ZSBvbiBmb3JtIGNvbnRy
b2xzIHRoYXQgYXJlbid0Ci0gICAgLy8gaW1hZ2VzIG9yIGhpZGRlbi4KLSAgICBpZiAoaGFzTWFw
cGVkQXR0cmlidXRlcygpICYmIG1fdHlwZSAhPSBISURERU4gJiYgbV90eXBlICE9IElNQUdFICYm
ICFnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y0Nv
ZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh3aWR0aEF0dHIsIGV4Y0NvZGUpOwotICAgIH0K
LQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIGlmICht
X3R5cGUgPT0gSU1BR0UpIHsKLSAgICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAg
ICAgbV9pbWFnZUxvYWRlciA9IG5ldyBIVE1MSW1hZ2VMb2FkZXIodGhpcyk7Ci0gICAgICAgIG1f
aW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigp
KSB7Ci0gICAgICAgICAgICBSZW5kZXJJbWFnZSogaW1hZ2VPYmogPSBzdGF0aWNfY2FzdDxSZW5k
ZXJJbWFnZSo+KHJlbmRlcmVyKCkpOwotICAgICAgICAgICAgaW1hZ2VPYmotPnNldEltYWdlKG1f
aW1hZ2VMb2FkZXItPmltYWdlKCkpOyAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG5v
dGUgd2UgZG9uJ3QgZGVhbCB3aXRoIGNhbGxpbmcgcGFzc3dvcmRGaWVsZFJlbW92ZWQoKSBvbiBk
ZXRhY2gsIGJlY2F1c2UgdGhlIHRpbWluZwotICAgIC8vIHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJl
ZCBvdXIgc3RhdGUgdG9vIGVhcmx5Ci0gICAgaWYgKG1fdHlwZSA9PSBQQVNTV09SRCkKLSAgICAg
ICAgZ2V0RG9jdW1lbnQoKS0+cGFzc3dvcmRGaWVsZEFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OmRldGFjaCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmRldGFjaCgpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQot
RE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHRUZXh0KCkgY29uc3QKLXsKLSAgICAv
LyBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvYXBwZW5kaXgv
bm90ZXMuaHRtbCNhbHRnZW4KLSAgICAvLyBhbHNvIGhlYXZpbHkgZGlzY3Vzc2VkIGJ5IEhpeGll
IG9uIGJ1Z3ppbGxhCi0gICAgLy8gbm90ZSB0aGlzIGlzIGludGVudGlvbmFsbHkgZGlmZmVyZW50
IHRvIEhUTUxJbWFnZUVsZW1lbnRJbXBsOjphbHRUZXh0KCkKLSAgICBET01TdHJpbmcgYWx0ID0g
Z2V0QXR0cmlidXRlKGFsdEF0dHIpOwotICAgIC8vIGZhbGwgYmFjayB0byB0aXRsZSBhdHRyaWJ1
dGUKLSAgICBpZiAoYWx0LmlzTnVsbCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodGl0
bGVBdHRyKTsKLSAgICBpZiAoYWx0LmlzTnVsbCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1
dGUodmFsdWVBdHRyKTsKLSAgICBpZiAoYWx0LmlzRW1wdHkoKSkKLSAgICAgICAgYWx0ID0gaW5w
dXRFbGVtZW50QWx0VGV4dCgpOwotCi0gICAgcmV0dXJuIGFsdDsKLX0KLQotYm9vbCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAgICAv
LyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8gdG8g
YmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2VycwotICAgIC8v
IGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQotICAg
IC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAot
ICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gV2FzOiAobV90eXBlID09IFNVQk1JVCAm
JiAhbmFtZSgpLmlzRW1wdHkoKSkKLSAgICByZXR1cm4gIW1fZGlzYWJsZWQgJiYgKG1fdHlwZSA9
PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VCTUlUKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6aXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdAotewotICAgIHJldHVybiBtX2FjdGl2ZVN1
Ym1pdDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0
KGJvb2wgZmxhZykKLXsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRN
TElucHV0RWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCAmZW5jb2Rpbmcs
IGJvb2wgbXVsdGlwYXJ0KQotewotICAgIC8vIGltYWdlIGdlbmVyYXRlcyBpdHMgb3duIG5hbWVz
Ci0gICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkgJiYgbV90eXBlICE9IElNQUdFKSByZXR1cm4gZmFs
c2U7Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToK
LSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgICAgIC8vIGFsd2F5cyBzdWNjZXNzZnVs
Ci0gICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBj
YXNlIFJBRElPOgotICAgICAgICAgICAgaWYgKGNoZWNrZWQoKSkgewotICAgICAgICAgICAgICAg
IGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAg
IGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgLy8gdGhvc2Ug
YnV0dG9ucyBhcmUgbmV2ZXIgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsK
LSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAi
eCIgOiAobmFtZSgpICsgIi54IiksIGNsaWNrWCgpKTsKLSAgICAgICAgICAgICAgICBlbmNvZGlu
Zy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieSIgOiAobmFtZSgpICsgIi55IiksIGNs
aWNrWSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUoKS5pc0VtcHR5KCkgJiYgIXZhbHVl
KCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5h
bWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAg
ICAgIGlmIChtX2FjdGl2ZVN1Ym1pdCkgewotICAgICAgICAgICAgICAgIERPTVN0cmluZyBlbmNf
c3RyID0gdmFsdWVXaXRoRGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIGlmICghZW5jX3N0ci5p
c0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1l
KCksIGVuY19zdHIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBj
YXNlIEZJTEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNhbid0IHN1Ym1pdCBmaWxlIG9u
IEdFVAotICAgICAgICAgICAgLy8gZG9uJ3Qgc3VibWl0IGlmIGRpc3BsYXk6IG5vbmUgb3IgZGlz
cGxheTogaGlkZGVuCi0gICAgICAgICAgICBpZighbXVsdGlwYXJ0IHx8ICFyZW5kZXJlcigpIHx8
IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBraHRtbDo6VklTSUJMRSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIGlmIG5vIGZpbGVu
YW1lIGF0IGFsbCBpcyBlbnRlcmVkLCByZXR1cm4gc3VjY2Vzc2Z1bCwgaG93ZXZlciBlbXB0eQot
ICAgICAgICAgICAgLy8gbnVsbCB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgYnV0IG5ldHNjYXBlIHBv
c3RzIGFuIGVtcHR5IGZpbGUuIGFyZ2guCi0gICAgICAgICAgICBpZiAodmFsdWUoKS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgUVN0cmlu
ZygiIikpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBlbmNvZGluZy5hcHBlbmRGaWxlKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAg
ICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgaWYgKHN0b3Jlc1ZhbHVlU2VwYXJhdGVG
cm9tQXR0cmlidXRlKCkpCi0gICAgICAgIHNldFZhbHVlKERPTVN0cmluZygpKTsKLSAgICBzZXRD
aGVja2VkKG1fZGVmYXVsdENoZWNrZWQpOwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVl
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRDaGVja2VkKGJvb2wgX2NoZWNr
ZWQpCi17Ci0gICAgLy8gV2luSUUgZG9lcyBub3QgYWxsb3cgdW5uYW1lZCByYWRpbyBidXR0b25z
IHRvIGV2ZW4gYmUgY2hlY2tlZC4KLSAgICBpZiAoY2hlY2tlZCgpID09IF9jaGVja2VkIHx8ICht
X3R5cGUgPT0gUkFESU8gJiYgbmFtZSgpLmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgX2NoZWNrZWQpCi0gICAgICAgIGdldERvY3VtZW50
KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotCi0gICAgbV91c2VEZWZhdWx0
Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1fY2hlY2tlZCA9IF9jaGVja2VkOwotICAgIHNldENoYW5n
ZWQoKTsKLSAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBl
YXJhbmNlKCkpCi0gICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVj
a2VkU3RhdGUpOwotICAgIG9uQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OnNldEluZGV0ZXJtaW5hdGUoYm9vbCBfaW5kZXRlcm1pbmF0ZSkKLXsKLSAgICAvLyBPbmx5
IGNoZWNrYm94ZXMgaG9ub3IgaW5kZXRlcm1pbmF0ZS4KLSAgICBpZiAobV90eXBlICE9IENIRUNL
Qk9YIHx8IGluZGV0ZXJtaW5hdGUoKSA9PSBfaW5kZXRlcm1pbmF0ZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgbV9pbmRldGVybWluYXRlID0gX2luZGV0ZXJtaW5hdGU7Ci0KLSAgICBzZXRDaGFu
Z2VkKCk7Ci0KLSAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNB
cHBlYXJhbmNlKCkpCi0gICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBD
aGVja2VkU3RhdGUpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjb3B5Tm9uQXR0
cmlidXRlUHJvcGVydGllcyhjb25zdCBFbGVtZW50SW1wbCAqc291cmNlKQotewotICAgIGNvbnN0
IEhUTUxJbnB1dEVsZW1lbnRJbXBsICpzb3VyY2VFbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRN
TElucHV0RWxlbWVudEltcGwgKj4oc291cmNlKTsKLQotICAgIG1fdmFsdWUgPSBzb3VyY2VFbGVt
LT5tX3ZhbHVlOwotICAgIG1fY2hlY2tlZCA9IHNvdXJjZUVsZW0tPm1fY2hlY2tlZDsKLSAgICBt
X2luZGV0ZXJtaW5hdGUgPSBzb3VyY2VFbGVtLT5tX2luZGV0ZXJtaW5hdGU7Ci19Ci0KLURPTVN0
cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIERPTVN0cmlu
ZyB2YWx1ZSA9IG1fdmFsdWU7Ci0KLSAgICAvLyBJdCdzIGltcG9ydGFudCAqbm90KiB0byBmYWxs
IGJhY2sgdG8gdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgZmlsZSBpbnB1dHMsCi0gICAgLy8gYmVj
YXVzZSB0aGF0IHdvdWxkIGFsbG93IGEgbWFsaWNpb3VzIHdlYiBwYWdlIHRvIHVwbG9hZCBmaWxl
cyBieSBzZXR0aW5nIHRoZQotICAgIC8vIHZhbHVlIGF0dHJpYnV0ZSBpbiBtYXJrdXAuCi0gICAg
aWYgKHZhbHVlLmlzTnVsbCgpICYmIG1fdHlwZSAhPSBGSUxFKQotICAgICAgICB2YWx1ZSA9IGdl
dEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotCi0gICAgLy8gSWYgbm8gYXR0cmlidXRlIGV4aXN0cywg
dGhlbiBqdXN0IHVzZSAib24iIG9yICIiIGJhc2VkIG9mZiB0aGUgY2hlY2tlZCgpIHN0YXRlIG9m
IHRoZSBjb250cm9sLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiAobV90eXBlID09IENIRUNL
Qk9YIHx8IG1fdHlwZSA9PSBSQURJTykpCi0gICAgICAgIHJldHVybiBET01TdHJpbmcoY2hlY2tl
ZCgpID8gIm9uIiA6ICIiKTsKLQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjp2YWx1ZVdpdGhEZWZhdWx0KCkgY29uc3QKLXsKLSAgICBET01T
dHJpbmcgdiA9IHZhbHVlKCk7Ci0gICAgaWYgKHYuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHN3aXRj
aCAobV90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIHYg
PSByZXNldEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0g
ICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICB2ID0gc3VibWl0QnV0dG9u
RGVmYXVsdExhYmVsKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNh
c2UgQlVUVE9OOgotICAgICAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgICAgIGNhc2Ug
RklMRToKLSAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgY2FzZSBJTUFHRToK
LSAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0g
ICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAg
ICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2OwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAg
IGlmIChtX3R5cGUgPT0gRklMRSkgcmV0dXJuOwotCi0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJl
ciA9IGZhbHNlOwotICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKSB7
Ci0gICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgaWYgKG1fcmVuZGVyKQotICAgICAg
ICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIHNldENoYW5nZWQo
KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7
Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1ZUZyb21SZW5k
ZXJlcihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAg
ICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGaXJlIHRoZSAi
aW5wdXQiIERPTSBldmVudC4KLSAgICBkaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVl
LCBmYWxzZSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OnN0b3Jlc1ZhbHVlU2Vw
YXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAg
ICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBG
SUxFOgotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAg
Y2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAg
ICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNh
c2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6
Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQqIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwcmVEaXNw
YXRjaEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICAvLyBwcmV2ZW50RGVmYXVs
dCBvciAicmV0dXJuIGZhbHNlIiBhcmUgdXNlZCB0byByZXZlcnNlIHRoZSBhdXRvbWF0aWMgY2hl
Y2tpbmcvc2VsZWN0aW9uIHdlIGRvIGhlcmUuCi0gICAgLy8gVGhpcyByZXN1bHQgZ2l2ZXMgdXMg
ZW5vdWdoIGluZm8gdG8gcGVyZm9ybSB0aGUgInVuZG8iIGluIHBvc3REaXNwYXRjaCBvZiB0aGUg
YWN0aW9uIHdlIHRha2UgaGVyZS4KLSAgICB2b2lkKiByZXN1bHQgPSAwOyAKLSAgICBpZiAoKG1f
dHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50
KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8
TW91c2VFdmVudEltcGwqPihldnQpLT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5
cGUgPT0gQ0hFQ0tCT1gpIHsKLSAgICAgICAgICAgIC8vIEFzIGEgd2F5IHRvIHN0b3JlIHRoZSBz
dGF0ZSwgd2UgcmV0dXJuIDAgaWYgd2Ugd2VyZSB1bmNoZWNrZWQsIDEgaWYgd2Ugd2VyZSBjaGVj
a2VkLCBhbmQgMiBmb3IKLSAgICAgICAgICAgIC8vIGluZGV0ZXJtaW5hdGUuCi0gICAgICAgICAg
ICBpZiAoaW5kZXRlcm1pbmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQq
KTB4MjsKLSAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQoKSkKLSAgICAgICAgICAg
ICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKTB4MTsKLSAgICAgICAgICAgICAgICBzZXRDaGVja2Vk
KCFjaGVja2VkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgLy8gRm9yIHJhZGlvIGJ1dHRvbnMsIHN0b3JlIHRoZSBjdXJyZW50IHNlbGVjdGVkIHJhZGlv
IG9iamVjdC4KLSAgICAgICAgICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpIHx8IGNoZWNrZWQoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gVW5uYW1lZCByYWRpbyBidXR0b25zIGRvbnQg
Z2V0IGNoZWNrZWQuIENoZWNrZWQgYnV0dG9ucyBqdXN0IHN0YXkgY2hlY2tlZC4KLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IE5lZWQgdG8gbGVhcm4gdG8gd29yayB3aXRob3V0
IGEgZm9ybS4KLQotICAgICAgICAgICAgLy8gV2UgcmVhbGx5IHdhbnQgcmFkaW8gZ3JvdXBzIHRv
IGVuZCB1cCBpbiBzYW5lIHN0YXRlcywgaS5lLiwgdG8gaGF2ZSBzb21ldGhpbmcgY2hlY2tlZC4K
LSAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSBzZWxlY3Rl
ZCwgd2Ugd29uJ3QgYWxsb3cgdGhpcyBhY3Rpb24gdG8gYmUgInVuZG9uZSIsIHNpbmNlCi0gICAg
ICAgICAgICAvLyB3ZSB3YW50IHNvbWUgb2JqZWN0IGluIHRoZSByYWRpbyBncm91cCB0byBhY3R1
YWxseSBnZXQgc2VsZWN0ZWQuCi0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY3Vy
clJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgp
LmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAgICAgIGlmIChjdXJyUmFkaW8pIHsKLSAgICAgICAg
ICAgICAgICAvLyBXZSBoYXZlIGEgcmFkaW8gYnV0dG9uIHNlbGVjdGVkIHRoYXQgaXMgbm90IHVz
LiAgQ2FjaGUgaXQgaW4gb3VyIHJlc3VsdCBmaWVsZCBhbmQgcmVmIGl0IHNvCi0gICAgICAgICAg
ICAgICAgLy8gdGhhdCBpdCBjYW4ndCBiZSBkZXN0cm95ZWQuCi0gICAgICAgICAgICAgICAgY3Vy
clJhZGlvLT5yZWYoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyUmFkaW87Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOwotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBv
c3REaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCwgdm9pZCogZGF0YSkKLXsKLSAg
ICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNN
b3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3Rh
dGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpLT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAg
IGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gpIHsKLSAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIGNo
ZWNraW5nIHdlIGRpZCBpbiBwcmVEaXNwYXRjaC4KLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1
bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRlZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoZGF0YSA9PSAodm9pZCopMHgyKQotICAgICAgICAgICAgICAgICAgICBzZXRJbmRldGVy
bWluYXRlKHRydWUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAg
c2V0Q2hlY2tlZChkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRh
KSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogaW5wdXQgPSBzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGRhdGEpOwotICAgICAgICAgICAgaWYgKGV2dC0+ZGVm
YXVsdFByZXZlbnRlZCgpIHx8IGV2dC0+ZGVmYXVsdEhhbmRsZWQoKSkgewotICAgICAgICAgICAg
ICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBpZiBwb3Nz
aWJsZS4KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgaXMgc3RpbGwgYSByYWRpbyBi
dXR0b24gYW5kIG9ubHkgZG8gdGhlIHJlc3RvcmF0aW9uIGlmIGl0IHN0aWxsCi0gICAgICAgICAg
ICAgICAgLy8gYmVsb25ncyB0byBvdXIgZ3JvdXAuCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0
LT5mb3JtKCkgPT0gZm9ybSgpICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1
dC0+bmFtZSgpID09IG5hbWUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPaywgdGhlIG9s
ZCByYWRpbyBidXR0b24gaXMgc3RpbGwgaW4gb3VyIGZvcm0gYW5kIGluIG91ciBncm91cCBhbmQg
aXMgc3RpbGwgYSAKLSAgICAgICAgICAgICAgICAgICAgLy8gcmFkaW8gYnV0dG9uLCBzbyBpdCdz
IHNhZmUgdG8gcmVzdG9yZSBzZWxlY3Rpb24gdG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIGlu
cHV0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGlucHV0LT5kZXJlZigpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0
KQotewotICAgIGlmIChtX3R5cGUgPT0gSU1BR0UgJiYgZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBl
dnQtPnR5cGUoKSA9PSBjbGlja0V2ZW50ICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIC8vIHJlY29y
ZCB0aGUgbW91c2UgcG9zaXRpb24gZm9yIHdoZW4gd2UgZ2V0IHRoZSBET01BY3RpdmF0ZSBldmVu
dAotICAgICAgICBNb3VzZUV2ZW50SW1wbCAqbWUgPSBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50SW1w
bCo+KGV2dCk7Ci0gICAgICAgIGludCBvZmZzZXRYLCBvZmZzZXRZOwotICAgICAgICBtX3JlbmRl
ci0+YWJzb2x1dGVQb3NpdGlvbihvZmZzZXRYLG9mZnNldFkpOwotICAgICAgICB4UG9zID0gbWUt
PmNsaWVudFgoKS1vZmZzZXRYOwotICAgICAgICB5UG9zID0gbWUtPmNsaWVudFkoKS1vZmZzZXRZ
OwotCi0JbWUtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgfQotCi0gICAgLy8gRE9NQWN0aXZh
dGUgZXZlbnRzIGNhdXNlIHRoZSBpbnB1dCB0byBiZSAiYWN0aXZhdGVkIiAtIGluIHRoZSBjYXNl
IG9mIGltYWdlIGFuZCBzdWJtaXQgaW5wdXRzLCB0aGlzIG1lYW5zCi0gICAgLy8gYWN0dWFsbHkg
c3VibWl0dGluZyB0aGUgZm9ybS4gRm9yIHJlc2V0IGlucHV0cywgdGhlIGZvcm0gaXMgcmVzZXQu
IFRoZXNlIGV2ZW50cyBhcmUgc2VudCB3aGVuIHRoZSB1c2VyIGNsaWNrcwotICAgIC8vIG9uIHRo
ZSBlbGVtZW50LCBvciBwcmVzc2VzIGVudGVyIHdoaWxlIGl0IGlzIHRoZSBhY3RpdmUgZWxlbWVu
dC4gSmF2YWNzcmlwdCBjb2RlIHdpc2hpbmcgdG8gYWN0aXZhdGUgdGhlIGVsZW1lbnQKLSAgICAv
LyBtdXN0IGRpc3BhdGNoIGEgRE9NQWN0aXZhdGUgZXZlbnQgLSBhIGNsaWNrIGV2ZW50IHdpbGwg
bm90IGRvIHRoZSBqb2IuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQp
IHsKLSAgICAgICAgaWYgKG1fdHlwZSA9PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VCTUlUIHx8IG1f
dHlwZSA9PSBSRVNFVCkgewotICAgICAgICAgICAgaWYgKCFtX2Zvcm0pCi0gICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSRVNFVCkKLSAgICAgICAgICAg
ICAgICBtX2Zvcm0tPnJlc2V0KCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2Zvcm0tPnBy
ZXBhcmVTdWJtaXQoKSkgewotICAgICAgICAgICAgICAgICAgICB4UG9zID0gMDsKLSAgICAgICAg
ICAgICAgICAgICAgeVBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAg
fQotCi0gICAgLy8gVXNlIGtleSBwcmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxh
dGVkIG1vdXNlIGV2ZW50cwotICAgIC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNl
bmRpbmcgb2YgdGhlIGtleSBwcmVzcyBldmVudC4KLSAgICBpZiAoZXZ0LT50eXBlKCkgPT0ga2V5
cHJlc3NFdmVudCAmJiBldnQtPmlzS2V5Ym9hcmRFdmVudCgpKSB7Ci0gICAgICAgIGJvb2wgY2xp
Y2tFbGVtZW50ID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9
IGZhbHNlOwotCi0gICAgICAgIERPTVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2
ZW50SW1wbCAqPihldnQpLT5rZXlJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSAi
VSswMDAwMjAiKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAg
ICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAg
ICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIHNwYWNlYmFyIGZvciB0
aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEFwcEtp
dCBhbHJlYWR5IGRvZXMgdGhpcyBmb3Igc29tZSwgYnV0IG5vdCBhbGwsIG9mIHRoZW0uCi0gICAg
ICAgICAgICAgICAgICAgIGNsaWNrRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAgICAgICAgICAg
IC8vIElmIGFuIHVuc2VsZWN0ZWQgcmFkaW8gaXMgdGFiYmVkIGludG8gKGJlY2F1c2UgdGhlIGVu
dGlyZSBncm91cCBoYXMgbm90aGluZwotICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkLCBv
ciBiZWNhdXNlIG9mIHNvbWUgZXhwbGljaXQgLmZvY3VzKCkgY2FsbCksIHRoZW4gYWxsb3cgc3Bh
Y2UgdG8gY2hlY2sgaXQuCi0gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAg
ICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAg
ICAgICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleSA9PSAiRW50ZXIiKSB7Ci0gICAg
ICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgot
ICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBISURE
RU46Ci0gICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgICAgICBj
YXNlIFNFQVJDSDoKLSAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIG9uIHRoZSBkZWZhdWx0IGZvcm0gYnV0dG9uIGZv
ciBlbnRlciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAg
IGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBJTUFH
RToKLSAgICAgICAgICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIGNhc2UgU1VC
TUlUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3IgZW50
ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlj
a0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gRG9uJ3QgZG8g
YW55dGhpbmcgZm9yIGVudGVyIG9uIGEgcmFkaW8gYnV0dG9uLgotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAoa2V5ID09ICJVcCIgfHwg
a2V5ID09ICJEb3duIiB8fCBrZXkgPT0gIkxlZnQiIHx8IGtleSA9PSAiUmlnaHQiKSkgewotICAg
ICAgICAgICAgLy8gTGVmdCBhbmQgdXAgbWVhbiAicHJldmlvdXMgcmFkaW8gYnV0dG9uIi4KLSAg
ICAgICAgICAgIC8vIFJpZ2h0IGFuZCBkb3duIG1lYW4gIm5leHQgcmFkaW8gYnV0dG9uIi4KLSAg
ICAgICAgICAgIC8vIFRlc3RlZCBpbiBXaW5JRSwgYW5kIGV2ZW4gZm9yIFJUTCwgbGVmdCBzdGls
bCBtZWFucyBwcmV2aW91cyByYWRpbyBidXR0b24gKGFuZCBzbyBtb3ZlcwotICAgICAgICAgICAg
Ly8gdG8gdGhlIHJpZ2h0KS4gIFNlZW1zIHN0cmFuZ2UsIGJ1dCB3ZSdsbCBtYXRjaCBpdC4KLSAg
ICAgICAgICAgIGJvb2wgZm9yd2FyZCA9IChrZXkgPT0gIkRvd24iIHx8IGtleSA9PSAiUmlnaHQi
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gV2UgY2FuIG9ubHkgc3RheSB3aXRoaW4g
dGhlIGZvcm0ncyBjaGlsZHJlbiBpZiB0aGUgZm9ybSBoYXNuJ3QgYmVlbiBkZW1vdGVkIHRvIGEg
bGVhZiBiZWNhdXNlCi0gICAgICAgICAgICAvLyBvZiBtYWxmb3JtZWQgSFRNTC4KLSAgICAgICAg
ICAgIE5vZGVJbXBsKiBuID0gdGhpczsKLSAgICAgICAgICAgIHdoaWxlICgobiA9IChmb3J3YXJk
ID8gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpIDogbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkpKSB7
Ci0gICAgICAgICAgICAgICAgLy8gT25jZSB3ZSBlbmNvdW50ZXIgYSBmb3JtIGVsZW1lbnQsIHdl
IGtub3cgd2UncmUgdGhyb3VnaC4KLSAgICAgICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShm
b3JtVGFnKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIG1vcmUgcmFkaW8gYnV0dG9ucy4KLSAgICAg
ICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgICAg
ICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGVsdCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKj4obik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbHQtPmZvcm0oKSAhPSBt
X2Zvcm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBIVE1MSW5wdXRFbGVtZW50SW1wbCogaW5wdXRFbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWx0LT5p
bnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1dEVsdC0+bmFtZSgpID09IG5hbWUoKSAmJgotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5pc0ZvY3VzYWJsZSgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQtPnNldENoZWNrZWQodHJ1ZSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2V0Rm9jdXNOb2RlKGlucHV0
RWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+Y2xpY2soZmFsc2Us
IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5k
bGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpY2tFbGVtZW50KSB7Ci0g
ICAgICAgICAgICBjbGljayhmYWxzZSk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5k
bGVkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiAmJiBtX2Zv
cm0pIHsKLSAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAgICAgIGV2
dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLWJvb2wg
SFRNTElucHV0RWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQotewotICAgIHJldHVybiAoKG1fdHlw
ZSA9PSBURVhUKSB8fCAobV90eXBlID09IFBBU1NXT1JEKSB8fAotICAgICAgICAgICAgKG1fdHlw
ZSA9PSBTRUFSQ0gpIHx8IChtX3R5cGUgPT0gSVNJTkRFWCkgfHwgKG1fdHlwZSA9PSBGSUxFKSk7
Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0
ZUltcGwgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChhdHRyLT5uYW1lKCkgPT0gc3JjQXR0
cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdENoZWNrZWQoKSBjb25zdAotewotICAgIHJldHVy
biAhZ2V0QXR0cmlidXRlKGNoZWNrZWRBdHRyKS5pc051bGwoKTsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0RGVmYXVsdENoZWNrZWQoYm9vbCBkZWZhdWx0Q2hlY2tlZCkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoY2hlY2tlZEF0dHIsIGRlZmF1bHRDaGVja2VkID8gIiIgOiAwKTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphY2NlcHQoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldEFjY2VwdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZShhY2NlcHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2Nl
c3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNz
a2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFs
aWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJp
bmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFsdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShhbHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWx0
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsdEF0dHIsIHZh
bHVlKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0TWF4TGVuZ3RoKGludCBf
bWF4TGVuZ3RoKQotewotICAgIHNldEF0dHJpYnV0ZShtYXhsZW5ndGhBdHRyLCBRU3RyaW5nOjpu
dW1iZXIoX21heExlbmd0aCkpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRT
aXplKHVuc2lnbmVkIF9zaXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmlu
Zzo6bnVtYmVyKF9zaXplKSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
c3JjKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoZ2V0
QXR0cmlidXRlKHNyY0F0dHIpKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0
U3JjKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNyY0F0dHIs
IHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp1c2VNYXAoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodXNlbWFwQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZSh1c2VtYXBBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotSFRNTExhYmVsRWxlbWVudEltcGw6OkhUTUxMYWJlbEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnRJbXBsKGxhYmVsVGFnLCBkb2MpCi17
Ci19Ci0KLUhUTUxMYWJlbEVsZW1lbnRJbXBsOjp+SFRNTExhYmVsRWxlbWVudEltcGwoKQotewot
fQotCi1ib29sIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIo
Zm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVy
QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwot
ICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KGF0dHIpOwotfQotCi1FbGVtZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm1FbGVt
ZW50KCkKLXsKLSAgICBET01TdHJpbmcgZm9ybUVsZW1lbnRJZCA9IGdldEF0dHJpYnV0ZShmb3JB
dHRyKTsKLSAgICBpZiAoZm9ybUVsZW1lbnRJZC5pc051bGwoKSkgewotICAgICAgICAvLyBTZWFy
Y2ggY2hpbGRyZW4gb2YgdGhlIGxhYmVsIGVsZW1lbnQgZm9yIGEgZm9ybSBlbGVtZW50LgotICAg
ICAgICBOb2RlSW1wbCAqbm9kZSA9IHRoaXM7Ci0gICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUt
PnRyYXZlcnNlTmV4dE5vZGUodGhpcykpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1M
RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50ID0g
c3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpOwotICAgICAgICAgICAgICAgIGlm
IChlbGVtZW50LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZWxlbWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgaWYgKGZvcm1FbGVtZW50SWQuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZm9ybUVsZW1l
bnRJZCk7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OmZvY3VzKCkKLXsKLSAgICBp
ZiAoRWxlbWVudEltcGwgKmVsZW1lbnQgPSBmb3JtRWxlbWVudCgpKQotICAgICAgICBlbGVtZW50
LT5mb2N1cygpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rp
b24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIEVsZW1lbnRJbXBsICplbGVtZW50ID0g
Zm9ybUVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCkKLSAgICAgICAgZWxlbWVudC0+YWNjZXNz
S2V5QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpI
VE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9ybSgpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqcCA9IHBh
cmVudE5vZGUoKTsgcCAhPSAwOyBwID0gcC0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChw
LT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhU
TUxGb3JtRWxlbWVudEltcGwgKj4ocCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQot
Ci1ET01TdHJpbmcgSFRNTExhYmVsRWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFi
ZWxFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxMYWJlbEVsZW1lbnRJbXBsOjpodG1sRm9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGZvckF0dHIpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpzZXRIdG1s
Rm9yKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGZvckF0dHIs
IHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MTGVnZW5kRWxlbWVudElt
cGw6OkhUTUxMZWdlbmRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVt
ZW50SW1wbCAqZikKLTogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwobGVnZW5kVGFnLCBkb2Ms
IGYpCi17Ci19Ci0KLUhUTUxMZWdlbmRFbGVtZW50SW1wbDo6fkhUTUxMZWdlbmRFbGVtZW50SW1w
bCgpCi17Ci19Ci0KLWJvb2wgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHls
ZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckxlZ2VuZCh0aGlzKTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuICJsZWdlbmQiOwotfQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBs
OjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwg
dmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphbGlnbigpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhU
TUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLUVsZW1lbnRJbXBsICpI
VE1MTGVnZW5kRWxlbWVudEltcGw6OmZvcm1FbGVtZW50KCkKLXsKLSAgICAvLyBDaGVjayBpZiB0
aGVyZSdzIGEgZmllbGRzZXQgYmVsb25naW5nIHRvIHRoaXMgbGVnZW5kLgotICAgIE5vZGVJbXBs
ICpmaWVsZHNldCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAoZmllbGRzZXQgJiYgIWZpZWxk
c2V0LT5oYXNUYWdOYW1lKGZpZWxkc2V0VGFnKSkKLSAgICAgICAgZmllbGRzZXQgPSBmaWVsZHNl
dC0+cGFyZW50Tm9kZSgpOwotICAgIGlmICghZmllbGRzZXQpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgLy8gRmluZCBmaXJzdCBmb3JtIGVsZW1lbnQgaW5zaWRlIHRoZSBmaWVsZHNldC4KLSAg
ICAvLyBGSVhNRTogU2hvdWxkIHdlIGNhcmUgYWJvdXQgdGFiaW5kZXg/Ci0gICAgTm9kZUltcGwg
Km5vZGUgPSBmaWVsZHNldDsKLSAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKGZpZWxkc2V0KSkpIHsKLSAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewot
ICAgICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVs
ZW1lbnRJbXBsICo+KG5vZGUpOwotICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5oYXNMb2NhbE5h
bWUobGVnZW5kVGFnKSAmJiBlbGVtZW50LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBlbGVtZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IDA7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYg
KEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+
Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlv
bihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50
ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRU
b0FueUVsZW1lbnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6SFRNTFNlbGVjdEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoc2VsZWN0
VGFnLCBkb2MsIGYpLCBtX29wdGlvbnMoMCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6SFRNTFNlbGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUm
IHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAg
IDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwodGFnTmFtZSwgZG9jLCBmKSwgbV9vcHRpb25z
KDApCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5p
dCgpCi17Ci0gICAgbV9vcHRpb25zID0gMDsKLSAgICBtX211bHRpcGxlID0gZmFsc2U7Ci0gICAg
bV9yZWNhbGNMaXN0SXRlbXMgPSBmYWxzZTsKLSAgICAvLyAwIG1lYW5zIGludmFsaWQgKGkuZS4g
bm90IHNldCkKLSAgICBtX3NpemUgPSAwOwotICAgIG1fbWlud2lkdGggPSAwOwotfQotCi1IVE1M
U2VsZWN0RWxlbWVudEltcGw6On5IVE1MU2VsZWN0RWxlbWVudEltcGwoKQotewotICAgIGlmIChn
ZXREb2N1bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUodGhp
cyk7Ci0gICAgaWYgKG1fb3B0aW9ucykgewotICAgICAgICBtX29wdGlvbnMtPmRldGFjaCgpOwot
ICAgICAgICBtX29wdGlvbnMtPmRlcmVmKCk7Ci0gICAgfQotfQotCi1ib29sIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJl
dHVybiBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGlv
blRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpIHx8IG5ld0NoaWxkLT5o
YXNUYWdOYW1lKGhyVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3Jp
cHRUYWcpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0
eWxlQ2hhbmdlIGNoICkKLXsKLSAgICBpZiAoaGFzQ2hhbmdlZENoaWxkKCkgJiYgbV9yZW5kZXIp
IHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+
c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotfQotCi0KLURPTVN0cmluZyBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAobV9tdWx0aXBsZSA/ICJz
ZWxlY3QtbXVsdGlwbGUiIDogInNlbGVjdC1vbmUiKTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0Ci17Ci0gICAgLy8gcmV0dXJuIHRoZSBudW1i
ZXIgb2YgdGhlIGZpcnN0IG9wdGlvbiBzZWxlY3RlZAotICAgIHVpbnQgbyA9IDA7Ci0gICAgUU1l
bUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yICh1
bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAo
aXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBpZiAoc3Rh
dGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQot
ICAgICAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICAgICAgbysrOwotICAgICAgICB9Ci0g
ICAgfQotICAgIFFfQVNTRVJUKG1fbXVsdGlwbGUpOwotICAgIHJldHVybiAtMTsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFNlbGVjdGVkSW5kZXgoIGludCAgaW5kZXggKQot
ewotICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25zIGFuZCBzZWxlY3Qgb25seSB0aGUg
bmV3IG9uZQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVt
cygpOwotICAgIGludCBsaXN0SW5kZXg7Ci0gICAgZm9yIChsaXN0SW5kZXggPSAwOyBsaXN0SW5k
ZXggPCBpbnQoaXRlbXMuc2l6ZSgpKTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgaWYgKGl0ZW1z
W2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVj
dGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoaW5k
ZXgpOwotICAgIGlmIChsaXN0SW5kZXggPj0gMCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKHRydWUpOwot
Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6
bGVuZ3RoKCkgY29uc3QKLXsKLSAgICBpbnQgbGVuID0gMDsKLSAgICB1aW50IGk7Ci0gICAgUU1l
bUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChp
ID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBsZW4rKzsKLSAgICB9Ci0gICAgcmV0
dXJuIGxlbjsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZCggSFRNTEVsZW1l
bnRJbXBsICplbGVtZW50LCBIVE1MRWxlbWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICBSZWZQdHI8SFRNTEVsZW1lbnRJbXBsPiBwcm90ZWN0TmV3Q2hpbGQoZWxl
bWVudCk7IC8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3
ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICBpZiAoIWVsZW1lbnQgfHwgIShlbGVtZW50LT5oYXNMb2Nh
bE5hbWUob3B0aW9uVGFnKSB8fCBlbGVtZW50LT5oYXNMb2NhbE5hbWUoaHJUYWcpKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGJlZm9yZSwgZXhjZXB0aW9u
Y29kZSk7Ci0gICAgaWYgKCFleGNlcHRpb25jb2RlKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZSggaW50IGluZGV4
ICkKLXsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgaW50IGxpc3RJbmRleCA9IG9w
dGlvblRvTGlzdEluZGV4KGluZGV4KTsKLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmKGxpc3RJbmRleCA8IDAgfHwgaW5kZXggPj0g
aW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybjsgLy8gIyMjIHdoYXQgc2hvdWxkIHdl
IGRvID8gcmVtb3ZlIHRoZSBsYXN0IGl0ZW0/Ci0KLSAgICBOb2RlSW1wbCAqaXRlbSA9IGl0ZW1z
W2xpc3RJbmRleF07Ci0gICAgaXRlbS0+cmVmKCk7Ci0gICAgcmVtb3ZlQ2hpbGQoaXRlbSwgZXhj
ZXB0aW9uY29kZSk7Ci0gICAgaXRlbS0+ZGVyZWYoKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUg
KQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6dmFsdWUoKQotewotICAgIHVpbnQgaTsKLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwg
aXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tp
XSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTE9wdGlv
bkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT52YWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gRE9N
U3RyaW5nKCIiKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgLy8gZmluZCB0aGUgb3B0aW9uIHdpdGggdmFsdWUoKSBtYXRjaGluZyB0
aGUgZ2l2ZW4gcGFyYW1ldGVyCi0gICAgLy8gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0
aW9uLgotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAg
ICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxI
VE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnZhbHVlKCkgPT0gdmFsdWUpIHsKLSAg
ICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+
c2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQot
UVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnN0YXRlKCkKLXsKLSAgICBRTWVtQXJyYXk8
SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIGludCBsID0gaXRl
bXMuY291bnQoKTsKLQotICAgIFFDaGFyIHN0YXRlQ2hhcnNbbF07Ci0gICAgCi0gICAgZm9yKGlu
dCBpID0gMDsgaSA8IGw7IGkrKykKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShv
cHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ld
KS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgIHN0YXRlQ2hhcnNbaV0gPSAnWCc7Ci0gICAgICAg
IGVsc2UKLSAgICAgICAgICAgIHN0YXRlQ2hhcnNbaV0gPSAnLic7Ci0gICAgUVN0cmluZyBzdGF0
ZShzdGF0ZUNoYXJzLCBsKTsKLQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6c3RhdGUoKSArIHN0YXRlOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVz
dG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZfc3RhdGVzKQotewotICAgIFFTdHJpbmcgX3N0YXRlID0g
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKF9zdGF0ZXMpOwot
ICAgIGlmIChfc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLQotICAgIHJlY2FsY0xpc3RJdGVtcygp
OwotCi0gICAgUVN0cmluZyBzdGF0ZSA9IF9zdGF0ZTsKLSAgICBpZighc3RhdGUuaXNFbXB0eSgp
ICYmICFzdGF0ZS5jb250YWlucygnWCcpICYmICFtX211bHRpcGxlKSB7Ci0gICAgICAgIHFXYXJu
aW5nKCJzaG91bGQgbm90IGhhcHBlbiBpbiByZXN0b3JlU3RhdGUhIik7Ci0gICAgICAgIC8vIEtX
UVN0cmluZyBkb2Vzbid0IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24uIFNob3VsZCBuZXZlciBnZXQg
aGVyZSBhbnl3YXkuCi0gICAgICAgIC8vc3RhdGVbMF0gPSAnWCc7Ci0gICAgfQotCi0gICAgUU1l
bUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQg
bCA9IGl0ZW1zLmNvdW50KCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotICAg
ICAgICBpZihpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAg
IEhUTUxPcHRpb25FbGVtZW50SW1wbCogb2UgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBvZS0+c2V0U2VsZWN0ZWQoc3RhdGVbaV0g
PT0gJ1gnKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi1O
b2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAq
bmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAg
ICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJl
Zm9yZShuZXdDaGlsZCxyZWZDaGlsZCwgZXhjZXB0aW9uY29kZSApOwotICAgIGlmICghZXhjZXB0
aW9uY29kZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIHJlc3Vs
dDsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkICgg
Tm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpyZXBsYWNlQ2hpbGQobmV3Q2hpbGQsb2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlm
KCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92
ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hp
bGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0g
ICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5v
ZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5l
d0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlv
bmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJ
dGVtcygpOwotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
Tm9kZUltcGwqIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0No
aWxkKQotewotICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6YWRkQ2hpbGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAq
YXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNpemVBdHRyKSB7Ci0gICAgICAgIG1f
c2l6ZSA9IGtNYXgoYXR0ci0+dmFsdWUoKS50b0ludCgpLCAxKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgbV9taW53aWR0aCA9IGtNYXgoIGF0
dHItPnZhbHVlKCkudG9JbnQoKSwgMCApOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG11bHRpcGxlQXR0cikgewotICAgICAgICBtX211bHRpcGxlID0gKCFhdHRyLT5pc051bGwoKSk7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAg
ICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9j
dXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0
cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsK
LX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBu
ZXcgKGFyZW5hKSBSZW5kZXJTZWxlY3QodGhpcyk7Ci19Ci0KLWJvb2wgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29s
KQotewotICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgIFFNZW1BcnJheTxIVE1MRWxl
bWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotCi0gICAgdWludCBpOwotICAgIGZvciAo
aSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhh
c0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudElt
cGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ld
KTsKLSAgICAgICAgICAgIGlmIChvcHRpb24tPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAg
ICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAg
ICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vICMjIyB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4uIG1ha2Ug
c3VyZSB0aGF0IHdlIHNlbGVjdCB0aGUgZmlyc3Qgb3B0aW9uCi0gICAgLy8gaW4gYW55IGNhc2Uu
IG90aGVyd2lzZSB3ZSBoYXZlIG5vIGNvbnNpc3RlbmN5IHdpdGggdGhlIERPTSBpbnRlcmZhY2Uu
IEZJWE1FIQotICAgIC8vIHdlIHJldHVybiB0aGUgZmlyc3Qgb25lIGlmIGl0IHdhcyBhIGNvbWJv
Ym94IHNlbGVjdAotICAgIGlmICghc3VjY2Vzc2Z1bCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUg
PD0gMSAmJiBpdGVtcy5zaXplKCkgJiYKLSAgICAgICAgKGl0ZW1zWzBdLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkpIHsKLSAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1swXSk7Ci0gICAgICAgIGlm
IChvcHRpb24tPnZhbHVlKCkuaXNOdWxsKCkpCi0gICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5h
cHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT50ZXh0KCkucXN0cmluZygpLnN0cmlwV2hpdGVTcGFj
ZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0
YShuYW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7Ci0gICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwot
ICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzZnVsOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0Ci17Ci0gICAg
UU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYg
KG9wdGlvbkluZGV4IDwgMCB8fCBvcHRpb25JbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSkKLSAg
ICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IGxpc3RJbmRleCA9IDA7Ci0gICAgaW50IG9wdGlv
bkluZGV4MiA9IDA7Ci0gICAgZm9yICg7Ci0gICAgICAgICBvcHRpb25JbmRleDIgPCBpbnQoaXRl
bXMuc2l6ZSgpKSAmJiBvcHRpb25JbmRleDIgPD0gb3B0aW9uSW5kZXg7Ci0gICAgICAgICBsaXN0
SW5kZXgrKykgeyAvLyBub3QgYSB0eXBvIQotICAgICAgICBpZiAoaXRlbXNbbGlzdEluZGV4XS0+
aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBvcHRpb25JbmRleDIrKzsKLSAg
ICB9Ci0gICAgbGlzdEluZGV4LS07Ci0gICAgcmV0dXJuIGxpc3RJbmRleDsKLX0KLQotaW50IEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6bGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29u
c3QKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMo
KTsKLSAgICBpZiAobGlzdEluZGV4IDwgMCB8fCBsaXN0SW5kZXggPj0gaW50KGl0ZW1zLnNpemUo
KSkgfHwKLSAgICAgICAgIWl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcp
KQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpbnQgb3B0aW9uSW5kZXggPSAwOyAvLyBhY3R1
YWwgaW5kZXggb2Ygb3B0aW9uIG5vdCBjb3VudGluZyBPUFRHUk9VUCBlbnRyaWVzIHRoYXQgbWF5
IGJlIGluIGxpc3QKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdEluZGV4OyBp
KyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAg
ICAgICAgICBvcHRpb25JbmRleCsrOwotICAgIHJldHVybiBvcHRpb25JbmRleDsKLX0KLQotLy8g
RklYTUUgNDE5Nzk5NzogdGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgcHVibGljIEFQSSAtW0RP
TUhUTUxTZWxlY3RFbGVtZW50IG9wdGlvbnNdLCBidXQgYWx3YXlzIHJldHVybnMKLS8vIGFuIGVt
cHR5IGxpc3QuCi1IVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICpIVE1MU2VsZWN0RWxlbWVudElt
cGw6Om9wdGlvbnMoKQotewotICAgIGlmICghbV9vcHRpb25zKSB7Ci0gICAgICAgIG1fb3B0aW9u
cyA9IG5ldyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsKHRoaXMpOwotICAgICAgICBtX29wdGlv
bnMtPnJlZigpOwotICAgIH0KLSAgICByZXR1cm4gbV9vcHRpb25zOwotfQotCi0vLyBGSVhNRTog
RGVsZXRlIG9uY2UgdGhlIGFib3ZlIGZ1bmN0aW9uIGlzIHdvcmtpbmcgd2VsbCBlbm91Z2ggdG8g
dXNlIGZvciByZWFsLgotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpvcHRpb25zSFRNTENvbGxlY3Rpb24oKQotewotICAgIHJldHVybiBSZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0
aW9uSW1wbDo6U0VMRUNUX09QVElPTlMpKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OnJlY2FsY0xpc3RJdGVtcygpCi17Ci0gICAgTm9kZUltcGwqIGN1cnJlbnQgPSBmaXJzdENo
aWxkKCk7Ci0gICAgbV9saXN0SXRlbXMucmVzaXplKDApOwotICAgIEhUTUxPcHRpb25FbGVtZW50
SW1wbCogZm91bmRTZWxlY3RlZCA9IDA7Ci0gICAgd2hpbGUoY3VycmVudCkgewotICAgICAgICBp
ZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykgJiYgY3VycmVudC0+Zmlyc3RDaGls
ZCgpKSB7Ci0gICAgICAgICAgICAvLyAjIyMgd2hhdCBpZiBvcHRncm91cCBjb250YWlucyBqdXN0
IGNvbW1lbnRzPyBkb24ndCB3YW50IG9uZSBvZiBubyBvcHRpb25zIGluIGl0Li4uCi0gICAgICAg
ICAgICBtX2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAg
ICAgbV9saXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVs
ZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+Zmly
c3RDaGlsZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9w
dGlvblRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5z
aXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0g
PSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIGlm
ICghZm91bmRTZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSkgewotICAgICAg
ICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVk
ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kU2VsZWN0
ZWQgJiYgIW1fbXVsdGlwbGUgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4o
Y3VycmVudCktPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5t
X3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKGhyVGFnKSkgewotICAg
ICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAg
ICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhU
TUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsICpw
YXJlbnQgPSBjdXJyZW50LT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50
LT5uZXh0U2libGluZygpOwotICAgICAgICBpZiAoIWN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlm
IChwYXJlbnQgIT0gdGhpcykKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50LT5uZXh0
U2libGluZygpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFs
c2U7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQot
ewotICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6c2V0UmVjYWxjTGlzdEl0ZW1zKCkKLXsKLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IHRydWU7
Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxraHRtbDo6UmVuZGVyU2Vs
ZWN0Kj4obV9yZW5kZXIpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2Vk
KCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgUU1l
bUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgdWludCBp
OwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAo
aXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0
aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1w
bCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGJvb2wgc2VsZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0
QXR0cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxsKCkpOwotICAgICAgICAgICAgb3B0aW9uLT5z
ZXRTZWxlY3RlZChzZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCBtX3JlbmRl
ciApCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2Vs
ZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2VkKCB0cnVlICk7Ci19Ci0KLXZvaWQg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpub3RpZnlPcHRpb25TZWxlY3RlZChIVE1MT3B0aW9uRWxl
bWVudEltcGwgKnNlbGVjdGVkT3B0aW9uLCBib29sIHNlbGVjdGVkKQotewotICAgIGlmIChzZWxl
Y3RlZCAmJiAhbV9tdWx0aXBsZSkgewotICAgICAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0
aW9ucwotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRl
bXMoKTsKLSAgICAgICAgdWludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6
ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBs
Kj4oaXRlbXNbaV0pLT5tX3NlbGVjdGVkID0gKGl0ZW1zW2ldID09IHNlbGVjdGVkT3B0aW9uKTsK
LSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLQot
ICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpk
ZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIC8vIFVzZSBrZXkgcHJl
c3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAv
LyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3Mg
ZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXByZXNzRXZlbnQpIHsKLSAgICAKLSAg
ICAgICAgaWYgKCFtX2Zvcm0gfHwgIW1fcmVuZGVyIHx8ICFldnQtPmlzS2V5Ym9hcmRFdmVudCgp
KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgRE9NU3RyaW5nIGtleSA9
IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsK
LSAgICAgICAgCi0gICAgICAgIGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgbV9m
b3JtLT5zdWJtaXRDbGljaygpOwotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgp
OwotICAgICAgICB9Ci0gICAgfQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZh
dWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjph
Y2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGZvY3VzKCk7Ci19
Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRNdWx0aXBsZShib29sIG11bHRpcGxl
KQotewotICAgIHNldEF0dHJpYnV0ZShtdWx0aXBsZUF0dHIsIG11bHRpcGxlID8gIiIgOiAwKTsK
LX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFNpemUoaW50IHNpemUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHNpemVBdHRyLCBRU3RyaW5nOjpudW1iZXIoc2l6ZSkpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxLZXlnZW5FbGVtZW50SW1wbDo6SFRNTEtleWdlbkVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCogZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsKiBmKQotICAg
IDogSFRNTFNlbGVjdEVsZW1lbnRJbXBsKGtleWdlblRhZywgZG9jLCBmKQotewotICAgIFFTdHJp
bmdMaXN0IGtleXMgPSBLU1NMS2V5R2VuOjpzdXBwb3J0ZWRLZXlTaXplcygpOwotICAgIGZvciAo
UVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGkgPSBrZXlzLmJlZ2luKCk7IGkgIT0ga2V5cy5lbmQoKTsg
KytpKSB7Ci0gICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCogbyA9IG5ldyBIVE1MT3B0aW9u
RWxlbWVudEltcGwoZG9jLCBmb3JtKCkpOwotICAgICAgICBhZGRDaGlsZChvKTsKLSAgICAgICAg
by0+YWRkQ2hpbGQobmV3IFRleHRJbXBsKGRvYywgRE9NU3RyaW5nKCppKSkpOwotICAgIH0KLX0K
LQotRE9NU3RyaW5nIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuICJrZXlnZW4iOwotfQotCi12b2lkIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0
ci0+bmFtZSgpID09IGNoYWxsZW5nZUF0dHIpCi0gICAgICAgIG1fY2hhbGxlbmdlID0gYXR0ci0+
dmFsdWUoKTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0ga2V5dHlwZUF0dHIpCi0gICAg
ICAgIG1fa2V5VHlwZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBza2lw
IEhUTUxTZWxlY3RFbGVtZW50SW1wbCBwYXJzaW5nIQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEtl
eWdlbkVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kZWRfdmFs
dWVzLCBib29sKQotewotICAgIC8vIE9ubHkgUlNBIGlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUu
Ci0gICAgaWYgKCFtX2tleVR5cGUuaXNOdWxsKCkgJiYgIWVxdWFsSWdub3JpbmdDYXNlKG1fa2V5
VHlwZSwgInJzYSIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgUVN0cmluZyB2YWx1ZSA9
IEtTU0xLZXlHZW46OnNpZ25lZFB1YmxpY0tleUFuZENoYWxsZW5nZVN0cmluZyhzZWxlY3RlZElu
ZGV4KCksIG1fY2hhbGxlbmdlLnFzdHJpbmcoKSwgZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKS0+YmFz
ZVVSTCgpKTsKLSAgICBpZiAodmFsdWUuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUudXRmOCgpKTsKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0R3JvdXBF
bGVtZW50SW1wbDo6SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChv
cHRncm91cFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6fkhU
TUxPcHRHcm91cEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gIm9wdGdyb3VwIjsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpp
bnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50
ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdDaGlsZCxyZWZDaGlsZCwgZXhjZXB0aW9u
Y29kZSk7Ci0gICAgaWYgKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9w
dGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3Vw
RWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwg
Km9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQg
PSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENo
aWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZighZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmVj
YWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpI
VE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZChvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7
Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygp
OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbDo6YXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjphcHBlbmRDaGlsZChuZXdDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRp
b25jb2RlICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6YWRkQ2hpbGQoTm9k
ZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIHJl
dHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YWRkQ2hpbGQobmV3Q2hpbGQpOwotfQor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkhUTUxMYWJlbEVsZW1lbnRJbXBsLmgiCisj
aW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50SW1wbC5oIgogCi12b2lkIEhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQot
ewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShh
dHRyKTsKLSAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci19CisjaW5jbHVkZSAicmVuZGVyaW5n
L3JlbmRlcl9mb3JtLmgiCisjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCisjaW5jbHVkZSAiRXZlbnRO
YW1lcy5oIgogCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZWNhbGNTZWxlY3RPcHRp
b25zKCkKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxl
IChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFtZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxl
Y3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAgICBzdGF0
aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3QpLT5zZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLX0KK3VzaW5nIG5hbWVzcGFjZSBraHRtbDsKK3VzaW5nIG5hbWVzcGFjZSBET006OkhU
TUxOYW1lczsKK3VzaW5nIG5hbWVzcGFjZSBET006OkV2ZW50TmFtZXM7CiAKLURPTVN0cmluZyBI
VE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUobGFiZWxBdHRyKTsKLX0KK25hbWVzcGFjZSBET00gewogCi12b2lkIEhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsOjpzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJnZhbHVlKQorSFRNTExh
YmVsRWxlbWVudEltcGw6OkhUTUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQor
ICAgIDogSFRNTEVsZW1lbnRJbXBsKGxhYmVsVGFnLCBkb2MpCiB7Ci0gICAgc2V0QXR0cmlidXRl
KGxhYmVsQXR0ciwgdmFsdWUpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRp
b25FbGVtZW50SW1wbDo6SFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBI
VE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwo
b3B0aW9uVGFnLCBkb2MsIGYpCitIVE1MTGFiZWxFbGVtZW50SW1wbDo6fkhUTUxMYWJlbEVsZW1l
bnRJbXBsKCkKIHsKLSAgICBtX3NlbGVjdGVkID0gZmFsc2U7CiB9CiAKLWJvb2wgSFRNTE9wdGlv
bkVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Citib29sIEhUTUxMYWJlbEVsZW1lbnRJ
bXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ET01T
dHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Im9wdGlvbiI7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnRleHQoKSBj
b25zdAotewotICAgIERPTVN0cmluZyB0ZXh0OwotCi0gICAgLy8gV2luSUUgZG9lcyBub3QgdXNl
IHRoZSBsYWJlbCBhdHRyaWJ1dGUsIHNvIGFzIGEgcXVpcmssIHdlIGlnbm9yZSBpdC4KLSAgICBp
ZiAoZ2V0RG9jdW1lbnQoKSAmJiAhZ2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpIHsKLSAg
ICAgICAgRE9NU3RyaW5nIHRleHQgPSBnZXRBdHRyaWJ1dGUobGFiZWxBdHRyKTsKLSAgICAgICAg
aWYgKCF0ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQot
ICAgIGNvbnN0IE5vZGVJbXBsICpuID0gdGhpcy0+Zmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChu
KSB7Ci0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSB8fCBuLT5u
b2RlVHlwZSgpID09IE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERSkKLSAgICAgICAgICAgIHRleHQg
Kz0gbi0+bm9kZVZhbHVlKCk7Ci0gICAgICAgIC8vIHNraXAgc2NyaXB0IGNvbnRlbnQKLSAgICAg
ICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSAmJiBuLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6c2Ny
aXB0VGFnKSkKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHRTaWJsaW5nKHRoaXMpOwot
ICAgICAgICBlbHNlCi0gICAgICAgICAgICBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gdGV4dDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudElt
cGw6OnNldFRleHQoY29uc3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAg
ICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlcmUncyBleGFjdGx5
IDEgY2hpbGQgbm9kZSwgYW5kIGl0J3MgYSB0ZXh0IG5vZGUuCi0gICAgTm9kZUltcGwgKmNoaWxk
ID0gZmlyc3RDaGlsZCgpOwotICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+aXNUZXh0Tm9kZSgpICYm
ICFjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxUZXh0SW1wbCAq
PihjaGlsZCktPnNldERhdGEodGV4dCwgZXhjZXB0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgYXBwZW5kQ2hpbGQobmV3IFRleHRJbXBs
KGdldERvY3VtZW50KCksIHRleHQpLCBleGNlcHRpb24pOwotfQotCi1pbnQgSFRNTE9wdGlvbkVs
ZW1lbnRJbXBsOjppbmRleCgpIGNvbnN0Ci17Ci0gICAgLy8gTGV0J3MgZG8gdGhpcyBkeW5hbWlj
YWxseS4gTWlnaHQgYmUgYSBiaXQgc2xvdywgYnV0IHdlJ3JlIHN1cmUKLSAgICAvLyB3ZSB3b24n
dCBmb3JnZXQgdG8gdXBkYXRlIGEgbWVtYmVyIHZhcmlhYmxlIGluIHNvbWUgY2FzZXMuLi4KLSAg
ICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgIGlmIChz
ZWxlY3QpIHsKLSAgICAgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gc2Vs
ZWN0LT5saXN0SXRlbXMoKTsKLSAgICAgICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgICAg
ICBpbnQgb3B0aW9uSW5kZXggPSAwOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbDsgaSsr
KSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+
KGl0ZW1zW2ldKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uSW5k
ZXg7Ci0gICAgICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudElt
cGw6OnNldEluZGV4KGludCwgaW50ICZleGNlcHRpb24pCi17Ci0gICAgZXhjZXB0aW9uID0gRE9N
RXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgLy8gIyMjCi19Ci0K
LXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gc2VsZWN0ZWRB
dHRyKQotICAgICAgICBtX3NlbGVjdGVkID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikKLSAgICAgICAgbV92YWx1ZSA9IGF0dHItPnZh
bHVlKCk7Ci0gICAgZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVu
dEltcGw6OnZhbHVlKCkgY29uc3QKLXsKLSAgICBpZiAoICFtX3ZhbHVlLmlzTnVsbCgpICkKLSAg
ICAgICAgcmV0dXJuIG1fdmFsdWU7Ci0gICAgLy8gVXNlIHRoZSB0ZXh0IGlmIHRoZSB2YWx1ZSB3
YXNuJ3Qgc2V0LgotICAgIHJldHVybiB0ZXh0KCkucXN0cmluZygpLnN0cmlwV2hpdGVTcGFjZSgp
OwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0K
LXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRTZWxlY3RlZChib29sIF9zZWxlY3RlZCkK
LXsKLSAgICBpZihtX3NlbGVjdGVkID09IF9zZWxlY3RlZCkKLSAgICAgICAgcmV0dXJuOwotICAg
IG1fc2VsZWN0ZWQgPSBfc2VsZWN0ZWQ7Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpzZWxl
Y3QgPSBnZXRTZWxlY3QoKTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAgICBzZWxlY3QtPm5vdGlm
eU9wdGlvblNlbGVjdGVkKHRoaXMsX3NlbGVjdGVkKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxl
bWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICBIVE1MU2VsZWN0RWxlbWVudEltcGwg
KnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgaWYgKHNlbGVjdCkKLSAgICAgICBzZWxlY3QtPmNo
aWxkcmVuQ2hhbmdlZCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGwgKkhUTUxPcHRpb25F
bGVtZW50SW1wbDo6Z2V0U2VsZWN0KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0ID0g
cGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFtZShz
ZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnRJbXBsKj4oc2VsZWN0KTsKLX0KLQot
Ym9vbCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmRlZmF1bHRTZWxlY3RlZCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuICFnZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyKS5pc051bGwoKTsKLX0KLQotdm9p
ZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldERlZmF1bHRTZWxlY3RlZChib29sIGIpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmxhYmVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKGxhYmVsQXR0cik7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpz
ZXRMYWJlbChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsYWJl
bEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6SFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCh0
ZXh0YXJlYVRhZywgZG9jLCBmKSwgbV92YWx1ZUlzVmFsaWQoZmFsc2UpLCBtX3ZhbHVlTWF0Y2hl
c1JlbmRlcmVyKGZhbHNlKQotewotICAgIC8vIERURCByZXF1aXJlcyByb3dzICYgY29scyBiZSBz
cGVjaWZpZWQsIGJ1dCB3ZSB3aWxsIHByb3ZpZGUgcmVhc29uYWJsZSBkZWZhdWx0cwotICAgIG1f
cm93cyA9IDI7Ci0gICAgbV9jb2xzID0gMjA7Ci0gICAgbV93cmFwID0gdGFfVmlydHVhbDsKLX0K
LQotSFRNTFRleHRBcmVhRWxlbWVudEltcGw6On5IVE1MVGV4dEFyZWFFbGVtZW50SW1wbCgpCi17
Ci0gICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFp
bnNTdGF0ZSh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp0
eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gInRleHRhcmVhIjsKLX0KLQotUVN0cmluZyBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIHN0
cmluZyBpcyBub3QgZW1wdHkhCi0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpzdGF0ZSgpICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOwotfQotCi12b2lkIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBR
U3RyaW5nIHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0
YXRlKHN0YXRlcyk7Ci0gICAgaWYgKHN0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0gICAgc2V0RGVm
YXVsdFZhbHVlKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpOwotICAgIC8vIHRoZSBjbG9z
ZSgpIGluIHRoZSByZW5kZXJ0cmVlIHdpbGwgdGFrZSBjYXJlIG9mIHRyYW5zZmVycmluZyBkZWZh
dWx0dmFsdWUgdG8gJ3ZhbHVlJwotfQotCi1pbnQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNl
bGVjdGlvblN0YXJ0KCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0YXJ0KCk7Ci0g
ICAgcmV0dXJuIDA7Ci19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2VsZWN0aW9u
RW5kKCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxS
ZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvbkVuZCgpOwotICAgIHJldHVybiAw
OwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25TdGFydChp
bnQgc3RhcnQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsKLX0KLQot
dm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17
Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAq
PihtX3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotfQotCi12b2lkIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjpzZWxlY3QoICApCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBz
dGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwg
aW50IGVuZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRl
clRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci19
Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0g
ICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwotfQotICAgIAotdm9pZCBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0
cikKK3ZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBl
ZEF0dHJpYnV0ZUltcGwgKmF0dHIpCiB7Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dzQXR0
cikgewotICAgICAgICBtX3Jvd3MgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRv
SW50KCkgOiAzOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRlcmVy
KCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gY29sc0F0dHIpIHsKLSAgICAgICAgbV9jb2xzID0gIWF0dHItPmlzTnVsbCgp
ID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogNjA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQot
ICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3cmFwQXR0cikgewotICAgICAgICAvLyB2
aXJ0dWFsIC8gcGh5c2ljYWwgaXMgTmV0c2NhcGUgZXh0ZW5zaW9uIG9mIEhUTUwgMy4wLCBub3cg
ZGVwcmVjYXRlZAotICAgICAgICAvLyBzb2Z0LyBoYXJkIC8gb2ZmIGlzIHJlY29tbWVuZGF0aW9u
IGZvciBIVE1MIDQgZXh0ZW5zaW9uIGJ5IElFIGFuZCBOUyA0Ci0gICAgICAgIGlmIChlcXVhbEln
bm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAidmlydHVhbCIpIHx8IGVxdWFsSWdub3JpbmdDYXNl
KGF0dHItPnZhbHVlKCksICJzb2Z0IikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9WaXJ0dWFs
OwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicGh5
c2ljYWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiaGFyZCIpKQotICAg
ICAgICAgICAgbV93cmFwID0gdGFfUGh5c2ljYWw7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdu
b3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvbiIgKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRh
X1BoeXNpY2FsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1
ZSgpLCAib2ZmIikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9Ob1dyYXA7Ci0gICAgICAgIGlm
IChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRN
aW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlB
dHRyKSB7Ci0gICAgICAgIC8vIGlnbm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7CisgICAgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bmZvY3VzQXR0cikgewogICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBh
dHRyKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7CiAgICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZl
bnQsIGF0dHIpOwogICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFRl
eHRBcmVhRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVu
ZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJUZXh0QXJl
YSh0aGlzKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURh
dGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCkKLXsKLSAgICBpZiAobmFtZSgpLmlzRW1w
dHkoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1
ZSgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1w
bDo6cmVzZXQoKQotewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgSFRN
TEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKIH0KIAotdm9pZCBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6dXBkYXRlVmFsdWUoKQorRWxlbWVudEltcGwgKkhUTUxMYWJl
bEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCiB7Ci0gICAgaWYgKCAhbV92YWx1ZUlzVmFsaWQg
KSB7Ci0gICAgICAgIGlmICggbV9yZW5kZXIgKSB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPiggbV9yZW5kZXIgKS0+dGV4dCgpLnFzdHJpbmcoKTsK
LSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0cnVlOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgbV92YWx1ZSA9IGRlZmF1bHRWYWx1ZSgpLnFzdHJpbmcoKTsKLSAg
ICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKKyAgICBET01TdHJpbmcg
Zm9ybUVsZW1lbnRJZCA9IGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKKyAgICBpZiAoZm9ybUVsZW1l
bnRJZC5pc051bGwoKSkgeworICAgICAgICAvLyBTZWFyY2ggY2hpbGRyZW4gb2YgdGhlIGxhYmVs
IGVsZW1lbnQgZm9yIGEgZm9ybSBlbGVtZW50LgorICAgICAgICBOb2RlSW1wbCAqbm9kZSA9IHRo
aXM7CisgICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhpcykp
KSB7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAg
ICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJ
bXBsICo+KG5vZGUpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5pc0dlbmVyaWNGb3Jt
RWxlbWVudCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgICAg
ICAgIH0KICAgICAgICAgfQotICAgICAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7CisgICAgICAg
IHJldHVybiAwOwogICAgIH0KKyAgICBpZiAoZm9ybUVsZW1lbnRJZC5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiAwOworICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5nZXRFbGVtZW50QnlJZChm
b3JtRWxlbWVudElkKTsKIH0KIAotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp2
YWx1ZSgpCi17Ci0gICAgdXBkYXRlVmFsdWUoKTsKLSAgICByZXR1cm4gbV92YWx1ZS5pc051bGwo
KSA/IERPTVN0cmluZygiIikgOiBtX3ZhbHVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQordm9pZCBIVE1MTGFiZWxF
bGVtZW50SW1wbDo6Zm9jdXMoKQogewotICAgIG1fdmFsdWUgPSB2YWx1ZS5xc3RyaW5nKCk7Ci0g
ICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIG1fdmFsdWVJc1ZhbGlkID0g
dHJ1ZTsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgIC8vIEZJWE1FOiBGb3JjZSByZWxvYWQgZnJvbSByZW5kZXJlciwgYXMgcmVu
ZGVyZXIgbWF5IGhhdmUgbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MuCi0gICAgbV92YWx1ZUlzVmFs
aWQgPSBmYWxzZTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOworICAgIGlmIChFbGVtZW50SW1wbCAq
ZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCisgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CiB9CiAK
LQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpkZWZhdWx0VmFsdWUoKQordm9p
ZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxl
bWVudCkKIHsKLSAgICBET01TdHJpbmcgdmFsID0gIiI7Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNv
bW1lbnRzIC0ganVzdCBncmFiIHRoZSB0ZXh0IG5vZGVzCi0gICAgTm9kZUltcGwgKm47Ci0gICAg
Zm9yIChuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAg
aWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAgICAgICAgIHZhbCArPSBzdGF0aWNfY2FzdDxUZXh0
SW1wbCo+KG4pLT5kYXRhKCk7Ci0gICAgCi0gICAgaWYgKHZhbFswXSA9PSAnXHInICYmIHZhbFsx
XSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9IHZhbC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1v
dmUoMCwyKTsKLSAgICB9IGVsc2UgaWYgKHZhbFswXSA9PSAnXHInIHx8IHZhbFswXSA9PSAnXG4n
KSB7Ci0gICAgICAgIHZhbCA9IHZhbC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwxKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOworICAgIEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9y
bUVsZW1lbnQoKTsKKyAgICBpZiAoZWxlbWVudCkKKyAgICAgICAgZWxlbWVudC0+YWNjZXNzS2V5
QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwogfQogCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZkZWZhdWx0VmFsdWUpCitIVE1M
Rm9ybUVsZW1lbnRJbXBsICpIVE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9ybSgpCiB7Ci0gICAgLy8g
dGhlcmUgbWF5IGJlIGNvbW1lbnRzIC0gcmVtb3ZlIGFsbCB0aGUgdGV4dCBub2RlcyBhbmQgcmVw
bGFjZSB0aGVtIHdpdGggb25lCi0gICAgUVB0ckxpc3Q8Tm9kZUltcGw+IHRvUmVtb3ZlOwotICAg
IE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRT
aWJsaW5nKCkpCi0gICAgICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB0b1Jl
bW92ZS5hcHBlbmQobik7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxOb2RlSW1wbD4gaXQodG9SZW1v
dmUpOwotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgp
OyArK2l0KSB7Ci0gICAgICAgIE5vZGVJbXBsICpuID0gaXQuY3VycmVudCgpOwotICAgICAgICBu
LT5yZWYoKTsKLSAgICAgICAgcmVtb3ZlQ2hpbGQobiwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAg
IG4tPmRlcmVmKCk7CisgICAgZm9yIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKTsgcCAhPSAw
OyBwID0gcC0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIGlmIChwLT5oYXNUYWdOYW1lKGZvcm1U
YWcpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudEltcGwg
Kj4ocCk7CiAgICAgfQotICAgIGluc2VydEJlZm9yZShnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0
Tm9kZShkZWZhdWx0VmFsdWUpLGZpcnN0Q2hpbGQoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgc2V0
VmFsdWUoZGVmYXVsdFZhbHVlKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0g
ICAgZm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXR0YWNoKCkK
LXsKLSAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmF0dGFjaCgpOwotICAgIHVwZGF0ZVZhbHVlKCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRB
cmVhRWxlbWVudEltcGw6OmRldGFjaCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmRldGFjaCgpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKKyAgICAK
KyAgICByZXR1cm4gMDsKIH0KIAotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjph
Y2Nlc3NLZXkoKSBjb25zdAorRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NL
ZXkoKSBjb25zdAogewogICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7CiB9
CiAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01T
dHJpbmcgJnZhbHVlKQordm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCiB7CiAgICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIs
IHZhbHVlKTsKIH0KIAotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0Q29scyhpbnQg
Y29scykKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY29sc0F0dHIsIFFTdHJpbmc6Om51bWJlcihjb2xz
KSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFJvd3MoaW50IHJvd3Mp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHJvd3NBdHRyLCBRU3RyaW5nOjpudW1iZXIocm93cykpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJc0luZGV4RWxlbWVudEltcGw6OkhUTUxJ
c0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwg
KmYpCi0gICAgOiBIVE1MSW5wdXRFbGVtZW50SW1wbChpc2luZGV4VGFnLCBkb2MsIGYpCi17Ci0g
ICAgbV90eXBlID0gVEVYVDsKLSAgICBtX25hbWUgPSAiaXNpbmRleCI7Ci19Ci0KLXZvaWQgSFRN
TElzSW5kZXhFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHByb21wdEF0dHIpCi0Jc2V0
VmFsdWUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZQotICAgICAgICAvLyBkb24ndCBjYWxsIEhU
TUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlIGhlcmUsIGFzIGl0IHdvdWxkCi0g
ICAgICAgIC8vIGFjY2VwdCBhdHRyaWJ1dGVzIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBzdXBwb3J0
Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnByb21wdCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShwcm9tcHRBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUocHJvbXB0QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLXVuc2lnbmVkIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Omxlbmd0
aCgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICByZXR1cm4gMDsK
LX0KLQotdm9pZCBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpzZXRMZW5ndGgodW5zaWduZWQg
bGVuZ3RoKQotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi19Ci0KLU5vZGVJbXBsICpI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAotewot
ICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBs
ICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZu
YW1lKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9ybURhdGFMaXN0OjpGb3JtRGF0YUxpc3Qo
UVRleHRDb2RlYyAqYykKLSAgICA6IG1fY29kZWMoYykKLXsKLX0KLQotdm9pZCBGb3JtRGF0YUxp
c3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcykKLXsKLSAgICBtX2xpc3QuYXBwZW5k
KHMpOwotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0IFFTdHJpbmcg
JnMpCitET01TdHJpbmcgSFRNTExhYmVsRWxlbWVudEltcGw6Omh0bWxGb3IoKSBjb25zdAogewot
ICAgIFFDU3RyaW5nIGNzdHIgPSBmaXhMaW5lQnJlYWtzKG1fY29kZWMtPmZyb21Vbmljb2RlKHMs
IHRydWUpKTsKLSAgICBjc3RyLnRydW5jYXRlKGNzdHIubGVuZ3RoKCkpOwotICAgIG1fbGlzdC5h
cHBlbmQoY3N0cik7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKIH0KIAotdm9p
ZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERP
TVN0cmluZyAmZmlsZW5hbWUpCit2b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpzZXRIdG1sRm9y
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCiB7Ci0gICAgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5n
KCkpOwotICAgIG1fbGlzdC5hcHBlbmQoZmlsZW5hbWUucXN0cmluZygpKTsKKyAgICBzZXRBdHRy
aWJ1dGUoZm9yQXR0ciwgdmFsdWUpOwogfQogCiB9IC8vIG5hbWVzcGFjZQpJbmRleDoga2h0bWwv
aHRtbC9IVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRt
bC9IVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDExOTc2KQorKysga2h0bWwv
aHRtbC9IVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQsNyAr
NCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykK
ICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykK
ICAqICAgICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAq
IENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJp
Z2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKiAgICAgICAg
ICAgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAbnlwb3AuY29tKQogICoKICAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKQEAgLTI0LDI5ODYgKzI0LDE3IEBACiAgKgogICovCiAKLSN1bmRlZiBGT1JNU19ERUJVRwot
Ly8jZGVmaW5lIEZPUk1TX0RFQlVHCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJo
dG1sL2h0bWxfZm9ybWltcGwuaCIKLQotI2luY2x1ZGUgImtodG1sdmlldy5oIgotI2luY2x1ZGUg
Ik1hY0ZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1
ZGUgImh0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAia2h0bWxfc2V0dGluZ3MuaCIKLSNpbmNs
dWRlICJtaXNjL2Zvcm1kYXRhLmgiCi0KLSNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgot
I2luY2x1ZGUgImNzcy9jc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiY3NzcHJvcGVydGll
cy5oIgotI2luY2x1ZGUgImNzc2hlbHBlci5oIgotI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwu
aCIKLSNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAieG1sL0V2ZW50
TmFtZXMuaCIKLSNpbmNsdWRlICJraHRtbF9leHQuaCIKLQotI2luY2x1ZGUgInJlbmRlcmluZy9y
ZW5kZXJfZm9ybS5oIgotI2luY2x1ZGUgInJlbmRlcl9idXR0b24uaCIKLSNpbmNsdWRlICJyZW5k
ZXJfdGhlbWUuaCIKLQotI2luY2x1ZGUgPGtsb2NhbGUuaD4KLSNpbmNsdWRlIDxxZmlsZS5oPgot
I2luY2x1ZGUgPHF0ZXh0Y29kZWMuaD4KLQotLy8gZm9yIGtleWdlbgotI2luY2x1ZGUgPHFzdHJp
bmcuaD4KLSNpbmNsdWRlIDxrc3Nsa2V5Z2VuLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQot
dXNpbmcgbmFtZXNwYWNlIGtodG1sOwotCi1uYW1lc3BhY2UgRE9NIHsKLQotdXNpbmcgbmFtZXNw
YWNlIEV2ZW50TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1zdHJ1Y3QgRm9y
bURhdGFMaXN0SXRlbSB7Ci0gICAgRm9ybURhdGFMaXN0SXRlbShjb25zdCBRQ1N0cmluZyAmZGF0
YSkgOiBtX2RhdGEoZGF0YSkgeyB9Ci0gICAgRm9ybURhdGFMaXN0SXRlbShjb25zdCBRU3RyaW5n
ICZwYXRoKSA6IG1fcGF0aChwYXRoKSB7IH0KLQotICAgIFFTdHJpbmcgbV9wYXRoOwotICAgIFFD
U3RyaW5nIG1fZGF0YTsKLX07Ci0KLWNsYXNzIEZvcm1EYXRhTGlzdCB7Ci1wdWJsaWM6Ci0gICAg
Rm9ybURhdGFMaXN0KFFUZXh0Q29kZWMgKik7Ci0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3Qg
RE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5k
U3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFsdWUucXN0cmluZygpKTsgfQot
ICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgUVN0cmluZyAm
dmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJp
bmcodmFsdWUpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBj
b25zdCBRQ1N0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5n
KCkpOyBhcHBlbmRTdHJpbmcodmFsdWUpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERP
TVN0cmluZyAma2V5LCBpbnQgdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3Ry
aW5nKCkpOyBhcHBlbmRTdHJpbmcoUVN0cmluZzo6bnVtYmVyKHZhbHVlKSk7IH0KLSAgICB2b2lk
IGFwcGVuZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmZmlsZW5h
bWUpOwotCi0gICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gYmVn
aW4oKSBjb25zdAotICAgICAgICB7IHJldHVybiBtX2xpc3QuYmVnaW4oKTsgfQotICAgIFFWYWx1
ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+IGVuZCgpIGNvbnN0Ci0gICAgICAg
IHsgcmV0dXJuIG1fbGlzdC5lbmQoKTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgYXBwZW5kU3Ry
aW5nKGNvbnN0IFFDU3RyaW5nICZzKTsKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBRU3Ry
aW5nICZzKTsKLQotICAgIFFUZXh0Q29kZWMgKm1fY29kZWM7Ci0gICAgUVZhbHVlTGlzdDxGb3Jt
RGF0YUxpc3RJdGVtPiBtX2xpc3Q7Ci19OwotCi1IVE1MRm9ybUVsZW1lbnRJbXBsOjpIVE1MRm9y
bUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnRJbXBsKGZv
cm1UYWcsIGRvYykKLXsKLSAgICBjb2xsZWN0aW9uSW5mbyA9IDA7Ci0gICAgbV9wb3N0ID0gZmFs
c2U7Ci0gICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICBtX2F1dG9jb21wbGV0ZSA9IHRydWU7
Ci0gICAgbV9pbnN1Ym1pdCA9IGZhbHNlOwotICAgIG1fZG9pbmdzdWJtaXQgPSBmYWxzZTsKLSAg
ICBtX2lucmVzZXQgPSBmYWxzZTsKLSAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRpb24veC13d3ct
Zm9ybS11cmxlbmNvZGVkIjsKLSAgICBtX2JvdW5kYXJ5ID0gIi0tLS0tLS0tLS0weEtoVG1MYk91
TmRBclkiOwotICAgIG1fYWNjZXB0Y2hhcnNldCA9ICJVTktOT1dOIjsKLSAgICBtX21hbGZvcm1l
ZCA9IGZhbHNlOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEZvcm1FbGVtZW50SW1w
bCgpCi17Ci0gICAgZGVsZXRlIGNvbGxlY3Rpb25JbmZvOwotICAgIAotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxl
bWVudHNbaV0tPm1fZm9ybSA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGltZ0Vs
ZW1lbnRzLmNvdW50KCk7ICsraSkKLSAgICAgICAgaW1nRWxlbWVudHNbaV0tPm1fZm9ybSA9IDA7
Ci19Ci0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtV291bGRIYXZlU2VjdXJlU3Vi
bWlzc2lvbihjb25zdCBET01TdHJpbmcgJnVybCkKLXsKLSAgICBpZiAodXJsLmlzTnVsbCgpKSB7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCkt
PmNvbXBsZXRlVVJMKHVybC5xc3RyaW5nKCkpLnN0YXJ0c1dpdGgoImh0dHBzOiIsIGZhbHNlKTsK
LX0KLQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgSFRNTEVs
ZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3aXRoIGNh
bGxpbmcgc2VjdXJlRm9ybVJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhlIHRpbWluZwot
ICAgIC8vIHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVhcmx5Ci0gICAg
aWYgKGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKSkKLSAgICAgICAgZ2V0RG9j
dW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1w
bDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hU
TUxEb2N1bWVudCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2Fz
dDxIVE1MRG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3VtZW50LT5hZGROYW1l
ZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLQotICAgIEhUTUxFbGVtZW50SW1wbDo6aW5zZXJ0
ZWRJbnRvRG9jdW1lbnQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVk
RnJvbURvY3VtZW50KCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQo
KSkgewotCUhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3Vt
ZW50SW1wbCAqPihnZXREb2N1bWVudCgpKTsKLQlkb2N1bWVudC0+cmVtb3ZlTmFtZWRJdGVtKG9s
ZE5hbWVBdHRyKTsKLSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9t
RG9jdW1lbnQoKTsKLX0KLQotaW50IEhUTUxGb3JtRWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0
Ci17Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1F
bGVtZW50cy5jb3VudCgpOyArK2kpCi0JaWYgKGZvcm1FbGVtZW50c1tpXS0+aXNFbnVtZXJhdGFi
bGUoKSkKLQkgICAgKytsZW47Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6c3VibWl0Q2xpY2soKQotewotICAgIGJvb2wgc3VibWl0Rm91bmQgPSBm
YWxzZTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7
ICsraSkgewotICAgICAgICBpZiAoZm9ybUVsZW1lbnRzW2ldLT5oYXNMb2NhbE5hbWUoaW5wdXRU
YWcpKSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KGZvcm1FbGVtZW50c1tpXSk7Ci0gICAgICAg
ICAgICBpZiAoZWxlbWVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgJiYgZWxlbWVudC0+
cmVuZGVyZXIoKSkgewotICAgICAgICAgICAgICAgIHN1Ym1pdEZvdW5kID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICBlbGVtZW50LT5jbGljayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzdWJtaXRGb3VuZCkg
Ly8gc3VibWl0IHRoZSBmb3JtIHdpdGhvdXQgYSBzdWJtaXQgb3IgaW1hZ2UgaW5wdXQKLSAgICAg
ICAgcHJlcGFyZVN1Ym1pdCgpOwotfQotCi0KLXN0YXRpYyBRQ1N0cmluZyBlbmNvZGVDU3RyaW5n
KGNvbnN0IFFDU3RyaW5nJiBlKQotewotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0
L2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40LjEKLSAgICAvLyBzYWZlIGNoYXJhY3RlcnMg
bGlrZSBOUyBoYW5kbGVzIHRoZW0gZm9yIGNvbXBhdGliaWxpdHkKLSAgICBzdGF0aWMgY29uc3Qg
Y2hhciAqc2FmZSA9ICItLl8qIjsKLSAgICBpbnQgZWxlbiA9IGUubGVuZ3RoKCk7Ci0gICAgUUNT
dHJpbmcgZW5jb2RlZCgoIGVsZW4rZS5jb250YWlucyggJ1xuJyApICkqMysxKTsKLSAgICBpbnQg
ZW5jbGVuID0gMDsKLQotICAgIC8vUUNTdHJpbmcgb3JpZyhlLmRhdGEoKSwgZS5zaXplKCkpOwot
Ci0gICAgZm9yKGludCBwb3MgPSAwOyBwb3MgPCBlbGVuOyBwb3MrKykgewotICAgICAgICB1bnNp
Z25lZCBjaGFyIGMgPSBlW3Bvc107Ci0KLSAgICAgICAgaWYgKCAoKCBjID49ICdBJykgJiYgKCBj
IDw9ICdaJykpIHx8Ci0gICAgICAgICAgICAgKCggYyA+PSAnYScpICYmICggYyA8PSAneicpKSB8
fAotICAgICAgICAgICAgICgoIGMgPj0gJzAnKSAmJiAoIGMgPD0gJzknKSkgfHwKLSAgICAgICAg
ICAgICAoc3RyY2hyKHNhZmUsIGMpKQotICAgICAgICAgICAgKQotICAgICAgICAgICAgZW5jb2Rl
ZFtlbmNsZW4rK10gPSBjOwotICAgICAgICBlbHNlIGlmICggYyA9PSAnICcgKQotICAgICAgICAg
ICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnKyc7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICdcbicg
fHwgKCBjID09ICdccicgJiYgZVtwb3MrMV0gIT0gJ1xuJyApICkKLSAgICAgICAgewotICAgICAg
ICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xl
bisrXSA9ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ0QnOwotICAgICAg
ICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xl
bisrXSA9ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ0EnOwotICAgICAg
ICB9Ci0gICAgICAgIGVsc2UgaWYgKCBjICE9ICdccicgKQotICAgICAgICB7Ci0gICAgICAgICAg
ICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBoID0g
YyAvIDE2OwotICAgICAgICAgICAgaCArPSAoaCA+IDkpID8gKCdBJyAtIDEwKSA6ICcwJzsKLSAg
ICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gaDsKLQotICAgICAgICAgICAgdW5zaWduZWQg
aW50IGwgPSBjICUgMTY7Ci0gICAgICAgICAgICBsICs9IChsID4gOSkgPyAoJ0EnIC0gMTApIDog
JzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBsOwotICAgICAgICB9Ci0gICAg
fQotICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ1wwJzsKLSAgICBlbmNvZGVkLnRydW5jYXRlKGVu
Y2xlbik7Ci0KLSAgICByZXR1cm4gZW5jb2RlZDsKLX0KLQotLy8gQ2hhbmdlIHBsYWluIENSIGFu
ZCBwbGFpbiBMRiB0byBDUkxGIHBhaXJzLgotc3RhdGljIFFDU3RyaW5nIGZpeExpbmVCcmVha3Mo
Y29uc3QgUUNTdHJpbmcgJnMpCi17Ci0gICAgLy8gQ29tcHV0ZSB0aGUgbGVuZ3RoLgotICAgIHVu
c2lnbmVkIG5ld0xlbiA9IDA7Ci0gICAgY29uc3QgY2hhciAqcCA9IHMuZGF0YSgpOwotICAgIHdo
aWxlIChjaGFyIGMgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAgICAg
ICAgIC8vIFNhZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0gICAg
ICAgICAgICBpZiAoKnAgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1IgaW50
byBDUkxGLgotICAgICAgICAgICAgICAgIG5ld0xlbiArPSAyOwotICAgICAgICAgICAgfQotICAg
ICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgLy8gVHVybiBMRiBpbnRv
IENSTEYuCi0gICAgICAgICAgICBuZXdMZW4gKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIC8vIExlYXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICBuZXdM
ZW4gKz0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobmV3TGVuID09IHMubGVuZ3RoKCkp
IHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIAotICAgIC8vIE1ha2UgYSBjb3B5IG9m
IHRoZSBzdHJpbmcuCi0gICAgcCA9IHMuZGF0YSgpOwotICAgIFFDU3RyaW5nIHJlc3VsdChuZXdM
ZW4gKyAxKTsKLSAgICBjaGFyICpxID0gcmVzdWx0LmRhdGEoKTsKLSAgICB3aGlsZSAoY2hhciBj
ID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBTYWZl
IHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGluZyAnXDAnLgotICAgICAgICAgICAgaWYg
KCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAvLyBUdXJuIENSIGludG8gQ1JMRi4KLSAg
ICAgICAgICAgICAgICAqcSsrID0gJ1xyJzsKLSAgICAgICAgICAgICAgICAqcSsrID0gJ1xuJzsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAgICAg
ICAgIC8vIFR1cm4gTEYgaW50byBDUkxGLgotICAgICAgICAgICAgKnErKyA9ICdccic7Ci0gICAg
ICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExl
YXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICAqcSsrID0gYzsKLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLWJvb2wgSFRNTEZvcm1FbGVt
ZW50SW1wbDo6Zm9ybURhdGEoRm9ybURhdGEgJmZvcm1fZGF0YSkgY29uc3QKLXsKLSAgICBRQ1N0
cmluZyBlbmNfc3RyaW5nID0gIiI7IC8vIHVzZWQgZm9yIG5vbi1tdWx0aXBhcnQgZGF0YQotCi0g
ICAgLy8gZmluZCBvdXQgdGhlIFFUZXh0Y29kZWMgdG8gdXNlCi0gICAgUVN0cmluZyBzdHIgPSBt
X2FjY2VwdGNoYXJzZXQucXN0cmluZygpOwotICAgIHN0ci5yZXBsYWNlKCcsJywgJyAnKTsKLSAg
ICBRU3RyaW5nTGlzdCBjaGFyc2V0cyA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnICcsIHN0cik7Ci0g
ICAgUVRleHRDb2RlYyogY29kZWMgPSAwOwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50
KCktPmZyYW1lKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBjaGFyc2V0
cy5iZWdpbigpOyBpdCAhPSBjaGFyc2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5n
IGVuYyA9ICgqaXQpOwotICAgICAgICBpZiAoZW5jLmNvbnRhaW5zKCJVTktOT1dOIikpIHsKLSAg
ICAgICAgICAgIC8vIHVzZSBzdGFuZGFyZCBkb2N1bWVudCBlbmNvZGluZwotICAgICAgICAgICAg
ZW5jID0gIklTTy04ODU5LTEiOwotICAgICAgICAgICAgaWYgKGZyYW1lKQotICAgICAgICAgICAg
ICAgIGVuYyA9IGZyYW1lLT5lbmNvZGluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY29k
ZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoZW5jLmxhdGluMSgpKSkpCi0gICAgICAgICAg
ICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIWNvZGVjKQotICAgICAgICBjb2RlYyA9IFFUZXh0
Q29kZWM6OmNvZGVjRm9yTG9jYWxlKCk7Ci0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsKiBjdXJyZW50ID0gZm9ybUVsZW1lbnRzW2ldOwotICAgICAgICBGb3JtRGF0YUxp
c3QgbHN0KGNvZGVjKTsKLQotICAgICAgICBpZiAoIWN1cnJlbnQtPmRpc2FibGVkKCkgJiYgY3Vy
cmVudC0+YXBwZW5kRm9ybURhdGEobHN0LCBtX211bHRpcGFydCkpIHsKLSAgICAgICAgICAgIGZv
ciAoUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gaXQgPSBsc3QuYmVn
aW4oKTsgaXQgIT0gbHN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX211
bHRpcGFydCkgewotICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgSVNJTkRFWCAvIDxpbnB1
dCBuYW1lPWlzaW5kZXg+IHNwZWNpYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkg
aWYgaXRzIHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgICAgICAgICBpZiAoIGVuY19zdHJp
bmcuaXNFbXB0eSgpICYmICgqaXQpLm1fZGF0YSA9PSAiaXNpbmRleCIgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICArK2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyAr
PSBlbmNvZGVDU3RyaW5nKCAoKml0KS5tX2RhdGEgKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFl
bmNfc3RyaW5nLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3Ry
aW5nICs9ICcmJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNv
ZGVDU3RyaW5nKCgqaXQpLm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3Ry
aW5nICs9ICI9IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRQ1N0cmluZyBoc3Ry
KCItLSIpOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1fYm91bmRhcnkucXN0cmluZygp
LmxhdGluMSgpOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuIjsKLSAgICAgICAg
ICAgICAgICAgICAgaHN0ciArPSAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1l
PVwiIjsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAoKml0KS5tX2RhdGEuZGF0YSgpOwot
ICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcIiI7Ci0KLSAgICAgICAgICAgICAgICAgICAg
Ly8gaWYgdGhlIGN1cnJlbnQgdHlwZSBpcyBGSUxFLCB0aGVuIHdlIGFsc28gbmVlZCB0bwotICAg
ICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBmaWxlbmFtZQotICAgICAgICAgICAgICAg
ICAgICBpZiAoY3VycmVudC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSAmJgotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+
aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OkZJTEUpCi0gICAgICAgICAgICAg
ICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgcGF0aCA9IHN0YXRpY19j
YXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCktPnZhbHVlKCkucXN0cmluZygpOwot
Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGlmIHRo
ZSBmaWxlbmFtZSBpbmNsdWRlcyBhICIgbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8v
IG9yIGNvbnRyb2wgY2hhcmFjdGVycyBsaWtlIENSIG9yIExGLiBUaGlzIGFsc28gZG9lcyBzdHJh
bmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluZ3MgaWYgdGhlIGZpbGVuYW1lIGlu
Y2x1ZGVzIGNoYXJhY3RlcnMgeW91IGNhbid0IGVuY29kZQotICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gaW4gdGhlIHdlYnNpdGUncyBjaGFyYWN0ZXIgc2V0LgotICAgICAgICAgICAgICAgICAg
ICAgICAgaHN0ciArPSAiOyBmaWxlbmFtZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBo
c3RyICs9IGNvZGVjLT5mcm9tVW5pY29kZShwYXRoLm1pZChwYXRoLmZpbmRSZXYoJy8nKSArIDEp
LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYoIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4o
Y3VycmVudCktPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgbWltZVR5cGUgPSBmcmFtZSA/IE1h
YyhmcmFtZSktPm1pbWVUeXBlRm9yRmlsZU5hbWUocGF0aCkgOiBRU3RyaW5nKCk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKCFtaW1lVHlwZS5pc0VtcHR5KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXHJcbkNvbnRlbnQtVHlwZTogIjsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSBtaW1lVHlwZS5hc2NpaSgpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxy
XG5cclxuIjsKLSAgICAgICAgICAgICAgICAgICAgKytpdDsKLQotICAgICAgICAgICAgICAgICAg
ICAvLyBhcHBlbmQgYm9keQotICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0
YShoc3RyLmRhdGEoKSwgaHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0
IEZvcm1EYXRhTGlzdEl0ZW0gJml0ZW0gPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVf
dCBkYXRhU2l6ZSA9IGl0ZW0ubV9kYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGRhdGFTaXplICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5k
RGF0YShpdGVtLm1fZGF0YSwgZGF0YVNpemUgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxz
ZSBpZiAoIWl0ZW0ubV9wYXRoLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZv
cm1fZGF0YS5hcHBlbmRGaWxlKGl0ZW0ubV9wYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9y
bV9kYXRhLmFwcGVuZERhdGEoIlxyXG4iLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmIChtX211bHRpcGFydCkKLSAgICAg
ICAgZW5jX3N0cmluZyA9ICgiLS0iICsgbV9ib3VuZGFyeS5xc3RyaW5nKCkgKyAiLS1cclxuIiku
YXNjaWkoKTsKLQotICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGVuY19zdHJpbmcuZGF0YSgpLCBl
bmNfc3RyaW5nLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MRm9y
bUVsZW1lbnRJbXBsOjpwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5nJiB0eXBlKQotewotICAg
IGlmKHR5cGUuY29udGFpbnMoIm11bHRpcGFydCIsIGZhbHNlKSB8fCB0eXBlLmNvbnRhaW5zKCJm
b3JtLWRhdGEiLCBmYWxzZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gIm11bHRpcGFydC9mb3Jt
LWRhdGEiOwotICAgICAgICBtX211bHRpcGFydCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh0eXBl
LmNvbnRhaW5zKCJ0ZXh0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFpbnMoInBsYWluIiwgZmFsc2Up
KSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJ0ZXh0L3BsYWluIjsKLSAgICAgICAgbV9tdWx0aXBh
cnQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRp
b24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0Qm91bmRhcnkoIGNvbnN0
IERPTVN0cmluZyYgYm91bmQgKQotewotICAgIG1fYm91bmRhcnkgPSBib3VuZDsKLX0KLQotYm9v
bCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpwcmVwYXJlU3VibWl0KCkKLXsKLSAgICBGcmFtZSAqZnJh
bWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmKG1faW5zdWJtaXQgfHwgIWZyYW1l
IHx8IGZyYW1lLT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkpCi0gICAgICAgIHJldHVybiBtX2luc3Vi
bWl0OwotCi0gICAgbV9pbnN1Ym1pdCA9IHRydWU7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNl
OwotCi0gICAgaWYgKCBkaXNwYXRjaEhUTUxFdmVudChzdWJtaXRFdmVudCxmYWxzZSx0cnVlKSAm
JiAhbV9kb2luZ3N1Ym1pdCApCi0gICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotCi0gICAg
bV9pbnN1Ym1pdCA9IGZhbHNlOwotCi0gICAgaWYgKCBtX2RvaW5nc3VibWl0ICkKLSAgICAgICAg
c3VibWl0KHRydWUpOwotCi0gICAgcmV0dXJuIG1fZG9pbmdzdWJtaXQ7Ci19Ci0KLXZvaWQgSFRN
TEZvcm1FbGVtZW50SW1wbDo6c3VibWl0KCBib29sIGFjdGl2YXRlU3VibWl0QnV0dG9uICkKLXsK
LSAgICBLSFRNTFZpZXcgKnZpZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgRnJhbWUg
KmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWZyYW1l
KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIG1faW5zdWJtaXQgKSB7Ci0g
ICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgbV9pbnN1Ym1pdCA9IHRydWU7Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCog
Zmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gMDsKLSAgICBib29sIG5lZWRCdXR0b25BY3Rp
dmF0aW9uID0gYWN0aXZhdGVTdWJtaXRCdXR0b247CS8vIGRvIHdlIG5lZWQgdG8gYWN0aXZhdGUg
YSBzdWJtaXQgYnV0dG9uPwotICAgIAotICAgIE1hYyhmcmFtZSktPmNsZWFyUmVjb3JkZWRGb3Jt
VmFsdWVzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3Vu
dCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnQg
PSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIC8vIE91ciBhcHAgbmVlZHMgdG8gZ2V0IGZvcm0g
dmFsdWVzIGZvciBwYXNzd29yZCBmaWVsZHMgZm9yIGRvaW5nIHBhc3N3b3JkIGF1dG9jb21wbGV0
ZSwKLSAgICAgICAgLy8gc28gd2UgYXJlIG1vcmUgbGVuaWVudCBpbiBwdXNoaW5nIHZhbHVlcywg
YW5kIGxldCB0aGUgYXBwIGRlY2lkZSB3aGF0IHRvIHNhdmUgd2hlbi4KLSAgICAgICAgaWYgKGN1
cnJlbnQtPmhhc0xvY2FsTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsICppbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3Vy
cmVudCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpURVhUCi0gICAgICAgICAgICAgICAgfHwgaW5wdXQtPmlucHV0VHlwZSgpID09
ICBIVE1MSW5wdXRFbGVtZW50SW1wbDo6UEFTU1dPUkQKLSAgICAgICAgICAgICAgICB8fCBpbnB1
dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAgICAgICAg
ICAgIHsKLSAgICAgICAgICAgICAgICBNYWMoZnJhbWUpLT5yZWNvcmRGb3JtVmFsdWUoaW5wdXQt
Pm5hbWUoKS5xc3RyaW5nKCksIGlucHV0LT52YWx1ZSgpLnFzdHJpbmcoKSwgdGhpcyk7Ci0gICAg
ICAgICAgICAgICAgaWYgKGlucHV0LT5yZW5kZXJlcigpICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9
PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCo+KGlucHV0LT5yZW5kZXJlcigpKS0+YWRkU2VhcmNoUmVz
dWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZEJ1dHRv
bkFjdGl2YXRpb24pIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5pc0FjdGl2YXRlZFN1Ym1p
dCgpKSB7Ci0gICAgICAgICAgICAgICAgbmVlZEJ1dHRvbkFjdGl2YXRpb24gPSBmYWxzZTsKLSAg
ICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID09IDAgJiYg
Y3VycmVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkpIHsKLSAgICAgICAgICAgICAgICBm
aXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uICYmIGZpcnN0U3Vj
Y2Vzc2Z1bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0
b24tPnNldEFjdGl2YXRlZFN1Ym1pdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fcG9zdCkK
LSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICAKLSAgICBGb3JtRGF0YSBmb3JtX2Rh
dGE7Ci0gICAgaWYgKGZvcm1EYXRhKGZvcm1fZGF0YSkpIHsKLSAgICAgICAgaWYobV9wb3N0KSB7
Ci0gICAgICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggInBvc3QiLCBtX3VybC5xc3RyaW5nKCks
IGZvcm1fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJn
ZXQucXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN0
eXBlKCkucXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
b3VuZGFyeSgpLnFzdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgZnJhbWUtPnN1Ym1pdEZvcm0oICJnZXQiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0
YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmlu
ZygpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24g
JiYgZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbi0+c2V0QWN0aXZhdGVkU3VibWl0KGZhbHNlKTsKLSAgICB9Ci0gICAgCi0g
ICAgbV9kb2luZ3N1Ym1pdCA9IG1faW5zdWJtaXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9y
bUVsZW1lbnRJbXBsOjpyZXNldCggICkKLXsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVu
dCgpLT5mcmFtZSgpOwotICAgIGlmKG1faW5yZXNldCB8fCAhZnJhbWUpIHJldHVybjsKLQotICAg
IG1faW5yZXNldCA9IHRydWU7Ci0KLSAgICAvLyAjIyMgRE9NMiBsYWJlbHMgdGhpcyBldmVudCBh
cyBub3QgY2FuY2VsYWJsZSwgaG93ZXZlcgotICAgIC8vIGNvbW1vbiBicm93c2Vycyggc2ljayEg
KSBhbGxvdyBpdCBiZSBjYW5jZWxsZWQuCi0gICAgaWYgKCAhZGlzcGF0Y2hIVE1MRXZlbnQocmVz
ZXRFdmVudCx0cnVlLCB0cnVlKSApIHsKLSAgICAgICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVs
ZW1lbnRzLmNvdW50KCk7ICsraSkKLSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5yZXNldCgpOwot
Ci0gICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBp
ZiAoYXR0ci0+bmFtZSgpID09IGFjdGlvbkF0dHIpIAotICAgIHsKLSAgICAgICAgYm9vbCBvbGRV
UkxXYXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7Ci0gICAg
ICAgIG1fdXJsID0ga2h0bWw6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBib29s
IG5ld1VSTElzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpOwot
Ci0gICAgICAgIGlmIChtX2F0dGFjaGVkICYmIChvbGRVUkxXYXNTZWN1cmUgIT0gbmV3VVJMSXNT
ZWN1cmUpKQotICAgICAgICAgICAgaWYgKG5ld1VSTElzU2VjdXJlKQotICAgICAgICAgICAgICAg
IGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1SZW1vdmVkKCk7Ci0gICAgfQot
ICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB0YXJnZXRBdHRyKSB7Ci0gICAgICAgIG1fdGFy
Z2V0ID0gYXR0ci0+dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtZXRo
b2RBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAi
cG9zdCIpKQotICAgICAgICAgICAgbV9wb3N0ID0gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImdldCIpKQotICAgICAgICAgICAgbV9wb3N0
ID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZW5jdHlwZUF0dHIpIHsK
LSAgICAgICAgcGFyc2VFbmN0eXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGFjY2VwdF9jaGFyc2V0QXR0cikgewotICAgICAgICAvLyBzcGFjZSBzZXBh
cmF0ZWQgbGlzdCBvZiBjaGFyc2V0cyB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFjY2VwdHMgLSBz
ZWUgcmZjMjA0NQotICAgICAgICBtX2FjY2VwdGNoYXJzZXQgPSBhdHRyLT52YWx1ZSgpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2VwdEF0dHIpIHsKLSAgICAgICAgLy8gaWdu
b3JlIHRoaXMgb25lIGZvciB0aGUgbW9tZW50Li4uCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gYXV0b2NvbXBsZXRlQXR0cikgewotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9ICFlcXVh
bElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25zdWJtaXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVy
KHN1Ym1pdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnJl
c2V0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihyZXNldEV2ZW50LCBhdHRy
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBE
T01TdHJpbmcgbmV3TmFtZUF0dHIgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoaW5Eb2N1
bWVudCgpICYmIGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgICAg
IEhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1w
bCAqPihnZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgIGRvY3VtZW50LT5yZW1vdmVOYW1lZEl0
ZW0ob2xkTmFtZUF0dHIpOwotICAgICAgICAgICAgZG9jdW1lbnQtPmFkZE5hbWVkSXRlbShuZXdO
YW1lQXR0cik7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1lQXR0cjsK
LSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShhdHRyKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5zZXJ0SW50b1Zl
Y3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIHVuc2lnbmVkIHBvcywgVCogaXRlbSkKLXsKLSAgICB1
bnNpZ25lZCBzaXplID0gdmVjLnNpemUoKTsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3Vu
dCgpOwotICAgIGFzc2VydChwb3MgPD0gY291bnQpOwotICAgIGlmIChzaXplID09IGNvdW50KQot
ICAgICAgICB2ZWMucmVzaXplKHNpemUgPT0gMCA/IDggOiBzaXplICogMyAvIDIpOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IGNvdW50OyBpID4gcG9zOyAtLWkpCi0gICAgICAgIHZlYy5pbnNlcnQo
aSwgdmVjW2kgLSAxXSk7ICAgIAotICAgIHZlYy5pbnNlcnQocG9zLCBpdGVtKTsKLX0KLQotdGVt
cGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgYXBwZW5kVG9WZWN0b3IoUVB0clZlY3RvcjxUPiAm
dmVjLCBUICppdGVtKQotewotICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVu
c2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAg
ICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAgdmVjLmlu
c2VydChjb3VudCwgaXRlbSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJl
bW92ZUZyb21WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCBUICppdGVtKQotewotICAgIGludCBw
b3MgPSB2ZWMuZmluZFJlZihpdGVtKTsKLSAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgcmV0dXJu
OwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gcG9zOyBpIDwgY291bnQgLSAxOyArK2kpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwgdmVjW2kg
KyAxXSk7Ci0gICAgdmVjLnJlbW92ZShjb3VudCAtIDEpOwotfQotCi11bnNpZ25lZCBIVE1MRm9y
bUVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudEluZGV4KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
ICplKQotewotICAgIC8vIENoZWNrIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHRoaXMgZWxl
bWVudCBpcyB0aGUgdmVyeSBsYXN0IHRoaW5nIGluCi0gICAgLy8gdGhlIGZvcm0ncyB0cmVlIG9m
IGNoaWxkcmVuOyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhlIGVudGlyZSB0cmVlIGluIHRoYXQK
LSAgICAvLyBjb21tb24gY2FzZSB0aGF0IG9jY3VycyBkdXJpbmcgcGFyc2luZzsgaW5zdGVhZCB3
ZSdsbCBqdXN0IHJldHVybiBhIHZhbHVlCi0gICAgLy8gdGhhdCBzYXlzICJhZGQgdGhpcyBmb3Jt
IGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkiLgotICAgIGlmIChlLT50cmF2ZXJzZU5l
eHROb2RlKHRoaXMpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAgICBmb3IgKE5v
ZGVJbXBsICpub2RlID0gdGhpczsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUo
dGhpcykpIHsKLSAgICAgICAgICAgIGlmIChub2RlID09IGUpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIGk7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpCi0gICAgICAgICAg
ICAgICAgICAgICYmIHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKS0+aXNHZW5l
cmljRm9ybUVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqPihub2RlKS0+Zm9ybSgpID09IHRoaXMpCi0gICAgICAg
ICAgICAgICAgKytpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtRWxlbWVudHMu
Y291bnQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZWdpc3RlckZvcm1FbGVt
ZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICplKQotewotICAgIERvY3VtZW50SW1wbCAq
ZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jICYmIGUtPmlzUmFkaW9CdXR0b24oKSAm
JiAhZS0+bmFtZSgpLmlzRW1wdHkoKSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbCogY3VycmVudENoZWNrZWRSYWRpbyA9IGRvYy0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3Jv
dXAoZS0+bmFtZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAg
aWYgKGN1cnJlbnRDaGVja2VkUmFkaW8gPT0gZSkKLSAgICAgICAgICAgIGRvYy0+cmVtb3ZlUmFk
aW9CdXR0b25Hcm91cChlLT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDAp
OwotICAgICAgICBpZiAoZS0+aXNDaGVja2VkKCkpCi0gICAgICAgICAgICBkb2MtPnJhZGlvQnV0
dG9uQ2hlY2tlZCgoSFRNTElucHV0RWxlbWVudEltcGwqKSBlLCB0aGlzKTsKLSAgICB9Ci0gICAg
aW5zZXJ0SW50b1ZlY3Rvcihmb3JtRWxlbWVudHMsIGZvcm1FbGVtZW50SW5kZXgoZSksIGUpOwot
fQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92ZUZvcm1FbGVtZW50KEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsICplKQotewotICAgIGlmICghZS0+bmFtZSgpLmlzRW1wdHkoKSAm
JiBnZXREb2N1bWVudCgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBj
dXJyZW50Q2hlY2tlZFJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9y
R3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tl
ZFJhZGlvID09IGUpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRv
bkdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAgIH0KLSAgICByZW1vdmVGcm9tVmVj
dG9yKGZvcm1FbGVtZW50cywgZSk7Ci19Ci0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6aXNV
UkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0
ci0+bmFtZSgpID09IGFjdGlvbkF0dHI7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6
cmVnaXN0ZXJJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIGFwcGVu
ZFRvVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpyZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIHJlbW92
ZUZyb21WZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25J
bXBsPiBIVE1MRm9ybUVsZW1lbnRJbXBsOjplbGVtZW50cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0
cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsKHRoaXMpKTsK
LX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om5hbWUoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVu
dEltcGw6OnNldE5hbWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUobmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6
OmFjY2VwdENoYXJzZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0
X2NoYXJzZXRBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRBY2NlcHRD
aGFyc2V0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vw
dF9jaGFyc2V0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1w
bDo6YWN0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjdGlvbkF0dHIp
OwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFjdGlvbihjb25zdCBET01TdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY3Rpb25BdHRyLCB2YWx1ZSk7Ci19Ci0K
LXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0RW5jdHlwZShjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShlbmN0eXBlQXR0ciwgdmFsdWUpOwotfQotCi1ET01T
dHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6bWV0aG9kKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKG1ldGhvZEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6
OnNldE1ldGhvZChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSht
ZXRob2RBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjp0
YXJnZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodGFyZ2V0QXR0cik7Ci19
Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHRhcmdldEF0dHIsIHZhbHVlKTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6SFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJ
bXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MRWxlbWVudEltcGwo
dGFnTmFtZSwgZG9jKQotewotICAgIG1fZGlzYWJsZWQgPSBtX3JlYWRPbmx5ID0gZmFsc2U7Ci0K
LSAgICBpZiAoZikKLQltX2Zvcm0gPSBmOwotICAgIGVsc2UKLQltX2Zvcm0gPSBnZXRGb3JtKCk7
Ci0gICAgaWYgKG1fZm9ybSkKLSAgICAgICAgbV9mb3JtLT5yZWdpc3RlckZvcm1FbGVtZW50KHRo
aXMpOwotfQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6fkhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlbW92ZUZv
cm1FbGVtZW50KHRoaXMpOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlm
IChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBkaXNhYmxlZEF0dHIpIHsKLSAgICAgICAgYm9v
bCBvbGREaXNhYmxlZCA9IG1fZGlzYWJsZWQ7Ci0gICAgICAgIG1fZGlzYWJsZWQgPSAhYXR0ci0+
aXNOdWxsKCk7Ci0gICAgICAgIGlmIChvbGREaXNhYmxlZCAhPSBtX2Rpc2FibGVkKSB7Ci0gICAg
ICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5k
ZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgICAgICAgICAgdGhlbWUo
KS0+c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIEVuYWJsZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZWFkb25seUF0dHIpIHsKLSAgICAgICAgYm9v
bCBvbGRSZWFkT25seSA9IG1fcmVhZE9ubHk7Ci0gICAgICAgIG1fcmVhZE9ubHkgPSAhYXR0ci0+
aXNOdWxsKCk7Ci0gICAgICAgIGlmIChvbGRSZWFkT25seSAhPSBtX3JlYWRPbmx5KSBzZXRDaGFu
Z2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0
dGFjaCgpCi17Ci0gICAgYXNzZXJ0KCFhdHRhY2hlZCgpKTsKLQotICAgIEhUTUxFbGVtZW50SW1w
bDo6YXR0YWNoKCk7Ci0KLSAgICAvLyBUaGUgY2FsbCB0byB1cGRhdGVGcm9tRWxlbWVudCgpIG5l
ZWRzIHRvIGdvIGFmdGVyIHRoZSBjYWxsIHRocm91Z2gKLSAgICAvLyB0byB0aGUgYmFzZSBjbGFz
cydzIGF0dGFjaCgpIGJlY2F1c2UgdGhhdCBjYW4gc29tZXRpbWVzIGRvIGEgY2xvc2UKLSAgICAv
LyBvbiB0aGUgcmVuZGVyZXIuCi0gICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAgICAgIG1fcmVuZGVy
LT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIAotICAgICAgICAvLyBEZWxheWVkIGF0dGFjaG1l
bnQgaW4gb3JkZXIgdG8gcHJldmVudCBGT1VDIGNhbiByZXN1bHQgaW4gYW4gb2JqZWN0IGJlaW5n
Ci0gICAgICAgIC8vIHByb2dyYW1tYXRpY2FsbHkgZm9jdXNlZCBiZWZvcmUgaXQgaGFzIGEgcmVu
ZGVyIG9iamVjdC4gIElmIHdlIGhhdmUgYmVlbiBmb2N1c2VkCi0gICAgICAgIC8vIChpLmUuLCBp
ZiB3ZSBhcmUgdGhlIGZvY3VzTm9kZSkgdGhlbiBnbyBhaGVhZCBhbmQgZm9jdXMgb3VyIGNvcnJl
c3BvbmRpbmcgbmF0aXZlIHdpZGdldC4KLSAgICAgICAgLy8gKEF0dGFjaC9kZXRhY2ggY2FuIGFs
c28gaGFwcGVuIGFzIGEgcmVzdWx0IG9mIGRpc3BsYXkgdHlwZSBjaGFuZ2VzLCBlLmcuLCBtYWtp
bmcgYSB3aWRnZXQKLSAgICAgICAgLy8gYmxvY2sgaW5zdGVhZCBvZiBpbmxpbmUsIGFuZCBmb2N1
cyBzaG91bGQgYmUgcmVzdG9yZWQgaW4gdGhhdCBjYXNlIGFzIHdlbGwuKQotICAgICAgICBpZiAo
Z2V0RG9jdW1lbnQoKS0+Zm9jdXNOb2RlKCkgPT0gdGhpcyAmJiBtX3JlbmRlci0+aXNXaWRnZXQo
KSAmJiAKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkp
LT53aWRnZXQoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRl
cmVyKCkpLT53aWRnZXQoKS0+c2V0Rm9jdXMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQotewotICAgIGlm
ICghbV9mb3JtKSB7Ci0gICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBm
b3JtIGVsZW1lbnQgYmVpbmcgY3JlYXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBp
bnNlcnRlZCBpbnNpZGUgYSBmb3JtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAg
ICAvLyBzZXR0aW5nIGEgZm9ybSwgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1
ZSBmb3IgbV9mb3JtLCAKLSAgICAgICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55
dGhpbmcuCi0gICAgICAgIG1fZm9ybSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBt
X2Zvcm0tPnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYg
KGRvYyAmJiBpc1JhZGlvQnV0dG9uKCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2Vk
KCkpCi0gICAgICAgICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKil0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEVs
ZW1lbnRJbXBsOjppbnNlcnRlZEludG9UcmVlKGRlZXApOwotfQotCi12b2lkIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVkRnJvbVRyZWUoYm9vbCBkZWVwKQotewotICAgIC8vIFdo
ZW4gYmVpbmcgcmVtb3ZlZCB3ZSBoYXZlIHRvIHBvc3NpYmx5IG51bGwgb3V0IG91ciBmb3JtIGFu
ZCByZW1vdmUgb3Vyc2VsdmVzIGZyb20KLSAgICAvLyB0aGUgZm9ybSdzIGxpc3Qgb2YgZWxlbWVu
dHMuCi0gICAgaWYgKG1fZm9ybSkgewotICAgICAgICAvLyBBdHRlbXB0IHRvIHJlLWFjcXVpcmUg
dGhlIGZvcm0uICBJZiB3ZSBjYW4ndCByZS1hY3F1aXJlLCB0aGVuCi0gICAgICAgIC8vIHJlbW92
ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgZm9ybS4KLSAgICAgICAgTm9kZUltcGwqIGZvcm0gPSBwYXJl
bnROb2RlKCk7Ci0gICAgICAgIE5vZGVJbXBsKiByb290ID0gdGhpczsKLSAgICAgICAgd2hpbGUg
KGZvcm0pIHsKLSAgICAgICAgICAgIGlmIChmb3JtLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcm9vdCA9IGZvcm07Ci0gICAgICAgICAg
ICBmb3JtID0gZm9ybS0+cGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAg
ICAvLyBJZiB0aGUgZm9ybSBoYXMgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiwgdGhlbiB3ZSB3b24n
dCBmaW5kIGl0IGFzIGFuIGFuY2VzdG9yLgotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhl
IHJvb3Qgbm9kZSBvZiBvdXIgY3VycmVudCBmb3JtIGFuZCBvdXIgcm9vdCBub2RlCi0gICAgICAg
IC8vIG1hdGNoLiAgSWYgc28sIHByZXNlcnZlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBmb3JtLgot
ICAgICAgICBpZiAoIWZvcm0pIHsKLSAgICAgICAgICAgIE5vZGVJbXBsKiBmb3JtUm9vdCA9IG1f
Zm9ybTsKLSAgICAgICAgICAgIHdoaWxlIChmb3JtUm9vdC0+cGFyZW50KCkpIGZvcm1Sb290ID0g
Zm9ybVJvb3QtPnBhcmVudCgpOwotICAgICAgICAgICAgaWYgKGZvcm1Sb290ID09IHJvb3QpCi0g
ICAgICAgICAgICAgICAgZm9ybSA9IG1fZm9ybTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAg
ICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0
aGlzKTsKLSAgICAgICAgICAgIG1fZm9ybSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgYXNzZXJ0KGZvcm0gPT0gbV9mb3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVkIGZvcm0gc2hvdWxk
IGJlIHRoZSBzYW1lLiBJZiBub3QsIHNvbWV0aGluZyByZWFsbHkgc3RyYW5nZSBoYXBwZW5lZC4K
LSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsK
LX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omdl
dEZvcm0oKSBjb25zdAotewotICAgIE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOwotICAgIHdo
aWxlKHApIHsKLSAgICAgICAgaWYgKHAtPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAgICAgICAg
cCA9IHAtPnBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3Ry
aW5nIG4gPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIHJldHVybiBuLmlzTnVsbCgpID8g
IiIgOiBuOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1
ZSk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uU2VsZWN0KCkKLXsK
LSAgICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0
dXJlCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoc2VsZWN0RXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0K
LXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uQ2hhbmdlKCkKLXsKLSAgICAvLyAj
IyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJlCi0gICAg
ZGlzcGF0Y2hIVE1MRXZlbnQoY2hhbmdlRXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLWJvb2wgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9kaXNhYmxlZDsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0RGlz
YWJsZWQoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShkaXNhYmxlZEF0dHIsIGIgPyAiIiA6
IDApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRSZWFkT25seShi
b29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0ciwgYiA/ICIiIDogMCk7Ci19
Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNo
YW5nZSBjaCApCi17Ci0gICAgLy9ib29sIGNoYW5nZWQgPSBjaGFuZ2VkKCk7Ci0gICAgSFRNTEVs
ZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLQotICAgIGlmIChtX3JlbmRlciAvKiYmIGNo
YW5nZWQqLykKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLWJv
b2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAg
ICBpZiAoZGlzYWJsZWQoKSB8fCAhbV9yZW5kZXIgfHwgCi0gICAgICAgIChtX3JlbmRlci0+c3R5
bGUoKSAmJiBtX3JlbmRlci0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHx8IAot
ICAgICAgICBtX3JlbmRlci0+d2lkdGgoKSA9PSAwIHx8IG1fcmVuZGVyLT5oZWlnaHQoKSA9PSAw
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewot
ICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQo
KSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVu
ZGVyKS0+d2lkZ2V0KCkgJiYKLSAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lk
Z2V0Kj4obV9yZW5kZXIpLT53aWRnZXQoKS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OlRhYkZv
Y3VzKTsKLSAgICAgICAgfQotCWlmIChnZXREb2N1bWVudCgpLT5mcmFtZSgpKQotCSAgICByZXR1
cm4gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKS0+dGFic1RvQWxsQ29udHJvbHMoKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpp
c01vdXNlRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAg
ICAgICBpZiAobV9yZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAg
ICAgICAgKHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZv
Y3VzUG9saWN5KCkgJiBRV2lkZ2V0OjpDbGlja0ZvY3VzKTsKLSAgICAgICAgfQotICAgICAgICAv
LyBGb3IgPGlucHV0IHR5cGU9aW1hZ2U+IGFuZCA8YnV0dG9uPiwgd2Ugd2lsbCBhc3N1bWUgbm8g
bW91c2UgZm9jdXNhYmlsaXR5LiAgVGhpcyBpcwotICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGgg
T1MgWCBiZWhhdmlvciBmb3IgYnV0dG9ucy4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmlzRWRpdGFibGUoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gU3BlY2lhbCBjaGFy
cyB1c2VkIHRvIGVuY29kZSBmb3JtIHN0YXRlIHN0cmluZ3MuCi0vLyBXZSBwaWNrIGNoYXJzIHRo
YXQgYXJlIHVubGlrZWx5IHRvIGJlIHVzZWQgaW4gYW4gSFRNTCBhdHRyLCBzbyB3ZSByYXJlbHkg
aGF2ZSB0byByZWFsbHkgZW5jb2RlLgotY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvciA9ICcmJzsK
LWNvbnN0IGNoYXIgc3RhdGVFc2NhcGUgPSAnPCc7Ci1zdGF0aWMgY29uc3QgY2hhciBzdGF0ZVNl
cGFyYXRvck1hcmtlcltdID0gIjxBIjsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlRXNjYXBlTWFy
a2VyW10gPSAiPDwiOwotCi0vLyBFbmNvZGUgYW4gZWxlbWVudCBuYW1lIHNvIHdlIGNhbiBwdXQg
aXQgaW4gYSBzdGF0ZSBzdHJpbmcgd2l0aG91dCBjb2xsaWRpbmcKLS8vIHdpdGggb3VyIHNlcGFy
YXRvciBjaGFyLgotc3RhdGljIFFTdHJpbmcgZW5jb2RlZEVsZW1lbnROYW1lKFFTdHJpbmcgc3Ry
KQotewotICAgIGludCBzZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaW50
IGVzY0xvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICBpZiAoc2VwTG9jID49IDAg
fHwgZXNjTG9jID49IDApIHsKLSAgICAgICAgUVN0cmluZyBuZXdTdHIgPSBzdHI7Ci0gICAgICAg
IC8vICAgcmVwbGFjZSAiPCIgd2l0aCAiPDwiCi0gICAgICAgIHdoaWxlIChlc2NMb2MgPj0gMCkg
ewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2UoZXNjTG9jLCAxLCBzdGF0ZUVzY2FwZU1hcmtl
cik7Ci0gICAgICAgICAgICBlc2NMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgZXNjTG9j
KzEpOwotICAgICAgICB9Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiJiIgd2l0aCAiPEEiCi0gICAg
ICAgIHdoaWxlIChzZXBMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2Uoc2Vw
TG9jLCAxLCBzdGF0ZVNlcGFyYXRvck1hcmtlcik7Ci0gICAgICAgICAgICBzZXBMb2MgPSBzdHIu
ZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwTG9jKzEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biBuZXdTdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19Ci0K
LVFTdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8g
QnVpbGQgYSBzdHJpbmcgdGhhdCBjb250YWlucyBFbGVtZW50TmFtZSZFbGVtZW50VHlwZSYKLSAg
ICByZXR1cm4gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpICsgc3RhdGVTZXBh
cmF0b3IgKyB0eXBlKCkucXN0cmluZygpICsgc3RhdGVTZXBhcmF0b3I7Ci19Ci0KLVFTdHJpbmcg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0
ICZzdGF0ZXMpCi17Ci0gICAgUVN0cmluZyBlbmNOYW1lID0gZW5jb2RlZEVsZW1lbnROYW1lKG5h
bWUoKS5xc3RyaW5nKCkpOwotICAgIFFTdHJpbmcgdHlwZVN0ciA9IHR5cGUoKS5xc3RyaW5nKCk7
Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBzdGF0ZXMuYmVnaW4oKTsgaXQg
IT0gc3RhdGVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgc3RhdGUgPSAqaXQ7Ci0g
ICAgICAgIGludCBzZXAxID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgICAgIGlu
dCBzZXAyID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwMSsxKTsKLSAgICAgICAgYXNz
ZXJ0KHNlcDEgPj0gMCk7Ci0gICAgICAgIGFzc2VydChzZXAyID49IDApOwotCi0gICAgICAgIFFT
dHJpbmcgbmFtZUFuZFR5cGUgPSBzdGF0ZS5sZWZ0KHNlcDIpOwotICAgICAgICBpZiAoZW5jTmFt
ZS5sZW5ndGgoKSArIHR5cGVTdHIubGVuZ3RoKCkgKyAxID09ICh1aW50KXNlcDIKLSAgICAgICAg
ICAgICYmIG5hbWVBbmRUeXBlLnN0YXJ0c1dpdGgoZW5jTmFtZSkKLSAgICAgICAgICAgICYmIG5h
bWVBbmRUeXBlLmVuZHNXaXRoKHR5cGVTdHIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0
ZXMucmVtb3ZlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5taWQoc2VwMisxKTsKLSAg
ICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKLX0KLQotaW50IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp0YWJJbmRleCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZSh0YWJpbmRleEF0dHIpLnRvSW50KCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnNldFRhYkluZGV4KGludCB2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUodGFiaW5kZXhBdHRyLCBRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6OkhUTUxCdXR0b25FbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsKGJ1dHRvblRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9
IFNVQk1JVDsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNl
OwotfQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6On5IVE1MQnV0dG9uRWxlbWVudEltcGwoKQot
ewotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVy
ZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJu
IG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0
b25FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0
eXBlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1l
KCkgPT0gIHR5cGVBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52
YWx1ZSgpLCAic3VibWl0IikpCi0gICAgICAgICAgICBtX3R5cGUgPSBTVUJNSVQ7Ci0gICAgICAg
IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJyZXNldCIpKQotICAg
ICAgICAgICAgbV90eXBlID0gUkVTRVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKGF0dHItPnZhbHVlKCksICJidXR0b24iKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IEJVVFRP
TjsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKLSAgICAgICAg
bV92YWx1ZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIG1fY3VyclZhbHVlID0gbV92YWx1ZTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAg
IC8vIERvIG5vdGhpbmcuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19
Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0KQotewotICAgIGlmIChtX3R5cGUgIT0gQlVUVE9OICYmIChldnQtPnR5cGUoKSA9
PSBET01BY3RpdmF0ZUV2ZW50KSkgewotCi0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0g
U1VCTUlUKSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAg
ICBtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKTsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0g
ZmFsc2U7IC8vIGluIGNhc2Ugd2Ugd2VyZSBjYW5jZWxlZAotICAgICAgICB9Ci0gICAgICAgIGlm
KG1fZm9ybSAmJiBtX3R5cGUgPT0gUkVTRVQpIG1fZm9ybS0+cmVzZXQoKTsKLSAgICB9Ci0gICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0K
LQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigp
IGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBu
YW1lcwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIg
YnJvd3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3Jl
LCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0
dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFJlbW92ZSB0
aGUgbmFtZSBjb25zdHJhaW50IGZvciBub3cuCi0gICAgLy8gV2FzOiBtX3R5cGUgPT0gU1VCTUlU
ICYmICFtX2Rpc2FibGVkICYmICFuYW1lKCkuaXNFbXB0eSgpCi0gICAgcmV0dXJuIG1fdHlwZSA9
PSBTVUJNSVQgJiYgIW1fZGlzYWJsZWQ7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
Ojppc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0
OwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJv
b2wgZmxhZykKLXsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTEJ1
dHRvbkVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBi
b29sIC8qbXVsdGlwYXJ0Ki8pCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBTVUJNSVQgfHwgbmFtZSgp
LmlzRW1wdHkoKSB8fCAhbV9hY3RpdmVTdWJtaXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgbV9jdXJyVmFsdWUpOwotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJv
b2wgc2VuZFRvQW55RWxlbWVudCkKLXsgICAKLSAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24g
ZXZlbnRzIGlmZiB0aGUKLSAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQK
LSAgICBjbGljayhzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25F
bGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWNj
ZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6
dmFsdWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0K
LQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpIVE1MRmllbGRTZXRF
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAg
IDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoZmllbGRzZXRUYWcsIGRvYywgZikKLXsKLX0K
LQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6On5IVE1MRmllbGRTZXRFbGVtZW50SW1wbCgpCi17
Ci19Ci0KLWJvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJ
bXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUobGVnZW5k
VGFnKSB8fCBIVE1MRWxlbWVudEltcGw6OmNoZWNrRFREKG5ld0NoaWxkKTsKLX0KLQotYm9vbCBI
VE1MRmllbGRTZXRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp0eXBlKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gImZpZWxkc2V0IjsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1M
RmllbGRTZXRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBS
ZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpZWxk
c2V0KHRoaXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpIVE1MSW5wdXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVt
ZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGlucHV0VGFnLCBk
b2MsIGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElu
cHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBs
ICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbCh0YWdOYW1lLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjppbml0KCkKLXsKLSAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICBt
X3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBt
X21heExlbiA9IC0xOwotICAgIG1fc2l6ZSA9IDIwOwotICAgIG1fY2hlY2tlZCA9IGZhbHNlOwot
ICAgIG1fZGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0g
dHJ1ZTsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTsKLQotICAgIG1faGF2ZVR5cGUgPSBm
YWxzZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0g
dHJ1ZTsKLSAgICBtX2luaXRlZCA9IGZhbHNlOwotCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9
IDA7Ci0KLSAgICBtX21heFJlc3VsdHMgPSAtMTsKLQotICAgIGlmIChtX2Zvcm0pCi0gICAgICAg
IG1fYXV0b2NvbXBsZXRlID0gbV9mb3JtLT5hdXRvQ29tcGxldGUoKTsKLX0KLQotSFRNTElucHV0
RWxlbWVudEltcGw6On5IVE1MSW5wdXRFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3Vt
ZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAg
ICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBt
X25hbWU7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2Fi
bGUoKSBjb25zdAotewotICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3QgYmUg
Zm9jdXNlZCwgdGhlbiB3ZSBjYW4gc3RvcCBub3cuCi0gICAgaWYgKCFIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPKSB7Ci0gICAgICAgIC8vIFVubmFtZWQgcmFkaW8g
YnV0dG9ucyBhcmUgbmV2ZXIgZm9jdXNhYmxlIChtYXRjaGVzIFdpbklFKS4KLSAgICAgICAgaWYg
KG5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
Ly8gTmV2ZXIgYWxsb3cga2V5Ym9hcmQgdGFiYmluZyB0byBsZWF2ZSB5b3UgaW4gdGhlIHNhbWUg
cmFkaW8gZ3JvdXAuICBBbHdheXMKLSAgICAgICAgLy8gc2tpcCBhbnkgb3RoZXIgZWxlbWVudHMg
aW4gdGhlIGdyb3VwLgotICAgICAgICBOb2RlSW1wbCogY3VycmVudEZvY3VzTm9kZSA9IGdldERv
Y3VtZW50KCktPmZvY3VzTm9kZSgpOwotICAgICAgICBpZiAoY3VycmVudEZvY3VzTm9kZSAmJiBj
dXJyZW50Rm9jdXNOb2RlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRN
TElucHV0RWxlbWVudEltcGwqIGZvY3VzZWRJbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKj4oY3VycmVudEZvY3VzTm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNlZElu
cHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBmb2N1c2VkSW5wdXQtPmZvcm0oKSA9PSBtX2Zv
cm0gJiYKLSAgICAgICAgICAgICAgICBmb2N1c2VkSW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAg
ICAvLyBBbGxvdyBrZXlib2FyZCBmb2N1cyBpZiB3ZSdyZSBjaGVja2VkIG9yIGlmIG5vdGhpbmcg
aW4gdGhlIGdyb3VwIGlzIGNoZWNrZWQuCi0gICAgICAgIHJldHVybiBjaGVja2VkKCkgfHwgIWdl
dERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1f
Zm9ybSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICBpZiAodC5p
c0VtcHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y2NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0
ZSh0eXBlQXR0ciwgZXhjY29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc2V0QXR0cmli
dXRlKHR5cGVBdHRyLCB0KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5w
dXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICB0eXBlRW51bSBuZXdUeXBlOwotICAg
IAotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicGFzc3dvcmQiKSkKLSAgICAgICAgbmV3
VHlwZSA9IFBBU1NXT1JEOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJjaGVj
a2JveCIpKQotICAgICAgICBuZXdUeXBlID0gQ0hFQ0tCT1g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJ
Z25vcmluZ0Nhc2UodCwgInJhZGlvIikpCi0gICAgICAgIG5ld1R5cGUgPSBSQURJTzsKLSAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic3VibWl0IikpCi0gICAgICAgIG5ld1R5cGUg
PSBTVUJNSVQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJlc2V0IikpCi0g
ICAgICAgIG5ld1R5cGUgPSBSRVNFVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0
LCAiZmlsZSIpKQotICAgICAgICBuZXdUeXBlID0gRklMRTsKLSAgICBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZSh0LCAiaGlkZGVuIikpCi0gICAgICAgIG5ld1R5cGUgPSBISURERU47Ci0gICAg
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImltYWdlIikpCi0gICAgICAgIG5ld1R5cGUg
PSBJTUFHRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiYnV0dG9uIikpCi0g
ICAgICAgIG5ld1R5cGUgPSBCVVRUT047Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
dCwgImtodG1sX2lzaW5kZXgiKSkKLSAgICAgICAgbmV3VHlwZSA9IElTSU5ERVg7Ci0gICAgZWxz
ZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInNlYXJjaCIpKQotICAgICAgICBuZXdUeXBlID0g
U0VBUkNIOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYW5nZSIpKQotICAg
ICAgICBuZXdUeXBlID0gUkFOR0U7Ci0gICAgZWxzZQotICAgICAgICBuZXdUeXBlID0gVEVYVDsK
LQotICAgIC8vICMjIyBJTVBPUlRBTlQ6IERvbid0IGFsbG93IHRoZSB0eXBlIHRvIGJlIGNoYW5n
ZWQgdG8gRklMRSBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyB0eXBlIGNoYW5nZSwgb3RoZXJ3aXNl
IGEgSmF2YVNjcmlwdCBwcm9ncmFtbWVyIHdvdWxkIGJlIGFibGUgdG8gc2V0IGEgdGV4dAotICAg
IC8vIGZpZWxkJ3MgdmFsdWUgdG8gc29tZXRoaW5nIGxpa2UgL2V0Yy9wYXNzd2QgYW5kIHRoZW4g
Y2hhbmdlIGl0IHRvIGEgZmlsZSBmaWVsZC4KLSAgICBpZiAobV90eXBlICE9IG5ld1R5cGUpIHsK
LSAgICAgICAgaWYgKG5ld1R5cGUgPT0gRklMRSAmJiBtX2hhdmVUeXBlKSB7Ci0gICAgICAgICAg
ICAvLyBTZXQgdGhlIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAg
ICAvLyBVc2VmdWwgaW4gY2FzZSB3ZSB3ZXJlIGNhbGxlZCBmcm9tIGluc2lkZSBwYXJzZU1hcHBl
ZEF0dHJpYnV0ZS4KLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdHlwZSgpKTsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW5h
bWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Y2hl
Y2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKSA9PSB0aGlzKQot
ICAgICAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3Vw
KG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29s
IHdhc0F0dGFjaGVkID0gbV9hdHRhY2hlZDsKLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkK
LSAgICAgICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIGJvb2wgZGlkU3RvcmVWYWx1
ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBtX3R5
cGUgPSBuZXdUeXBlOwotICAgICAgICAgICAgYm9vbCB3aWxsU3RvcmVWYWx1ZSA9IHN0b3Jlc1Zh
bHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoZGlkU3RvcmVWYWx1
ZSAmJiAhd2lsbFN0b3JlVmFsdWUgJiYgIW1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAg
ICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBtX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBt
X3ZhbHVlID0gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRp
ZFN0b3JlVmFsdWUgJiYgd2lsbFN0b3JlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVl
ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBp
ZiAod2FzQXR0YWNoZWQpCi0gICAgICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAvLyBJZiBvdXIgdHlwZSBtb3JwaHMgaW50byBhIHJhZGlvIGJ1dHRv
biBhbmQgd2UgYXJlIGNoZWNrZWQsIHRoZW4gZ28gYWhlYWQKLSAgICAgICAgICAgIC8vIGFuZCBz
aWduYWwgdGhpcyB0byB0aGUgZm9ybS4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8g
JiYgY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9u
Q2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotICAgIG1faGF2ZVR5cGUg
PSB0cnVlOwotICAgIAotICAgIGlmIChtX3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikg
ewotICAgICAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLSAgICAgICAgbV9pbWFnZUxvYWRlciA9
IDA7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnR5cGUoKSBj
b25zdAotewotICAgIC8vIG5lZWRzIHRvIGJlIGxvd2VyY2FzZSBhY2NvcmRpbmcgdG8gRE9NIHNw
ZWMKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgVEVYVDogcmV0dXJuICJ0ZXh0IjsK
LSAgICBjYXNlIFBBU1NXT1JEOiByZXR1cm4gInBhc3N3b3JkIjsKLSAgICBjYXNlIENIRUNLQk9Y
OiByZXR1cm4gImNoZWNrYm94IjsKLSAgICBjYXNlIFJBRElPOiByZXR1cm4gInJhZGlvIjsKLSAg
ICBjYXNlIFNVQk1JVDogcmV0dXJuICJzdWJtaXQiOwotICAgIGNhc2UgUkVTRVQ6IHJldHVybiAi
cmVzZXQiOwotICAgIGNhc2UgRklMRTogcmV0dXJuICJmaWxlIjsKLSAgICBjYXNlIEhJRERFTjog
cmV0dXJuICJoaWRkZW4iOwotICAgIGNhc2UgSU1BR0U6IHJldHVybiAiaW1hZ2UiOwotICAgIGNh
c2UgQlVUVE9OOiByZXR1cm4gImJ1dHRvbiI7Ci0gICAgY2FzZSBTRUFSQ0g6IHJldHVybiAic2Vh
cmNoIjsKLSAgICBjYXNlIFJBTkdFOiByZXR1cm4gInJhbmdlIjsKLSAgICBjYXNlIElTSU5ERVg6
IHJldHVybiAiIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi1RU3RyaW5nIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQp
OwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLQotICAgIFFT
dHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKTsKLSAgICBz
d2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAg
ICAgICAgcmV0dXJuIHN0YXRlICsgKGNoZWNrZWQoKSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgZGVm
YXVsdDoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOyAvLyBN
YWtlIHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0gICAgfQotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAg
ICBhc3NlcnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3Rv
cmUgcGFzc3dvcmQgZmllbGRzCi0gICAgCi0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0
ZS5pc051bGwoKSkgcmV0dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENI
RUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHNldENoZWNrZWQoKHN0YXRlID09ICJv
biIpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc2V0VmFsdWUoRE9N
U3RyaW5nKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjYW5IYXZlU2VsZWN0aW9uKCkK
LXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNh
c2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0
KCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1f
dHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAg
ICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxp
bmVFZGl0ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgZGVmYXVsdDoK
LSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZWxlY3Rpb25FbmQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJl
dHVybiAwOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dP
UkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rp
b25FbmQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAg
ICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9u
U3RhcnQoaW50IHN0YXJ0KQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAg
ICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNl
IFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAg
IH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBl
bmQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90
eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAq
PihtX3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZighbV9yZW5kZXIpIHJldHVy
bjsKLQotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24qPihtX3JlbmRlciktPnNlbGVjdCgpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2Ug
U0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJMaW5lRWRpdCo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2Ug
SElEREVOOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAg
ICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6
Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGlu
dCBlbmQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAo
bV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgot
ICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRp
dCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19
Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRz
LCBib29sIHNob3dQcmVzc2VkTG9vaykKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0g
ICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBl
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2Ug
UkVTRVQ6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBpZiAocmVu
ZGVyZXIoKSkgewotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24g
Kj4ocmVuZGVyZXIoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0g
ICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQ
QVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAg
ICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpj
bGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlv
bihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewot
ICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlw
ZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQ
QVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAg
ICAgICAgICAgIGZvY3VzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVD
S0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAg
IGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgot
ICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAvLyBm
b2N1cwotICAgICAgICAgICAgZm9jdXMoKTsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgbW91
c2UgYnV0dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgICAgICAgICAvLyBjYWxsZXIgc3BlY2lmaWVk
IHNlbmRUb0FueUVsZW1lbnQKLSAgICAgICAgICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1
dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIg
fHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9
PSB2c3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhzcGFjZUF0dHIpIHsKLSAgICAg
ICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0g
ICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBl
UmVwbGFjZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlv
ciBpcyB0aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBy
ZXR1cm4gSFRNTEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIp
IHsKLSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkgJiYgbV9mb3JtKSB7
Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJhZGlvIGZyb20gaXRzIG9sZCBncm91cC4KLSAg
ICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW1fbmFtZS5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChtX25hbWUu
aW1wbCgpLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUg
b3VyIGNhY2hlZCByZWZlcmVuY2UgdG8gdGhlIG5hbWUuCi0gICAgICAgIG1fbmFtZSA9IGF0dHIt
PnZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgaXQgdG8gaXRzIG5ldyBncm91cC4K
LSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICBn
ZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0
b2NvbXBsZXRlID0gIWVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgc2V0SW5w
dXRUeXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZh
bHVlQXR0cikgewotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUg
Zm9ybSBpcyBsb29raW5nIGF0IHRoZSBkZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KLSAgICAgICAg
aWYgKG1fdmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAg
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBjaGVja2VkQXR0cikgewotICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHIt
PmlzTnVsbCgpOwotICAgICAgICBpZiAobV91c2VEZWZhdWx0Q2hlY2tlZCkgewotICAgICAgICAg
ICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICAgICAgICAgIG1fdXNlRGVmYXVs
dENoZWNrZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gbWF4bGVuZ3RoQXR0cikgewotICAgICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/
IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0g
IWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMjA7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gYWx0QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYg
bV90eXBlID09IElNQUdFKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPiht
X3JlbmRlciktPnVwZGF0ZUFsdFRleHQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBzcmNBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsK
LSAgICAgICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgICAgICBtX2ltYWdl
TG9hZGVyID0gbmV3IEhUTUxJbWFnZUxvYWRlcih0aGlzKTsKLSAgICAgICAgICAgIG1faW1hZ2VM
b2FkZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSB1c2VtYXBBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkg
PT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9t
ZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAg
ICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7
Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRy
LT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7
Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+
dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklH
SFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWdu
QXR0cikgewotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwg
Q1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9Q
X0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwg
YXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAg
ICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRM
aXN0ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gb25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmlucHV0QXR0cikg
ewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRyKTsKLSAgICB9
Ci0gICAgLy8gU2VhcmNoIGZpZWxkIGFuZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwganVzdCBjYXVz
ZSB1cGRhdGVGcm9tRWxlbWVudCB0byBiZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQotICAgIC8vIHJl
Y2FsY2luZy4KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWFyY2hBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZXN1bHRzQXR0cikgewotICAgICAgICBtX21heFJlc3Vs
dHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAg
ICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZl
QXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8
fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0ciB8fAotICAg
ICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0
dHItPm5hbWUoKSA9PSBtYXhBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0g
cHJlY2lzaW9uQXR0cikgewotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRy
KTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5k
ZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBU
RVhUOgotICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBSQU5H
RToKLSAgICBjYXNlIElTSU5ERVg6Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElP
OgotICAgIGNhc2UgU1VCTUlUOgotICAgIGNhc2UgSU1BR0U6Ci0gICAgY2FzZSBSRVNFVDoKLSAg
ICBjYXNlIEZJTEU6Ci0gICAgY2FzZSBCVVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKHN0eWxlKTsKLSAgICBjYXNlIEhJRERFTjogICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJl
cihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2go
bV90eXBlKQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBj
YXNlIFNFQVJDSDoKLSAgICBjYXNlIElTSU5ERVg6ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVy
TGluZUVkaXQodGhpcyk7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAg
ICAgICByZXR1cm4gUmVuZGVyT2JqZWN0OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotICAg
IGNhc2UgU1VCTUlUOgotICAgIGNhc2UgUkVTRVQ6Ci0gICAgY2FzZSBCVVRUT046Ci0gICAgICAg
IHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBJTUFHRTog
ICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckltYWdlQnV0dG9uKHRoaXMpOwotICAgIGNhc2Ug
RklMRTogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGaWxlQnV0dG9uKHRoaXMpOwotICAg
IGNhc2UgUkFOR0U6ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTbGlkZXIodGhpcyk7Ci0g
ICAgY2FzZSBISURERU46ICAgYnJlYWs7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0g
ICAgaWYgKCFtX2luaXRlZCkgewotICAgICAgICBpZiAoIW1faGF2ZVR5cGUpCi0gICAgICAgICAg
ICBzZXRJbnB1dFR5cGUoZ2V0QXR0cmlidXRlKHR5cGVBdHRyKSk7Ci0KLSAgICAgICAgLy8gRklY
TUU6IFRoaXMgbmVlZHMgdG8gYmUgZHluYW1pYywgZG9lc24ndCBpdCwgc2luY2Ugc29tZW9uZSBj
b3VsZCBzZXQgdGhpcwotICAgICAgICAvLyBhZnRlciBhdHRhY2htZW50PwotICAgICAgICBET01T
dHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgIGlmICgodWludCkg
bV90eXBlIDw9IElTSU5ERVggJiYgIXZhbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJl
bW92ZSBuZXdsaW5lIHN0dWZmLi4KLSAgICAgICAgICAgIFFTdHJpbmcgbnZhbHVlOwotICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoKCk7ICsraSkKLSAg
ICAgICAgICAgICAgICBpZiAodmFsW2ldID49ICcgJykKLSAgICAgICAgICAgICAgICAgICAgbnZh
bHVlICs9IHZhbFtpXTsKLQotICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSBudmFsdWUu
bGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbnZhbHVl
KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1faW5pdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAv
LyBEaXNhbGxvdyB0aGUgd2lkdGggYXR0cmlidXRlIG9uIGlucHV0cyBvdGhlciB0aGFuIEhJRERF
TiBhbmQgSU1BR0UuCi0gICAgLy8gRHVtYiBXZWIgc2l0ZXMgd2lsbCB0cnkgdG8gc2V0IHRoZSB3
aWR0aCBhcyBhbiBhdHRyaWJ1dGUgb24gZm9ybSBjb250cm9scyB0aGF0IGFyZW4ndAotICAgIC8v
IGltYWdlcyBvciBoaWRkZW4uCi0gICAgaWYgKGhhc01hcHBlZEF0dHJpYnV0ZXMoKSAmJiBtX3R5
cGUgIT0gSElEREVOICYmIG1fdHlwZSAhPSBJTUFHRSAmJiAhZ2V0QXR0cmlidXRlKHdpZHRoQXR0
cikuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBleGNDb2RlOwotICAgICAgICByZW1vdmVBdHRy
aWJ1dGUod2lkdGhBdHRyLCBleGNDb2RlKTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAobV90eXBlID09IElNQUdFKSB7Ci0gICAg
ICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcg
SFRNTEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9t
RWxlbWVudCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW1hZ2UqIGltYWdlT2JqID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJlcigpKTsK
LSAgICAgICAgICAgIGltYWdlT2JqLT5zZXRJbWFnZShtX2ltYWdlTG9hZGVyLT5pbWFnZSgpKTsg
ICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBj
YWxsaW5nIHBhc3N3b3JkRmllbGRSZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1p
bmcKLSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQot
ICAgIGlmIChtX3R5cGUgPT0gUEFTU1dPUkQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnBhc3N3
b3JkRmllbGRBZGRlZCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZXRhY2go
KQotewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3Zh
bHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6YWx0VGV4dCgpIGNvbnN0Ci17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIv
MTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L2FwcGVuZGl4L25vdGVzLmh0bWwjYWx0Z2VuCi0gICAg
Ly8gYWxzbyBoZWF2aWx5IGRpc2N1c3NlZCBieSBIaXhpZSBvbiBidWd6aWxsYQotICAgIC8vIG5v
dGUgdGhpcyBpcyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCB0byBIVE1MSW1hZ2VFbGVtZW50SW1w
bDo6YWx0VGV4dCgpCi0gICAgRE9NU3RyaW5nIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsK
LSAgICAvLyBmYWxsIGJhY2sgdG8gdGl0bGUgYXR0cmlidXRlCi0gICAgaWYgKGFsdC5pc051bGwo
KSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgaWYgKGFsdC5p
c051bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgaWYg
KGFsdC5pc0VtcHR5KCkpCi0gICAgICAgIGFsdCA9IGlucHV0RWxlbWVudEFsdFRleHQoKTsKLQot
ICAgIHJldHVybiBhbHQ7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vz
c2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBi
dXR0b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1
bC4gSG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29u
c3RyYWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2Fu
IHVzZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQu
IAotICAgIC8vIFdhczogKG1fdHlwZSA9PSBTVUJNSVQgJiYgIW5hbWUoKS5pc0VtcHR5KCkpCi0g
ICAgcmV0dXJuICFtX2Rpc2FibGVkICYmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNV
Qk1JVCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9h
Y3RpdmVTdWJtaXQgPSBmbGFnOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBl
bmRGb3JtRGF0YShGb3JtRGF0YUxpc3QgJmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKLXsKLSAg
ICAvLyBpbWFnZSBnZW5lcmF0ZXMgaXRzIG93biBuYW1lcwotICAgIGlmIChuYW1lKCkuaXNFbXB0
eSgpICYmIG1fdHlwZSAhPSBJTUFHRSkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoIChtX3R5
cGUpIHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAg
Y2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6
Ci0gICAgICAgICAgICAvLyBhbHdheXMgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZW5jb2Rpbmcu
YXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0K
LSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAg
IGlmIChjaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5h
bWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAg
Y2FzZSBSRVNFVDoKLSAgICAgICAgICAgIC8vIHRob3NlIGJ1dHRvbnMgYXJlIG5ldmVyIHN1Y2Nl
c3NmdWwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjYXNlIElNQUdFOgot
ICAgICAgICAgICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2Rp
bmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBj
bGlja1goKSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNF
bXB0eSgpID8gInkiIDogKG5hbWUoKSArICIueSIpLCBjbGlja1koKSk7Ci0gICAgICAgICAgICAg
ICAgaWYgKCFuYW1lKCkuaXNFbXB0eSgpICYmICF2YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQp
IHsKLSAgICAgICAgICAgICAgICBET01TdHJpbmcgZW5jX3N0ciA9IHZhbHVlV2l0aERlZmF1bHQo
KTsKLSAgICAgICAgICAgICAgICBpZiAoIWVuY19zdHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBlbmNfc3RyKTsKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICB7Ci0g
ICAgICAgICAgICAvLyBjYW4ndCBzdWJtaXQgZmlsZSBvbiBHRVQKLSAgICAgICAgICAgIC8vIGRv
bid0IHN1Ym1pdCBpZiBkaXNwbGF5OiBub25lIG9yIGRpc3BsYXk6IGhpZGRlbgotICAgICAgICAg
ICAgaWYoIW11bHRpcGFydCB8fCAhcmVuZGVyZXIoKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52
aXNpYmlsaXR5KCkgIT0ga2h0bWw6OlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgICAgICAgICAvLyBpZiBubyBmaWxlbmFtZSBhdCBhbGwgaXMgZW50ZXJlZCwg
cmV0dXJuIHN1Y2Nlc3NmdWwsIGhvd2V2ZXIgZW1wdHkKLSAgICAgICAgICAgIC8vIG51bGwgd291
bGQgYmUgbW9yZSBsb2dpY2FsIGJ1dCBuZXRzY2FwZSBwb3N0cyBhbiBlbXB0eSBmaWxlLiBhcmdo
LgotICAgICAgICAgICAgaWYgKHZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAg
ZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIFFTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5jb2RpbmcuYXBw
ZW5kRmlsZShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5k
RGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQo
KQotewotICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKQotICAgICAg
ICBzZXRWYWx1ZShET01TdHJpbmcoKSk7Ci0gICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2Vk
KTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6c2V0Q2hlY2tlZChib29sIF9jaGVja2VkKQotewotICAgIC8vIFdpbklFIGRv
ZXMgbm90IGFsbG93IHVubmFtZWQgcmFkaW8gYnV0dG9ucyB0byBldmVuIGJlIGNoZWNrZWQuCi0g
ICAgaWYgKGNoZWNrZWQoKSA9PSBfY2hlY2tlZCB8fCAobV90eXBlID09IFJBRElPICYmIG5hbWUo
KS5pc0VtcHR5KCkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElP
ICYmIF9jaGVja2VkKQotICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQo
dGhpcywgbV9mb3JtKTsKLQotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBt
X2NoZWNrZWQgPSBfY2hlY2tlZDsKLSAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgaWYgKHJlbmRlcmVy
KCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVt
ZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLSAgICBvbkNoYW5n
ZSgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJv
b2wgX2luZGV0ZXJtaW5hdGUpCi17Ci0gICAgLy8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0
ZXJtaW5hdGUuCi0gICAgaWYgKG1fdHlwZSAhPSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkg
PT0gX2luZGV0ZXJtaW5hdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5kZXRlcm1pbmF0
ZSA9IF9pbmRldGVybWluYXRlOwotCi0gICAgc2V0Q2hhbmdlZCgpOwotCi0gICAgaWYgKHJlbmRl
cmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0
aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3Qg
RWxlbWVudEltcGwgKnNvdXJjZSkKLXsKLSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAq
c291cmNlRWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KHNv
dXJjZSk7Ci0KLSAgICBtX3ZhbHVlID0gc291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNr
ZWQgPSBzb3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0gc291cmNl
RWxlbS0+bV9pbmRldGVybWluYXRlOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudElt
cGw6OnZhbHVlKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdmFsdWUgPSBtX3ZhbHVlOwotCi0g
ICAgLy8gSXQncyBpbXBvcnRhbnQgKm5vdCogdG8gZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBhdHRy
aWJ1dGUgZm9yIGZpbGUgaW5wdXRzLAotICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBh
IG1hbGljaW91cyB3ZWIgcGFnZSB0byB1cGxvYWQgZmlsZXMgYnkgc2V0dGluZyB0aGUKLSAgICAv
LyB2YWx1ZSBhdHRyaWJ1dGUgaW4gbWFya3VwLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiBt
X3R5cGUgIT0gRklMRSkKLSAgICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsK
LQotICAgIC8vIElmIG5vIGF0dHJpYnV0ZSBleGlzdHMsIHRoZW4ganVzdCB1c2UgIm9uIiBvciAi
IiBiYXNlZCBvZmYgdGhlIGNoZWNrZWQoKSBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLSAgICBpZiAo
dmFsdWUuaXNOdWxsKCkgJiYgKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8p
KQotICAgICAgICByZXR1cm4gRE9NU3RyaW5nKGNoZWNrZWQoKSA/ICJvbiIgOiAiIik7Ci0KLSAg
ICByZXR1cm4gdmFsdWU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFs
dWVXaXRoRGVmYXVsdCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHYgPSB2YWx1ZSgpOwotICAg
IGlmICh2LmlzRW1wdHkoKSkgewotICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAg
ICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAgICB2ID0gcmVzZXRCdXR0b25EZWZhdWx0TGFi
ZWwoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVUJNSVQ6
Ci0gICAgICAgICAgICAgICAgdiA9IHN1Ym1pdEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAg
IGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBjYXNl
IEhJRERFTjoKLSAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBjYXNlIElTSU5E
RVg6Ci0gICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgY2FzZSBSQURJTzoK
LSAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAg
ICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
IH0KLSAgICByZXR1cm4gdjsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFs
dWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBpZiAobV90eXBlID09IEZJTEUpIHJl
dHVybjsKLQotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBpZiAoc3Rv
cmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkgewotICAgICAgICBtX3ZhbHVlID0gdmFs
dWU7Ci0gICAgICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgICAgIG1fcmVuZGVyLT51cGRhdGVG
cm9tRWxlbWVudCgpOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJl
ciA9IHRydWU7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAg
ZGlzcGF0Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi1ib29sIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpIGNv
bnN0Ci17Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAg
ICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBISURE
RU46Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNh
c2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNh
c2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12
b2lkKiBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQpCi17Ci0gICAgLy8gcHJldmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJl
IHVzZWQgdG8gcmV2ZXJzZSB0aGUgYXV0b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBo
ZXJlLgotICAgIC8vIFRoaXMgcmVzdWx0IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0g
dGhlICJ1bmRvIiBpbiBwb3N0RGlzcGF0Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCi0g
ICAgdm9pZCogcmVzdWx0ID0gMDsgCi0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90
eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNs
aWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+
YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAg
ICAgICAgICAvLyBBcyBhIHdheSB0byBzdG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdl
IHdlcmUgdW5jaGVja2VkLCAxIGlmIHdlIHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCi0gICAgICAg
ICAgICAvLyBpbmRldGVybWluYXRlLgotICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkg
ewotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDI7Ci0gICAgICAgICAgICAgICAg
c2V0SW5kZXRlcm1pbmF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgIGlmIChjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lk
KikweDE7Ci0gICAgICAgICAgICAgICAgc2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25z
LCBzdG9yZSB0aGUgY3VycmVudCBzZWxlY3RlZCByYWRpbyBvYmplY3QuCi0gICAgICAgICAgICBp
ZiAobmFtZSgpLmlzRW1wdHkoKSB8fCBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IDA7IC8vIFVubmFtZWQgcmFkaW8gYnV0dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1
dHRvbnMganVzdCBzdGF5IGNoZWNrZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJ
WE1FOiBOZWVkIHRvIGxlYXJuIHRvIHdvcmsgd2l0aG91dCBhIGZvcm0uCi0KLSAgICAgICAgICAg
IC8vIFdlIHJlYWxseSB3YW50IHJhZGlvIGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMs
IGkuZS4sIHRvIGhhdmUgc29tZXRoaW5nIGNoZWNrZWQuCi0gICAgICAgICAgICAvLyBUaGVyZWZv
cmUgaWYgbm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMg
YWN0aW9uIHRvIGJlICJ1bmRvbmUiLCBzaW5jZQotICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21l
IG9iamVjdCBpbiB0aGUgcmFkaW8gZ3JvdXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgotICAg
ICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCkt
PmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAg
ICAgICAgICBpZiAoY3VyclJhZGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJh
ZGlvIGJ1dHRvbiBzZWxlY3RlZCB0aGF0IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1
bHQgZmllbGQgYW5kIHJlZiBpdCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3Qg
YmUgZGVzdHJveWVkLgotICAgICAgICAgICAgICAgIGN1cnJSYWRpby0+cmVmKCk7Ci0gICAgICAg
ICAgICAgICAgcmVzdWx0ID0gY3VyclJhZGlvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0Owot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIo
RXZlbnRJbXBsICpldnQsIHZvaWQqIGRhdGEpCi17Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tC
T1ggfHwgbV90eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlw
ZSgpID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBs
Kj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9Y
KSB7Ci0gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBjaGVja2luZyB3ZSBkaWQgaW4gcHJlRGlz
cGF0Y2guCi0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5k
ZWZhdWx0SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gKHZvaWQqKTB4
MikKLSAgICAgICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICAgICAg
ICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWQoZGF0YSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkgewotICAgICAgICAgICAgSFRNTElu
cHV0RWxlbWVudEltcGwqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwq
PihkYXRhKTsKLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQt
PmRlZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmln
aW5hbCBzZWxlY3RlZCByYWRpbyBidXR0b24gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAg
Ly8gTWFrZSBzdXJlIGl0IGlzIHN0aWxsIGEgcmFkaW8gYnV0dG9uIGFuZCBvbmx5IGRvIHRoZSBy
ZXN0b3JhdGlvbiBpZiBpdCBzdGlsbAotICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gb3Vy
IGdyb3VwLgotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+Zm9ybSgpID09IGZvcm0oKSAmJiBp
bnB1dC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpIHsK
LSAgICAgICAgICAgICAgICAgICAgLy8gT2ssIHRoZSBvbGQgcmFkaW8gYnV0dG9uIGlzIHN0aWxs
IGluIG91ciBmb3JtIGFuZCBpbiBvdXIgZ3JvdXAgYW5kIGlzIHN0aWxsIGEgCi0gICAgICAgICAg
ICAgICAgICAgIC8vIHJhZGlvIGJ1dHRvbiwgc28gaXQncyBzYWZlIHRvIHJlc3RvcmUgc2VsZWN0
aW9uIHRvIGl0LgotICAgICAgICAgICAgICAgICAgICBpbnB1dC0+c2V0Q2hlY2tlZCh0cnVlKTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC0+ZGVy
ZWYoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlID09
IElNQUdFICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVu
dCAmJiBtX3JlbmRlcikgewotICAgICAgICAvLyByZWNvcmQgdGhlIG1vdXNlIHBvc2l0aW9uIGZv
ciB3aGVuIHdlIGdldCB0aGUgRE9NQWN0aXZhdGUgZXZlbnQKLSAgICAgICAgTW91c2VFdmVudElt
cGwgKm1lID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpOwotICAgICAgICBpbnQg
b2Zmc2V0WCwgb2Zmc2V0WTsKLSAgICAgICAgbV9yZW5kZXItPmFic29sdXRlUG9zaXRpb24ob2Zm
c2V0WCxvZmZzZXRZKTsKLSAgICAgICAgeFBvcyA9IG1lLT5jbGllbnRYKCktb2Zmc2V0WDsKLSAg
ICAgICAgeVBvcyA9IG1lLT5jbGllbnRZKCktb2Zmc2V0WTsKLQotCW1lLT5zZXREZWZhdWx0SGFu
ZGxlZCgpOwotICAgIH0KLQotICAgIC8vIERPTUFjdGl2YXRlIGV2ZW50cyBjYXVzZSB0aGUgaW5w
dXQgdG8gYmUgImFjdGl2YXRlZCIgLSBpbiB0aGUgY2FzZSBvZiBpbWFnZSBhbmQgc3VibWl0IGlu
cHV0cywgdGhpcyBtZWFucwotICAgIC8vIGFjdHVhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm0uIEZv
ciByZXNldCBpbnB1dHMsIHRoZSBmb3JtIGlzIHJlc2V0LiBUaGVzZSBldmVudHMgYXJlIHNlbnQg
d2hlbiB0aGUgdXNlciBjbGlja3MKLSAgICAvLyBvbiB0aGUgZWxlbWVudCwgb3IgcHJlc3NlcyBl
bnRlciB3aGlsZSBpdCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQuIEphdmFjc3JpcHQgY29kZSB3aXNo
aW5nIHRvIGFjdGl2YXRlIHRoZSBlbGVtZW50Ci0gICAgLy8gbXVzdCBkaXNwYXRjaCBhIERPTUFj
dGl2YXRlIGV2ZW50IC0gYSBjbGljayBldmVudCB3aWxsIG5vdCBkbyB0aGUgam9iLgotICAgIGlm
IChldnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSB7Ci0gICAgICAgIGlmIChtX3R5cGUg
PT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQpIHsKLSAgICAg
ICAgICAgIGlmICghbV9mb3JtKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
IGlmIChtX3R5cGUgPT0gUkVTRVQpCi0gICAgICAgICAgICAgICAgbV9mb3JtLT5yZXNldCgpOwot
ICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSB0cnVl
OwotICAgICAgICAgICAgICAgIGlmICghbV9mb3JtLT5wcmVwYXJlU3VibWl0KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgeFBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHlQb3MgPSAwOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNl
OwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0KLQotICAgIC8vIFVzZSBrZXkgcHJl
c3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAv
LyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3Mg
ZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXByZXNzRXZlbnQgJiYgZXZ0LT5pc0tl
eWJvYXJkRXZlbnQoKSkgewotICAgICAgICBib29sIGNsaWNrRWxlbWVudCA9IGZhbHNlOwotICAg
ICAgICBib29sIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSBmYWxzZTsKLQotICAgICAgICBET01T
dHJpbmcga2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRl
bnRpZmllcigpOwotCi0gICAgICAgIGlmIChrZXkgPT0gIlUrMDAwMDIwIikgewotICAgICAgICAg
ICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAg
ICAgICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAg
ICAgICAgICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0g
ICAgICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVs
YXRlIG1vdXNlIGNsaWNrIGZvciBzcGFjZWJhciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMu
Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBBcHBLaXQgYWxyZWFkeSBkb2VzIHRoaXMgZm9y
IHNvbWUsIGJ1dCBub3QgYWxsLCBvZiB0aGVtLgotICAgICAgICAgICAgICAgICAgICBjbGlja0Vs
ZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICBjYXNlIFJBRElPOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiB1bnNlbGVjdGVkIHJh
ZGlvIGlzIHRhYmJlZCBpbnRvIChiZWNhdXNlIHRoZSBlbnRpcmUgZ3JvdXAgaGFzIG5vdGhpbmcK
LSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tlZCwgb3IgYmVjYXVzZSBvZiBzb21lIGV4cGxp
Y2l0IC5mb2N1cygpIGNhbGwpLCB0aGVuIGFsbG93IHNwYWNlIHRvIGNoZWNrIGl0LgotICAgICAg
ICAgICAgICAgICAgICBpZiAoIWNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNs
aWNrRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAg
ICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0g
ICAgICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUp
IHsKLSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENI
RUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNh
c2UgSVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAg
ICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAg
ICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBj
bGljayBvbiB0aGUgZGVmYXVsdCBmb3JtIGJ1dHRvbiBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVz
IG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0RlZmF1bHRGb3JtQnV0dG9u
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBGSUxFOgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBSRVNFVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAg
ICAgLy8gU2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBl
bGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7IC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBlbnRlciBvbiBh
IHJhZGlvIGJ1dHRvbi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICht
X3R5cGUgPT0gUkFESU8gJiYgKGtleSA9PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09
ICJMZWZ0IiB8fCBrZXkgPT0gIlJpZ2h0IikpIHsKLSAgICAgICAgICAgIC8vIExlZnQgYW5kIHVw
IG1lYW4gInByZXZpb3VzIHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBSaWdodCBhbmQg
ZG93biBtZWFuICJuZXh0IHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBUZXN0ZWQgaW4g
V2luSUUsIGFuZCBldmVuIGZvciBSVEwsIGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8g
YnV0dG9uIChhbmQgc28gbW92ZXMKLSAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVt
cyBzdHJhbmdlLCBidXQgd2UnbGwgbWF0Y2ggaXQuCi0gICAgICAgICAgICBib29sIGZvcndhcmQg
PSAoa2V5ID09ICJEb3duIiB8fCBrZXkgPT0gIlJpZ2h0Iik7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIFdlIGNhbiBvbmx5IHN0YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYg
dGhlIGZvcm0gaGFzbid0IGJlZW4gZGVtb3RlZCB0byBhIGxlYWYgYmVjYXVzZQotICAgICAgICAg
ICAgLy8gb2YgbWFsZm9ybWVkIEhUTUwuCi0gICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7
Ci0gICAgICAgICAgICB3aGlsZSAoKG4gPSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUo
KSA6IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpKSkgewotICAgICAgICAgICAgICAgIC8vIE9u
Y2Ugd2UgZW5jb3VudGVyIGEgZm9ybSBlbGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCi0g
ICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBM
b29rIGZvciBtb3JlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1Rh
Z05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsKiBlbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAg
ICAgICAgICAgICAgICBpZiAoZWx0LT5mb3JtKCkgIT0gbV9mb3JtKQotICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlu
cHV0VGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwq
IGlucHV0RWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYg
aW5wdXRFbHQtPm5hbWUoKSA9PSBuYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnB1dEVsdC0+aXNGb2N1c2FibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlucHV0RWx0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGdldERvY3VtZW50KCktPnNldEZvY3VzTm9kZShpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5wdXRFbHQtPmNsaWNrKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKGNsaWNrRWxlbWVudCkgewotICAgICAgICAgICAgY2xpY2soZmFsc2Up
OwotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2Ug
aWYgKGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICBtX2Zv
cm0tPnN1Ym1pdENsaWNrKCk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVm
YXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpp
c0VkaXRhYmxlKCkKLXsKLSAgICByZXR1cm4gKChtX3R5cGUgPT0gVEVYVCkgfHwgKG1fdHlwZSA9
PSBQQVNTV09SRCkgfHwKLSAgICAgICAgICAgIChtX3R5cGUgPT0gU0VBUkNIKSB8fCAobV90eXBl
ID09IElTSU5ERVgpIHx8IChtX3R5cGUgPT0gRklMRSkpOwotfQotCi1ib29sIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewot
ICAgIHJldHVybiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpOwotfQotCi1ET01TdHJpbmcgSFRN
TElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmRl
ZmF1bHRDaGVja2VkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShjaGVja2Vk
QXR0cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1
bHRDaGVja2VkKGJvb2wgZGVmYXVsdENoZWNrZWQpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoZWNr
ZWRBdHRyLCBkZWZhdWx0Q2hlY2tlZCA/ICIiIDogMCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6YWNjZXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGFjY2VwdEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0QXR0ciwg
dmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQot
RE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjphbHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsdChjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNldE1heExlbmd0aChpbnQgX21heExlbmd0aCkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUobWF4bGVuZ3RoQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9tYXhMZW5ndGgpKTsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihfc2l6ZSkpOwotfQot
Ci1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19
Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzcmNBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dXNlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHVzZW1hcEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXRVc2VNYXAoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodXNl
bWFwQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMYWJlbEVs
ZW1lbnRJbXBsOjpIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6
IEhUTUxFbGVtZW50SW1wbChsYWJlbFRhZywgZG9jKQotewotfQotCi1IVE1MTGFiZWxFbGVtZW50
SW1wbDo6fkhUTUxMYWJlbEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGFiZWxFbGVt
ZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
dm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0
cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRy
KSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRN
TEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRN
TEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRWxlbWVudElt
cGwgKkhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgRE9NU3RyaW5n
IGZvcm1FbGVtZW50SWQgPSBnZXRBdHRyaWJ1dGUoZm9yQXR0cik7Ci0gICAgaWYgKGZvcm1FbGVt
ZW50SWQuaXNOdWxsKCkpIHsKLSAgICAgICAgLy8gU2VhcmNoIGNoaWxkcmVuIG9mIHRoZSBsYWJl
bCBlbGVtZW50IGZvciBhIGZvcm0gZWxlbWVudC4KLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSB0
aGlzOwotICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMp
KSkgewotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAg
ICAgICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50
SW1wbCAqPihub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNHZW5lcmljRm9y
bUVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3Jt
RWxlbWVudElkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdldERv
Y3VtZW50KCktPmdldEVsZW1lbnRCeUlkKGZvcm1FbGVtZW50SWQpOwotfQotCi12b2lkIEhUTUxM
YWJlbEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50
ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBI
VE1MTGFiZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVu
dCkKLXsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCk7Ci0gICAgaWYg
KGVsZW1lbnQpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVt
ZW50KTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZv
cm0oKQotewotICAgIGZvciAoTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7IHAgIT0gMDsgcCA9
IHAtPnBhcmVudE5vZGUoKSkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkK
LSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHAp
OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVs
ZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
YWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEFjY2Vz
c0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3Nr
ZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aHRt
bEZvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLX0KLQot
dm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShmb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpIVE1MTGVnZW5kRWxlbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi06IEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsKGxlZ2VuZFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MTGVnZW5k
RWxlbWVudEltcGw6On5IVE1MTGVnZW5kRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxM
ZWdlbmRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVy
biBuZXcgKGFyZW5hKSBSZW5kZXJMZWdlbmQodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVn
ZW5kRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAibGVnZW5kIjsKLX0K
LQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxM
ZWdlbmRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17
Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5n
IEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNl
dEFsaWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWdu
QXR0ciwgdmFsdWUpOwotfQotCi1FbGVtZW50SW1wbCAqSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpm
b3JtRWxlbWVudCgpCi17Ci0gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGZpZWxkc2V0IGJlbG9u
Z2luZyB0byB0aGlzIGxlZ2VuZC4KLSAgICBOb2RlSW1wbCAqZmllbGRzZXQgPSBwYXJlbnROb2Rl
KCk7Ci0gICAgd2hpbGUgKGZpZWxkc2V0ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNl
dFRhZykpCi0gICAgICAgIGZpZWxkc2V0ID0gZmllbGRzZXQtPnBhcmVudE5vZGUoKTsKLSAgICBp
ZiAoIWZpZWxkc2V0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgZmlyc3QgZm9y
bSBlbGVtZW50IGluc2lkZSB0aGUgZmllbGRzZXQuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBj
YXJlIGFib3V0IHRhYmluZGV4PwotICAgIE5vZGVJbXBsICpub2RlID0gZmllbGRzZXQ7Ci0gICAg
d2hpbGUgKChub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShmaWVsZHNldCkpKSB7Ci0gICAg
ICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50
SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAg
ICAgICAgICAgIGlmICghZWxlbWVudC0+aGFzTG9jYWxOYW1lKGxlZ2VuZFRhZykgJiYgZWxlbWVu
dC0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVu
dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9
IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRN
TExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50
KQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAg
ICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHNlbGVjdFRhZywgZG9jLCBmKSwgbV9vcHRpb25z
KDApCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxl
Y3RFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKHRhZ05hbWUsIGRvYywgZiksIG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0K
LQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1fb3B0aW9ucyA9
IDA7Ci0gICAgbV9tdWx0aXBsZSA9IGZhbHNlOwotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFs
c2U7Ci0gICAgLy8gMCBtZWFucyBpbnZhbGlkIChpLmUuIG5vdCBzZXQpCi0gICAgbV9zaXplID0g
MDsKLSAgICBtX21pbndpZHRoID0gMDsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp+SFRN
TFNlbGVjdEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1l
bnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotICAgIGlmIChtX29wdGlvbnMp
IHsKLSAgICAgICAgbV9vcHRpb25zLT5kZXRhY2goKTsKLSAgICAgICAgbV9vcHRpb25zLT5kZXJl
ZigpOwotICAgIH0KLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNoZWNrRFREKGNv
bnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5v
ZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNU
YWdOYW1lKG9wdGdyb3VwVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShoclRhZykgfHwKLSAg
ICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotdm9pZCBIVE1M
U2VsZWN0RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAg
aWYgKGhhc0NoYW5nZWRDaGlsZCgpICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0
PGtodG1sOjpSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUp
OwotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSgg
Y2ggKTsKLX0KLQotCi1ET01TdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp0eXBlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gKG1fbXVsdGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxl
Y3Qtb25lIik7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNlbGVjdGVkSW5kZXgo
KSBjb25zdAotewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24g
c2VsZWN0ZWQKLSAgICB1aW50IG8gPSAwOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwg
aXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkgewotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVt
ZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
bzsKLSAgICAgICAgICAgIG8rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBRX0FTU0VSVChtX211
bHRpcGxlKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjpzZXRTZWxlY3RlZEluZGV4KCBpbnQgIGluZGV4ICkKLXsKLSAgICAvLyBkZXNlbGVjdCBhbGwg
b3RoZXIgb3B0aW9ucyBhbmQgc2VsZWN0IG9ubHkgdGhlIG5ldyBvbmUKLSAgICBRTWVtQXJyYXk8
SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpbnQgbGlzdEluZGV4
OwotICAgIGZvciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4IDwgaW50KGl0ZW1zLnNpemUoKSk7
IGxpc3RJbmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5h
bWUob3B0aW9uVGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgfQotICAg
IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsKLSAgICBpZiAobGlzdEluZGV4
ID49IDApCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1z
W2xpc3RJbmRleF0pLT5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7
Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAg
aW50IGxlbiA9IDA7Ci0gICAgdWludCBpOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQot
ICAgICAgICAgICAgbGVuKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjphZGQoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVs
ZW1lbnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgUmVmUHRyPEhU
TUxFbGVtZW50SW1wbD4gcHJvdGVjdE5ld0NoaWxkKGVsZW1lbnQpOyAvLyBtYWtlIHN1cmUgdGhl
IGVsZW1lbnQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAg
aWYgKCFlbGVtZW50IHx8ICEoZWxlbWVudC0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgfHwgZWxl
bWVudC0+aGFzTG9jYWxOYW1lKGhyVGFnKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGluc2Vy
dEJlZm9yZShlbGVtZW50LCBiZWZvcmUsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXhjZXB0
aW9uY29kZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpyZW1vdmUoIGludCBpbmRleCApCi17Ci0gICAgaW50IGV4Y2VwdGlv
bmNvZGUgPSAwOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7
Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsK
LSAgICBpZihsaXN0SW5kZXggPCAwIHx8IGluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAg
ICAgICByZXR1cm47IC8vICMjIyB3aGF0IHNob3VsZCB3ZSBkbyA/IHJlbW92ZSB0aGUgbGFzdCBp
dGVtPwotCi0gICAgTm9kZUltcGwgKml0ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgIGl0ZW0t
PnJlZigpOwotICAgIHJlbW92ZUNoaWxkKGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOwotICAgIGl0ZW0t
PmRlcmVmKCk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlz
dEl0ZW1zKCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkK
LXsKLSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0g
bGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0g
ICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nh
c3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ld
KS0+dmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIERPTVN0cmluZygiIik7Ci19Ci0KLXZvaWQg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIGZpbmQg
dGhlIG9wdGlvbiB3aXRoIHZhbHVlKCkgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcgotICAg
IC8vIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9j
YWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4o
aXRlbXNbaV0pLT52YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxI
VE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNldFNlbGVjdGVkKHRydWUpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpzdGF0ZSgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1z
ID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0KLSAgICBRQ2hh
ciBzdGF0ZUNoYXJzW2xdOwotICAgIAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspCi0g
ICAgICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAg
ICAgICBzdGF0ZUNoYXJzW2ldID0gJ1gnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0
ZUNoYXJzW2ldID0gJy4nOwotICAgIFFTdHJpbmcgc3RhdGUoc3RhdGVDaGFycywgbCk7Ci0KLSAg
ICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyBzdGF0ZTsKLX0K
LQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAm
X3N0YXRlcykKLXsKLSAgICBRU3RyaW5nIF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShfc3RhdGVzKTsKLSAgICBpZiAoX3N0YXRlLmlzTnVsbCgp
KSByZXR1cm47Ci0KLSAgICByZWNhbGNMaXN0SXRlbXMoKTsKLQotICAgIFFTdHJpbmcgc3RhdGUg
PSBfc3RhdGU7Ci0gICAgaWYoIXN0YXRlLmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gn
KSAmJiAhbV9tdWx0aXBsZSkgewotICAgICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4g
aW4gcmVzdG9yZVN0YXRlISIpOwotICAgICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0
IHRoaXMgb3BlcmF0aW9uLiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgotICAgICAgICAv
L3N0YXRlWzBdID0gJ1gnOwotICAgIH0KLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotCi0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAg
IGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwq
IG9lID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAg
ICAgICAgICAgb2UtPnNldFNlbGVjdGVkKHN0YXRlW2ldID09ICdYJyk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVm
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQs
IGV4Y2VwdGlvbmNvZGUgKTsKLSAgICBpZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJl
Y2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1M
U2VsZWN0RWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9k
ZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpy
ZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxk
LG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAg
ICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2Rl
SW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25j
b2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2Vw
dGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICBzZXRDaGFuZ2Vk
KHRydWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBzZXRSZWNhbGNM
aXN0SXRlbXMoKTsKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENo
aWxkKG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSBrTWF4KGF0dHItPnZhbHVl
KCkudG9JbnQoKSwgMSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRy
KSB7Ci0gICAgICAgIG1fbWlud2lkdGggPSBrTWF4KCBhdHRyLT52YWx1ZSgpLnRvSW50KCksIDAg
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpIHsKLSAgICAg
ICAgbV9tdWx0aXBsZSA9ICghYXR0ci0+aXNOdWxsKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3Ig
dGhlIG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2
ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdl
RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJl
bmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2VsZWN0
KHRoaXMpOwotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEo
Rm9ybURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICBib29sIHN1Y2Nlc3Nm
dWwgPSBmYWxzZTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0
SXRlbXMoKTsKLQotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgp
OyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkg
ewotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBpZiAob3B0
aW9uLT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5k
RGF0YShuYW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1
bCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAjIyMg
dGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuLiBtYWtlIHN1cmUgdGhhdCB3ZSBzZWxlY3QgdGhl
IGZpcnN0IG9wdGlvbgotICAgIC8vIGluIGFueSBjYXNlLiBvdGhlcndpc2Ugd2UgaGF2ZSBubyBj
b25zaXN0ZW5jeSB3aXRoIHRoZSBET00gaW50ZXJmYWNlLiBGSVhNRSEKLSAgICAvLyB3ZSByZXR1
cm4gdGhlIGZpcnN0IG9uZSBpZiBpdCB3YXMgYSBjb21ib2JveCBzZWxlY3QKLSAgICBpZiAoIXN1
Y2Nlc3NmdWwgJiYgIW1fbXVsdGlwbGUgJiYgbV9zaXplIDw9IDEgJiYgaXRlbXMuc2l6ZSgpICYm
Ci0gICAgICAgIChpdGVtc1swXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpKSB7Ci0gICAgICAg
IEhUTUxPcHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVs
ZW1lbnRJbXBsKj4oaXRlbXNbMF0pOwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVs
bCgpKQotICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlv
bi0+dGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVl
KCkpOwotICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3Vj
Y2Vzc2Z1bDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5k
ZXgoaW50IG9wdGlvbkluZGV4KSBjb25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudElt
cGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0
aW9uSW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAg
IGludCBsaXN0SW5kZXggPSAwOwotICAgIGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAo
OwotICAgICAgICAgb3B0aW9uSW5kZXgyIDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5k
ZXgyIDw9IG9wdGlvbkluZGV4OwotICAgICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlw
byEKLSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcp
KQotICAgICAgICAgICAgb3B0aW9uSW5kZXgyKys7Ci0gICAgfQotICAgIGxpc3RJbmRleC0tOwot
ICAgIHJldHVybiBsaXN0SW5kZXg7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxp
c3RUb09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhU
TUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8
IDAgfHwgbGlzdEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1ts
aXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwot
Ci0gICAgaW50IG9wdGlvbkluZGV4ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3Qg
Y291bnRpbmcgT1BUR1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgaW50IGk7
Ci0gICAgZm9yIChpID0gMDsgaSA8IGxpc3RJbmRleDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNb
aV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsK
LSAgICByZXR1cm4gb3B0aW9uSW5kZXg7Ci19Ci0KLS8vIEZJWE1FIDQxOTc5OTc6IHRoaXMgbWV0
aG9kIGlzIHVzZWQgYnkgdGhlIHB1YmxpYyBBUEkgLVtET01IVE1MU2VsZWN0RWxlbWVudCBvcHRp
b25zXSwgYnV0IGFsd2F5cyByZXR1cm5zCi0vLyBhbiBlbXB0eSBsaXN0LgotSFRNTE9wdGlvbnND
b2xsZWN0aW9uSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zKCkKLXsKLSAgICBp
ZiAoIW1fb3B0aW9ucykgewotICAgICAgICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbCh0aGlzKTsKLSAgICAgICAgbV9vcHRpb25zLT5yZWYoKTsKLSAgICB9Ci0gICAg
cmV0dXJuIG1fb3B0aW9uczsKLX0KLQotLy8gRklYTUU6IERlbGV0ZSBvbmNlIHRoZSBhYm92ZSBm
dW5jdGlvbiBpcyB3b3JraW5nIHdlbGwgZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4KLVJlZlB0cjxI
VE1MQ29sbGVjdGlvbkltcGw+IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uc0hUTUxDb2xs
ZWN0aW9uKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhU
TUxDb2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OlNFTEVDVF9PUFRJT05T
KSk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNMaXN0SXRlbXMoKQot
ewotICAgIE5vZGVJbXBsKiBjdXJyZW50ID0gZmlyc3RDaGlsZCgpOwotICAgIG1fbGlzdEl0ZW1z
LnJlc2l6ZSgwKTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIGZvdW5kU2VsZWN0ZWQgPSAw
OwotICAgIHdoaWxlKGN1cnJlbnQpIHsKLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUo
b3B0Z3JvdXBUYWcpICYmIGN1cnJlbnQtPmZpcnN0Q2hpbGQoKSkgewotICAgICAgICAgICAgLy8g
IyMjIHdoYXQgaWYgb3B0Z3JvdXAgY29udGFpbnMganVzdCBjb21tZW50cz8gZG9uJ3Qgd2FudCBv
bmUgb2Ygbm8gb3B0aW9ucyBpbiBpdC4uLgotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXpl
KG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0
ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwot
ICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAg
ICBtX2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAg
bV9saXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1l
bnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgIW1f
bXVsdGlwbGUgJiYgbV9zaXplIDw9IDEpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVk
ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAg
ICAgICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBlbHNlIGlmIChmb3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7
Ci0gICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAg
ICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAo
Y3VycmVudC0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJl
c2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xp
c3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50
KTsKLSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCAqcGFyZW50ID0gY3VycmVudC0+cGFyZW50
Tm9kZSgpOwotICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAg
ICAgaWYgKCFjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMpCi0gICAg
ICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQo
KTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygp
Ci17Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAg
ICAgICAgc3RhdGljX2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0
aW9uc0NoYW5nZWQodHJ1ZSk7Ci0gICAgc2V0Q2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwg
aXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkgewotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24g
PSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAg
ICAgICBib29sIHNlbGVjdGVkID0gKCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIp
LmlzTnVsbCgpKTsKLSAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIGlmICggbV9yZW5kZXIgKQotICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0g
ICAgc2V0Q2hhbmdlZCggdHJ1ZSApOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6
bm90aWZ5T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlv
biwgYm9vbCBzZWxlY3RlZCkKLXsKLSAgICBpZiAoc2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUpIHsK
LSAgICAgICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKLSAgICAgICAgUU1lbUFycmF5
PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgICAgIHVpbnQgaTsK
LSAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAg
ICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+bV9zZWxlY3Rl
ZCA9IChpdGVtc1tpXSA9PSBzZWxlY3RlZE9wdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAg
aWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRl
ciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVu
dEltcGwgKmV2dCkKLXsKLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2Vu
ZGluZyBzaW11bGF0ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRo
ZSBwcm9wZXIgc2VuZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5
cGUoKSA9PSBrZXlwcmVzc0V2ZW50KSB7Ci0gICAgCi0gICAgICAgIGlmICghbV9mb3JtIHx8ICFt
X3JlbmRlciB8fCAhZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgCi0gICAgICAgIERPTVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2
ZW50SW1wbCAqPihldnQpLT5rZXlJZGVudGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAo
a2V5ID09ICJFbnRlciIpIHsKLSAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAg
ICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAg
ICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2Vu
ZFRvQW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6c2V0TXVsdGlwbGUoYm9vbCBtdWx0aXBsZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
bXVsdGlwbGVBdHRyLCBtdWx0aXBsZSA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsOjpzZXRTaXplKGludCBzaXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0
ciwgUVN0cmluZzo6bnVtYmVyKHNpemUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1I
VE1MS2V5Z2VuRWxlbWVudEltcGw6OkhUTUxLZXlnZW5FbGVtZW50SW1wbChEb2N1bWVudEltcGwq
IGRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCogZikKLSAgICA6IEhUTUxTZWxlY3RFbGVtZW50SW1w
bChrZXlnZW5UYWcsIGRvYywgZikKLXsKLSAgICBRU3RyaW5nTGlzdCBrZXlzID0gS1NTTEtleUdl
bjo6c3VwcG9ydGVkS2V5U2l6ZXMoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBp
ID0ga2V5cy5iZWdpbigpOyBpICE9IGtleXMuZW5kKCk7ICsraSkgewotICAgICAgICBIVE1MT3B0
aW9uRWxlbWVudEltcGwqIG8gPSBuZXcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKGRvYywgZm9ybSgp
KTsKLSAgICAgICAgYWRkQ2hpbGQobyk7Ci0gICAgICAgIG8tPmFkZENoaWxkKG5ldyBUZXh0SW1w
bChkb2MsIERPTVN0cmluZygqaSkpKTsKLSAgICB9Ci19CisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MU2VsZWN0
RWxlbWVudEltcGwuaCIKIAotRE9NU3RyaW5nIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6dHlwZSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuICJrZXlnZW4iOwotfQorI2luY2x1ZGUgInJlbmRlcmluZy9y
ZW5kZXJfZm9ybS5oIgogCi12b2lkIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFt
ZSgpID09IGNoYWxsZW5nZUF0dHIpCi0gICAgICAgIG1fY2hhbGxlbmdlID0gYXR0ci0+dmFsdWUo
KTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0ga2V5dHlwZUF0dHIpCi0gICAgICAgIG1f
a2V5VHlwZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBza2lwIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbCBwYXJzaW5nIQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Cit1c2luZyBuYW1lc3BhY2Uga2h0
bWw7CiAKLWJvb2wgSFRNTEtleWdlbkVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0
YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIC8vIE9ubHkgUlNBIGlzIHN1cHBv
cnRlZCBhdCB0aGlzIHRpbWUuCi0gICAgaWYgKCFtX2tleVR5cGUuaXNOdWxsKCkgJiYgIWVxdWFs
SWdub3JpbmdDYXNlKG1fa2V5VHlwZSwgInJzYSIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgUVN0cmluZyB2YWx1ZSA9IEtTU0xLZXlHZW46OnNpZ25lZFB1YmxpY0tleUFuZENoYWxsZW5n
ZVN0cmluZyhzZWxlY3RlZEluZGV4KCksIG1fY2hhbGxlbmdlLnFzdHJpbmcoKSwgZ2V0RG9jdW1l
bnQoKS0+ZnJhbWUoKS0+YmFzZVVSTCgpKTsKLSAgICBpZiAodmFsdWUuaXNOdWxsKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwg
dmFsdWUudXRmOCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KK25hbWVzcGFjZSBET00gewogCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCiBIVE1MT3B0
R3JvdXBFbGVtZW50SW1wbDo6SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpk
b2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCiAgICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbChvcHRncm91cFRhZywgZG9jLCBmKQpAQCAtMzA4Nyw0ODIgKzExOCw1IEBAIHZvaWQgSFRN
TE9wdEdyb3VwRWxlbWVudEltcGw6OnNldExhYmVsKGMKIHsKICAgICBzZXRBdHRyaWJ1dGUobGFi
ZWxBdHRyLCB2YWx1ZSk7CiB9Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTE9wdGlvbkVs
ZW1lbnRJbXBsOjpIVE1MT3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChvcHRp
b25UYWcsIGRvYywgZikKLXsKLSAgICBtX3NlbGVjdGVkID0gZmFsc2U7Ci19Ci0KLWJvb2wgSFRN
TE9wdGlvbkVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gIm9wdGlvbiI7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVu
dEltcGw6OnRleHQoKSBjb25zdAotewotICAgIERPTVN0cmluZyB0ZXh0OwotCi0gICAgLy8gV2lu
SUUgZG9lcyBub3QgdXNlIHRoZSBsYWJlbCBhdHRyaWJ1dGUsIHNvIGFzIGEgcXVpcmssIHdlIGln
bm9yZSBpdC4KLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSAmJiAhZ2V0RG9jdW1lbnQoKS0+aW5Db21w
YXRNb2RlKCkpIHsKLSAgICAgICAgRE9NU3RyaW5nIHRleHQgPSBnZXRBdHRyaWJ1dGUobGFiZWxB
dHRyKTsKLSAgICAgICAgaWYgKCF0ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0
ZXh0OwotICAgIH0KLQotICAgIGNvbnN0IE5vZGVJbXBsICpuID0gdGhpcy0+Zmlyc3RDaGlsZCgp
OwotICAgIHdoaWxlIChuKSB7Ci0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IE5vZGU6OlRF
WFRfTk9ERSB8fCBuLT5ub2RlVHlwZSgpID09IE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERSkKLSAg
ICAgICAgICAgIHRleHQgKz0gbi0+bm9kZVZhbHVlKCk7Ci0gICAgICAgIC8vIHNraXAgc2NyaXB0
IGNvbnRlbnQKLSAgICAgICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSAmJiBuLT5oYXNUYWdOYW1l
KEhUTUxOYW1lczo6c2NyaXB0VGFnKSkKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHRT
aWJsaW5nKHRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuID0gbi0+dHJhdmVyc2VO
ZXh0Tm9kZSh0aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGV4dDsKLX0KLQotdm9pZCBIVE1M
T3B0aW9uRWxlbWVudEltcGw6OnNldFRleHQoY29uc3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4
Y2VwdGlvbikKLXsKLSAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugd2hlcmUg
dGhlcmUncyBleGFjdGx5IDEgY2hpbGQgbm9kZSwgYW5kIGl0J3MgYSB0ZXh0IG5vZGUuCi0gICAg
Tm9kZUltcGwgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+
aXNUZXh0Tm9kZSgpICYmICFjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBzdGF0aWNf
Y2FzdDxUZXh0SW1wbCAqPihjaGlsZCktPnNldERhdGEodGV4dCwgZXhjZXB0aW9uKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgYXBwZW5kQ2hp
bGQobmV3IFRleHRJbXBsKGdldERvY3VtZW50KCksIHRleHQpLCBleGNlcHRpb24pOwotfQotCi1p
bnQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjppbmRleCgpIGNvbnN0Ci17Ci0gICAgLy8gTGV0J3Mg
ZG8gdGhpcyBkeW5hbWljYWxseS4gTWlnaHQgYmUgYSBiaXQgc2xvdywgYnV0IHdlJ3JlIHN1cmUK
LSAgICAvLyB3ZSB3b24ndCBmb3JnZXQgdG8gdXBkYXRlIGEgbWVtYmVyIHZhcmlhYmxlIGluIHNv
bWUgY2FzZXMuLi4KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVj
dCgpOwotICAgIGlmIChzZWxlY3QpIHsKLSAgICAgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1w
bCo+IGl0ZW1zID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKLSAgICAgICAgaW50IGwgPSBpdGVtcy5j
b3VudCgpOwotICAgICAgICBpbnQgb3B0aW9uSW5kZXggPSAwOwotICAgICAgICBmb3IoaW50IGkg
PSAwOyBpIDwgbDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRp
b25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gb3B0aW9uSW5kZXg7Ci0gICAgICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1M
T3B0aW9uRWxlbWVudEltcGw6OnNldEluZGV4KGludCwgaW50ICZleGNlcHRpb24pCi17Ci0gICAg
ZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0g
ICAgLy8gIyMjCi19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1l
KCkgPT0gc2VsZWN0ZWRBdHRyKQotICAgICAgICBtX3NlbGVjdGVkID0gKCFhdHRyLT5pc051bGwo
KSk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikKLSAgICAgICAgbV92
YWx1ZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLURPTVN0cmluZyBI
VE1MT3B0aW9uRWxlbWVudEltcGw6OnZhbHVlKCkgY29uc3QKLXsKLSAgICBpZiAoICFtX3ZhbHVl
LmlzTnVsbCgpICkKLSAgICAgICAgcmV0dXJuIG1fdmFsdWU7Ci0gICAgLy8gVXNlIHRoZSB0ZXh0
IGlmIHRoZSB2YWx1ZSB3YXNuJ3Qgc2V0LgotICAgIHJldHVybiB0ZXh0KCkucXN0cmluZygpLnN0
cmlwV2hpdGVTcGFjZSgpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0VmFs
dWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRy
LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRTZWxlY3RlZChi
b29sIF9zZWxlY3RlZCkKLXsKLSAgICBpZihtX3NlbGVjdGVkID09IF9zZWxlY3RlZCkKLSAgICAg
ICAgcmV0dXJuOwotICAgIG1fc2VsZWN0ZWQgPSBfc2VsZWN0ZWQ7Ci0gICAgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAg
ICBzZWxlY3QtPm5vdGlmeU9wdGlvblNlbGVjdGVkKHRoaXMsX3NlbGVjdGVkKTsKLX0KLQotdm9p
ZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICBIVE1MU2Vs
ZWN0RWxlbWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgaWYgKHNlbGVjdCkKLSAg
ICAgICBzZWxlY3QtPmNoaWxkcmVuQ2hhbmdlZCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudElt
cGwgKkhUTUxPcHRpb25FbGVtZW50SW1wbDo6Z2V0U2VsZWN0KCkgY29uc3QKLXsKLSAgICBOb2Rl
SW1wbCAqc2VsZWN0ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVj
dC0+aGFzVGFnTmFtZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVu
dE5vZGUoKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnRJbXBsKj4o
c2VsZWN0KTsKLX0KLQotYm9vbCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmRlZmF1bHRTZWxlY3Rl
ZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFnZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyKS5pc051
bGwoKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldERlZmF1bHRTZWxlY3Rl
ZChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0ciwgYiA/ICIiIDogMCk7
Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmxhYmVsKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxhYmVsQXR0cik7Ci19Ci0KLXZvaWQgSFRNTE9wdGlv
bkVsZW1lbnRJbXBsOjpzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZShsYWJlbEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1IVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6SFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1l
bnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbCh0ZXh0YXJlYVRhZywgZG9jLCBmKSwgbV92YWx1ZUlzVmFsaWQoZmFsc2Up
LCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyKGZhbHNlKQotewotICAgIC8vIERURCByZXF1aXJlcyBy
b3dzICYgY29scyBiZSBzcGVjaWZpZWQsIGJ1dCB3ZSB3aWxsIHByb3ZpZGUgcmVhc29uYWJsZSBk
ZWZhdWx0cwotICAgIG1fcm93cyA9IDI7Ci0gICAgbV9jb2xzID0gMjA7Ci0gICAgbV93cmFwID0g
dGFfVmlydHVhbDsKLX0KLQotSFRNTFRleHRBcmVhRWxlbWVudEltcGw6On5IVE1MVGV4dEFyZWFF
bGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRl
cmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gInRleHRhcmVhIjsKLX0K
LQotUVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICAvLyBN
YWtlIHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0gICAgcmV0dXJuIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOwotfQotCi12
b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0
YXRlcykKLXsKLSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmZpbmRNYXRjaGluZ1N0YXRlKHN0YXRlcyk7Ci0gICAgaWYgKHN0YXRlLmlzTnVsbCgpKSByZXR1
cm47Ci0gICAgc2V0RGVmYXVsdFZhbHVlKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpOwot
ICAgIC8vIHRoZSBjbG9zZSgpIGluIHRoZSByZW5kZXJ0cmVlIHdpbGwgdGFrZSBjYXJlIG9mIHRy
YW5zZmVycmluZyBkZWZhdWx0dmFsdWUgdG8gJ3ZhbHVlJwotfQotCi1pbnQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVj
dGlvblN0YXJ0KCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6c2VsZWN0aW9uRW5kKCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvbkVuZCgp
OwotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRT
ZWxlY3Rpb25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBz
dGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0
KHN0YXJ0KTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9u
RW5kKGludCBlbmQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotfQotCi12
b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZWxlY3QoICApCi17Ci0gICAgaWYgKG1fcmVu
ZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KG1fcmVuZGVyKS0+c2Vs
ZWN0KCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJh
bmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uo
c3RhcnQsIGVuZCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNoaWxkcmVu
Q2hhbmdlZCgpCi17Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwotfQotICAgIAotdm9p
ZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0
cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHJvd3NBdHRyKSB7
Ci0gICAgICAgIG1fcm93cyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQo
KSA6IDM7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+
c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBjb2xzQXR0cikgewotICAgICAgICBtX2NvbHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBh
dHRyLT52YWx1ZSgpLnRvSW50KCkgOiA2MDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAg
ICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdyYXBBdHRyKSB7Ci0gICAgICAgIC8vIHZpcnR1
YWwgLyBwaHlzaWNhbCBpcyBOZXRzY2FwZSBleHRlbnNpb24gb2YgSFRNTCAzLjAsIG5vdyBkZXBy
ZWNhdGVkCi0gICAgICAgIC8vIHNvZnQvIGhhcmQgLyBvZmYgaXMgcmVjb21tZW5kYXRpb24gZm9y
IEhUTUwgNCBleHRlbnNpb24gYnkgSUUgYW5kIE5TIDQKLSAgICAgICAgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKGF0dHItPnZhbHVlKCksICJ2aXJ0dWFsIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYXR0
ci0+dmFsdWUoKSwgInNvZnQiKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1ZpcnR1YWw7Ci0g
ICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJwaHlzaWNh
bCIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJoYXJkIikpCi0gICAgICAg
ICAgICBtX3dyYXAgPSB0YV9QaHlzaWNhbDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9uIiApKQotICAgICAgICAgICAgbV93cmFwID0gdGFfUGh5
c2ljYWw7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCks
ICJvZmYiKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX05vV3JhcDsKLSAgICAgICAgaWYgKHJl
bmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZE1pbk1h
eFJlY2FsYygpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIp
IHsKLSAgICAgICAgLy8gaWdub3JlIGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIo
Zm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVy
QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBz
ZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3Rl
bmVyKGNoYW5nZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1SZW5kZXJP
YmplY3QgKkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVu
YSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkg
UmVuZGVyVGV4dEFyZWEodGhpcyk7Ci19Ci0KLWJvb2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6
OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RpbmcsIGJvb2wpCi17Ci0gICAgaWYg
KG5hbWUoKS5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGluZy5hcHBlbmREYXRh
KG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRB
cmVhRWxlbWVudEltcGw6OnJlc2V0KCkKLXsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUoKSk7
Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnVwZGF0ZVZhbHVlKCkKLXsKLSAg
ICBpZiAoICFtX3ZhbHVlSXNWYWxpZCApIHsKLSAgICAgICAgaWYgKCBtX3JlbmRlciApIHsKLSAg
ICAgICAgICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KCBtX3JlbmRl
ciApLT50ZXh0KCkucXN0cmluZygpOwotICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJl
ciA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gZGVmYXVs
dFZhbHVlKCkucXN0cmluZygpOwotICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9
IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1fdmFsdWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICB9
Ci19Ci0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dmFsdWUoKQotewotICAg
IHVwZGF0ZVZhbHVlKCk7Ci0gICAgcmV0dXJuIG1fdmFsdWUuaXNOdWxsKCkgPyBET01TdHJpbmco
IiIpIDogbV92YWx1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0VmFs
dWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWUucXN0cmlu
ZygpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3ZhbHVlSXNW
YWxpZCA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRl
RnJvbUVsZW1lbnQoKTsKLSAgICAvLyBGSVhNRTogRm9yY2UgcmVsb2FkIGZyb20gcmVuZGVyZXIs
IGFzIHJlbmRlcmVyIG1heSBoYXZlIG5vcm1hbGl6ZWQgbGluZSBlbmRpbmdzLgotICAgIG1fdmFs
dWVJc1ZhbGlkID0gZmFsc2U7Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotCi1ET01TdHJp
bmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpCi17Ci0gICAgRE9NU3Ry
aW5nIHZhbCA9ICIiOwotICAgIC8vIHRoZXJlIG1heSBiZSBjb21tZW50cyAtIGp1c3QgZ3JhYiB0
aGUgdGV4dCBub2RlcwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQo
KTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlmIChuLT5pc1RleHROb2RlKCkp
Ci0gICAgICAgICAgICB2YWwgKz0gc3RhdGljX2Nhc3Q8VGV4dEltcGwqPihuKS0+ZGF0YSgpOwot
ICAgIAotICAgIGlmICh2YWxbMF0gPT0gJ1xyJyAmJiB2YWxbMV0gPT0gJ1xuJykgewotICAgICAg
ICB2YWwgPSB2YWwuY29weSgpOwotICAgICAgICB2YWwucmVtb3ZlKDAsMik7Ci0gICAgfSBlbHNl
IGlmICh2YWxbMF0gPT0gJ1xyJyB8fCB2YWxbMF0gPT0gJ1xuJykgewotICAgICAgICB2YWwgPSB2
YWwuY29weSgpOwotICAgICAgICB2YWwucmVtb3ZlKDAsMSk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IHZhbDsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0RGVmYXVsdFZhbHVl
KGNvbnN0IERPTVN0cmluZyAmZGVmYXVsdFZhbHVlKQotewotICAgIC8vIHRoZXJlIG1heSBiZSBj
b21tZW50cyAtIHJlbW92ZSBhbGwgdGhlIHRleHQgbm9kZXMgYW5kIHJlcGxhY2UgdGhlbSB3aXRo
IG9uZQotICAgIFFQdHJMaXN0PE5vZGVJbXBsPiB0b1JlbW92ZTsKLSAgICBOb2RlSW1wbCAqbjsK
LSAgICBmb3IgKG4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQotICAg
ICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKG4p
OwotICAgIFFQdHJMaXN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0KHRvUmVtb3ZlKTsKLSAgICBpbnQg
ZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkgewotICAg
ICAgICBOb2RlSW1wbCAqbiA9IGl0LmN1cnJlbnQoKTsKLSAgICAgICAgbi0+cmVmKCk7Ci0gICAg
ICAgIHJlbW92ZUNoaWxkKG4sIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICBuLT5kZXJlZigpOwot
ICAgIH0KLSAgICBpbnNlcnRCZWZvcmUoZ2V0RG9jdW1lbnQoKS0+Y3JlYXRlVGV4dE5vZGUoZGVm
YXVsdFZhbHVlKSxmaXJzdENoaWxkKCksIGV4Y2VwdGlvbmNvZGUpOwotICAgIHNldFZhbHVlKGRl
ZmF1bHRWYWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmlzRWRpdGFi
bGUoKQotewotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGZvY3Vz
KCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAg
bV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjph
dHRhY2goKTsKLSAgICB1cGRhdGVWYWx1ZSgpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpkZXRhY2goKQotewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRh
Y2goKTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjpzZXRDb2xzKGludCBjb2xzKQotewotICAgIHNldEF0dHJpYnV0ZShjb2xz
QXR0ciwgUVN0cmluZzo6bnVtYmVyKGNvbHMpKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6c2V0Um93cyhpbnQgcm93cykKLXsKLSAgICBzZXRBdHRyaWJ1dGUocm93c0F0dHIs
IFFTdHJpbmc6Om51bWJlcihyb3dzKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRN
TElzSW5kZXhFbGVtZW50SW1wbDo6SFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxJbnB1dEVsZW1lbnRJbXBs
KGlzaW5kZXhUYWcsIGRvYywgZikKLXsKLSAgICBtX3R5cGUgPSBURVhUOwotICAgIG1fbmFtZSA9
ICJpc2luZGV4IjsKLX0KLQotdm9pZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsKiBhdHRyKQotewotICAgIGlmIChhdHRyLT5u
YW1lKCkgPT0gcHJvbXB0QXR0cikKLQlzZXRWYWx1ZShhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNl
Ci0gICAgICAgIC8vIGRvbid0IGNhbGwgSFRNTElucHV0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUgaGVyZSwgYXMgaXQgd291bGQKLSAgICAgICAgLy8gYWNjZXB0IGF0dHJpYnV0ZXMgdGhp
cyBlbGVtZW50IGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElz
SW5kZXhFbGVtZW50SW1wbDo6cHJvbXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKHByb21wdEF0dHIpOwotfQotCi12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnNldFBy
b21wdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShwcm9tcHRB
dHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdW5zaWduZWQgSFRNTE9w
dGlvbnNDb2xsZWN0aW9uSW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGlt
cGxlbWVudGVkLgotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25zQ29sbGVjdGlv
bkltcGw6OnNldExlbmd0aCh1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgLy8gTm90IHlldCBpbXBs
ZW1lbnRlZC4KLX0KLQotTm9kZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Oml0ZW0o
dW5zaWduZWQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAg
ICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Om5h
bWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBp
bXBsZW1lbnRlZC4KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1G
b3JtRGF0YUxpc3Q6OkZvcm1EYXRhTGlzdChRVGV4dENvZGVjICpjKQotICAgIDogbV9jb2RlYyhj
KQotewotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0IFFDU3RyaW5n
ICZzKQotewotICAgIG1fbGlzdC5hcHBlbmQocyk7Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0Ojph
cHBlbmRTdHJpbmcoY29uc3QgUVN0cmluZyAmcykKLXsKLSAgICBRQ1N0cmluZyBjc3RyID0gZml4
TGluZUJyZWFrcyhtX2NvZGVjLT5mcm9tVW5pY29kZShzLCB0cnVlKSk7Ci0gICAgY3N0ci50cnVu
Y2F0ZShjc3RyLmxlbmd0aCgpKTsKLSAgICBtX2xpc3QuYXBwZW5kKGNzdHIpOwotfQotCi12b2lk
IEZvcm1EYXRhTGlzdDo6YXBwZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9N
U3RyaW5nICZmaWxlbmFtZSkKLXsKLSAgICBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7Ci0g
ICAgbV9saXN0LmFwcGVuZChmaWxlbmFtZS5xc3RyaW5nKCkpOwotfQotCisgCiB9IC8vIG5hbWVz
cGFjZQpJbmRleDoga2h0bWwvaHRtbC9IVE1MQnV0dG9uRWxlbWVudEltcGwuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBraHRtbC9odG1sL0hUTUxCdXR0b25FbGVtZW50SW1wbC5oCShyZXZpc2lvbiAxMTk3NikK
KysrIGtodG1sL2h0bWwvSFRNTEJ1dHRvbkVsZW1lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2Rl
Lm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2Rl
Lm9yZykKICAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9y
ZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJp
Z2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKQEAgLTIyLDIxMyArMjIsMTMgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywg
VVNBLgogICoKICAqLwotI2lmbmRlZiBIVE1MX0ZPUk1JTVBMX0gKLSNkZWZpbmUgSFRNTF9GT1JN
SU1QTF9ICisjaWZuZGVmIEhUTUxfSFRNTEJ1dHRvbkVsZW1lbnRJbXBsX0gKKyNkZWZpbmUgSFRN
TF9IVE1MQnV0dG9uRWxlbWVudEltcGxfSAogCi0jaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRp
bXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX21pc2NpbXBsLmgiCi0KLSNpbmNsdWRlIDxxcHRy
dmVjdG9yLmg+Ci0jaW5jbHVkZSA8cW1lbWFycmF5Lmg+Ci0jaW5jbHVkZSA8a3htbGNvcmUvSGFz
aE1hcC5oPgotCi1jbGFzcyBLSFRNTFZpZXc7Ci1jbGFzcyBRVGV4dENvZGVjOwotCi1uYW1lc3Bh
Y2Uga2h0bWwKLXsKLSAgICBjbGFzcyBGb3JtRGF0YTsKLSAgICBjbGFzcyBSZW5kZXJGb3JtRWxl
bWVudDsKLSAgICBjbGFzcyBSZW5kZXJUZXh0QXJlYTsKLSAgICBjbGFzcyBSZW5kZXJTZWxlY3Q7
Ci0gICAgY2xhc3MgUmVuZGVyTGluZUVkaXQ7Ci0gICAgY2xhc3MgUmVuZGVyRmlsZUJ1dHRvbjsK
LSAgICBjbGFzcyBSZW5kZXJTbGlkZXI7Ci19CisjaW5jbHVkZSAiSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwuaCIKIAogbmFtZXNwYWNlIERPTSB7CiAKLWNsYXNzIERPTVN0cmluZzsKLWNsYXNz
IEZvcm1EYXRhTGlzdDsKLWNsYXNzIEhUTUxGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGw7Ci1jbGFzcyBIVE1M
SW1hZ2VFbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbWFnZUxvYWRlcjsKLWNsYXNzIEhUTUxPcHRp
b25FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw7Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEZvcm1FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1M
RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5IVE1MRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2
aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBU
YWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3Qg
eyByZXR1cm4gMzsgfQotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwg
dm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJv
bURvY3VtZW50KCk7Ci0gCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gZWxlbWVudHMo
KTsKLSAgICBpbnQgbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgZW5jdHlwZSgpIGNv
bnN0IHsgcmV0dXJuIG1fZW5jdHlwZTsgfQotICAgIHZvaWQgc2V0RW5jdHlwZShjb25zdCBET01T
dHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYm91bmRhcnkoKSBjb25zdCB7IHJldHVybiBtX2Jv
dW5kYXJ5OyB9Ci0gICAgdm9pZCBzZXRCb3VuZGFyeShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAg
ICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1w
bCAqYXR0cik7Ci0KLSAgICB2b2lkIHJlZ2lzdGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbCAqKTsKLSAgICB2b2lkIHJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VF
bGVtZW50SW1wbCAqKTsKLSAgICB2b2lkIHJlbW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVu
dEltcGwgKik7Ci0KLSAgICBib29sIHByZXBhcmVTdWJtaXQoKTsKLSAgICB2b2lkIHN1Ym1pdChi
b29sIGFjdGl2YXRlU3VibWl0QnV0dG9uID0gZmFsc2UpOwotICAgIHZvaWQgcmVzZXQoKTsKLQot
ICAgIHZvaWQgc2V0TWFsZm9ybWVkKGJvb2wgbWFsZm9ybWVkKSB7IG1fbWFsZm9ybWVkID0gbWFs
Zm9ybWVkOyB9Ci0gICAgdmlydHVhbCBib29sIGlzTWFsZm9ybWVkKCkgeyByZXR1cm4gbV9tYWxm
b3JtZWQ7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRl
SW1wbCAqYXR0cikgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzdWJtaXRDbGljaygpOwotICAgIGJv
b2wgZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwpOwot
Ci0gICAgRE9NU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgRE9N
U3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2VwdENoYXJzZXQoKSBjb25zdDsKLSAgICB2
b2lkIHNldEFjY2VwdENoYXJzZXQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5n
IGFjdGlvbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWN0aW9uKGNvbnN0IERPTVN0cmluZyAmKTsK
LQotICAgIERPTVN0cmluZyBtZXRob2QoKSBjb25zdDsKLSAgICB2b2lkIHNldE1ldGhvZChjb25z
dCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdGFyZ2V0KCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRUYXJnZXQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgc3RhdGljIHZvaWQgaTE4bkRh
dGEoKTsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci0gICAgZnJpZW5kIGNs
YXNzIEhUTUxGb3JtQ29sbGVjdGlvbkltcGw7Ci0KLSAgICBIVE1MQ29sbGVjdGlvbkltcGw6OkNv
bGxlY3Rpb25JbmZvICpjb2xsZWN0aW9uSW5mbzsKLQotICAgIFFQdHJWZWN0b3I8SFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw+IGZvcm1FbGVtZW50czsKLSAgICBRUHRyVmVjdG9yPEhUTUxJbWFn
ZUVsZW1lbnRJbXBsPiBpbWdFbGVtZW50czsKLSAgICBET01TdHJpbmcgbV91cmw7Ci0gICAgRE9N
U3RyaW5nIG1fdGFyZ2V0OwotICAgIERPTVN0cmluZyBtX2VuY3R5cGU7Ci0gICAgRE9NU3RyaW5n
IG1fYm91bmRhcnk7Ci0gICAgRE9NU3RyaW5nIG1fYWNjZXB0Y2hhcnNldDsKLSAgICBib29sIG1f
cG9zdCA6IDE7Ci0gICAgYm9vbCBtX211bHRpcGFydCA6IDE7Ci0gICAgYm9vbCBtX2F1dG9jb21w
bGV0ZSA6IDE7Ci0gICAgYm9vbCBtX2luc3VibWl0IDogMTsKLSAgICBib29sIG1fZG9pbmdzdWJt
aXQgOiAxOwotICAgIGJvb2wgbV9pbnJlc2V0IDogMTsKLSAgICBib29sIG1fbWFsZm9ybWVkIDog
MTsKLSAgICAKLXByaXZhdGU6Ci0gICAgdm9pZCBwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5n
ICYpOwotICAgIGJvb2wgZm9ybURhdGEoa2h0bWw6OkZvcm1EYXRhICYpIGNvbnN0OwotCi0gICAg
dW5zaWduZWQgZm9ybUVsZW1lbnRJbmRleChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqKTsK
LQotICAgIERPTVN0cmluZyBvbGROYW1lQXR0cjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotY2xhc3MgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJ
bXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGw7Ci0gICAgZnJpZW5k
IGNsYXNzIGtodG1sOjpSZW5kZXJGb3JtRWxlbWVudDsKLQotcHVibGljOgotICAgIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBl
bmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0g
ICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAxOyB9Ci0KLSAgICBI
VE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKCkgeyByZXR1cm4gbV9mb3JtOyB9Ci0KLSAgICB2aXJ0
dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBib29sIGlzQ29u
dHJvbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbmFibGVk
KCkgY29uc3QgeyByZXR1cm4gIWRpc2FibGVkKCk7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFs
IHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b1RyZWUoYm9vbCBk
ZWVwKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJvb2wgZGVlcCk7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQotCi0gICAgdm9pZCBvblNlbGVjdCgpOwotICAgIHZv
aWQgb25DaGFuZ2UoKTsKLQotICAgIGJvb2wgZGlzYWJsZWQoKSBjb25zdDsKLSAgICB2b2lkIHNl
dERpc2FibGVkKGJvb2wgX2Rpc2FibGVkKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJs
ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBib29sIGlzTW91c2VGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgYm9v
bCByZWFkT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVhZE9ubHk7IH0KLSAgICB2b2lkIHNldFJl
YWRPbmx5KGJvb2wgX3JlYWRPbmx5KTsKLQotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSgg
U3R5bGVDaGFuZ2UgKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAg
ICB2b2lkIHNldE5hbWUoY29uc3QgRE9NU3RyaW5nJiBuYW1lKTsKLQotICAgIHZpcnR1YWwgYm9v
bCBpc0dlbmVyaWNGb3JtRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNSYWRpb0J1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAv
KgotICAgICAqIG92ZXJyaWRlIGluIGRlcml2ZWQgY2xhc3NlcyB0byBnZXQgdGhlIGVuY29kZWQg
bmFtZT12YWx1ZSBwYWlyCi0gICAgICogZm9yIHN1Ym1pdHRpbmcKLSAgICAgKiByZXR1cm4gdHJ1
ZSBmb3IgYSBzdWNjZXNzZnVsIGNvbnRyb2wgKHNlZSBIVE1MNC0xNy4xMy4yKQotICAgICAqLwot
ICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKSB7IHJl
dHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIHZp
cnR1YWwgUVN0cmluZyBzdGF0ZSgpOwotICAgIFFTdHJpbmcgZmluZE1hdGNoaW5nU3RhdGUoUVN0
cmluZ0xpc3QgJnN0YXRlcyk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0
QnV0dG9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNBY3Rp
dmF0ZWRTdWJtaXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKSB7IH0KLQotICAgIGludCB0YWJJbmRleCgpIGNv
bnN0OwotICAgIHZvaWQgc2V0VGFiSW5kZXgoaW50KTsKLQotcHJvdGVjdGVkOgotICAgIEhUTUxG
b3JtRWxlbWVudEltcGwgKmdldEZvcm0oKSBjb25zdDsKLQotICAgIEhUTUxGb3JtRWxlbWVudElt
cGwgKm1fZm9ybTsKLSAgICBib29sIG1fZGlzYWJsZWQgOiAxOwotICAgIGJvb2wgbV9yZWFkT25s
eTogMTsKLSAgICBib29sIG1faW5pdGVkIDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQogY2xhc3MgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsCiB7CiBwdWJsaWM6CkBAIC0yNzEsNTYzICs3MSw2IEBAIHByb3RlY3RlZDoKICAg
ICBib29sICAgICAgbV9hY3RpdmVTdWJtaXQgOiAxOwogfTsKIAotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBIVE1MRmllbGRTZXRFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVh
bCB+SFRNTEZpZWxkU2V0RWxlbWVudEltcGwoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJs
ZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRl
UmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotCi0gICAgdmly
dHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyTGluZUVkaXQ7Ci0gICAg
ZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJGaWxlQnV0dG9uOwotCi0gICAgZnJpZW5kIGNsYXNz
IEhUTUxTZWxlY3RFbGVtZW50SW1wbDsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlclNs
aWRlcjsKLQotcHVibGljOgotICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIQotICAgIGVu
dW0gdHlwZUVudW0gewotICAgICAgICBURVhULAotICAgICAgICBQQVNTV09SRCwKLSAgICAgICAg
SVNJTkRFWCwKLSAgICAgICAgQ0hFQ0tCT1gsCi0gICAgICAgIFJBRElPLAotICAgICAgICBTVUJN
SVQsCi0gICAgICAgIFJFU0VULAotICAgICAgICBGSUxFLAotICAgICAgICBISURERU4sCi0gICAg
ICAgIElNQUdFLAotICAgICAgICBCVVRUT04KLSAgICAgICAgLFNFQVJDSCwKLSAgICAgICAgUkFO
R0UKLSAgICB9OwotCi0gICAgSFRNTElucHV0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50SW1wbChj
b25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1F
bGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxJbnB1dEVsZW1lbnRJbXBsKCk7
Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVx
dWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNGb3JiaWRkZW47IH0KLSAgICB2aXJ0
dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIHZpcnR1YWwg
Ym9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRW51
bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gaW5wdXRUeXBlKCkgIT0gSU1BR0U7IH0KLQotICAg
IHZpcnR1YWwgRE9NU3RyaW5nIG5hbWUoKSBjb25zdDsKLQotICAgIGJvb2wgYXV0b0NvbXBsZXRl
KCkgY29uc3QgeyByZXR1cm4gbV9hdXRvY29tcGxldGU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBp
c0NoZWNrZWQoKSBjb25zdCB7IHJldHVybiBjaGVja2VkKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wg
aXNJbmRldGVybWluYXRlKCkgY29uc3QgeyByZXR1cm4gaW5kZXRlcm1pbmF0ZSgpOyB9Ci0KLSAg
ICBib29sIGlzVGV4dEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBTVUJNSVQgfHwg
bV90eXBlID09IFJFU0VUIHx8IG1fdHlwZSA9PSBCVVRUT047IH0KLSAgICB2aXJ0dWFsIGJvb2wg
aXNSYWRpb0J1dHRvbigpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBSQURJTzsgfQotCi0gICAg
Ym9vbCBjaGVja2VkKCkgY29uc3QgeyByZXR1cm4gbV9jaGVja2VkOyB9Ci0gICAgdm9pZCBzZXRD
aGVja2VkKGJvb2wpOwotICAgIGJvb2wgaW5kZXRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
aW5kZXRlcm1pbmF0ZTsgfQotICAgIHZvaWQgc2V0SW5kZXRlcm1pbmF0ZShib29sKTsKLSAgICBp
bnQgbWF4TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9tYXhMZW47IH0KLSAgICBpbnQgc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCk7Ci0KLSAgICBET01TdHJpbmcgdmFs
dWUoKSBjb25zdDsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IERPTVN0cmluZyB2YWx1ZVdpdGhEZWZhdWx0KCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFZhbHVl
RnJvbVJlbmRlcmVyKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICBib29sIHZhbHVlTWF0Y2hlc1Jl
bmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZU1hdGNoZXNSZW5kZXJlcjsgfQotICAgIHZv
aWQgc2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKSB7IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0
cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiBtX3R5
cGUgIT0gUEFTU1dPUkQ7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgYm9vbCBjYW5IYXZl
U2VsZWN0aW9uKCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0
aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0
U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2Vs
ZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBjbGljayhib29s
IHNlbmRNb3VzZUV2ZW50cyA9IGZhbHNlLCBib29sIHNob3dQcmVzc2VkTG9vayA9IHRydWUpOwot
ICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsK
LQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJO
YW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgY29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudElt
cGwgKnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCBi
b29sIHJlbmRlcmVySXNOZWVkZWQoa2h0bWw6OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwg
a2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6
OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLSAgICB2aXJ0dWFs
IGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29s
IGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRl
ZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdHlwZUVudW0gaW5wdXRUeXBlKCkgY29uc3QgeyBy
ZXR1cm4gbV90eXBlOyB9Ci0gICAgdm9pZCBzZXRJbnB1dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB2
YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLQotICAgIC8vIHVzZWQgaW4gY2Fz
ZSBpbnB1dCB0eXBlPWltYWdlIHdhcyBjbGlja2VkLgotICAgIGludCBjbGlja1goKSBjb25zdCB7
IHJldHVybiB4UG9zOyB9Ci0gICAgaW50IGNsaWNrWSgpIGNvbnN0IHsgcmV0dXJuIHlQb3M7IH0K
LQotICAgIHZpcnR1YWwgdm9pZCogcHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpl
dnQpOwotICAgIHZpcnR1YWwgdm9pZCBwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBs
ICpldnQsIHZvaWQqIGRhdGEpOwotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVy
KEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpOwotCi0gICAg
RE9NU3RyaW5nIGFsdFRleHQoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxB
dHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3Q7Ci0KLSAgICBpbnQgbWF4UmVzdWx0
cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF4UmVzdWx0czsgfQotCi0gICAgRE9NU3RyaW5nIGRlZmF1
bHRWYWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKGNvbnN0IERPTVN0cmlu
ZyAmKTsKLSAgICAKLSAgICBib29sIGRlZmF1bHRDaGVja2VkKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXREZWZhdWx0Q2hlY2tlZChib29sKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHQoKSBjb25zdDsK
LSAgICB2b2lkIHNldEFjY2VwdChjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcg
YWNjZXNzS2V5KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgRE9NU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWx0KCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRBbHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXRTaXplKHVuc2lnbmVk
KTsKLQotICAgIERPTVN0cmluZyBzcmMoKSBjb25zdDsKLSAgICB2b2lkIHNldFNyYyhjb25zdCBE
T01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldE1heExlbmd0aChpbnQpOwotCi0gICAgRE9NU3Ry
aW5nIHVzZU1hcCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VXNlTWFwKGNvbnN0IERPTVN0cmluZyAm
KTsKLQotcHJvdGVjdGVkOgotICAgIGJvb2wgc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1
dGUoKSBjb25zdDsKLQotICAgIEF0b21pY1N0cmluZyBtX25hbWU7Ci0gICAgRE9NU3RyaW5nIG1f
dmFsdWU7Ci0gICAgaW50ICAgICAgIHhQb3M7Ci0gICAgc2hvcnQgICAgIG1fbWF4TGVuOwotICAg
IHNob3J0ICAgICBtX3NpemU7Ci0gICAgc2hvcnQgICAgIHlQb3M7Ci0KLSAgICBzaG9ydCAgICAg
bV9tYXhSZXN1bHRzOwotCi0gICAgSFRNTEltYWdlTG9hZGVyKiBtX2ltYWdlTG9hZGVyOwotCi0g
ICAgdHlwZUVudW0gbV90eXBlIDogNDsKLSAgICBib29sIG1fY2hlY2tlZCA6IDE7Ci0gICAgYm9v
bCBtX2RlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1fdXNlRGVmYXVsdENoZWNrZWQgOiAx
OwotICAgIGJvb2wgbV9pbmRldGVybWluYXRlIDogMTsKLSAgICBib29sIG1faGF2ZVR5cGUgOiAx
OwotICAgIGJvb2wgbV9hY3RpdmVTdWJtaXQgOiAxOwotICAgIGJvb2wgbV9hdXRvY29tcGxldGUg
OiAxOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA6IDE7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMYWJlbEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxF
bGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5IVE1MTGFiZWxFbGVtZW50SW1wbCgpOwotCi0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA1OyB9Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwg
dm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIC8qKgot
ICAgICAqIHRoZSBmb3JtIGVsZW1lbnQgdGhpcyBsYWJlbCBpcyBhc3NvY2lhdGVkIHRvLgotICAg
ICAqLwotICAgIEVsZW1lbnRJbXBsICpmb3JtRWxlbWVudCgpOwotCi0gICAgSFRNTEZvcm1FbGVt
ZW50SW1wbCAqZm9ybSgpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAg
IHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBo
dG1sRm9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIdG1sRm9yKGNvbnN0IERPTVN0cmluZyAmKTsK
LQotICAgIHZvaWQgZm9jdXMoKTsKLQotIHByaXZhdGU6Ci0gICAgRE9NU3RyaW5nIG1fZm9ybUVs
ZW1lbnRJRDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTExlZ2VuZEVs
ZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6
Ci0gICAgSFRNTExlZ2VuZEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTExlZ2VuZEVsZW1lbnRJbXBsKCk7
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0
dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGto
dG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25z
dDsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVt
ZW50KTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaXJzdCBmb3JtIGVsZW1lbnQgaW4gdGhlIGxl
Z2VuZCdzIGZpZWxkc2V0IAotICAgICAqLwotICAgIEVsZW1lbnRJbXBsICpmb3JtRWxlbWVudCgp
OwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0Owot
ICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotICAgIHZvaWQgZm9j
dXMoKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5k
IGNsYXNzIGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0KLXB1YmxpYzoKLSAgICBIVE1MU2VsZWN0RWxl
bWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsK
LSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwg
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRN
TFNlbGVjdEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIGlu
dCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hl
Y2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0K
LSAgICBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0OwotICAgIHZvaWQgc2V0U2VsZWN0ZWRJbmRl
eCggaW50IGluZGV4ICk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25z
dCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBpbnQgbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICBpbnQg
bWluV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21pbndpZHRoOyB9Ci0KLSAgICBpbnQgc2l6ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgYm9vbCBtdWx0aXBsZSgpIGNvbnN0IHsg
cmV0dXJuIG1fbXVsdGlwbGU7IH0KLQotICAgIHZvaWQgYWRkICggSFRNTEVsZW1lbnRJbXBsICpl
bGVtZW50LCBIVE1MRWxlbWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0g
ICAgdm9pZCByZW1vdmUgKCBpbnQgaW5kZXggKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpOwot
ICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotICAgIEhUTUxPcHRp
b25zQ29sbGVjdGlvbkltcGwgKm9wdGlvbnMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25J
bXBsPiBvcHRpb25zSFRNTENvbGxlY3Rpb24oKTsgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGFuZCBt
aWdyYXRlIHRvIG9wdGlvbnMoKS4KLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgp
IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgdmlydHVhbCBOb2Rl
SW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VD
aGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBs
ICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAq
YXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZpcnR1YWwgTm9kZUltcGwgKmFkZENoaWxkKCBOb2RlSW1wbCogbmV3Q2hpbGQgKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZp
cnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwg
a2h0bWw6OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShG
b3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIC8vIGdldCB0aGUgYWN0dWFsIGxpc3Rib3ggaW5k
ZXggb2YgdGhlIG9wdGlvbkluZGV4dGggb3B0aW9uCi0gICAgaW50IG9wdGlvblRvTGlzdEluZGV4
KGludCBvcHRpb25JbmRleCkgY29uc3Q7Ci0gICAgLy8gcmV2ZXJzZSBvZiBvcHRpb25Ub0xpc3RJ
bmRleCAtIGdldCBvcHRpb25JbmRleCBmcm9tIGxpc3Rib3hJbmRleAotICAgIGludCBsaXN0VG9P
cHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgc2V0UmVjYWxjTGlz
dEl0ZW1zKCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gbGlzdEl0ZW1zKCkg
Y29uc3QKLSAgICAgewotICAgICAgICAgaWYgKG1fcmVjYWxjTGlzdEl0ZW1zKSBjb25zdF9jYXN0
PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHRoaXMpLT5yZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAg
ICAgIHJldHVybiBtX2xpc3RJdGVtczsKLSAgICAgfQotICAgIHZpcnR1YWwgdm9pZCByZXNldCgp
OwotICAgIHZvaWQgbm90aWZ5T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpz
ZWxlY3RlZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVs
dEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tl
eUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgdm9pZCBzZXRNdWx0aXBsZShi
b29sKTsKLQotICAgIHZvaWQgc2V0U2l6ZShpbnQpOwotCi1wcml2YXRlOgotICAgIHZvaWQgcmVj
YWxjTGlzdEl0ZW1zKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBtdXRhYmxlIFFNZW1BcnJheTxIVE1M
RWxlbWVudEltcGwqPiBtX2xpc3RJdGVtczsKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBs
ICptX29wdGlvbnM7Ci0gICAgc2hvcnQgbV9taW53aWR0aDsKLSAgICBzaG9ydCBtX3NpemU7Ci0g
ICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJvb2wgbV9yZWNhbGNMaXN0SXRlbXM7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxLZXlnZW5FbGVtZW50SW1wbCA6IHB1Ymxp
YyBIVE1MU2VsZWN0RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVu
dEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAg
RE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIC8vICMjIyB0aGlzIGlzIGp1c3QgYSByb3Vn
aCBndWVzcwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJu
IGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZv
cm1EYXRhTGlzdCYsIGJvb2wpOwotcHJvdGVjdGVkOgotICAgIEF0b21pY1N0cmluZyBtX2NoYWxs
ZW5nZTsKLSAgICBBdG9taWNTdHJpbmcgbV9rZXlUeXBlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBs
KERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmly
dHVhbCB+SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVj
a0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdO
YW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFt
ZXM6OmhyVGFnKTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1
YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgTm9kZUltcGwg
Kmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQg
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xk
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVu
ZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0gICAgdmly
dHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIp
OwotICAgIHZvaWQgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotCi0gICAgRE9NU3RyaW5nIGxhYmVs
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJik7Ci19OwotCi0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBw
dWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0
bWw6OlJlbmRlclNlbGVjdDsKLSAgICBmcmllbmQgY2xhc3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVu
dEltcGw7Ci0KLXB1YmxpYzoKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBs
ICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRh
Z1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlv
bmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAyOyB9
Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyBy
ZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1M
TmFtZXM6OnNjcmlwdFRhZyk7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNv
bnN0OwotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIERPTVN0cmluZyB0ZXh0
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmLCBpbnQgJmV4Y2Vw
dGlvbik7Ci0KLSAgICBpbnQgaW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldEluZGV4KGludCwg
aW50ICZleGNlcHRpb24pOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShN
YXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0
OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBzZWxl
Y3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWQ7IH0KLSAgICB2b2lkIHNldFNlbGVjdGVk
KGJvb2wgX3NlbGVjdGVkKTsKLQotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0
KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBi
b29sIGRlZmF1bHRTZWxlY3RlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVk
KCBib29sICk7Ci0KLSAgICBET01TdHJpbmcgbGFiZWwoKSBjb25zdDsKLSAgICB2b2lkIHNldExh
YmVsKCBjb25zdCBET01TdHJpbmcgJiApOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1f
dmFsdWU7Ci0gICAgYm9vbCBtX3NlbGVjdGVkOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJUZXh0QXJlYTsK
LQotcHVibGljOgotICAgIGVudW0gV3JhcE1ldGhvZCB7Ci0gICAgICAgIHRhX05vV3JhcCwKLSAg
ICAgICAgdGFfVmlydHVhbCwKLSAgICAgICAgdGFfUGh5c2ljYWwKLSAgICB9OwotCi0gICAgSFRN
TFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudElt
cGwgKmYgPSAwKTsKLSAgICB+SFRNTFRleHRBcmVhRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1
YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0No
aWxkLT5pc1RleHROb2RlKCk7IH0KLQotICAgIGludCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9j
b2xzOyB9Ci0gICAgaW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KLQotICAgIFdy
YXBNZXRob2Qgd3JhcCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JhcDsgfQotCi0gICAgdmlydHVhbCBi
b29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3Ry
aW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsg
cmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFs
IHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgaW50IHNlbGVjdGlvblN0
YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotCi0gICAgdm9pZCBzZXRTZWxlY3Rpb25T
dGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNl
bGVjdCAoICApOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi0gICAg
dmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIGto
dG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpS
ZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2
b2lkIGRldGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxp
c3QmLCBib29sKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICBET01TdHJpbmcgdmFs
dWUoKTsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIERP
TVN0cmluZyBkZWZhdWx0VmFsdWUoKTsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBE
T01TdHJpbmcgJnZhbHVlKTsKLQotICAgIHZvaWQgaW52YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVl
SXNWYWxpZCA9IGZhbHNlOyB9Ci0gICAgdm9pZCB1cGRhdGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2
YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVy
ZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hl
c1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLSAg
ICAKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVu
dCk7Ci0gICAgCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0
QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0Q29scyhpbnQpOwot
Ci0gICAgdm9pZCBzZXRSb3dzKGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQgbV9yb3dzOwot
ICAgIGludCBtX2NvbHM7Ci0gICAgV3JhcE1ldGhvZCBtX3dyYXA7Ci0gICAgUVN0cmluZyBtX3Zh
bHVlOwotICAgIGJvb2wgbV92YWx1ZUlzVmFsaWQ7Ci0gICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1Jl
bmRlcmVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSXNJbmRleEVs
ZW1lbnRJbXBsIDogcHVibGljIEhUTUxJbnB1dEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAg
SFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZiA9IDApOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVt
ZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBp
bnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBE
T01TdHJpbmcgcHJvbXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRQcm9tcHQoY29uc3QgRE9NU3Ry
aW5nICYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fcHJvbXB0OwotfTsKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsIDogcHVi
bGljIGtodG1sOjpTaGFyZWQ8SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbD4KLXsKLXB1YmxpYzoK
LSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsKEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqaW1w
bCkgOiBtX3NlbGVjdChpbXBsKSB7IH0KLQotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0TGVuZ3RoKHVuc2lnbmVkKTsKLSAgICBOb2RlSW1wbCAqaXRlbSh1bnNpZ25l
ZCBpbmRleCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKm5hbWVkSXRlbShjb25zdCBET01TdHJpbmcg
Jm5hbWUpIGNvbnN0OwotCi0gICAgdm9pZCBkZXRhY2goKSB7IG1fc2VsZWN0ID0gMDsgfQotCi1w
cml2YXRlOgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqbV9zZWxlY3Q7Ci19OwotCiB9IC8v
bmFtZXNwYWNlCiAKICNlbmRpZgpJbmRleDoga2h0bWwvaHRtbC9odG1sX21pc2NpbXBsLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBraHRtbC9odG1sL2h0bWxfbWlzY2ltcGwuY3BwCShyZXZpc2lvbiAxMTk3
OCkKKysrIGtodG1sL2h0bWwvaHRtbF9taXNjaW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0
LDEwICsyNCwxMSBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgImh0bWwvaHRtbF9taXNjaW1wbC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9mb3Jt
aW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9pbWFnZWltcGwuaCIKICNpbmNsdWRlICJodG1s
L2h0bWxfZG9jdW1lbnRpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX29iamVjdGltcGwuaCIK
KyNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwuaCIKIAogI2luY2x1ZGUgImRvbS9kb21fbm9kZS5oIgogCkluZGV4OiBr
aHRtbC9odG1sL2h0bWxfb2JqZWN0aW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9o
dG1sX29iamVjdGltcGwuY3BwCShyZXZpc2lvbiAxMTk3OCkKKysrIGtodG1sL2h0bWwvaHRtbF9v
YmplY3RpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsOCArMzYsOCBAQAogI2luY2x1ZGUg
ImNzcy9jc3NoZWxwZXIuaCIKICNpbmNsdWRlICJjc3Nwcm9wZXJ0aWVzLmgiCiAjaW5jbHVkZSAi
Y3NzdmFsdWVzLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCiAjaW5jbHVkZSAi
aHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudEltcGwu
aCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2FwcGxldC5oIgogI2luY2x1ZGUgInJlbmRl
cmluZy9yZW5kZXJfZnJhbWVzLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9pbWFnZS5o
IgpJbmRleDoga2h0bWwvaHRtbC9IVE1MRmllbGRTZXRFbGVtZW50SW1wbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2h0bWwvaHRtbC9IVE1MRmllbGRTZXRFbGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDEx
OTc2KQorKysga2h0bWwvaHRtbC9IVE1MRmllbGRTZXRFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAo
a25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29p
dmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxs
ZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBBcHBsZSBDb21wdXRlciwg
SW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuCiAgKiAgICAgICAgICAgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAbnlwb3Au
Y29tKQogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTI0LDM1NDUgKzI0LDQ0IEBACiAgKgogICovCiAKLSN1bmRl
ZiBGT1JNU19ERUJVRwotLy8jZGVmaW5lIEZPUk1TX0RFQlVHCi0KICNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZm9ybWltcGwuaCIKLQotI2luY2x1ZGUgImtodG1sdmll
dy5oIgotI2luY2x1ZGUgIk1hY0ZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50
aW1wbC5oIgotI2luY2x1ZGUgImh0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAia2h0bWxfc2V0
dGluZ3MuaCIKLSNpbmNsdWRlICJtaXNjL2Zvcm1kYXRhLmgiCi0KLSNpbmNsdWRlICJkb20vZG9t
X2V4Y2VwdGlvbi5oIgotI2luY2x1ZGUgImNzcy9jc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVk
ZSAiY3NzcHJvcGVydGllcy5oIgotI2luY2x1ZGUgImNzc2hlbHBlci5oIgotI2luY2x1ZGUgInht
bC9kb21fdGV4dGltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5j
bHVkZSAieG1sL0V2ZW50TmFtZXMuaCIKLSNpbmNsdWRlICJraHRtbF9leHQuaCIKKyNpbmNsdWRl
ICJIVE1MRmllbGRTZXRFbGVtZW50SW1wbC5oIgogCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRl
cl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgotI2luY2x1ZGUgInJlbmRlcl90
aGVtZS5oIgotCi0jaW5jbHVkZSA8a2xvY2FsZS5oPgotI2luY2x1ZGUgPHFmaWxlLmg+Ci0jaW5j
bHVkZSA8cXRleHRjb2RlYy5oPgotCi0vLyBmb3Iga2V5Z2VuCi0jaW5jbHVkZSA8cXN0cmluZy5o
PgotI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgogCiB1c2lu
ZyBuYW1lc3BhY2Uga2h0bWw7CiAKIG5hbWVzcGFjZSBET00gewogCi11c2luZyBuYW1lc3BhY2Ug
RXZlbnROYW1lczsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLXN0cnVjdCBGb3JtRGF0
YUxpc3RJdGVtIHsKLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFDU3RyaW5nICZkYXRhKSA6
IG1fZGF0YShkYXRhKSB7IH0KLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFTdHJpbmcgJnBh
dGgpIDogbV9wYXRoKHBhdGgpIHsgfQotCi0gICAgUVN0cmluZyBtX3BhdGg7Ci0gICAgUUNTdHJp
bmcgbV9kYXRhOwotfTsKLQotY2xhc3MgRm9ybURhdGFMaXN0IHsKLXB1YmxpYzoKLSAgICBGb3Jt
RGF0YUxpc3QoUVRleHRDb2RlYyAqKTsKLQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01T
dHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJp
bmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZS5xc3RyaW5nKCkpOyB9Ci0gICAg
dm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBRU3RyaW5nICZ2YWx1
ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2
YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0
IFFDU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7
IGFwcGVuZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3Ry
aW5nICZrZXksIGludCB2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmco
KSk7IGFwcGVuZFN0cmluZyhRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsgfQotICAgIHZvaWQgYXBw
ZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZmaWxlbmFtZSk7
Ci0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBiZWdpbigp
IGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5iZWdpbigpOyB9Ci0gICAgUVZhbHVlTGlz
dENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gZW5kKCkgY29uc3QKLSAgICAgICAgeyBy
ZXR1cm4gbV9saXN0LmVuZCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmRTdHJpbmco
Y29uc3QgUUNTdHJpbmcgJnMpOwotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0IFFTdHJpbmcg
JnMpOwotCi0gICAgUVRleHRDb2RlYyAqbV9jb2RlYzsKLSAgICBRVmFsdWVMaXN0PEZvcm1EYXRh
TGlzdEl0ZW0+IG1fbGlzdDsKLX07Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6OkhUTUxGb3JtRWxl
bWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudEltcGwoZm9ybVRh
ZywgZG9jKQotewotICAgIGNvbGxlY3Rpb25JbmZvID0gMDsKLSAgICBtX3Bvc3QgPSBmYWxzZTsK
LSAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAg
ICBtX2luc3VibWl0ID0gZmFsc2U7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwotICAgIG1f
aW5yZXNldCA9IGZhbHNlOwotICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3Jt
LXVybGVuY29kZWQiOwotICAgIG1fYm91bmRhcnkgPSAiLS0tLS0tLS0tLTB4S2hUbUxiT3VOZEFy
WSI7Ci0gICAgbV9hY2NlcHRjaGFyc2V0ID0gIlVOS05PV04iOwotICAgIG1fbWFsZm9ybWVkID0g
ZmFsc2U7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6On5IVE1MRm9ybUVsZW1lbnRJbXBsKCkK
LXsKLSAgICBkZWxldGUgY29sbGVjdGlvbkluZm87Ci0gICAgCi0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZvcm1FbGVtZW50
c1tpXS0+bV9mb3JtID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW1nRWxlbWVu
dHMuY291bnQoKTsgKytpKQotICAgICAgICBpbWdFbGVtZW50c1tpXS0+bV9mb3JtID0gMDsKLX0K
LQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNz
aW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKQotewotICAgIGlmICh1cmwuaXNOdWxsKCkpIHsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Y29t
cGxldGVVUkwodXJsLnFzdHJpbmcoKSkuc3RhcnRzV2l0aCgiaHR0cHM6IiwgZmFsc2UpOwotfQot
Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBIVE1MRWxlbWVu
dEltcGw6OmF0dGFjaCgpOwotCi0gICAgLy8gbm90ZSB3ZSBkb24ndCBkZWFsIHdpdGggY2FsbGlu
ZyBzZWN1cmVGb3JtUmVtb3ZlZCgpIG9uIGRldGFjaCwgYmVjYXVzZSB0aGUgdGltaW5nCi0gICAg
Ly8gd2FzIHN1Y2ggdGhhdCBpdCBjbGVhcmVkIG91ciBzdGF0ZSB0b28gZWFybHkKLSAgICBpZiAo
Zm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpKQotICAgICAgICBnZXREb2N1bWVu
dCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpp
bnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmlzSFRNTERv
Y3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19jYXN0PEhU
TUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1lbnQtPmFkZE5hbWVkSXRl
bShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjppbnNlcnRlZElu
dG9Eb2N1bWVudCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9t
RG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7
Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJ
bXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3VtZW50LT5yZW1vdmVOYW1lZEl0ZW0ob2xkTmFt
ZUF0dHIpOwotICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21Eb2N1
bWVudCgpOwotfQotCi1pbnQgSFRNTEZvcm1FbGVtZW50SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsK
LSAgICBpbnQgbGVuID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1l
bnRzLmNvdW50KCk7ICsraSkKLQlpZiAoZm9ybUVsZW1lbnRzW2ldLT5pc0VudW1lcmF0YWJsZSgp
KQotCSAgICArK2xlbjsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQotdm9pZCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpzdWJtaXRDbGljaygpCi17Ci0gICAgYm9vbCBzdWJtaXRGb3VuZCA9IGZhbHNl
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytp
KSB7Ci0gICAgICAgIGlmIChmb3JtRWxlbWVudHNbaV0tPmhhc0xvY2FsTmFtZShpbnB1dFRhZykp
IHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudEltcGwgKj4oZm9ybUVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAg
IGlmIChlbGVtZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSAmJiBlbGVtZW50LT5yZW5k
ZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3VibWl0Rm91bmQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgIGVsZW1lbnQtPmNsaWNrKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXN1Ym1pdEZvdW5kKSAvLyBz
dWJtaXQgdGhlIGZvcm0gd2l0aG91dCBhIHN1Ym1pdCBvciBpbWFnZSBpbnB1dAotICAgICAgICBw
cmVwYXJlU3VibWl0KCk7Ci19Ci0KLQotc3RhdGljIFFDU3RyaW5nIGVuY29kZUNTdHJpbmcoY29u
c3QgUUNTdHJpbmcmIGUpCi17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50
ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQotICAgIC8vIHNhZmUgY2hhcmFjdGVycyBsaWtl
IE5TIGhhbmRsZXMgdGhlbSBmb3IgY29tcGF0aWJpbGl0eQotICAgIHN0YXRpYyBjb25zdCBjaGFy
ICpzYWZlID0gIi0uXyoiOwotICAgIGludCBlbGVuID0gZS5sZW5ndGgoKTsKLSAgICBRQ1N0cmlu
ZyBlbmNvZGVkKCggZWxlbitlLmNvbnRhaW5zKCAnXG4nICkgKSozKzEpOwotICAgIGludCBlbmNs
ZW4gPSAwOwotCi0gICAgLy9RQ1N0cmluZyBvcmlnKGUuZGF0YSgpLCBlLnNpemUoKSk7Ci0KLSAg
ICBmb3IoaW50IHBvcyA9IDA7IHBvcyA8IGVsZW47IHBvcysrKSB7Ci0gICAgICAgIHVuc2lnbmVk
IGNoYXIgYyA9IGVbcG9zXTsKLQotICAgICAgICBpZiAoICgoIGMgPj0gJ0EnKSAmJiAoIGMgPD0g
J1onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49ICdhJykgJiYgKCBjIDw9ICd6JykpIHx8Ci0g
ICAgICAgICAgICAgKCggYyA+PSAnMCcpICYmICggYyA8PSAnOScpKSB8fAotICAgICAgICAgICAg
IChzdHJjaHIoc2FmZSwgYykpCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBlbmNvZGVkW2Vu
Y2xlbisrXSA9IGM7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICcgJyApCi0gICAgICAgICAgICBl
bmNvZGVkW2VuY2xlbisrXSA9ICcrJzsKLSAgICAgICAgZWxzZSBpZiAoIGMgPT0gJ1xuJyB8fCAo
IGMgPT0gJ1xyJyAmJiBlW3BvcysxXSAhPSAnXG4nICkgKQotICAgICAgICB7Ci0gICAgICAgICAg
ICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytd
ID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnRCc7Ci0gICAgICAgICAg
ICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytd
ID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnQSc7Ci0gICAgICAgIH0K
LSAgICAgICAgZWxzZSBpZiAoIGMgIT0gJ1xyJyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVu
Y29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IGggPSBjIC8g
MTY7Ci0gICAgICAgICAgICBoICs9IChoID4gOSkgPyAoJ0EnIC0gMTApIDogJzAnOwotICAgICAg
ICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBoOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQg
bCA9IGMgJSAxNjsKLSAgICAgICAgICAgIGwgKz0gKGwgPiA5KSA/ICgnQScgLSAxMCkgOiAnMCc7
Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGw7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnXDAnOwotICAgIGVuY29kZWQudHJ1bmNhdGUoZW5jbGVu
KTsKLQotICAgIHJldHVybiBlbmNvZGVkOwotfQotCi0vLyBDaGFuZ2UgcGxhaW4gQ1IgYW5kIHBs
YWluIExGIHRvIENSTEYgcGFpcnMuCi1zdGF0aWMgUUNTdHJpbmcgZml4TGluZUJyZWFrcyhjb25z
dCBRQ1N0cmluZyAmcykKLXsKLSAgICAvLyBDb21wdXRlIHRoZSBsZW5ndGguCi0gICAgdW5zaWdu
ZWQgbmV3TGVuID0gMDsKLSAgICBjb25zdCBjaGFyICpwID0gcy5kYXRhKCk7Ci0gICAgd2hpbGUg
KGNoYXIgYyA9ICpwKyspIHsKLSAgICAgICAgaWYgKGMgPT0gJ1xyJykgewotICAgICAgICAgICAg
Ly8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2YgdHJhaWxpbmcgJ1wwJy4KLSAgICAgICAg
ICAgIGlmICgqcCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHVybiBDUiBpbnRvIENS
TEYuCi0gICAgICAgICAgICAgICAgbmV3TGVuICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAvLyBUdXJuIExGIGludG8gQ1JM
Ri4KLSAgICAgICAgICAgIG5ld0xlbiArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgLy8gTGVhdmUgb3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAgICAgICAgIG5ld0xlbiAr
PSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuZXdMZW4gPT0gcy5sZW5ndGgoKSkgewot
ICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhl
IHN0cmluZy4KLSAgICBwID0gcy5kYXRhKCk7Ci0gICAgUUNTdHJpbmcgcmVzdWx0KG5ld0xlbiAr
IDEpOwotICAgIGNoYXIgKnEgPSByZXN1bHQuZGF0YSgpOwotICAgIHdoaWxlIChjaGFyIGMgPSAq
cCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAgICAgICAgIC8vIFNhZmUgdG8g
bG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0gICAgICAgICAgICBpZiAoKnAg
IT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1IgaW50byBDUkxGLgotICAgICAg
ICAgICAgICAgICpxKysgPSAnXHInOwotICAgICAgICAgICAgICAgICpxKysgPSAnXG4nOwotICAg
ICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAg
Ly8gVHVybiBMRiBpbnRvIENSTEYuCi0gICAgICAgICAgICAqcSsrID0gJ1xyJzsKLSAgICAgICAg
ICAgICpxKysgPSAnXG4nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTGVhdmUg
b3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAgICAgICAgICpxKysgPSBjOwotICAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjpmb3JtRGF0YShGb3JtRGF0YSAmZm9ybV9kYXRhKSBjb25zdAotewotICAgIFFDU3RyaW5n
IGVuY19zdHJpbmcgPSAiIjsgLy8gdXNlZCBmb3Igbm9uLW11bHRpcGFydCBkYXRhCi0KLSAgICAv
LyBmaW5kIG91dCB0aGUgUVRleHRjb2RlYyB0byB1c2UKLSAgICBRU3RyaW5nIHN0ciA9IG1fYWNj
ZXB0Y2hhcnNldC5xc3RyaW5nKCk7Ci0gICAgc3RyLnJlcGxhY2UoJywnLCAnICcpOwotICAgIFFT
dHJpbmdMaXN0IGNoYXJzZXRzID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcgJywgc3RyKTsKLSAgICBR
VGV4dENvZGVjKiBjb2RlYyA9IDA7Ci0gICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+
ZnJhbWUoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IGNoYXJzZXRzLmJl
Z2luKCk7IGl0ICE9IGNoYXJzZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgZW5j
ID0gKCppdCk7Ci0gICAgICAgIGlmIChlbmMuY29udGFpbnMoIlVOS05PV04iKSkgewotICAgICAg
ICAgICAgLy8gdXNlIHN0YW5kYXJkIGRvY3VtZW50IGVuY29kaW5nCi0gICAgICAgICAgICBlbmMg
PSAiSVNPLTg4NTktMSI7Ci0gICAgICAgICAgICBpZiAoZnJhbWUpCi0gICAgICAgICAgICAgICAg
ZW5jID0gZnJhbWUtPmVuY29kaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChjb2RlYyA9
IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShlbmMubGF0aW4xKCkpKSkKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgIH0KLQotICAgIGlmICghY29kZWMpCi0gICAgICAgIGNvZGVjID0gUVRleHRDb2Rl
Yzo6Y29kZWNGb3JMb2NhbGUoKTsKLQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZv
cm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIEZvcm1EYXRhTGlzdCBs
c3QoY29kZWMpOwotCi0gICAgICAgIGlmICghY3VycmVudC0+ZGlzYWJsZWQoKSAmJiBjdXJyZW50
LT5hcHBlbmRGb3JtRGF0YShsc3QsIG1fbXVsdGlwYXJ0KSkgewotICAgICAgICAgICAgZm9yIChR
VmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBpdCA9IGxzdC5iZWdpbigp
OyBpdCAhPSBsc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1fbXVsdGlw
YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBJU0lOREVYIC8gPGlucHV0IG5h
bWU9aXNpbmRleD4gc3BlY2lhbAotICAgICAgICAgICAgICAgICAgICAvLyBidXQgb25seSBpZiBp
dHMgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZW5jX3N0cmluZy5p
c0VtcHR5KCkgJiYgKCppdCkubV9kYXRhID09ICJpc2luZGV4IiApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9IGVu
Y29kZUNTdHJpbmcoICgqaXQpLm1fZGF0YSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVuY19z
dHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJpbmcg
Kz0gJyYnOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNT
dHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJpbmcg
Kz0gIj0iOwotICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZygoKml0KS5tX2RhdGEpOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFDU3RyaW5nIGhzdHIoIi0t
Iik7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gbV9ib3VuZGFyeS5xc3RyaW5nKCkubGF0
aW4xKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG4iOwotICAgICAgICAgICAg
ICAgICAgICBoc3RyICs9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIi
OwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICgqaXQpLm1fZGF0YS5kYXRhKCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAgICAgICAgICAgICAvLyBp
ZiB0aGUgY3VycmVudCB0eXBlIGlzIEZJTEUsIHRoZW4gd2UgYWxzbyBuZWVkIHRvCi0gICAgICAg
ICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGZpbGVuYW1lCi0gICAgICAgICAgICAgICAgICAg
IGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpICYmCi0gICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQpLT5pbnB1
dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6RklMRSkKLSAgICAgICAgICAgICAgICAg
ICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBwYXRoID0gc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+dmFsdWUoKS5xc3RyaW5nKCk7Ci0KLSAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgaWYgdGhlIGZp
bGVuYW1lIGluY2x1ZGVzIGEgIiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Ig
Y29udHJvbCBjaGFyYWN0ZXJzIGxpa2UgQ1Igb3IgTEYuIFRoaXMgYWxzbyBkb2VzIHN0cmFuZ2UK
LSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaW5ncyBpZiB0aGUgZmlsZW5hbWUgaW5jbHVk
ZXMgY2hhcmFjdGVycyB5b3UgY2FuJ3QgZW5jb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBpbiB0aGUgd2Vic2l0ZSdzIGNoYXJhY3RlciBzZXQuCi0gICAgICAgICAgICAgICAgICAgICAg
ICBoc3RyICs9ICI7IGZpbGVuYW1lPVwiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIg
Kz0gY29kZWMtPmZyb21Vbmljb2RlKHBhdGgubWlkKHBhdGguZmluZFJldignLycpICsgMSksIHRy
dWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwotCi0gICAgICAgICAg
ICAgICAgICAgICAgICBpZighc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJy
ZW50KS0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBtaW1lVHlwZSA9IGZyYW1lID8gTWFjKGZy
YW1lKS0+bWltZVR5cGVGb3JGaWxlTmFtZShwYXRoKSA6IFFTdHJpbmcoKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUeXBlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuQ29udGVudC1UeXBlOiAiOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1pbWVUeXBlLmFzY2lpKCk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXHJcblxy
XG4iOwotICAgICAgICAgICAgICAgICAgICArK2l0OwotCi0gICAgICAgICAgICAgICAgICAgIC8v
IGFwcGVuZCBib2R5Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGhz
dHIuZGF0YSgpLCBoc3RyLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9y
bURhdGFMaXN0SXRlbSAmaXRlbSA9ICppdDsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRh
dGFTaXplID0gaXRlbS5tX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0
YVNpemUgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRh
KGl0ZW0ubV9kYXRhLCBkYXRhU2l6ZSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlm
ICghaXRlbS5tX3BhdGguaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9k
YXRhLmFwcGVuZEZpbGUoaXRlbS5tX3BhdGgpOwotICAgICAgICAgICAgICAgICAgICBmb3JtX2Rh
dGEuYXBwZW5kRGF0YSgiXHJcbiIsIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKG1fbXVsdGlwYXJ0KQotICAgICAgICBl
bmNfc3RyaW5nID0gKCItLSIgKyBtX2JvdW5kYXJ5LnFzdHJpbmcoKSArICItLVxyXG4iKS5hc2Np
aSgpOwotCi0gICAgZm9ybV9kYXRhLmFwcGVuZERhdGEoZW5jX3N0cmluZy5kYXRhKCksIGVuY19z
dHJpbmcubGVuZ3RoKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxGb3JtRWxl
bWVudEltcGw6OnBhcnNlRW5jdHlwZShjb25zdCBET01TdHJpbmcmIHR5cGUpCi17Ci0gICAgaWYo
dHlwZS5jb250YWlucygibXVsdGlwYXJ0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFpbnMoImZvcm0t
ZGF0YSIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0
YSI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHR5cGUuY29u
dGFpbnMoInRleHQiLCBmYWxzZSkgfHwgdHlwZS5jb250YWlucygicGxhaW4iLCBmYWxzZSkpIHsK
LSAgICAgICAgbV9lbmN0eXBlID0gInRleHQvcGxhaW4iOwotICAgICAgICBtX211bHRpcGFydCA9
IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94
LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAg
IH0KLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRCb3VuZGFyeSggY29uc3QgRE9N
U3RyaW5nJiBib3VuZCApCi17Ci0gICAgbV9ib3VuZGFyeSA9IGJvdW5kOwotfQotCi1ib29sIEhU
TUxGb3JtRWxlbWVudEltcGw6OnByZXBhcmVTdWJtaXQoKQotewotICAgIEZyYW1lICpmcmFtZSA9
IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYobV9pbnN1Ym1pdCB8fCAhZnJhbWUgfHwg
ZnJhbWUtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSkKLSAgICAgICAgcmV0dXJuIG1faW5zdWJtaXQ7
Ci0KLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLSAgICBtX2RvaW5nc3VibWl0ID0gZmFsc2U7Ci0K
LSAgICBpZiAoIGRpc3BhdGNoSFRNTEV2ZW50KHN1Ym1pdEV2ZW50LGZhbHNlLHRydWUpICYmICFt
X2RvaW5nc3VibWl0ICkKLSAgICAgICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0KLSAgICBtX2lu
c3VibWl0ID0gZmFsc2U7Ci0KLSAgICBpZiAoIG1fZG9pbmdzdWJtaXQgKQotICAgICAgICBzdWJt
aXQodHJ1ZSk7Ci0KLSAgICByZXR1cm4gbV9kb2luZ3N1Ym1pdDsKLX0KLQotdm9pZCBIVE1MRm9y
bUVsZW1lbnRJbXBsOjpzdWJtaXQoIGJvb2wgYWN0aXZhdGVTdWJtaXRCdXR0b24gKQotewotICAg
IEtIVE1MVmlldyAqdmlldyA9IGdldERvY3VtZW50KCktPnZpZXcoKTsKLSAgICBGcmFtZSAqZnJh
bWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmICghdmlldyB8fCAhZnJhbWUpIHsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggbV9pbnN1Ym1pdCApIHsKLSAgICAg
ICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBt
X2luc3VibWl0ID0gdHJ1ZTsKLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBmaXJz
dFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSAwOwotICAgIGJvb2wgbmVlZEJ1dHRvbkFjdGl2YXRp
b24gPSBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbjsJLy8gZG8gd2UgbmVlZCB0byBhY3RpdmF0ZSBhIHN1
Ym1pdCBidXR0b24/Ci0gICAgCi0gICAgTWFjKGZyYW1lKS0+Y2xlYXJSZWNvcmRlZEZvcm1WYWx1
ZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7
ICsraSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogY3VycmVudCA9IGZv
cm1FbGVtZW50c1tpXTsKLSAgICAgICAgLy8gT3VyIGFwcCBuZWVkcyB0byBnZXQgZm9ybSB2YWx1
ZXMgZm9yIHBhc3N3b3JkIGZpZWxkcyBmb3IgZG9pbmcgcGFzc3dvcmQgYXV0b2NvbXBsZXRlLAot
ICAgICAgICAvLyBzbyB3ZSBhcmUgbW9yZSBsZW5pZW50IGluIHB1c2hpbmcgdmFsdWVzLCBhbmQg
bGV0IHRoZSBhcHAgZGVjaWRlIHdoYXQgdG8gc2F2ZSB3aGVuLgotICAgICAgICBpZiAoY3VycmVu
dC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVu
dEltcGwgKmlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50
KTsKLSAgICAgICAgICAgIGlmIChpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVu
dEltcGw6OlRFWFQKLSAgICAgICAgICAgICAgICB8fCBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpQQVNTV09SRAotICAgICAgICAgICAgICAgIHx8IGlucHV0LT5p
bnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAg
ewotICAgICAgICAgICAgICAgIE1hYyhmcmFtZSktPnJlY29yZEZvcm1WYWx1ZShpbnB1dC0+bmFt
ZSgpLnFzdHJpbmcoKSwgaW5wdXQtPnZhbHVlKCkucXN0cmluZygpLCB0aGlzKTsKLSAgICAgICAg
ICAgICAgICBpZiAoaW5wdXQtPnJlbmRlcmVyKCkgJiYgaW5wdXQtPmlucHV0VHlwZSgpID09IEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpTRUFSQ0gpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlckxpbmVFZGl0Kj4oaW5wdXQtPnJlbmRlcmVyKCkpLT5hZGRTZWFyY2hSZXN1bHQo
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkQnV0dG9uQWN0
aXZhdGlvbikgewotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmlzQWN0aXZhdGVkU3VibWl0KCkp
IHsKLSAgICAgICAgICAgICAgICBuZWVkQnV0dG9uQWN0aXZhdGlvbiA9IGZhbHNlOwotICAgICAg
ICAgICAgfSBlbHNlIGlmIChmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPT0gMCAmJiBjdXJy
ZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSkgewotICAgICAgICAgICAgICAgIGZpcnN0
U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmlyc3RTdWNjZXNz
ZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbi0+
c2V0QWN0aXZhdGVkU3VibWl0KHRydWUpOwotICAgIH0KLQotICAgIGlmICghbV9wb3N0KQotICAg
ICAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIAotICAgIEZvcm1EYXRhIGZvcm1fZGF0YTsK
LSAgICBpZiAoZm9ybURhdGEoZm9ybV9kYXRhKSkgewotICAgICAgICBpZihtX3Bvc3QpIHsKLSAg
ICAgICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAicG9zdCIsIG1fdXJsLnFzdHJpbmcoKSwgZm9y
bV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RhcmdldC5x
c3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3R5cGUo
KS5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5k
YXJ5KCkucXN0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICBmcmFtZS0+c3VibWl0Rm9ybSggImdldCIsIG1fdXJsLnFzdHJpbmcoKSwgZm9ybV9kYXRhLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RhcmdldC5xc3RyaW5nKCkg
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZWVkQnV0dG9uQWN0aXZhdGlvbiAmJiBm
aXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsKLSAgICAgICAgZmlyc3RTdWNjZXNzZnVsU3Vi
bWl0QnV0dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQoZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBt
X2RvaW5nc3VibWl0ID0gbV9pbnN1Ym1pdCA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxGb3JtRWxl
bWVudEltcGw6OnJlc2V0KCAgKQotewotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCkt
PmZyYW1lKCk7Ci0gICAgaWYobV9pbnJlc2V0IHx8ICFmcmFtZSkgcmV0dXJuOwotCi0gICAgbV9p
bnJlc2V0ID0gdHJ1ZTsKLQotICAgIC8vICMjIyBET00yIGxhYmVscyB0aGlzIGV2ZW50IGFzIG5v
dCBjYW5jZWxhYmxlLCBob3dldmVyCi0gICAgLy8gY29tbW9uIGJyb3dzZXJzKCBzaWNrISApIGFs
bG93IGl0IGJlIGNhbmNlbGxlZC4KLSAgICBpZiAoICFkaXNwYXRjaEhUTUxFdmVudChyZXNldEV2
ZW50LHRydWUsIHRydWUpICkgewotICAgICAgICBtX2lucmVzZXQgPSBmYWxzZTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVu
dHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxlbWVudHNbaV0tPnJlc2V0KCk7Ci0KLSAg
ICBtX2lucmVzZXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChh
dHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cikgCi0gICAgewotICAgICAgICBib29sIG9sZFVSTFdh
c1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKTsKLSAgICAgICAg
bV91cmwgPSBraHRtbDo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGJvb2wgbmV3
VVJMSXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7Ci0KLSAg
ICAgICAgaWYgKG1fYXR0YWNoZWQgJiYgKG9sZFVSTFdhc1NlY3VyZSAhPSBuZXdVUkxJc1NlY3Vy
ZSkpCi0gICAgICAgICAgICBpZiAobmV3VVJMSXNTZWN1cmUpCi0gICAgICAgICAgICAgICAgZ2V0
RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybVJlbW92ZWQoKTsKLSAgICB9Ci0gICAg
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHRhcmdldEF0dHIpIHsKLSAgICAgICAgbV90YXJnZXQg
PSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1ldGhvZEF0
dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJwb3N0
IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSB0cnVlOwotICAgICAgICBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiZ2V0IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSBm
YWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBlbmN0eXBlQXR0cikgewotICAg
ICAgICBwYXJzZUVuY3R5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gYWNjZXB0X2NoYXJzZXRBdHRyKSB7Ci0gICAgICAgIC8vIHNwYWNlIHNlcGFyYXRl
ZCBsaXN0IG9mIGNoYXJzZXRzIHRoZSBzZXJ2ZXIKLSAgICAgICAgLy8gYWNjZXB0cyAtIHNlZSBy
ZmMyMDQ1Ci0gICAgICAgIG1fYWNjZXB0Y2hhcnNldCA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0QXR0cikgewotICAgICAgICAvLyBpZ25vcmUg
dGhpcyBvbmUgZm9yIHRoZSBtb21lbnQuLi4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gIWVxdWFsSWdu
b3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBvbnN1Ym1pdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc3Vi
bWl0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9ucmVzZXRB
dHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHJlc2V0RXZlbnQsIGF0dHIpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAgIERPTVN0
cmluZyBuZXdOYW1lQXR0ciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChpbkRvY3VtZW50
KCkgJiYgZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICAgICAgSFRN
TERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+
KGdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgZG9jdW1lbnQtPnJlbW92ZU5hbWVkSXRlbShv
bGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2N1bWVudC0+YWRkTmFtZWRJdGVtKG5ld05hbWVB
dHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lQXR0ciA9IG5ld05hbWVBdHRyOwotICAg
IH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0
dHIpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBpbnNlcnRJbnRvVmVjdG9y
KFFQdHJWZWN0b3I8VD4gJnZlYywgdW5zaWduZWQgcG9zLCBUKiBpdGVtKQotewotICAgIHVuc2ln
bmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7
Ci0gICAgYXNzZXJ0KHBvcyA8PSBjb3VudCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAg
ICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gY291bnQ7IGkgPiBwb3M7IC0taSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2
ZWNbaSAtIDFdKTsgICAgCi0gICAgdmVjLmluc2VydChwb3MsIGl0ZW0pOwotfQotCi10ZW1wbGF0
ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBhcHBlbmRUb1ZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMs
IFQgKml0ZW0pCi17Ci0gICAgdW5zaWduZWQgc2l6ZSA9IHZlYy5zaXplKCk7Ci0gICAgdW5zaWdu
ZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBpZiAoc2l6ZSA9PSBjb3VudCkKLSAgICAgICAg
dmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6ZSAqIDMgLyAyKTsKLSAgICB2ZWMuaW5zZXJ0
KGNvdW50LCBpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgcmVtb3Zl
RnJvbVZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAgaW50IHBvcyA9
IHZlYy5maW5kUmVmKGl0ZW0pOwotICAgIGlmIChwb3MgPCAwKQotICAgICAgICByZXR1cm47Ci0g
ICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBw
b3M7IGkgPCBjb3VudCAtIDE7ICsraSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2ZWNbaSArIDFd
KTsKLSAgICB2ZWMucmVtb3ZlKGNvdW50IC0gMSk7Ci19Ci0KLXVuc2lnbmVkIEhUTUxGb3JtRWxl
bWVudEltcGw6OmZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUp
Ci17Ci0gICAgLy8gQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhpcyBlbGVtZW50
IGlzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgaW4KLSAgICAvLyB0aGUgZm9ybSdzIHRyZWUgb2YgY2hp
bGRyZW47IHdlIGRvbid0IHdhbnQgdG8gd2FsayB0aGUgZW50aXJlIHRyZWUgaW4gdGhhdAotICAg
IC8vIGNvbW1vbiBjYXNlIHRoYXQgb2NjdXJzIGR1cmluZyBwYXJzaW5nOyBpbnN0ZWFkIHdlJ2xs
IGp1c3QgcmV0dXJuIGEgdmFsdWUKLSAgICAvLyB0aGF0IHNheXMgImFkZCB0aGlzIGZvcm0gZWxl
bWVudCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSIuCi0gICAgaWYgKGUtPnRyYXZlcnNlTmV4dE5v
ZGUodGhpcykpIHsKLSAgICAgICAgdW5zaWduZWQgaSA9IDA7Ci0gICAgICAgIGZvciAoTm9kZUlt
cGwgKm5vZGUgPSB0aGlzOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlz
KSkgewotICAgICAgICAgICAgaWYgKG5vZGUgPT0gZSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
aTsKLSAgICAgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkKLSAgICAgICAgICAgICAg
ICAgICAgJiYgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpLT5pc0dlbmVyaWNG
b3JtRWxlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsICo+KG5vZGUpLT5mb3JtKCkgPT0gdGhpcykKLSAgICAgICAgICAg
ICAgICArK2k7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1FbGVtZW50cy5jb3Vu
dCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlZ2lzdGVyRm9ybUVsZW1lbnQo
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgRG9jdW1lbnRJbXBsICpkb2Mg
PSBnZXREb2N1bWVudCgpOwotICAgIGlmIChkb2MgJiYgZS0+aXNSYWRpb0J1dHRvbigpICYmICFl
LT5uYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
KiBjdXJyZW50Q2hlY2tlZFJhZGlvID0gZG9jLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChl
LT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDApOwotICAgICAgICBpZiAo
Y3VycmVudENoZWNrZWRSYWRpbyA9PSBlKQotICAgICAgICAgICAgZG9jLT5yZW1vdmVSYWRpb0J1
dHRvbkdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIChIVE1MRm9ybUVsZW1lbnRJbXBsKikgMCk7Ci0g
ICAgICAgIGlmIChlLT5pc0NoZWNrZWQoKSkKLSAgICAgICAgICAgIGRvYy0+cmFkaW9CdXR0b25D
aGVja2VkKChIVE1MSW5wdXRFbGVtZW50SW1wbCopIGUsIHRoaXMpOwotICAgIH0KLSAgICBpbnNl
cnRJbnRvVmVjdG9yKGZvcm1FbGVtZW50cywgZm9ybUVsZW1lbnRJbmRleChlKSwgZSk7Ci19Ci0K
LXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgaWYgKCFlLT5uYW1lKCkuaXNFbXB0eSgpICYmIGdl
dERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJl
bnRDaGVja2VkUmFkaW8gPSBnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91
cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAgICAgICAgaWYgKGN1cnJlbnRDaGVja2VkUmFk
aW8gPT0gZSkKLSAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3Jv
dXAoZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgfQotICAgIHJlbW92ZUZyb21WZWN0b3Io
Zm9ybUVsZW1lbnRzLCBlKTsKLX0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjppc1VSTEF0
dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5u
YW1lKCkgPT0gYWN0aW9uQXR0cjsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZWdp
c3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKmUpCi17Ci0gICAgYXBwZW5kVG9W
ZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJl
bW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKmUpCi17Ci0gICAgcmVtb3ZlRnJv
bVZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+
IEhUTUxGb3JtRWxlbWVudEltcGw6OmVsZW1lbnRzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhU
TUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxGb3JtQ29sbGVjdGlvbkltcGwodGhpcykpOwotfQot
Ci1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1w
bDo6c2V0TmFtZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShu
YW1lQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6YWNj
ZXB0Q2hhcnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2NlcHRfY2hh
cnNldEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFjY2VwdENoYXJz
ZXQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0X2No
YXJzZXRBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjph
Y3Rpb24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWN0aW9uQXR0cik7Ci19
Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0QWN0aW9uKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjdGlvbkF0dHIsIHZhbHVlKTsKLX0KLQotdm9p
ZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRFbmN0eXBlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGVuY3R5cGVBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjptZXRob2QoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUobWV0aG9kQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0
TWV0aG9kKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG1ldGhv
ZEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6OnRhcmdl
dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKLX0KLQot
dm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRUYXJnZXQoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFyZ2V0QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxFbGVtZW50SW1wbCh0YWdO
YW1lLCBkb2MpCi17Ci0gICAgbV9kaXNhYmxlZCA9IG1fcmVhZE9ubHkgPSBmYWxzZTsKLQotICAg
IGlmIChmKQotCW1fZm9ybSA9IGY7Ci0gICAgZWxzZQotCW1fZm9ybSA9IGdldEZvcm0oKTsKLSAg
ICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhpcyk7
Ci19Ci0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwoKQotewotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9ybS0+cmVtb3ZlRm9ybUVs
ZW1lbnQodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0
dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGRpc2FibGVkQXR0cikgewotICAgICAgICBib29sIG9s
ZERpc2FibGVkID0gbV9kaXNhYmxlZDsKLSAgICAgICAgbV9kaXNhYmxlZCA9ICFhdHRyLT5pc051
bGwoKTsKLSAgICAgICAgaWYgKG9sZERpc2FibGVkICE9IG1fZGlzYWJsZWQpIHsKLSAgICAgICAg
ICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVy
KCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgICAgICB0aGVtZSgpLT5z
dGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgRW5hYmxlZFN0YXRlKTsKLSAgICAgICAgfQotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlYWRvbmx5QXR0cikgewotICAgICAgICBib29sIG9s
ZFJlYWRPbmx5ID0gbV9yZWFkT25seTsKLSAgICAgICAgbV9yZWFkT25seSA9ICFhdHRyLT5pc051
bGwoKTsKLSAgICAgICAgaWYgKG9sZFJlYWRPbmx5ICE9IG1fcmVhZE9ubHkpIHNldENoYW5nZWQo
KTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNo
KCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjph
dHRhY2goKTsKLQotICAgIC8vIFRoZSBjYWxsIHRvIHVwZGF0ZUZyb21FbGVtZW50KCkgbmVlZHMg
dG8gZ28gYWZ0ZXIgdGhlIGNhbGwgdGhyb3VnaAotICAgIC8vIHRvIHRoZSBiYXNlIGNsYXNzJ3Mg
YXR0YWNoKCkgYmVjYXVzZSB0aGF0IGNhbiBzb21ldGltZXMgZG8gYSBjbG9zZQotICAgIC8vIG9u
IHRoZSByZW5kZXJlci4KLSAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAgbV9yZW5kZXItPnVw
ZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgCi0gICAgICAgIC8vIERlbGF5ZWQgYXR0YWNobWVudCBp
biBvcmRlciB0byBwcmV2ZW50IEZPVUMgY2FuIHJlc3VsdCBpbiBhbiBvYmplY3QgYmVpbmcKLSAg
ICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBmb2N1c2VkIGJlZm9yZSBpdCBoYXMgYSByZW5kZXIg
b2JqZWN0LiAgSWYgd2UgaGF2ZSBiZWVuIGZvY3VzZWQKLSAgICAgICAgLy8gKGkuZS4sIGlmIHdl
IGFyZSB0aGUgZm9jdXNOb2RlKSB0aGVuIGdvIGFoZWFkIGFuZCBmb2N1cyBvdXIgY29ycmVzcG9u
ZGluZyBuYXRpdmUgd2lkZ2V0LgotICAgICAgICAvLyAoQXR0YWNoL2RldGFjaCBjYW4gYWxzbyBo
YXBwZW4gYXMgYSByZXN1bHQgb2YgZGlzcGxheSB0eXBlIGNoYW5nZXMsIGUuZy4sIG1ha2luZyBh
IHdpZGdldAotICAgICAgICAvLyBibG9jayBpbnN0ZWFkIG9mIGlubGluZSwgYW5kIGZvY3VzIHNo
b3VsZCBiZSByZXN0b3JlZCBpbiB0aGF0IGNhc2UgYXMgd2VsbC4pCi0gICAgICAgIGlmIChnZXRE
b2N1bWVudCgpLT5mb2N1c05vZGUoKSA9PSB0aGlzICYmIG1fcmVuZGVyLT5pc1dpZGdldCgpICYm
IAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVyZXIoKSktPndp
ZGdldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVyZXIo
KSktPndpZGdldCgpLT5zZXRGb2N1cygpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApCi17Ci0gICAgaWYgKCFt
X2Zvcm0pIHsKLSAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIGEgbmV3IGZvcm0g
ZWxlbWVudCBiZWluZyBjcmVhdGVkIGJ5Ci0gICAgICAgIC8vIEphdmFTY3JpcHQgYW5kIGluc2Vy
dGVkIGluc2lkZSBhIGZvcm0uICBJbiB0aGUgY2FzZSBvZiB0aGUgcGFyc2VyCi0gICAgICAgIC8v
IHNldHRpbmcgYSBmb3JtLCB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBhIG5vbi1udWxsIHZhbHVlIGZv
ciBtX2Zvcm0sIAotICAgICAgICAvLyBhbmQgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGlu
Zy4KLSAgICAgICAgbV9mb3JtID0gZ2V0Rm9ybSgpOwotCWlmIChtX2Zvcm0pCi0JICAgIG1fZm9y
bS0+cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9j
ICYmIGlzUmFkaW9CdXR0b24oKSAmJiAhbmFtZSgpLmlzRW1wdHkoKSAmJiBpc0NoZWNrZWQoKSkK
LSAgICAgICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9uQ2hlY2tlZCgoSFRNTElucHV0RWxlbWVu
dEltcGwqKXRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVu
dEltcGw6Omluc2VydGVkSW50b1RyZWUoZGVlcCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApCi17Ci0gICAgLy8gV2hlbiBi
ZWluZyByZW1vdmVkIHdlIGhhdmUgdG8gcG9zc2libHkgbnVsbCBvdXQgb3VyIGZvcm0gYW5kIHJl
bW92ZSBvdXJzZWx2ZXMgZnJvbQotICAgIC8vIHRoZSBmb3JtJ3MgbGlzdCBvZiBlbGVtZW50cy4K
LSAgICBpZiAobV9mb3JtKSB7Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gcmUtYWNxdWlyZSB0aGUg
Zm9ybS4gIElmIHdlIGNhbid0IHJlLWFjcXVpcmUsIHRoZW4KLSAgICAgICAgLy8gcmVtb3ZlIG91
cnNlbHZlcyBmcm9tIHRoZSBmb3JtLgotICAgICAgICBOb2RlSW1wbCogZm9ybSA9IHBhcmVudE5v
ZGUoKTsKLSAgICAgICAgTm9kZUltcGwqIHJvb3QgPSB0aGlzOwotICAgICAgICB3aGlsZSAoZm9y
bSkgewotICAgICAgICAgICAgaWYgKGZvcm0tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByb290ID0gZm9ybTsKLSAgICAgICAgICAgIGZv
cm0gPSBmb3JtLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8v
IElmIHRoZSBmb3JtIGhhcyBiZWVuIGRlbW90ZWQgdG8gYSBsZWFmLCB0aGVuIHdlIHdvbid0IGZp
bmQgaXQgYXMgYW4gYW5jZXN0b3IuCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcm9v
dCBub2RlIG9mIG91ciBjdXJyZW50IGZvcm0gYW5kIG91ciByb290IG5vZGUKLSAgICAgICAgLy8g
bWF0Y2guICBJZiBzbywgcHJlc2VydmUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGZvcm0uCi0gICAg
ICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgTm9kZUltcGwqIGZvcm1Sb290ID0gbV9mb3Jt
OwotICAgICAgICAgICAgd2hpbGUgKGZvcm1Sb290LT5wYXJlbnQoKSkgZm9ybVJvb3QgPSBmb3Jt
Um9vdC0+cGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoZm9ybVJvb3QgPT0gcm9vdCkKLSAgICAg
ICAgICAgICAgICBmb3JtID0gbV9mb3JtOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAg
aWYgKCFmb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1FbGVtZW50KHRoaXMp
OwotICAgICAgICAgICAgbV9mb3JtID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBh
c3NlcnQoZm9ybSA9PSBtX2Zvcm0pOyAvLyBUaGUgcmUtYWNxdWlyZWQgZm9ybSBzaG91bGQgYmUg
dGhlIHNhbWUuIElmIG5vdCwgc29tZXRoaW5nIHJlYWxseSBzdHJhbmdlIGhhcHBlbmVkLgotICAg
IH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21UcmVlKGRlZXApOwotfQot
Ci1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Z2V0Rm9y
bSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUo
cCkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAgICAgICBwID0g
cC0+cGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcg
biA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0gICAgcmV0dXJuIG4uaXNOdWxsKCkgPyAiIiA6
IG47Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldE5hbWUoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobmFtZUF0dHIsIHZhbHVlKTsK
LX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25TZWxlY3QoKQotewotICAg
IC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUK
LSAgICBkaXNwYXRjaEhUTUxFdmVudChzZWxlY3RFdmVudCx0cnVlLGZhbHNlKTsKLX0KLQotdm9p
ZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25DaGFuZ2UoKQotewotICAgIC8vICMjIyBt
YWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUKLSAgICBkaXNw
YXRjaEhUTUxFdmVudChjaGFuZ2VFdmVudCx0cnVlLGZhbHNlKTsKLX0KLQotYm9vbCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGlzYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX2Rp
c2FibGVkOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXREaXNhYmxl
ZChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKGRpc2FibGVkQXR0ciwgYiA/ICIiIDogMCk7
Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFJlYWRPbmx5KGJvb2wg
YikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQot
dm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdl
IGNoICkKLXsKLSAgICAvL2Jvb2wgY2hhbmdlZCA9IGNoYW5nZWQoKTsKLSAgICBIVE1MRWxlbWVu
dEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotCi0gICAgaWYgKG1fcmVuZGVyIC8qJiYgY2hhbmdl
ZCovKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotYm9vbCBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAorSFRNTEZpZWxk
U2V0RWxlbWVudEltcGw6OkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9j
LCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQorICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bChmaWVsZHNldFRhZywgZG9jLCBmKQogewotICAgIGlmIChkaXNhYmxlZCgpIHx8ICFtX3JlbmRl
ciB8fCAKLSAgICAgICAgKG1fcmVuZGVyLT5zdHlsZSgpICYmIG1fcmVuZGVyLT5zdHlsZSgpLT52
aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkgfHwgCi0gICAgICAgIG1fcmVuZGVyLT53aWR0aCgpID09
IDAgfHwgbV9yZW5kZXItPmhlaWdodCgpID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNL
ZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0CitIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6fkhUTUxG
aWVsZFNldEVsZW1lbnRJbXBsKCkKIHsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAg
ICBpZiAobV9yZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAg
ICAgKHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3Vz
UG9saWN5KCkgJiBRV2lkZ2V0OjpUYWJGb2N1cyk7Ci0gICAgICAgIH0KLQlpZiAoZ2V0RG9jdW1l
bnQoKS0+ZnJhbWUoKSkKLQkgICAgcmV0dXJuIGdldERvY3VtZW50KCktPmZyYW1lKCktPnRhYnNU
b0FsbENvbnRyb2xzKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNNb3VzZUZvY3VzYWJsZSgpIGNvbnN0Citib29sIEhU
TUxGaWVsZFNldEVsZW1lbnRJbXBsOjpjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQp
CiB7Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyLT5pc1dp
ZGdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4o
bV9yZW5kZXIpLT53aWRnZXQoKSAmJgotICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxSZW5k
ZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpLT5mb2N1c1BvbGljeSgpICYgUVdpZGdldDo6
Q2xpY2tGb2N1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIDxpbnB1dCB0eXBlPWltYWdl
PiBhbmQgPGJ1dHRvbj4sIHdlIHdpbGwgYXNzdW1lIG5vIG1vdXNlIGZvY3VzYWJpbGl0eS4gIFRo
aXMgaXMKLSAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIE9TIFggYmVoYXZpb3IgZm9yIGJ1dHRv
bnMuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShsZWdlbmRUYWcpIHx8IEhUTUxFbGVtZW50SW1w
bDo6Y2hlY2tEVEQobmV3Q2hpbGQpOwogfQogCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjppc0VkaXRhYmxlKCkKK2Jvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmlzRm9jdXNh
YmxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIFNwZWNpYWwgY2hhcnMg
dXNlZCB0byBlbmNvZGUgZm9ybSBzdGF0ZSBzdHJpbmdzLgotLy8gV2UgcGljayBjaGFycyB0aGF0
IGFyZSB1bmxpa2VseSB0byBiZSB1c2VkIGluIGFuIEhUTUwgYXR0ciwgc28gd2UgcmFyZWx5IGhh
dmUgdG8gcmVhbGx5IGVuY29kZS4KLWNvbnN0IGNoYXIgc3RhdGVTZXBhcmF0b3IgPSAnJic7Ci1j
b25zdCBjaGFyIHN0YXRlRXNjYXBlID0gJzwnOwotc3RhdGljIGNvbnN0IGNoYXIgc3RhdGVTZXBh
cmF0b3JNYXJrZXJbXSA9ICI8QSI7Ci1zdGF0aWMgY29uc3QgY2hhciBzdGF0ZUVzY2FwZU1hcmtl
cltdID0gIjw8IjsKLQotLy8gRW5jb2RlIGFuIGVsZW1lbnQgbmFtZSBzbyB3ZSBjYW4gcHV0IGl0
IGluIGEgc3RhdGUgc3RyaW5nIHdpdGhvdXQgY29sbGlkaW5nCi0vLyB3aXRoIG91ciBzZXBhcmF0
b3IgY2hhci4KLXN0YXRpYyBRU3RyaW5nIGVuY29kZWRFbGVtZW50TmFtZShRU3RyaW5nIHN0cikK
LXsKLSAgICBpbnQgc2VwTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IpOwotICAgIGludCBl
c2NMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaWYgKHNlcExvYyA+PSAwIHx8
IGVzY0xvYyA+PSAwKSB7Ci0gICAgICAgIFFTdHJpbmcgbmV3U3RyID0gc3RyOwotICAgICAgICAv
LyAgIHJlcGxhY2UgIjwiIHdpdGggIjw8IgotICAgICAgICB3aGlsZSAoZXNjTG9jID49IDApIHsK
LSAgICAgICAgICAgIG5ld1N0ci5yZXBsYWNlKGVzY0xvYywgMSwgc3RhdGVFc2NhcGVNYXJrZXIp
OwotICAgICAgICAgICAgZXNjTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IsIGVzY0xvYysx
KTsKLSAgICAgICAgfQotICAgICAgICAvLyAgIHJlcGxhY2UgIiYiIHdpdGggIjxBIgotICAgICAg
ICB3aGlsZSAoc2VwTG9jID49IDApIHsKLSAgICAgICAgICAgIG5ld1N0ci5yZXBsYWNlKHNlcExv
YywgMSwgc3RhdGVTZXBhcmF0b3JNYXJrZXIpOwotICAgICAgICAgICAgc2VwTG9jID0gc3RyLmZp
bmQoc3RhdGVTZXBhcmF0b3IsIHNlcExvYysxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4g
bmV3U3RyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotfQotCi1R
U3RyaW5nIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIC8vIEJ1
aWxkIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgRWxlbWVudE5hbWUmRWxlbWVudFR5cGUmCi0gICAg
cmV0dXJuIGVuY29kZWRFbGVtZW50TmFtZShuYW1lKCkucXN0cmluZygpKSArIHN0YXRlU2VwYXJh
dG9yICsgdHlwZSgpLnFzdHJpbmcoKSArIHN0YXRlU2VwYXJhdG9yOwotfQotCi1RU3RyaW5nIEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShRU3RyaW5nTGlzdCAm
c3RhdGVzKQotewotICAgIFFTdHJpbmcgZW5jTmFtZSA9IGVuY29kZWRFbGVtZW50TmFtZShuYW1l
KCkucXN0cmluZygpKTsKLSAgICBRU3RyaW5nIHR5cGVTdHIgPSB0eXBlKCkucXN0cmluZygpOwot
ICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0ID0gc3RhdGVzLmJlZ2luKCk7IGl0ICE9
IHN0YXRlcy5lbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5nIHN0YXRlID0gKml0OwotICAg
ICAgICBpbnQgc2VwMSA9IHN0YXRlLmZpbmQoc3RhdGVTZXBhcmF0b3IpOwotICAgICAgICBpbnQg
c2VwMiA9IHN0YXRlLmZpbmQoc3RhdGVTZXBhcmF0b3IsIHNlcDErMSk7Ci0gICAgICAgIGFzc2Vy
dChzZXAxID49IDApOwotICAgICAgICBhc3NlcnQoc2VwMiA+PSAwKTsKLQotICAgICAgICBRU3Ry
aW5nIG5hbWVBbmRUeXBlID0gc3RhdGUubGVmdChzZXAyKTsKLSAgICAgICAgaWYgKGVuY05hbWUu
bGVuZ3RoKCkgKyB0eXBlU3RyLmxlbmd0aCgpICsgMSA9PSAodWludClzZXAyCi0gICAgICAgICAg
ICAmJiBuYW1lQW5kVHlwZS5zdGFydHNXaXRoKGVuY05hbWUpCi0gICAgICAgICAgICAmJiBuYW1l
QW5kVHlwZS5lbmRzV2l0aCh0eXBlU3RyKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGVz
LnJlbW92ZShpdCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGUubWlkKHNlcDIrMSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFFTdHJpbmc6Om51bGw7Ci19Ci0KLWludCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6dGFiSW5kZXgoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUodGFiaW5kZXhBdHRyKS50b0ludCgpOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpzZXRUYWJJbmRleChpbnQgdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHRhYmluZGV4QXR0ciwgUVN0cmluZzo6bnVtYmVyKHZhbHVlKSk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpIVE1MQnV0dG9uRWxlbWVudEltcGwo
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbChidXR0b25UYWcsIGRvYywgZikKLXsKLSAgICBtX3R5cGUgPSBT
VUJNSVQ7Ci0gICAgbV9kaXJ0eSA9IHRydWU7Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsK
LX0KLQotSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp+SFRNTEJ1dHRvbkVsZW1lbnRJbXBsKCkKK0RP
TVN0cmluZyBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0CiB7CisgICAgcmV0
dXJuICJmaWVsZHNldCI7CiB9CiAKLVJlbmRlck9iamVjdCogSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkK
LXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRoaXMpOwotfQotCi1ET01T
dHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKHR5cGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAg
aWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKGF0dHItPnZhbHVlKCksICJzdWJtaXQiKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IFNV
Qk1JVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwg
InJlc2V0IikpCi0gICAgICAgICAgICBtX3R5cGUgPSBSRVNFVDsKLSAgICAgICAgZWxzZSBpZiAo
ZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImJ1dHRvbiIpKQotICAgICAgICAgICAg
bV90eXBlID0gQlVUVE9OOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0
cikgewotICAgICAgICBtX3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgbV9jdXJyVmFs
dWUgPSBtX3ZhbHVlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0
dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmRlZmF1bHRFdmVu
dEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBCVVRUT04gJiYg
KGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQpKSB7Ci0KLSAgICAgICAgaWYobV9mb3Jt
ICYmIG1fdHlwZSA9PSBTVUJNSVQpIHsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1
ZTsKLSAgICAgICAgICAgIG1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpOwotICAgICAgICAgICAgbV9h
Y3RpdmVTdWJtaXQgPSBmYWxzZTsgLy8gaW4gY2FzZSB3ZSB3ZXJlIGNhbmNlbGVkCi0gICAgICAg
IH0KLSAgICAgICAgaWYobV9mb3JtICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgp
OwotICAgIH0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFu
ZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVs
U3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRv
bnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBI
b3dldmVyLCBvdGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJh
aW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNl
IGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0g
ICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGNvbnN0cmFpbnQgZm9yIG5vdy4KLSAgICAvLyBXYXM6IG1f
dHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJsZWQgJiYgIW5hbWUoKS5pc0VtcHR5KCkKLSAgICBy
ZXR1cm4gbV90eXBlID09IFNVQk1JVCAmJiAhbV9kaXNhYmxlZDsKLX0KLQotYm9vbCBIVE1MQnV0
dG9uRWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY3Rp
dmF0ZWRTdWJtaXQoYm9vbCBmbGFnKQotewotICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0K
LQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlz
dCYgZW5jb2RpbmcsIGJvb2wgLyptdWx0aXBhcnQqLykKLXsKLSAgICBpZiAobV90eXBlICE9IFNV
Qk1JVCB8fCBuYW1lKCkuaXNFbXB0eSgpIHx8ICFtX2FjdGl2ZVN1Ym1pdCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBtX2N1cnJWYWx1ZSk7
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nl
c3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQoteyAgIAotICAgIC8vIHNlbmQgdGhl
IG1vdXNlIGJ1dHRvbiBldmVudHMgaWZmIHRoZQotICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2Vu
ZFRvQW55RWxlbWVudAotICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi1ET01TdHJp
bmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1l
bnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRv
bkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2
YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1
ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6
OkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmKQotICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChmaWVsZHNldFRhZywg
ZG9jLCBmKQotewotfQotCi1IVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6fkhUTUxGaWVsZFNldEVs
ZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y2hlY2tE
VEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFz
VGFnTmFtZShsZWdlbmRUYWcpIHx8IEhUTUxFbGVtZW50SW1wbDo6Y2hlY2tEVEQobmV3Q2hpbGQp
OwotfQotCi1ib29sIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTEZpZWxkU2V0RWxlbWVu
dEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAiZmllbGRzZXQiOwotfQotCi1SZW5k
ZXJPYmplY3QqIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJB
cmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKK1JlbmRlck9iamVjdCogSFRNTEZpZWxk
U2V0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVy
U3R5bGUqIHN0eWxlKQogewogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGaWVsZHNldCh0
aGlzKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6
SFRNTElucHV0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudElt
cGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChpbnB1dFRhZywgZG9jLCBm
KQotewotICAgIGluaXQoKTsKLX0KLQotSFRNTElucHV0RWxlbWVudEltcGw6OkhUTUxJbnB1dEVs
ZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9j
LCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwodGFnTmFtZSwgZG9jLCBmKQotewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6aW5pdCgpCi17Ci0gICAgbV9pbWFnZUxvYWRlciA9IDA7Ci0gICAgbV92YWx1
ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIG1fdHlwZSA9IFRFWFQ7Ci0gICAgbV9tYXhM
ZW4gPSAtMTsKLSAgICBtX3NpemUgPSAyMDsKLSAgICBtX2NoZWNrZWQgPSBmYWxzZTsKLSAgICBt
X2RlZmF1bHRDaGVja2VkID0gZmFsc2U7Ci0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7
Ci0gICAgbV9pbmRldGVybWluYXRlID0gZmFsc2U7Ci0KLSAgICBtX2hhdmVUeXBlID0gZmFsc2U7
Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsKLSAgICBtX2F1dG9jb21wbGV0ZSA9IHRydWU7
Ci0gICAgbV9pbml0ZWQgPSBmYWxzZTsKLQotICAgIHhQb3MgPSAwOwotICAgIHlQb3MgPSAwOwot
Ci0gICAgbV9tYXhSZXN1bHRzID0gLTE7Ci0KLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2F1
dG9jb21wbGV0ZSA9IG1fZm9ybS0+YXV0b0NvbXBsZXRlKCk7Ci19Ci0KLUhUTUxJbnB1dEVsZW1l
bnRJbXBsOjp+SFRNTElucHV0RWxlbWVudEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgp
KSBnZXREb2N1bWVudCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci0gICAgZGVs
ZXRlIG1faW1hZ2VMb2FkZXI7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fbmFtZS5pc051bGwoKSA/ICIiIDogbV9uYW1l
OwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkg
Y29uc3QKLXsKLSAgICAvLyBJZiB0aGUgYmFzZSBjbGFzcyBzYXlzIHdlIGNhbid0IGJlIGZvY3Vz
ZWQsIHRoZW4gd2UgY2FuIHN0b3Agbm93LgotICAgIGlmICghSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKG1fdHlwZSA9PSBSQURJTykgewotICAgICAgICAvLyBVbm5hbWVkIHJhZGlvIGJ1dHRv
bnMgYXJlIG5ldmVyIGZvY3VzYWJsZSAobWF0Y2hlcyBXaW5JRSkuCi0gICAgICAgIGlmIChuYW1l
KCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIE5l
dmVyIGFsbG93IGtleWJvYXJkIHRhYmJpbmcgdG8gbGVhdmUgeW91IGluIHRoZSBzYW1lIHJhZGlv
IGdyb3VwLiAgQWx3YXlzCi0gICAgICAgIC8vIHNraXAgYW55IG90aGVyIGVsZW1lbnRzIGluIHRo
ZSBncm91cC4KLSAgICAgICAgTm9kZUltcGwqIGN1cnJlbnRGb2N1c05vZGUgPSBnZXREb2N1bWVu
dCgpLT5mb2N1c05vZGUoKTsKLSAgICAgICAgaWYgKGN1cnJlbnRGb2N1c05vZGUgJiYgY3VycmVu
dEZvY3VzTm9kZS0+aGFzVGFnTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1
dEVsZW1lbnRJbXBsKiBmb2N1c2VkSW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
SW1wbCo+KGN1cnJlbnRGb2N1c05vZGUpOwotICAgICAgICAgICAgaWYgKGZvY3VzZWRJbnB1dC0+
aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgZm9jdXNlZElucHV0LT5mb3JtKCkgPT0gbV9mb3JtICYm
Ci0gICAgICAgICAgICAgICAgZm9jdXNlZElucHV0LT5uYW1lKCkgPT0gbmFtZSgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8g
QWxsb3cga2V5Ym9hcmQgZm9jdXMgaWYgd2UncmUgY2hlY2tlZCBvciBpZiBub3RoaW5nIGluIHRo
ZSBncm91cCBpcyBjaGVja2VkLgotICAgICAgICByZXR1cm4gY2hlY2tlZCgpIHx8ICFnZXREb2N1
bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0p
OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c2V0VHlwZShjb25zdCBET01TdHJpbmcmIHQpCi17Ci0gICAgaWYgKHQuaXNFbXB0
eSgpKSB7Ci0gICAgICAgIGludCBleGNjb2RlOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUodHlw
ZUF0dHIsIGV4Y2NvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHNldEF0dHJpYnV0ZSh0
eXBlQXR0ciwgdCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldElucHV0VHlw
ZShjb25zdCBET01TdHJpbmcmIHQpCi17Ci0gICAgdHlwZUVudW0gbmV3VHlwZTsKLSAgICAKLSAg
ICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInBhc3N3b3JkIikpCi0gICAgICAgIG5ld1R5cGUg
PSBQQVNTV09SRDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiY2hlY2tib3gi
KSkKLSAgICAgICAgbmV3VHlwZSA9IENIRUNLQk9YOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKHQsICJyYWRpbyIpKQotICAgICAgICBuZXdUeXBlID0gUkFESU87Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInN1Ym1pdCIpKQotICAgICAgICBuZXdUeXBlID0gU1VC
TUlUOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyZXNldCIpKQotICAgICAg
ICBuZXdUeXBlID0gUkVTRVQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImZp
bGUiKSkKLSAgICAgICAgbmV3VHlwZSA9IEZJTEU7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgImhpZGRlbiIpKQotICAgICAgICBuZXdUeXBlID0gSElEREVOOwotICAgIGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJpbWFnZSIpKQotICAgICAgICBuZXdUeXBlID0gSU1B
R0U7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImJ1dHRvbiIpKQotICAgICAg
ICBuZXdUeXBlID0gQlVUVE9OOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJr
aHRtbF9pc2luZGV4IikpCi0gICAgICAgIG5ld1R5cGUgPSBJU0lOREVYOwotICAgIGVsc2UgaWYg
KGVxdWFsSWdub3JpbmdDYXNlKHQsICJzZWFyY2giKSkKLSAgICAgICAgbmV3VHlwZSA9IFNFQVJD
SDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmFuZ2UiKSkKLSAgICAgICAg
bmV3VHlwZSA9IFJBTkdFOwotICAgIGVsc2UKLSAgICAgICAgbmV3VHlwZSA9IFRFWFQ7Ci0KLSAg
ICAvLyAjIyMgSU1QT1JUQU5UOiBEb24ndCBhbGxvdyB0aGUgdHlwZSB0byBiZSBjaGFuZ2VkIHRv
IEZJTEUgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgLy8gdHlwZSBjaGFuZ2UsIG90aGVyd2lzZSBhIEph
dmFTY3JpcHQgcHJvZ3JhbW1lciB3b3VsZCBiZSBhYmxlIHRvIHNldCBhIHRleHQKLSAgICAvLyBm
aWVsZCdzIHZhbHVlIHRvIHNvbWV0aGluZyBsaWtlIC9ldGMvcGFzc3dkIGFuZCB0aGVuIGNoYW5n
ZSBpdCB0byBhIGZpbGUgZmllbGQuCi0gICAgaWYgKG1fdHlwZSAhPSBuZXdUeXBlKSB7Ci0gICAg
ICAgIGlmIChuZXdUeXBlID09IEZJTEUgJiYgbV9oYXZlVHlwZSkgewotICAgICAgICAgICAgLy8g
U2V0IHRoZSBhdHRyaWJ1dGUgYmFjayB0byB0aGUgb2xkIHZhbHVlLgotICAgICAgICAgICAgLy8g
VXNlZnVsIGluIGNhc2Ugd2Ugd2VyZSBjYWxsZWQgZnJvbSBpbnNpZGUgcGFyc2VNYXBwZWRBdHRy
aWJ1dGUuCi0gICAgICAgICAgICBzZXRBdHRyaWJ1dGUodHlwZUF0dHIsIHR5cGUoKSk7Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmICFuYW1lKCku
aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldERvY3VtZW50KCktPmNoZWNrZWRS
YWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSkgPT0gdGhpcykKLSAgICAg
ICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChuYW1l
KCkuaW1wbCgpLCBtX2Zvcm0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbCB3YXNB
dHRhY2hlZCA9IG1fYXR0YWNoZWQ7Ci0gICAgICAgICAgICBpZiAod2FzQXR0YWNoZWQpCi0gICAg
ICAgICAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgICAgICBib29sIGRpZFN0b3JlVmFsdWUgPSBz
dG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpOwotICAgICAgICAgICAgbV90eXBlID0g
bmV3VHlwZTsKLSAgICAgICAgICAgIGJvb2wgd2lsbFN0b3JlVmFsdWUgPSBzdG9yZXNWYWx1ZVNl
cGFyYXRlRnJvbUF0dHJpYnV0ZSgpOwotICAgICAgICAgICAgaWYgKGRpZFN0b3JlVmFsdWUgJiYg
IXdpbGxTdG9yZVZhbHVlICYmICFtX3ZhbHVlLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAg
c2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbV92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgbV92YWx1
ZSA9IERPTVN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaWRTdG9y
ZVZhbHVlICYmIHdpbGxTdG9yZVZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZSA9IGdl
dEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdh
c0F0dGFjaGVkKQotICAgICAgICAgICAgICAgIGF0dGFjaCgpOwotICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgLy8gSWYgb3VyIHR5cGUgbW9ycGhzIGludG8gYSByYWRpbyBidXR0b24gYW5k
IHdlIGFyZSBjaGVja2VkLCB0aGVuIGdvIGFoZWFkCi0gICAgICAgICAgICAvLyBhbmQgc2lnbmFs
IHRoaXMgdG8gdGhlIGZvcm0uCi0gICAgICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNo
ZWNrZWQoKSkKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNr
ZWQodGhpcywgbV9mb3JtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX2hhdmVUeXBlID0gdHJ1
ZTsKLSAgICAKLSAgICBpZiAobV90eXBlICE9IElNQUdFICYmIG1faW1hZ2VMb2FkZXIpIHsKLSAg
ICAgICAgZGVsZXRlIG1faW1hZ2VMb2FkZXI7Ci0gICAgICAgIG1faW1hZ2VMb2FkZXIgPSAwOwot
ICAgIH0KLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QK
LXsKLSAgICAvLyBuZWVkcyB0byBiZSBsb3dlcmNhc2UgYWNjb3JkaW5nIHRvIERPTSBzcGVjCi0g
ICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIFRFWFQ6IHJldHVybiAidGV4dCI7Ci0gICAg
Y2FzZSBQQVNTV09SRDogcmV0dXJuICJwYXNzd29yZCI7Ci0gICAgY2FzZSBDSEVDS0JPWDogcmV0
dXJuICJjaGVja2JveCI7Ci0gICAgY2FzZSBSQURJTzogcmV0dXJuICJyYWRpbyI7Ci0gICAgY2Fz
ZSBTVUJNSVQ6IHJldHVybiAic3VibWl0IjsKLSAgICBjYXNlIFJFU0VUOiByZXR1cm4gInJlc2V0
IjsKLSAgICBjYXNlIEZJTEU6IHJldHVybiAiZmlsZSI7Ci0gICAgY2FzZSBISURERU46IHJldHVy
biAiaGlkZGVuIjsKLSAgICBjYXNlIElNQUdFOiByZXR1cm4gImltYWdlIjsKLSAgICBjYXNlIEJV
VFRPTjogcmV0dXJuICJidXR0b24iOwotICAgIGNhc2UgU0VBUkNIOiByZXR1cm4gInNlYXJjaCI7
Ci0gICAgY2FzZSBSQU5HRTogcmV0dXJuICJyYW5nZSI7Ci0gICAgY2FzZSBJU0lOREVYOiByZXR1
cm4gIiI7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLX0KLQotUVN0cmluZyBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICBhc3NlcnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8v
IHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFzc3dvcmQgZmllbGRzCi0KLSAgICBRU3RyaW5n
IHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCk7Ci0gICAgc3dpdGNo
IChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgICAg
IHJldHVybiBzdGF0ZSArIChjaGVja2VkKCkgPyAib24iIDogIm9mZiIpOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIHJldHVybiBzdGF0ZSArIHZhbHVlKCkucXN0cmluZygpKycuJzsgLy8gTWFrZSBz
dXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IQotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgYXNz
ZXJ0KG1fdHlwZSAhPSBQQVNTV09SRCk7CQkvLyBzaG91bGQgbmV2ZXIgc2F2ZS9yZXN0b3JlIHBh
c3N3b3JkIGZpZWxkcwotICAgIAotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoc3RhdGVzKTsKLSAgICBpZiAoc3RhdGUuaXNO
dWxsKCkpIHJldHVybjsKLQotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBDSEVDS0JP
WDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICBzZXRDaGVja2VkKChzdGF0ZSA9PSAib24iKSk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNldFZhbHVlKERPTVN0cmlu
ZyhzdGF0ZS5sZWZ0KHN0YXRlLmxlbmd0aCgpLTEpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0K
LX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y2FuSGF2ZVNlbGVjdGlvbigpCi17Ci0g
ICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotaW50IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZWxlY3Rpb25TdGFydCgpCi17
Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuIDA7Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUp
IHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRp
dCAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6c2VsZWN0aW9uRW5kKCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4g
MDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgot
ICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uRW5k
KCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblN0YXJ0
KGludCBzdGFydCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dp
dGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFS
Q0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxp
bmVFZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19
Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQot
ewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAg
Y2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9y
ZW5kZXIpLT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZWxlY3QoICApCi17Ci0gICAgaWYoIW1fcmVuZGVyKSByZXR1cm47Ci0K
LSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBz
dGF0aWNfY2FzdDxSZW5kZXJGaWxlQnV0dG9uKj4obV9yZW5kZXIpLT5zZWxlY3QoKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJD
SDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGlu
ZUVkaXQqPihtX3JlbmRlciktPnNlbGVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIEhJRERF
TjoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICBj
YXNlIFJBRElPOgotICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICBjYXNlIFJFU0VUOgotICAg
ICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5k
KQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4o
bV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cywgYm9v
bCBzaG93UHJlc3NlZExvb2spCi17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewotICAgICAg
ICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlwZQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICBjYXNlIFJFU0VU
OgotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgaWYgKHJlbmRlcmVy
KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJGaWxlQnV0dG9uICo+KHJl
bmRlcmVyKCkpLT5jbGljayhzZW5kTW91c2VFdmVudHMpOwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAg
ICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUEFTU1dP
UkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICBj
YXNlIFRFWFQ6Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2so
c2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9v
bCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIHN3aXRjaCAoaW5wdXRUeXBlKCkpIHsKLSAgICAg
ICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAvLyBhIG5vLW9wIGZvciB0aGlzIHR5cGUKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2UgUEFTU1dP
UkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAg
ICAgICBmb2N1cygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6
Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICBjYXNl
IFJFU0VUOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAg
ICAgY2FzZSBGSUxFOgotICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAgICAgLy8gZm9jdXMK
LSAgICAgICAgICAgIGZvY3VzKCk7Ci0KLSAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1vdXNlIGJ1
dHRvbiBldmVudHMgaWZmIHRoZQotICAgICAgICAgICAgLy8gY2FsbGVyIHNwZWNpZmllZCBzZW5k
VG9BbnlFbGVtZW50Ci0gICAgICAgICAgICBjbGljayhzZW5kVG9BbnlFbGVtZW50KTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6bWFw
VG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50
cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gd2lkdGhBdHRyIHx8Ci0g
ICAgICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdnNw
YWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIHJl
c3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIAot
ICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVJlcGxh
Y2VkOyAvLyBTaGFyZSB3aXRoIDxpbWc+IHNpbmNlIHRoZSBhbGlnbm1lbnQgYmVoYXZpb3IgaXMg
dGhlIHNhbWUuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJu
IEhUTUxFbGVtZW50SW1wbDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0g
ICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpICYmIG1fZm9ybSkgewotICAg
ICAgICAgICAgLy8gUmVtb3ZlIHRoZSByYWRpbyBmcm9tIGl0cyBvbGQgZ3JvdXAuCi0gICAgICAg
ICAgICBpZiAobV90eXBlID09IFJBRElPICYmICFtX25hbWUuaXNFbXB0eSgpKQotICAgICAgICAg
ICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAobV9uYW1lLmltcGwo
KSwgbV9mb3JtKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gVXBkYXRlIG91ciBj
YWNoZWQgcmVmZXJlbmNlIHRvIHRoZSBuYW1lLgotICAgICAgICBtX25hbWUgPSBhdHRyLT52YWx1
ZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGl0IHRvIGl0cyBuZXcgZ3JvdXAuCi0gICAg
ICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpKQotICAgICAgICAgICAgZ2V0RG9j
dW1lbnQoKS0+cmFkaW9CdXR0b25DaGVja2VkKHRoaXMsIG1fZm9ybSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYXV0b2NvbXBsZXRlQXR0cikgewotICAgICAgICBtX2F1dG9jb21w
bGV0ZSA9ICFlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gIHR5cGVBdHRyKSB7Ci0gICAgICAgIHNldElucHV0VHlw
ZShhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0
dHIpIHsKLSAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHNldENoYW5nZWQgaWYgdGhlIGZvcm0g
aXMgbG9va2luZyBhdCB0aGUgZGVmYXVsdCB2YWx1ZSByaWdodCBub3cuCi0gICAgICAgIGlmICht
X3ZhbHVlLmlzTnVsbCgpKQotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICBtX3Zh
bHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gY2hlY2tlZEF0dHIpIHsKLSAgICAgICAgbV9kZWZhdWx0Q2hlY2tlZCA9ICFhdHRyLT5pc051
bGwoKTsKLSAgICAgICAgaWYgKG1fdXNlRGVmYXVsdENoZWNrZWQpIHsKLSAgICAgICAgICAgIHNl
dENoZWNrZWQobV9kZWZhdWx0Q2hlY2tlZCk7Ci0gICAgICAgICAgICBtX3VzZURlZmF1bHRDaGVj
a2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1h
eGxlbmd0aEF0dHIpIHsKLSAgICAgICAgbV9tYXhMZW4gPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRy
LT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IHNpemVBdHRyKSB7Ci0gICAgICAgIG1fc2l6ZSA9ICFhdHRy
LT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IDIwOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IGFsdEF0dHIpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyICYmIG1fdHlw
ZSA9PSBJTUFHRSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckltYWdlKj4obV9yZW5k
ZXIpLT51cGRhdGVBbHRUZXh0KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc3Jj
QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90eXBlID09IElNQUdFKSB7Ci0gICAg
ICAgICAgICBpZiAoIW1faW1hZ2VMb2FkZXIpCi0gICAgICAgICAgICAgICAgbV9pbWFnZUxvYWRl
ciA9IG5ldyBIVE1MSW1hZ2VMb2FkZXIodGhpcyk7Ci0gICAgICAgICAgICBtX2ltYWdlTG9hZGVy
LT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gdXNlbWFwQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGFj
Y2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3IgdGhlIG1vbWVudAot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZzcGFjZUF0dHIpIHsKLSAgICAgICAgYWRk
Q1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9UT1AsIGF0dHItPnZhbHVlKCkpOwotICAg
ICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX0JPVFRPTSwgYXR0ci0+dmFs
dWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaHNwYWNlQXR0cikgewotICAg
ICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX0xFRlQsIGF0dHItPnZhbHVl
KCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1JJR0hULCBh
dHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIp
IHsKLSAgICAgICAgYWRkSFRNTEFsaWdubWVudChhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19Q
Uk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlH
SFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9j
dXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAg
c2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbnNlbGVjdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVu
ZXIoc2VsZWN0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
Y2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwg
YXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25pbnB1dEF0dHIpIHsKLSAg
ICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoaW5wdXRFdmVudCwgYXR0cik7Ci0gICAgfQotICAg
IC8vIFNlYXJjaCBmaWVsZCBhbmQgc2xpZGVyIGF0dHJpYnV0ZXMgYWxsIGp1c3QgY2F1c2UgdXBk
YXRlRnJvbUVsZW1lbnQgdG8gYmUgY2FsbGVkIHRocm91Z2ggc3R5bGUKLSAgICAvLyByZWNhbGNp
bmcuCi0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc2VhcmNoQXR0cikgewotICAgICAg
ICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWFyY2hFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gcmVzdWx0c0F0dHIpIHsKLSAgICAgICAgbV9tYXhSZXN1bHRzID0g
IWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogLTE7Ci0gICAgICAgIHNl
dENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvc2F2ZUF0dHIg
fHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBpbmNyZW1lbnRhbEF0dHIgfHwKLSAg
ICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBwbGFjZWhvbGRlckF0dHIgfHwKLSAgICAgICAg
ICAgICAgIGF0dHItPm5hbWUoKSA9PSBtaW5BdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5u
YW1lKCkgPT0gbWF4QXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHByZWNp
c2lvbkF0dHIpIHsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZQotICAgICAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19
Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5
bGUgKnN0eWxlKQotewotICAgIHN3aXRjaChtX3R5cGUpCi0gICAgewotICAgIGNhc2UgVEVYVDoK
LSAgICBjYXNlIFBBU1NXT1JEOgotICAgIGNhc2UgU0VBUkNIOgotICAgIGNhc2UgUkFOR0U6Ci0g
ICAgY2FzZSBJU0lOREVYOgotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAg
ICBjYXNlIFNVQk1JVDoKLSAgICBjYXNlIElNQUdFOgotICAgIGNhc2UgUkVTRVQ6Ci0gICAgY2Fz
ZSBGSUxFOgotICAgIGNhc2UgQlVUVE9OOiAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6cmVuZGVyZXJJc05lZWRlZChzdHlsZSk7Ci0gICAgY2FzZSBISURERU46ICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLSAgICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotUmVuZGVyT2JqZWN0ICpIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVu
ZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlw
ZSkKLSAgICB7Ci0gICAgY2FzZSBURVhUOgotICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBT
RUFSQ0g6Ci0gICAgY2FzZSBJU0lOREVYOiAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckxpbmVF
ZGl0KHRoaXMpOwotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAg
cmV0dXJuIFJlbmRlck9iamVjdDo6Y3JlYXRlT2JqZWN0KHRoaXMsIHN0eWxlKTsKLSAgICBjYXNl
IFNVQk1JVDoKLSAgICBjYXNlIFJFU0VUOgotICAgIGNhc2UgQlVUVE9OOgotICAgICAgICByZXR1
cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgSU1BR0U6ICAgIHJl
dHVybiBuZXcgKGFyZW5hKSBSZW5kZXJJbWFnZUJ1dHRvbih0aGlzKTsKLSAgICBjYXNlIEZJTEU6
ICAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyRmlsZUJ1dHRvbih0aGlzKTsKLSAgICBjYXNl
IFJBTkdFOiAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2xpZGVyKHRoaXMpOwotICAgIGNh
c2UgSElEREVOOiAgIGJyZWFrOwotICAgIH0KLSAgICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVy
biAwOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphdHRhY2goKQotewotICAgIGlm
ICghbV9pbml0ZWQpIHsKLSAgICAgICAgaWYgKCFtX2hhdmVUeXBlKQotICAgICAgICAgICAgc2V0
SW5wdXRUeXBlKGdldEF0dHJpYnV0ZSh0eXBlQXR0cikpOwotCi0gICAgICAgIC8vIEZJWE1FOiBU
aGlzIG5lZWRzIHRvIGJlIGR5bmFtaWMsIGRvZXNuJ3QgaXQsIHNpbmNlIHNvbWVvbmUgY291bGQg
c2V0IHRoaXMKLSAgICAgICAgLy8gYWZ0ZXIgYXR0YWNobWVudD8KLSAgICAgICAgRE9NU3RyaW5n
IHZhbCA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotICAgICAgICBpZiAoKHVpbnQpIG1fdHlw
ZSA8PSBJU0lOREVYICYmICF2YWwuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUg
bmV3bGluZSBzdHVmZi4uCi0gICAgICAgICAgICBRU3RyaW5nIG52YWx1ZTsKLSAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdmFsLmxlbmd0aCgpOyArK2kpCi0gICAgICAg
ICAgICAgICAgaWYgKHZhbFtpXSA+PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIG52YWx1ZSAr
PSB2YWxbaV07Ci0KLSAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoKCkgIT0gbnZhbHVlLmxlbmd0
aCgpKQotICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIG52YWx1ZSk7Ci0g
ICAgICAgIH0KLQotICAgICAgICBtX2luaXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gRGlz
YWxsb3cgdGhlIHdpZHRoIGF0dHJpYnV0ZSBvbiBpbnB1dHMgb3RoZXIgdGhhbiBISURERU4gYW5k
IElNQUdFLgotICAgIC8vIER1bWIgV2ViIHNpdGVzIHdpbGwgdHJ5IHRvIHNldCB0aGUgd2lkdGgg
YXMgYW4gYXR0cmlidXRlIG9uIGZvcm0gY29udHJvbHMgdGhhdCBhcmVuJ3QKLSAgICAvLyBpbWFn
ZXMgb3IgaGlkZGVuLgotICAgIGlmIChoYXNNYXBwZWRBdHRyaWJ1dGVzKCkgJiYgbV90eXBlICE9
IEhJRERFTiAmJiBtX3R5cGUgIT0gSU1BR0UgJiYgIWdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpLmlz
RW1wdHkoKSkgewotICAgICAgICBpbnQgZXhjQ29kZTsKLSAgICAgICAgcmVtb3ZlQXR0cmlidXRl
KHdpZHRoQXR0ciwgZXhjQ29kZSk7Ci0gICAgfQotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmF0dGFjaCgpOwotCi0gICAgaWYgKG1fdHlwZSA9PSBJTUFHRSkgewotICAgICAgICBp
ZiAoIW1faW1hZ2VMb2FkZXIpCi0gICAgICAgICAgICBtX2ltYWdlTG9hZGVyID0gbmV3IEhUTUxJ
bWFnZUxvYWRlcih0aGlzKTsKLSAgICAgICAgbV9pbWFnZUxvYWRlci0+dXBkYXRlRnJvbUVsZW1l
bnQoKTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgICAgIFJlbmRlckltYWdl
KiBpbWFnZU9iaiA9IHN0YXRpY19jYXN0PFJlbmRlckltYWdlKj4ocmVuZGVyZXIoKSk7Ci0gICAg
ICAgICAgICBpbWFnZU9iai0+c2V0SW1hZ2UobV9pbWFnZUxvYWRlci0+aW1hZ2UoKSk7ICAgIAot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbm90ZSB3ZSBkb24ndCBkZWFsIHdpdGggY2FsbGlu
ZyBwYXNzd29yZEZpZWxkUmVtb3ZlZCgpIG9uIGRldGFjaCwgYmVjYXVzZSB0aGUgdGltaW5nCi0g
ICAgLy8gd2FzIHN1Y2ggdGhhdCBpdCBjbGVhcmVkIG91ciBzdGF0ZSB0b28gZWFybHkKLSAgICBp
ZiAobV90eXBlID09IFBBU1NXT1JEKQotICAgICAgICBnZXREb2N1bWVudCgpLT5wYXNzd29yZEZp
ZWxkQWRkZWQoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGV0YWNoKCkKLXsK
LSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGV0YWNoKCk7Ci0gICAgbV92YWx1ZU1h
dGNoZXNSZW5kZXJlciA9IGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudElt
cGw6OmFsdFRleHQoKSBjb25zdAotewotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgv
UkVDLWh0bWw0MC0xOTk4MDQyNC9hcHBlbmRpeC9ub3Rlcy5odG1sI2FsdGdlbgotICAgIC8vIGFs
c28gaGVhdmlseSBkaXNjdXNzZWQgYnkgSGl4aWUgb24gYnVnemlsbGEKLSAgICAvLyBub3RlIHRo
aXMgaXMgaW50ZW50aW9uYWxseSBkaWZmZXJlbnQgdG8gSFRNTEltYWdlRWxlbWVudEltcGw6OmFs
dFRleHQoKQotICAgIERPTVN0cmluZyBhbHQgPSBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci0gICAg
Ly8gZmFsbCBiYWNrIHRvIHRpdGxlIGF0dHJpYnV0ZQotICAgIGlmIChhbHQuaXNOdWxsKCkpCi0g
ICAgICAgIGFsdCA9IGdldEF0dHJpYnV0ZSh0aXRsZUF0dHIpOwotICAgIGlmIChhbHQuaXNOdWxs
KCkpCi0gICAgICAgIGFsdCA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotICAgIGlmIChhbHQu
aXNFbXB0eSgpKQotICAgICAgICBhbHQgPSBpbnB1dEVsZW1lbnRBbHRUZXh0KCk7Ci0KLSAgICBy
ZXR1cm4gYWx0OwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc1N1Y2Nlc3NmdWxT
dWJtaXRCdXR0b24oKSBjb25zdAotewotICAgIC8vIEhUTUwgc3BlYyBzYXlzIHRoYXQgYnV0dG9u
cyBtdXN0IGhhdmUgbmFtZXMKLSAgICAvLyB0byBiZSBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwuIEhv
d2V2ZXIsIG90aGVyIGJyb3dzZXJzCi0gICAgLy8gZG8gbm90IGltcG9zZSB0aGlzIGNvbnN0cmFp
bnQuIFRoZXJlZm9yZSwgd2UgYmVoYXZlCi0gICAgLy8gZGlmZmVyZW50bHkgYW5kIGNhbiB1c2Ug
ZGlmZmVyZW50IGJ1dHRvbnMgdGhhbiB0aGUgCi0gICAgLy8gYXV0aG9yIGludGVuZGVkLiAKLSAg
ICAvLyBXYXM6IChtX3R5cGUgPT0gU1VCTUlUICYmICFuYW1lKCkuaXNFbXB0eSgpKQotICAgIHJl
dHVybiAhbV9kaXNhYmxlZCAmJiAobV90eXBlID09IElNQUdFIHx8IG1fdHlwZSA9PSBTVUJNSVQp
OwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0FjdGl2YXRlZFN1Ym1pdCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0OwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKQotewotICAgIG1fYWN0aXZl
U3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YXBwZW5kRm9y
bURhdGEoRm9ybURhdGFMaXN0ICZlbmNvZGluZywgYm9vbCBtdWx0aXBhcnQpCi17Ci0gICAgLy8g
aW1hZ2UgZ2VuZXJhdGVzIGl0cyBvd24gbmFtZXMKLSAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSAm
JiBtX3R5cGUgIT0gSU1BR0UpIHJldHVybiBmYWxzZTsKLQotICAgIHN3aXRjaCAobV90eXBlKSB7
Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2Ug
U0VBUkNIOgotICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAg
ICAgICAgICAgLy8gYWx3YXlzIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgIGVuY29kaW5nLmFwcGVu
ZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg
ICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAgICBpZiAo
Y2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCks
IHZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2Ug
UkVTRVQ6Ci0gICAgICAgICAgICAvLyB0aG9zZSBidXR0b25zIGFyZSBuZXZlciBzdWNjZXNzZnVs
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAg
ICAgICAgIGlmIChtX2FjdGl2ZVN1Ym1pdCkgewotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFw
cGVuZERhdGEobmFtZSgpLmlzRW1wdHkoKSA/ICJ4IiA6IChuYW1lKCkgKyAiLngiKSwgY2xpY2tY
KCkpOwotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLmlzRW1wdHko
KSA/ICJ5IiA6IChuYW1lKCkgKyAiLnkiKSwgY2xpY2tZKCkpOwotICAgICAgICAgICAgICAgIGlm
ICghbmFtZSgpLmlzRW1wdHkoKSAmJiAhdmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0g
ICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0g
ICAgICAgICAgICAgICAgRE9NU3RyaW5nIGVuY19zdHIgPSB2YWx1ZVdpdGhEZWZhdWx0KCk7Ci0g
ICAgICAgICAgICAgICAgaWYgKCFlbmNfc3RyLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAg
ICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgZW5jX3N0cik7Ci0gICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgewotICAgICAg
ICAgICAgLy8gY2FuJ3Qgc3VibWl0IGZpbGUgb24gR0VUCi0gICAgICAgICAgICAvLyBkb24ndCBz
dWJtaXQgaWYgZGlzcGxheTogbm9uZSBvciBkaXNwbGF5OiBoaWRkZW4KLSAgICAgICAgICAgIGlm
KCFtdWx0aXBhcnQgfHwgIXJlbmRlcmVyKCkgfHwgcmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJp
bGl0eSgpICE9IGtodG1sOjpWSVNJQkxFKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICAgICAgLy8gaWYgbm8gZmlsZW5hbWUgYXQgYWxsIGlzIGVudGVyZWQsIHJldHVy
biBzdWNjZXNzZnVsLCBob3dldmVyIGVtcHR5Ci0gICAgICAgICAgICAvLyBudWxsIHdvdWxkIGJl
IG1vcmUgbG9naWNhbCBidXQgbmV0c2NhcGUgcG9zdHMgYW4gZW1wdHkgZmlsZS4gYXJnaC4KLSAg
ICAgICAgICAgIGlmICh2YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGVuY29k
aW5nLmFwcGVuZERhdGEobmFtZSgpLCBRU3RyaW5nKCIiKSk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZEZp
bGUobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9
Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEo
bmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnJlc2V0KCkKLXsK
LSAgICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkKLSAgICAgICAgc2V0
VmFsdWUoRE9NU3RyaW5nKCkpOwotICAgIHNldENoZWNrZWQobV9kZWZhdWx0Q2hlY2tlZCk7Ci0g
ICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OnNldENoZWNrZWQoYm9vbCBfY2hlY2tlZCkKLXsKLSAgICAvLyBXaW5JRSBkb2VzIG5v
dCBhbGxvdyB1bm5hbWVkIHJhZGlvIGJ1dHRvbnMgdG8gZXZlbiBiZSBjaGVja2VkLgotICAgIGlm
IChjaGVja2VkKCkgPT0gX2NoZWNrZWQgfHwgKG1fdHlwZSA9PSBSQURJTyAmJiBuYW1lKCkuaXNF
bXB0eSgpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBf
Y2hlY2tlZCkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmFkaW9CdXR0b25DaGVja2VkKHRoaXMs
IG1fZm9ybSk7Ci0KLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gZmFsc2U7Ci0gICAgbV9jaGVj
a2VkID0gX2NoZWNrZWQ7Ci0gICAgc2V0Q2hhbmdlZCgpOwotICAgIGlmIChyZW5kZXJlcigpICYm
IHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgdGhlbWUoKS0+
c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIENoZWNrZWRTdGF0ZSk7Ci0gICAgb25DaGFuZ2UoKTsK
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5kZXRlcm1pbmF0ZShib29sIF9p
bmRldGVybWluYXRlKQotewotICAgIC8vIE9ubHkgY2hlY2tib3hlcyBob25vciBpbmRldGVybWlu
YXRlLgotICAgIGlmIChtX3R5cGUgIT0gQ0hFQ0tCT1ggfHwgaW5kZXRlcm1pbmF0ZSgpID09IF9p
bmRldGVybWluYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBf
aW5kZXRlcm1pbmF0ZTsKLQotICAgIHNldENoYW5nZWQoKTsKLQotICAgIGlmIChyZW5kZXJlcigp
ICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgdGhlbWUo
KS0+c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIENoZWNrZWRTdGF0ZSk7Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OmNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1l
bnRJbXBsICpzb3VyY2UpCi17Ci0gICAgY29uc3QgSFRNTElucHV0RWxlbWVudEltcGwgKnNvdXJj
ZUVsZW0gPSBzdGF0aWNfY2FzdDxjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihzb3VyY2Up
OwotCi0gICAgbV92YWx1ZSA9IHNvdXJjZUVsZW0tPm1fdmFsdWU7Ci0gICAgbV9jaGVja2VkID0g
c291cmNlRWxlbS0+bV9jaGVja2VkOwotICAgIG1faW5kZXRlcm1pbmF0ZSA9IHNvdXJjZUVsZW0t
Pm1faW5kZXRlcm1pbmF0ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp2
YWx1ZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHZhbHVlID0gbV92YWx1ZTsKLQotICAgIC8v
IEl0J3MgaW1wb3J0YW50ICpub3QqIHRvIGZhbGwgYmFjayB0byB0aGUgdmFsdWUgYXR0cmlidXRl
IGZvciBmaWxlIGlucHV0cywKLSAgICAvLyBiZWNhdXNlIHRoYXQgd291bGQgYWxsb3cgYSBtYWxp
Y2lvdXMgd2ViIHBhZ2UgdG8gdXBsb2FkIGZpbGVzIGJ5IHNldHRpbmcgdGhlCi0gICAgLy8gdmFs
dWUgYXR0cmlidXRlIGluIG1hcmt1cC4KLSAgICBpZiAodmFsdWUuaXNOdWxsKCkgJiYgbV90eXBl
ICE9IEZJTEUpCi0gICAgICAgIHZhbHVlID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0KLSAg
ICAvLyBJZiBubyBhdHRyaWJ1dGUgZXhpc3RzLCB0aGVuIGp1c3QgdXNlICJvbiIgb3IgIiIgYmFz
ZWQgb2ZmIHRoZSBjaGVja2VkKCkgc3RhdGUgb2YgdGhlIGNvbnRyb2wuCi0gICAgaWYgKHZhbHVl
LmlzTnVsbCgpICYmIChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSkKLSAg
ICAgICAgcmV0dXJuIERPTVN0cmluZyhjaGVja2VkKCkgPyAib24iIDogIiIpOwotCi0gICAgcmV0
dXJuIHZhbHVlOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnZhbHVlV2l0
aERlZmF1bHQoKSBjb25zdAotewotICAgIERPTVN0cmluZyB2ID0gdmFsdWUoKTsKLSAgICBpZiAo
di5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgIGNh
c2UgUkVTRVQ6Ci0gICAgICAgICAgICAgICAgdiA9IHJlc2V0QnV0dG9uRGVmYXVsdExhYmVsKCk7
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAg
ICAgICAgICAgICAgIHYgPSBzdWJtaXRCdXR0b25EZWZhdWx0TGFiZWwoKTsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICBjYXNl
IENIRUNLQk9YOgotICAgICAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgY2FzZSBISURE
RU46Ci0gICAgICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgY2FzZSBJU0lOREVYOgot
ICAgICAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgICAgIGNhc2UgUkFESU86Ci0gICAg
ICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAg
ICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIHY7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgaWYgKG1fdHlwZSA9PSBGSUxFKSByZXR1cm47
Ci0KLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgaWYgKHN0b3Jlc1Zh
bHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkpIHsKLSAgICAgICAgbV92YWx1ZSA9IHZhbHVlOwot
ICAgICAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVs
ZW1lbnQoKTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNl
dEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldFZhbHVlRnJvbVJlbmRlcmVyKGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgbV92YWx1ZSA9IHZhbHVlOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0
cnVlOwotICAgIAotICAgIC8vIEZpcmUgdGhlICJpbnB1dCIgRE9NIGV2ZW50LgotICAgIGRpc3Bh
dGNoSFRNTEV2ZW50KGlucHV0RXZlbnQsIHRydWUsIGZhbHNlKTsKLX0KLQotYm9vbCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSBjb25zdAot
ewotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBj
YXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIGNhc2UgSElEREVOOgot
ICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIFJB
TkdFOgotICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCog
SFRNTElucHV0RWxlbWVudEltcGw6OnByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAq
ZXZ0KQotewotICAgIC8vIHByZXZlbnREZWZhdWx0IG9yICJyZXR1cm4gZmFsc2UiIGFyZSB1c2Vk
IHRvIHJldmVyc2UgdGhlIGF1dG9tYXRpYyBjaGVja2luZy9zZWxlY3Rpb24gd2UgZG8gaGVyZS4K
LSAgICAvLyBUaGlzIHJlc3VsdCBnaXZlcyB1cyBlbm91Z2ggaW5mbyB0byBwZXJmb3JtIHRoZSAi
dW5kbyIgaW4gcG9zdERpc3BhdGNoIG9mIHRoZSBhY3Rpb24gd2UgdGFrZSBoZXJlLgotICAgIHZv
aWQqIHJlc3VsdCA9IDA7IAotICAgIGlmICgobV90eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9
PSBSQURJTykgJiYgZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9PSBjbGlja0V2
ZW50ICYmIAotICAgICAgICBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2dCktPmJ1dHRv
bigpID09IDApIHsKLSAgICAgICAgaWYgKG1fdHlwZSA9PSBDSEVDS0JPWCkgewotICAgICAgICAg
ICAgLy8gQXMgYSB3YXkgdG8gc3RvcmUgdGhlIHN0YXRlLCB3ZSByZXR1cm4gMCBpZiB3ZSB3ZXJl
IHVuY2hlY2tlZCwgMSBpZiB3ZSB3ZXJlIGNoZWNrZWQsIGFuZCAyIGZvcgotICAgICAgICAgICAg
Ly8gaW5kZXRlcm1pbmF0ZS4KLSAgICAgICAgICAgIGlmIChpbmRldGVybWluYXRlKCkpIHsKLSAg
ICAgICAgICAgICAgICByZXN1bHQgPSAodm9pZCopMHgyOwotICAgICAgICAgICAgICAgIHNldElu
ZGV0ZXJtaW5hdGUoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBpZiAoY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAodm9pZCopMHgx
OwotICAgICAgICAgICAgICAgIHNldENoZWNrZWQoIWNoZWNrZWQoKSk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGb3IgcmFkaW8gYnV0dG9ucywgc3Rv
cmUgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcmFkaW8gb2JqZWN0LgotICAgICAgICAgICAgaWYgKG5h
bWUoKS5pc0VtcHR5KCkgfHwgY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOyAv
LyBVbm5hbWVkIHJhZGlvIGJ1dHRvbnMgZG9udCBnZXQgY2hlY2tlZC4gQ2hlY2tlZCBidXR0b25z
IGp1c3Qgc3RheSBjaGVja2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTog
TmVlZCB0byBsZWFybiB0byB3b3JrIHdpdGhvdXQgYSBmb3JtLgotCi0gICAgICAgICAgICAvLyBX
ZSByZWFsbHkgd2FudCByYWRpbyBncm91cHMgdG8gZW5kIHVwIGluIHNhbmUgc3RhdGVzLCBpLmUu
LCB0byBoYXZlIHNvbWV0aGluZyBjaGVja2VkLgotICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGlm
IG5vdGhpbmcgaXMgY3VycmVudGx5IHNlbGVjdGVkLCB3ZSB3b24ndCBhbGxvdyB0aGlzIGFjdGlv
biB0byBiZSAidW5kb25lIiwgc2luY2UKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgc29tZSBvYmpl
Y3QgaW4gdGhlIHJhZGlvIGdyb3VwIHRvIGFjdHVhbGx5IGdldCBzZWxlY3RlZC4KLSAgICAgICAg
ICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBjdXJyUmFkaW8gPSBnZXREb2N1bWVudCgpLT5jaGVj
a2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pOwotICAgICAgICAg
ICAgaWYgKGN1cnJSYWRpbykgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSByYWRpbyBi
dXR0b24gc2VsZWN0ZWQgdGhhdCBpcyBub3QgdXMuICBDYWNoZSBpdCBpbiBvdXIgcmVzdWx0IGZp
ZWxkIGFuZCByZWYgaXQgc28KLSAgICAgICAgICAgICAgICAvLyB0aGF0IGl0IGNhbid0IGJlIGRl
c3Ryb3llZC4KLSAgICAgICAgICAgICAgICBjdXJyUmFkaW8tPnJlZigpOwotICAgICAgICAgICAg
ICAgIHJlc3VsdCA9IGN1cnJSYWRpbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldENo
ZWNrZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKQotewotICAgIGlmICgobV90eXBlID09IENIRUNLQk9YIHx8
IG1fdHlwZSA9PSBSQURJTykgJiYgZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9
PSBjbGlja0V2ZW50ICYmIAotICAgICAgICBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2
dCktPmJ1dHRvbigpID09IDApIHsKLSAgICAgICAgaWYgKG1fdHlwZSA9PSBDSEVDS0JPWCkgewot
ICAgICAgICAgICAgLy8gUmV2ZXJzZSB0aGUgY2hlY2tpbmcgd2UgZGlkIGluIHByZURpc3BhdGNo
LgotICAgICAgICAgICAgaWYgKGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpIHx8IGV2dC0+ZGVmYXVs
dEhhbmRsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhID09ICh2b2lkKikweDIpCi0g
ICAgICAgICAgICAgICAgICAgIHNldEluZGV0ZXJtaW5hdGUodHJ1ZSk7Ci0gICAgICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzZXRDaGVja2VkKGRhdGEpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oZGF0
YSk7Ci0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZh
dWx0SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwg
c2VsZWN0ZWQgcmFkaW8gYnV0dG9uIGlmIHBvc3NpYmxlLgotICAgICAgICAgICAgICAgIC8vIE1h
a2Ugc3VyZSBpdCBpcyBzdGlsbCBhIHJhZGlvIGJ1dHRvbiBhbmQgb25seSBkbyB0aGUgcmVzdG9y
YXRpb24gaWYgaXQgc3RpbGwKLSAgICAgICAgICAgICAgICAvLyBiZWxvbmdzIHRvIG91ciBncm91
cC4KLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQtPmZvcm0oKSA9PSBmb3JtKCkgJiYgaW5wdXQt
PmlucHV0VHlwZSgpID09IFJBRElPICYmIGlucHV0LT5uYW1lKCkgPT0gbmFtZSgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIE9rLCB0aGUgb2xkIHJhZGlvIGJ1dHRvbiBpcyBzdGlsbCBpbiBv
dXIgZm9ybSBhbmQgaW4gb3VyIGdyb3VwIGFuZCBpcyBzdGlsbCBhIAotICAgICAgICAgICAgICAg
ICAgICAvLyByYWRpbyBidXR0b24sIHNvIGl0J3Mgc2FmZSB0byByZXN0b3JlIHNlbGVjdGlvbiB0
byBpdC4KLSAgICAgICAgICAgICAgICAgICAgaW5wdXQtPnNldENoZWNrZWQodHJ1ZSk7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQtPmRlcmVmKCk7
Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1
bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgaWYgKG1fdHlwZSA9PSBJTUFH
RSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYg
bV9yZW5kZXIpIHsKLSAgICAgICAgLy8gcmVjb3JkIHRoZSBtb3VzZSBwb3NpdGlvbiBmb3Igd2hl
biB3ZSBnZXQgdGhlIERPTUFjdGl2YXRlIGV2ZW50Ci0gICAgICAgIE1vdXNlRXZlbnRJbXBsICpt
ZSA9IHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KTsKLSAgICAgICAgaW50IG9mZnNl
dFgsIG9mZnNldFk7Ci0gICAgICAgIG1fcmVuZGVyLT5hYnNvbHV0ZVBvc2l0aW9uKG9mZnNldFgs
b2Zmc2V0WSk7Ci0gICAgICAgIHhQb3MgPSBtZS0+Y2xpZW50WCgpLW9mZnNldFg7Ci0gICAgICAg
IHlQb3MgPSBtZS0+Y2xpZW50WSgpLW9mZnNldFk7Ci0KLQltZS0+c2V0RGVmYXVsdEhhbmRsZWQo
KTsKLSAgICB9Ci0KLSAgICAvLyBET01BY3RpdmF0ZSBldmVudHMgY2F1c2UgdGhlIGlucHV0IHRv
IGJlICJhY3RpdmF0ZWQiIC0gaW4gdGhlIGNhc2Ugb2YgaW1hZ2UgYW5kIHN1Ym1pdCBpbnB1dHMs
IHRoaXMgbWVhbnMKLSAgICAvLyBhY3R1YWxseSBzdWJtaXR0aW5nIHRoZSBmb3JtLiBGb3IgcmVz
ZXQgaW5wdXRzLCB0aGUgZm9ybSBpcyByZXNldC4gVGhlc2UgZXZlbnRzIGFyZSBzZW50IHdoZW4g
dGhlIHVzZXIgY2xpY2tzCi0gICAgLy8gb24gdGhlIGVsZW1lbnQsIG9yIHByZXNzZXMgZW50ZXIg
d2hpbGUgaXQgaXMgdGhlIGFjdGl2ZSBlbGVtZW50LiBKYXZhY3NyaXB0IGNvZGUgd2lzaGluZyB0
byBhY3RpdmF0ZSB0aGUgZWxlbWVudAotICAgIC8vIG11c3QgZGlzcGF0Y2ggYSBET01BY3RpdmF0
ZSBldmVudCAtIGEgY2xpY2sgZXZlbnQgd2lsbCBub3QgZG8gdGhlIGpvYi4KLSAgICBpZiAoZXZ0
LT50eXBlKCkgPT0gRE9NQWN0aXZhdGVFdmVudCkgewotICAgICAgICBpZiAobV90eXBlID09IElN
QUdFIHx8IG1fdHlwZSA9PSBTVUJNSVQgfHwgbV90eXBlID09IFJFU0VUKSB7Ci0gICAgICAgICAg
ICBpZiAoIW1fZm9ybSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAo
bV90eXBlID09IFJFU0VUKQotICAgICAgICAgICAgICAgIG1fZm9ybS0+cmVzZXQoKTsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICBpZiAoIW1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIHhQb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICB5UG9zID0gMDsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICB9Ci0KLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2
ZW50IGhlcmUgc2luY2Ugc2VuZGluZyBzaW11bGF0ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24g
a2V5IGRvd24gYmxvY2tzIHRoZSBwcm9wZXIgc2VuZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50
LgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBrZXlwcmVzc0V2ZW50ICYmIGV2dC0+aXNLZXlib2Fy
ZEV2ZW50KCkpIHsKLSAgICAgICAgYm9vbCBjbGlja0VsZW1lbnQgPSBmYWxzZTsKLSAgICAgICAg
Ym9vbCBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0gZmFsc2U7Ci0KLSAgICAgICAgRE9NU3RyaW5n
IGtleSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZp
ZXIoKTsKLQotICAgICAgICBpZiAoa2V5ID09ICJVKzAwMDAyMCIpIHsKLSAgICAgICAgICAgIHN3
aXRjaCAobV90eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgICAgICBjYXNlIFJFU0VUOgotICAgICAg
ICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBt
b3VzZSBjbGljayBmb3Igc3BhY2ViYXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAg
ICAgICAgICAgICAgICAgICAvLyBUaGUgQXBwS2l0IGFscmVhZHkgZG9lcyB0aGlzIGZvciBzb21l
LCBidXQgbm90IGFsbCwgb2YgdGhlbS4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBSQURJTzoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gdW5zZWxlY3RlZCByYWRpbyBp
cyB0YWJiZWQgaW50byAoYmVjYXVzZSB0aGUgZW50aXJlIGdyb3VwIGhhcyBub3RoaW5nCi0gICAg
ICAgICAgICAgICAgICAgIC8vIGNoZWNrZWQsIG9yIGJlY2F1c2Ugb2Ygc29tZSBleHBsaWNpdCAu
Zm9jdXMoKSBjYWxsKSwgdGhlbiBhbGxvdyBzcGFjZSB0byBjaGVjayBpdC4KLSAgICAgICAgICAg
ICAgICAgICAgaWYgKCFjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGlja0Vs
ZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAg
ICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgICAgICAgICBjYXNlIFJBTkdFOgotICAgICAg
ICAgICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoa2V5ID09ICJFbnRlciIpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0g
ICAgICAgICAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICAgICAgY2FzZSBDSEVDS0JP
WDoKLSAgICAgICAgICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgICAgICBjYXNlIElT
SU5ERVg6Ci0gICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgICAgICAgICBj
YXNlIFJBTkdFOgotICAgICAgICAgICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbW91c2UgY2xpY2sg
b24gdGhlIGRlZmF1bHQgZm9ybSBidXR0b24gZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBl
bGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRklM
RToKLSAgICAgICAgICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgICAgIGNhc2UgUkVT
RVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8v
IFNpbXVsYXRlIG1vdXNlIGNsaWNrIGZvciBlbnRlciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVu
dHMuCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAg
ICAgICAgICAgIGJyZWFrOyAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgZW50ZXIgb24gYSByYWRp
byBidXR0b24uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV90eXBl
ID09IFJBRElPICYmIChrZXkgPT0gIlVwIiB8fCBrZXkgPT0gIkRvd24iIHx8IGtleSA9PSAiTGVm
dCIgfHwga2V5ID09ICJSaWdodCIpKSB7Ci0gICAgICAgICAgICAvLyBMZWZ0IGFuZCB1cCBtZWFu
ICJwcmV2aW91cyByYWRpbyBidXR0b24iLgotICAgICAgICAgICAgLy8gUmlnaHQgYW5kIGRvd24g
bWVhbiAibmV4dCByYWRpbyBidXR0b24iLgotICAgICAgICAgICAgLy8gVGVzdGVkIGluIFdpbklF
LCBhbmQgZXZlbiBmb3IgUlRMLCBsZWZ0IHN0aWxsIG1lYW5zIHByZXZpb3VzIHJhZGlvIGJ1dHRv
biAoYW5kIHNvIG1vdmVzCi0gICAgICAgICAgICAvLyB0byB0aGUgcmlnaHQpLiAgU2VlbXMgc3Ry
YW5nZSwgYnV0IHdlJ2xsIG1hdGNoIGl0LgotICAgICAgICAgICAgYm9vbCBmb3J3YXJkID0gKGtl
eSA9PSAiRG93biIgfHwga2V5ID09ICJSaWdodCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICAvLyBXZSBjYW4gb25seSBzdGF5IHdpdGhpbiB0aGUgZm9ybSdzIGNoaWxkcmVuIGlmIHRoZSBm
b3JtIGhhc24ndCBiZWVuIGRlbW90ZWQgdG8gYSBsZWFmIGJlY2F1c2UKLSAgICAgICAgICAgIC8v
IG9mIG1hbGZvcm1lZCBIVE1MLgotICAgICAgICAgICAgTm9kZUltcGwqIG4gPSB0aGlzOwotICAg
ICAgICAgICAgd2hpbGUgKChuID0gKGZvcndhcmQgPyBuLT50cmF2ZXJzZU5leHROb2RlKCkgOiBu
LT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBPbmNlIHdl
IGVuY291bnRlciBhIGZvcm0gZWxlbWVudCwgd2Uga25vdyB3ZSdyZSB0aHJvdWdoLgotICAgICAg
ICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTG9vayBm
b3IgbW9yZSByYWRpbyBidXR0b25zLgotICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1l
KGlucHV0VGFnKSkgewotICAgICAgICAgICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCog
ZWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKGVsdC0+Zm9ybSgpICE9IG1fZm9ybSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShpbnB1dFRh
ZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBpbnB1
dEVsdCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4obik7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoaW5wdXRFbHQtPmlucHV0VHlwZSgpID09IFJBRElPICYmIGlucHV0
RWx0LT5uYW1lKCkgPT0gbmFtZSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5w
dXRFbHQtPmlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1
dEVsdC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRE
b2N1bWVudCgpLT5zZXRGb2N1c05vZGUoaW5wdXRFbHQpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlucHV0RWx0LT5jbGljayhmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIGlmIChjbGlja0VsZW1lbnQpIHsKLSAgICAgICAgICAgIGNsaWNrKGZhbHNlKTsKLSAg
ICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChj
bGlja0RlZmF1bHRGb3JtQnV0dG9uICYmIG1fZm9ybSkgewotICAgICAgICAgICAgbV9mb3JtLT5z
dWJtaXRDbGljaygpOwotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRF
dmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNFZGl0
YWJsZSgpCi17Ci0gICAgcmV0dXJuICgobV90eXBlID09IFRFWFQpIHx8IChtX3R5cGUgPT0gUEFT
U1dPUkQpIHx8Ci0gICAgICAgICAgICAobV90eXBlID09IFNFQVJDSCkgfHwgKG1fdHlwZSA9PSBJ
U0lOREVYKSB8fCAobV90eXBlID09IEZJTEUpKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3QKLXsKLSAgICBy
ZXR1cm4gKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpkZWZhdWx0VmFsdWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUodmFsdWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0RGVm
YXVsdFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZh
bHVlQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZWZhdWx0
Q2hlY2tlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFnZXRBdHRyaWJ1dGUoY2hlY2tlZEF0dHIp
LmlzTnVsbCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXREZWZhdWx0Q2hl
Y2tlZChib29sIGRlZmF1bHRDaGVja2VkKQotewotICAgIHNldEF0dHJpYnV0ZShjaGVja2VkQXR0
ciwgZGVmYXVsdENoZWNrZWQgPyAiIiA6IDApOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxl
bWVudEltcGw6OmFjY2VwdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nl
cHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWNjZXB0KGNvbnN0
IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2VwdEF0dHIsIHZhbHVl
KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0
cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
c2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxp
Z25BdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWx0
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsdEF0dHIpOwotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBbHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWx0QXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRNYXhMZW5ndGgoaW50IF9tYXhMZW5ndGgpCi17Ci0gICAgc2V0QXR0cmli
dXRlKG1heGxlbmd0aEF0dHIsIFFTdHJpbmc6Om51bWJlcihfbWF4TGVuZ3RoKSk7Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNpemUodW5zaWduZWQgX3NpemUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKHNpemVBdHRyLCBRU3RyaW5nOjpudW1iZXIoX3NpemUpKTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzcmMoKSBjb25zdAotewotICAgIHJldHVybiBn
ZXREb2N1bWVudCgpLT5jb21wbGV0ZVVSTChnZXRBdHRyaWJ1dGUoc3JjQXR0cikpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTcmMoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoc3JjQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRN
TElucHV0RWxlbWVudEltcGw6OnVzZU1hcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZSh1c2VtYXBBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VXNl
TWFwKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHVzZW1hcEF0
dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MTGFiZWxFbGVtZW50
SW1wbDo6SFRNTExhYmVsRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1M
RWxlbWVudEltcGwobGFiZWxUYWcsIGRvYykKLXsKLX0KLQotSFRNTExhYmVsRWxlbWVudEltcGw6
On5IVE1MTGFiZWxFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTExhYmVsRWxlbWVudElt
cGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQg
SFRNTExhYmVsRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewot
ICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVu
dExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVt
ZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLUVsZW1lbnRJbXBsICpI
VE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9ybUVsZW1lbnQoKQotewotICAgIERPTVN0cmluZyBmb3Jt
RWxlbWVudElkID0gZ2V0QXR0cmlidXRlKGZvckF0dHIpOwotICAgIGlmIChmb3JtRWxlbWVudElk
LmlzTnVsbCgpKSB7Ci0gICAgICAgIC8vIFNlYXJjaCBjaGlsZHJlbiBvZiB0aGUgbGFiZWwgZWxl
bWVudCBmb3IgYSBmb3JtIGVsZW1lbnQuCi0gICAgICAgIE5vZGVJbXBsICpub2RlID0gdGhpczsK
LSAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKSkpIHsK
LSAgICAgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAg
ICBIVE1MRWxlbWVudEltcGwgKmVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwg
Kj4obm9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmlzR2VuZXJpY0Zvcm1FbGVt
ZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoZm9ybUVsZW1l
bnRJZC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBnZXREb2N1bWVu
dCgpLT5nZXRFbGVtZW50QnlJZChmb3JtRWxlbWVudElkKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxF
bGVtZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZv
cm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExh
YmVsRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17
Ci0gICAgRWxlbWVudEltcGwgKmVsZW1lbnQgPSBmb3JtRWxlbWVudCgpOwotICAgIGlmIChlbGVt
ZW50KQotICAgICAgICBlbGVtZW50LT5hY2Nlc3NLZXlBY3Rpb24oc2VuZFRvQW55RWxlbWVudCk7
Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGwgKkhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtKCkK
LXsKLSAgICBmb3IgKE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOyBwICE9IDA7IHAgPSBwLT5w
YXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYgKHAtPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAg
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAg
ICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50
SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXko
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0
ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTExhYmVsRWxlbWVudEltcGw6Omh0bWxGb3Io
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoZm9yQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTExhYmVsRWxlbWVudEltcGw6OnNldEh0bWxGb3IoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoZm9yQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLUhUTUxMZWdlbmRFbGVtZW50SW1wbDo6SFRNTExlZ2VuZEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotOiBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbChsZWdlbmRUYWcsIGRvYywgZikKLXsKLX0KLQotSFRNTExlZ2VuZEVsZW1l
bnRJbXBsOjp+SFRNTExlZ2VuZEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGVnZW5k
RWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLVJlbmRlck9iamVjdCogSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihS
ZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3
IChhcmVuYSkgUmVuZGVyTGVnZW5kKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVs
ZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gImxlZ2VuZCI7Ci19Ci0KLURP
TVN0cmluZyBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5k
RWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1M
TGVnZW5kRWxlbWVudEltcGw6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpzZXRBbGln
bihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIs
IHZhbHVlKTsKLX0KLQotRWxlbWVudEltcGwgKkhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Zm9ybUVs
ZW1lbnQoKQotewotICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBmaWVsZHNldCBiZWxvbmdpbmcg
dG8gdGhpcyBsZWdlbmQuCi0gICAgTm9kZUltcGwgKmZpZWxkc2V0ID0gcGFyZW50Tm9kZSgpOwot
ICAgIHdoaWxlIChmaWVsZHNldCAmJiAhZmllbGRzZXQtPmhhc1RhZ05hbWUoZmllbGRzZXRUYWcp
KQotICAgICAgICBmaWVsZHNldCA9IGZpZWxkc2V0LT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKCFm
aWVsZHNldCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBGaW5kIGZpcnN0IGZvcm0gZWxl
bWVudCBpbnNpZGUgdGhlIGZpZWxkc2V0LgotICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgY2FyZSBh
Ym91dCB0YWJpbmRleD8KLSAgICBOb2RlSW1wbCAqbm9kZSA9IGZpZWxkc2V0OwotICAgIHdoaWxl
ICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoZmllbGRzZXQpKSkgewotICAgICAgICBp
ZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBIVE1MRWxlbWVudEltcGwg
KmVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwgKj4obm9kZSk7Ci0gICAgICAg
ICAgICBpZiAoIWVsZW1lbnQtPmhhc0xvY2FsTmFtZShsZWdlbmRUYWcpICYmIGVsZW1lbnQtPmlz
R2VuZXJpY0Zvcm1FbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxl
bWVudEltcGw6OmZvY3VzKCkKLXsKLSAgICBpZiAoRWxlbWVudEltcGwgKmVsZW1lbnQgPSBmb3Jt
RWxlbWVudCgpKQotICAgICAgICBlbGVtZW50LT5mb2N1cygpOwotfQotCi12b2lkIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsK
LSAgICBpZiAoRWxlbWVudEltcGwgKmVsZW1lbnQgPSBmb3JtRWxlbWVudCgpKQotICAgICAgICBl
bGVtZW50LT5hY2Nlc3NLZXlBY3Rpb24oc2VuZFRvQW55RWxlbWVudCk7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpIVE1MU2VsZWN0RWxlbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbChzZWxlY3RUYWcsIGRvYywgZiksIG1fb3B0aW9ucygwKQot
ewotICAgIGluaXQoKTsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpIVE1MU2VsZWN0RWxl
bWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCh0YWdOYW1lLCBkb2MsIGYpLCBtX29wdGlvbnMoMCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZv
aWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjppbml0KCkKLXsKLSAgICBtX29wdGlvbnMgPSAwOwot
ICAgIG1fbXVsdGlwbGUgPSBmYWxzZTsKLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOwot
ICAgIC8vIDAgbWVhbnMgaW52YWxpZCAoaS5lLiBub3Qgc2V0KQotICAgIG1fc2l6ZSA9IDA7Ci0g
ICAgbV9taW53aWR0aCA9IDA7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6fkhUTUxTZWxl
Y3RFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCkt
PmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAgICBpZiAobV9vcHRpb25zKSB7Ci0g
ICAgICAgIG1fb3B0aW9ucy0+ZGV0YWNoKCk7Ci0gICAgICAgIG1fb3B0aW9ucy0+ZGVyZWYoKTsK
LSAgICB9Ci19Ci0KLWJvb2wgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpjaGVja0RURChjb25zdCBO
b2RlSW1wbCogbmV3Q2hpbGQpCi17Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCkg
fHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFt
ZShvcHRncm91cFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoaHJUYWcpIHx8Ci0gICAgICAg
ICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKQotewotICAgIGlmICho
YXNDaGFuZ2VkQ2hpbGQoKSAmJiBtX3JlbmRlcikgewotICAgICAgICBzdGF0aWNfY2FzdDxraHRt
bDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAg
ICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIGNoICk7
Ci19Ci0KLQotRE9NU3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIChtX211bHRpcGxlID8gInNlbGVjdC1tdWx0aXBsZSIgOiAic2VsZWN0LW9u
ZSIpOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZWxlY3RlZEluZGV4KCkgY29u
c3QKLXsKLSAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgZmlyc3Qgb3B0aW9uIHNlbGVj
dGVkCi0gICAgdWludCBvID0gMDsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGl0ZW1z
LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpIHsKLSAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0g
ICAgICAgICAgICBvKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgUV9BU1NFUlQobV9tdWx0aXBs
ZSk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0
U2VsZWN0ZWRJbmRleCggaW50ICBpbmRleCApCi17Ci0gICAgLy8gZGVzZWxlY3QgYWxsIG90aGVy
IG9wdGlvbnMgYW5kIHNlbGVjdCBvbmx5IHRoZSBuZXcgb25lCi0gICAgUU1lbUFycmF5PEhUTUxF
bGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaW50IGxpc3RJbmRleDsKLSAg
ICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8IGludChpdGVtcy5zaXplKCkpOyBsaXN0
SW5kZXgrKykgewotICAgICAgICBpZiAoaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9w
dGlvblRhZykpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihpdGVtc1tsaXN0SW5kZXhdKS0+c2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgIH0KLSAgICBsaXN0
SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7Ci0gICAgaWYgKGxpc3RJbmRleCA+PSAw
KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tsaXN0
SW5kZXhdKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQot
Ci1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIGludCBs
ZW4gPSAwOwotICAgIHVpbnQgaTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKysp
IHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAg
ICAgICAgIGxlbisrOwotICAgIH0KLSAgICByZXR1cm4gbGVuOwotfQotCi12b2lkIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6YWRkKCBIVE1MRWxlbWVudEltcGwgKmVsZW1lbnQsIEhUTUxFbGVtZW50
SW1wbCAqYmVmb3JlLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIFJlZlB0cjxIVE1MRWxl
bWVudEltcGw+IHByb3RlY3ROZXdDaGlsZChlbGVtZW50KTsgLy8gbWFrZSBzdXJlIHRoZSBlbGVt
ZW50IGlzIHJlZidkIGFuZCBkZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLQotICAgIGlmICgh
ZWxlbWVudCB8fCAhKGVsZW1lbnQtPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpIHx8IGVsZW1lbnQt
Pmhhc0xvY2FsTmFtZShoclRhZykpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpbnNlcnRCZWZv
cmUoZWxlbWVudCwgYmVmb3JlLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiAoIWV4Y2VwdGlvbmNv
ZGUpCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6cmVtb3ZlKCBpbnQgaW5kZXggKQotewotICAgIGludCBleGNlcHRpb25jb2Rl
ID0gMDsKLSAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoaW5kZXgpOwotCi0g
ICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAg
aWYobGlzdEluZGV4IDwgMCB8fCBpbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSkKLSAgICAgICAg
cmV0dXJuOyAvLyAjIyMgd2hhdCBzaG91bGQgd2UgZG8gPyByZW1vdmUgdGhlIGxhc3QgaXRlbT8K
LQotICAgIE5vZGVJbXBsICppdGVtID0gaXRlbXNbbGlzdEluZGV4XTsKLSAgICBpdGVtLT5yZWYo
KTsKLSAgICByZW1vdmVDaGlsZChpdGVtLCBleGNlcHRpb25jb2RlKTsKLSAgICBpdGVtLT5kZXJl
ZigpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVt
cygpOwotfQotCi1ET01TdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp2YWx1ZSgpCi17Ci0g
ICAgdWludCBpOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJ
dGVtcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAg
ICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhU
TUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnZh
bHVlKCk7Ci0gICAgfQotICAgIHJldHVybiBET01TdHJpbmcoIiIpOwotfQotCi12b2lkIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBpZiAodmFsdWUuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBmaW5kIHRoZSBv
cHRpb24gd2l0aCB2YWx1ZSgpIG1hdGNoaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXIKLSAgICAvLyBh
bmQgbWFrZSBpdCB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1z
W2ldKS0+dmFsdWUoKSA9PSB2YWx1ZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotfQotCi1RU3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6c3RhdGUoKQotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxp
c3RJdGVtcygpOwotCi0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotCi0gICAgUUNoYXIgc3Rh
dGVDaGFyc1tsXTsKLSAgICAKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbDsgaSsrKQotICAgICAg
ICBpZihpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAg
c3RhdGVDaGFyc1tpXSA9ICdYJzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGVDaGFy
c1tpXSA9ICcuJzsKLSAgICBRU3RyaW5nIHN0YXRlKHN0YXRlQ2hhcnMsIGwpOwotCi0gICAgcmV0
dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpICsgc3RhdGU7Ci19Ci0KLXZv
aWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJl9zdGF0
ZXMpCi17Ci0gICAgUVN0cmluZyBfc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
ZmluZE1hdGNoaW5nU3RhdGUoX3N0YXRlcyk7Ci0gICAgaWYgKF9zdGF0ZS5pc051bGwoKSkgcmV0
dXJuOwotCi0gICAgcmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLSAgICBRU3RyaW5nIHN0YXRlID0gX3N0
YXRlOwotICAgIGlmKCFzdGF0ZS5pc0VtcHR5KCkgJiYgIXN0YXRlLmNvbnRhaW5zKCdYJykgJiYg
IW1fbXVsdGlwbGUpIHsKLSAgICAgICAgcVdhcm5pbmcoInNob3VsZCBub3QgaGFwcGVuIGluIHJl
c3RvcmVTdGF0ZSEiKTsKLSAgICAgICAgLy8gS1dRU3RyaW5nIGRvZXNuJ3Qgc3VwcG9ydCB0aGlz
IG9wZXJhdGlvbi4gU2hvdWxkIG5ldmVyIGdldCBoZXJlIGFueXdheS4KLSAgICAgICAgLy9zdGF0
ZVswXSA9ICdYJzsKLSAgICB9Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKLSAgICBmb3Io
aW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0gICAgICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5h
bWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBvZSA9
IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAg
ICAgIG9lLT5zZXRTZWxlY3RlZChzdGF0ZVtpXSA9PSAnWCcpOwotICAgICAgICB9Ci0gICAgfQot
ICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudElt
cGw6Omluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxk
LCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlKG5ld0NoaWxkLHJlZkNoaWxkLCBleGNl
cHRpb25jb2RlICk7Ci0gICAgaWYgKCFleGNlcHRpb25jb2RlKQotICAgICAgICBzZXRSZWNhbGNM
aXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBs
ICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0
ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRD
aGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAg
c2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwg
KkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZChvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7
Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7
Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6YXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSAp
Ci17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjph
cHBlbmRDaGlsZChuZXdDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25j
b2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgc2V0Q2hhbmdlZCh0cnVl
KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCogSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjphZGRDaGlsZChOb2RlSW1wbCogbmV3Q2hpbGQpCi17Ci0gICAgc2V0UmVjYWxjTGlzdEl0
ZW1zKCk7Ci0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphZGRDaGlsZChu
ZXdDaGlsZCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1l
KCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0ga01heChhdHRyLT52YWx1ZSgpLnRv
SW50KCksIDEpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewot
ICAgICAgICBtX21pbndpZHRoID0ga01heCggYXR0ci0+dmFsdWUoKS50b0ludCgpLCAwICk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbXVsdGlwbGVBdHRyKSB7Ci0gICAgICAgIG1f
bXVsdGlwbGUgPSAoIWF0dHItPmlzTnVsbCgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBt
b21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAg
ICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJT
dHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclNlbGVjdCh0aGlz
KTsKLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1E
YXRhTGlzdCYgZW5jb2RlZF92YWx1ZXMsIGJvb2wpCi17Ci0gICAgYm9vbCBzdWNjZXNzZnVsID0g
ZmFsc2U7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1z
KCk7Ci0KLSAgICB1aW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsr
KSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAg
ICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgaWYgKG9wdGlvbi0+
c2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEo
bmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0
cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gIyMjIHRoaXMg
Y2FzZSBzaG91bGQgbm90IGhhcHBlbi4gbWFrZSBzdXJlIHRoYXQgd2Ugc2VsZWN0IHRoZSBmaXJz
dCBvcHRpb24KLSAgICAvLyBpbiBhbnkgY2FzZS4gb3RoZXJ3aXNlIHdlIGhhdmUgbm8gY29uc2lz
dGVuY3kgd2l0aCB0aGUgRE9NIGludGVyZmFjZS4gRklYTUUhCi0gICAgLy8gd2UgcmV0dXJuIHRo
ZSBmaXJzdCBvbmUgaWYgaXQgd2FzIGEgY29tYm9ib3ggc2VsZWN0Ci0gICAgaWYgKCFzdWNjZXNz
ZnVsICYmICFtX211bHRpcGxlICYmIG1fc2l6ZSA8PSAxICYmIGl0ZW1zLnNpemUoKSAmJgotICAg
ICAgICAoaXRlbXNbMF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSkgewotICAgICAgICBIVE1M
T3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zWzBdKTsKLSAgICAgICAgaWYgKG9wdGlvbi0+dmFsdWUoKS5pc051bGwoKSkK
LSAgICAgICAgICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnRl
eHQoKS5xc3RyaW5nKCkuc3RyaXBXaGl0ZVNwYWNlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsK
LSAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3Nm
dWw7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Om9wdGlvblRvTGlzdEluZGV4KGlu
dCBvcHRpb25JbmRleCkgY29uc3QKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4g
aXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZiAob3B0aW9uSW5kZXggPCAwIHx8IG9wdGlvbklu
ZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpbnQg
bGlzdEluZGV4ID0gMDsKLSAgICBpbnQgb3B0aW9uSW5kZXgyID0gMDsKLSAgICBmb3IgKDsKLSAg
ICAgICAgIG9wdGlvbkluZGV4MiA8IGludChpdGVtcy5zaXplKCkpICYmIG9wdGlvbkluZGV4MiA8
PSBvcHRpb25JbmRleDsKLSAgICAgICAgIGxpc3RJbmRleCsrKSB7IC8vIG5vdCBhIHR5cG8hCi0g
ICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAg
ICAgICAgICAgIG9wdGlvbkluZGV4MisrOwotICAgIH0KLSAgICBsaXN0SW5kZXgtLTsKLSAgICBy
ZXR1cm4gbGlzdEluZGV4OwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpsaXN0VG9P
cHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBjb25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxl
bWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChsaXN0SW5kZXggPCAwIHx8
IGxpc3RJbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSB8fAotICAgICAgICAhaXRlbXNbbGlzdElu
ZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAg
IGludCBvcHRpb25JbmRleCA9IDA7IC8vIGFjdHVhbCBpbmRleCBvZiBvcHRpb24gbm90IGNvdW50
aW5nIE9QVEdST1VQIGVudHJpZXMgdGhhdCBtYXkgYmUgaW4gbGlzdAotICAgIGludCBpOwotICAg
IGZvciAoaSA9IDA7IGkgPCBsaXN0SW5kZXg7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5o
YXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAg
cmV0dXJuIG9wdGlvbkluZGV4OwotfQotCi0vLyBGSVhNRSA0MTk3OTk3OiB0aGlzIG1ldGhvZCBp
cyB1c2VkIGJ5IHRoZSBwdWJsaWMgQVBJIC1bRE9NSFRNTFNlbGVjdEVsZW1lbnQgb3B0aW9uc10s
IGJ1dCBhbHdheXMgcmV0dXJucwotLy8gYW4gZW1wdHkgbGlzdC4KLUhUTUxPcHRpb25zQ29sbGVj
dGlvbkltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9ucygpCi17Ci0gICAgaWYgKCFt
X29wdGlvbnMpIHsKLSAgICAgICAgbV9vcHRpb25zID0gbmV3IEhUTUxPcHRpb25zQ29sbGVjdGlv
bkltcGwodGhpcyk7Ci0gICAgICAgIG1fb3B0aW9ucy0+cmVmKCk7Ci0gICAgfQotICAgIHJldHVy
biBtX29wdGlvbnM7Ci19Ci0KLS8vIEZJWE1FOiBEZWxldGUgb25jZSB0aGUgYWJvdmUgZnVuY3Rp
b24gaXMgd29ya2luZyB3ZWxsIGVub3VnaCB0byB1c2UgZm9yIHJlYWwuCi1SZWZQdHI8SFRNTENv
bGxlY3Rpb25JbXBsPiBIVE1MU2VsZWN0RWxlbWVudEltcGw6Om9wdGlvbnNIVE1MQ29sbGVjdGlv
bigpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29s
bGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpTRUxFQ1RfT1BUSU9OUykpOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjTGlzdEl0ZW1zKCkKLXsKLSAg
ICBOb2RlSW1wbCogY3VycmVudCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBtX2xpc3RJdGVtcy5yZXNp
emUoMCk7Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBmb3VuZFNlbGVjdGVkID0gMDsKLSAg
ICB3aGlsZShjdXJyZW50KSB7Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGdy
b3VwVGFnKSAmJiBjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKLSAgICAgICAgICAgIC8vICMjIyB3
aGF0IGlmIG9wdGdyb3VwIGNvbnRhaW5zIGp1c3QgY29tbWVudHM/IGRvbid0IHdhbnQgb25lIG9m
IG5vIG9wdGlvbnMgaW4gaXQuLi4KLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xp
c3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5z
aXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAg
ICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5maXJzdENoaWxkKCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgbV9s
aXN0SXRlbXMucmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlz
dEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1w
bCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKCFmb3VuZFNlbGVjdGVkICYmICFtX211bHRp
cGxlICYmIG1fc2l6ZSA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAg
ICAgIGZvdW5kU2VsZWN0ZWQtPm1fc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgZWxzZSBpZiAoZm91bmRTZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSAmJiBzdGF0aWNf
Y2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KS0+c2VsZWN0ZWQoKSkgewotICAg
ICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPm1fc2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBs
Kj4oY3VycmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJl
bnQtPmhhc1RhZ05hbWUoaHJUYWcpKSB7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtcy5yZXNpemUo
bV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9saXN0SXRl
bXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgTm9kZUltcGwgKnBhcmVudCA9IGN1cnJlbnQtPnBhcmVudE5vZGUo
KTsKLSAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGlm
ICghY3VycmVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSB0aGlzKQotICAgICAgICAg
ICAgICAgIGN1cnJlbnQgPSBwYXJlbnQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7
Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCk7Ci19
Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRSZWNhbGNMaXN0SXRlbXMoKQotewot
ICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gdHJ1ZTsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAg
IHN0YXRpY19jYXN0PGtodG1sOjpSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldE9wdGlvbnND
aGFuZ2VkKHRydWUpOwotICAgIHNldENoYW5nZWQoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OnJlc2V0KCkKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLSAgICB1aW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1z
LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3Rh
dGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAgICAg
Ym9vbCBzZWxlY3RlZCA9ICghb3B0aW9uLT5nZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyKS5pc051
bGwoKSk7Ci0gICAgICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVkKHNlbGVjdGVkKTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICBpZiAoIG1fcmVuZGVyICkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25DaGFuZ2VkKHRydWUpOwotICAgIHNl
dENoYW5nZWQoIHRydWUgKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Om5vdGlm
eU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24sIGJv
b2wgc2VsZWN0ZWQpCi17Ci0gICAgaWYgKHNlbGVjdGVkICYmICFtX211bHRpcGxlKSB7Ci0gICAg
ICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25zCi0gICAgICAgIFFNZW1BcnJheTxIVE1M
RWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgICAgICB1aW50IGk7Ci0gICAg
ICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYg
KGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPm1fc2VsZWN0ZWQgPSAo
aXRlbXNbaV0gPT0gc2VsZWN0ZWRPcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICht
X3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5z
ZXRTZWxlY3Rpb25DaGFuZ2VkKHRydWUpOwotCi0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBs
ICpldnQpCi17Ci0gICAgLy8gVXNlIGtleSBwcmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcg
c2ltdWxhdGVkIG1vdXNlIGV2ZW50cwotICAgIC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJv
cGVyIHNlbmRpbmcgb2YgdGhlIGtleSBwcmVzcyBldmVudC4KLSAgICBpZiAoZXZ0LT50eXBlKCkg
PT0ga2V5cHJlc3NFdmVudCkgewotICAgIAotICAgICAgICBpZiAoIW1fZm9ybSB8fCAhbV9yZW5k
ZXIgfHwgIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIAotICAgICAgICBET01TdHJpbmcga2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudElt
cGwgKj4oZXZ0KS0+a2V5SWRlbnRpZmllcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGtleSA9
PSAiRW50ZXIiKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnN1Ym1pdENsaWNrKCk7Ci0gICAgICAg
ICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0Fu
eUVsZW1lbnQpCi17Ci0gICAgZm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OnNldE11bHRpcGxlKGJvb2wgbXVsdGlwbGUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG11bHRp
cGxlQXR0ciwgbXVsdGlwbGUgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6c2V0U2l6ZShpbnQgc2l6ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFT
dHJpbmc6Om51bWJlcihzaXplKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEtl
eWdlbkVsZW1lbnRJbXBsOjpIVE1MS2V5Z2VuRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsKiBkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwqIGYpCi0gICAgOiBIVE1MU2VsZWN0RWxlbWVudEltcGwoa2V5
Z2VuVGFnLCBkb2MsIGYpCi17Ci0gICAgUVN0cmluZ0xpc3Qga2V5cyA9IEtTU0xLZXlHZW46OnN1
cHBvcnRlZEtleVNpemVzKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaSA9IGtl
eXMuYmVnaW4oKTsgaSAhPSBrZXlzLmVuZCgpOyArK2kpIHsKLSAgICAgICAgSFRNTE9wdGlvbkVs
ZW1lbnRJbXBsKiBvID0gbmV3IEhUTUxPcHRpb25FbGVtZW50SW1wbChkb2MsIGZvcm0oKSk7Ci0g
ICAgICAgIGFkZENoaWxkKG8pOwotICAgICAgICBvLT5hZGRDaGlsZChuZXcgVGV4dEltcGwoZG9j
LCBET01TdHJpbmcoKmkpKSk7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgSFRNTEtleWdlbkVsZW1l
bnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gImtleWdlbiI7Ci19Ci0KLXZvaWQg
SFRNTEtleWdlbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsKiBhdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gY2hhbGxlbmdlQXR0cikK
LSAgICAgICAgbV9jaGFsbGVuZ2UgPSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBrZXl0eXBlQXR0cikKLSAgICAgICAgbV9rZXlUeXBlID0gYXR0ci0+dmFsdWUo
KTsKLSAgICBlbHNlCi0gICAgICAgIC8vIHNraXAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsIHBhcnNp
bmchCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OmFwcGVuZEZvcm1E
YXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RlZF92YWx1ZXMsIGJvb2wpCi17Ci0gICAgLy8gT25seSBS
U0EgaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KLSAgICBpZiAoIW1fa2V5VHlwZS5pc051bGwo
KSAmJiAhZXF1YWxJZ25vcmluZ0Nhc2UobV9rZXlUeXBlLCAicnNhIikpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBRU3RyaW5nIHZhbHVlID0gS1NTTEtleUdlbjo6c2lnbmVkUHVibGljS2V5
QW5kQ2hhbGxlbmdlU3RyaW5nKHNlbGVjdGVkSW5kZXgoKSwgbV9jaGFsbGVuZ2UucXN0cmluZygp
LCBnZXREb2N1bWVudCgpLT5mcmFtZSgpLT5iYXNlVVJMKCkpOwotICAgIGlmICh2YWx1ZS5pc051
bGwoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERh
dGEobmFtZSgpLCB2YWx1ZS51dGY4KCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGdyb3VwVGFnLCBkb2MsIGYpCi17Ci19Ci0K
LUhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjp+SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoKQotewot
fQotCi1ib29sIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdEdyb3VwRWxlbWVudElt
cGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAib3B0Z3JvdXAiOwotfQotCi1Ob2RlSW1w
bCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6Omluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdD
aGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5v
ZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3Jl
KG5ld0NoaWxkLHJlZkNoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiAoICFleGNlcHRpb25j
b2RlICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkICgg
Tm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpyZXBsYWNlQ2hpbGQobmV3Q2hpbGQsb2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlm
KCFleGNlcHRpb25jb2RlKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0
dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZW1v
dmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAg
ICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNo
aWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQot
ICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
Tm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBs
ICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0
ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNl
cHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICByZWNhbGNTZWxl
Y3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwqIEhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsOjphZGRDaGlsZChOb2RlSW1wbCogbmV3Q2hpbGQpCi17Ci0gICAgcmVj
YWxjU2VsZWN0T3B0aW9ucygpOwotCi0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjphZGRDaGlsZChuZXdDaGlsZCk7Ci19Ci0KLXZvaWQgSFRNTE9wdEdyb3VwRWxlbWVudElt
cGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0g
ICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIp
OwotICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbDo6cmVjYWxjU2VsZWN0T3B0aW9ucygpCi17Ci0gICAgTm9kZUltcGwgKnNlbGVjdCA9
IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3QtPmhhc1RhZ05hbWUo
c2VsZWN0VGFnKSkKLSAgICAgICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnROb2RlKCk7Ci0gICAg
aWYgKHNlbGVjdCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnRJbXBsKj4o
c2VsZWN0KS0+c2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3Jv
dXBFbGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
bGFiZWxBdHRyKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6c2V0TGFiZWwo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobGFiZWxBdHRyLCB2
YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTE9wdGlvbkVsZW1lbnRJbXBs
OjpIVE1MT3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVu
dEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChvcHRpb25UYWcsIGRv
YywgZikKLXsKLSAgICBtX3NlbGVjdGVkID0gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTE9wdGlvbkVs
ZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gIm9wdGlvbiI7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnRl
eHQoKSBjb25zdAotewotICAgIERPTVN0cmluZyB0ZXh0OwotCi0gICAgLy8gV2luSUUgZG9lcyBu
b3QgdXNlIHRoZSBsYWJlbCBhdHRyaWJ1dGUsIHNvIGFzIGEgcXVpcmssIHdlIGlnbm9yZSBpdC4K
LSAgICBpZiAoZ2V0RG9jdW1lbnQoKSAmJiAhZ2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkp
IHsKLSAgICAgICAgRE9NU3RyaW5nIHRleHQgPSBnZXRBdHRyaWJ1dGUobGFiZWxBdHRyKTsKLSAg
ICAgICAgaWYgKCF0ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAg
IH0KLQotICAgIGNvbnN0IE5vZGVJbXBsICpuID0gdGhpcy0+Zmlyc3RDaGlsZCgpOwotICAgIHdo
aWxlIChuKSB7Ci0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSB8
fCBuLT5ub2RlVHlwZSgpID09IE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERSkKLSAgICAgICAgICAg
IHRleHQgKz0gbi0+bm9kZVZhbHVlKCk7Ci0gICAgICAgIC8vIHNraXAgc2NyaXB0IGNvbnRlbnQK
LSAgICAgICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSAmJiBuLT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6c2NyaXB0VGFnKSkKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHRTaWJsaW5nKHRo
aXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSh0
aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGV4dDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxl
bWVudEltcGw6OnNldFRleHQoY29uc3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4Y2VwdGlvbikK
LXsKLSAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlcmUncyBl
eGFjdGx5IDEgY2hpbGQgbm9kZSwgYW5kIGl0J3MgYSB0ZXh0IG5vZGUuCi0gICAgTm9kZUltcGwg
KmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+aXNUZXh0Tm9k
ZSgpICYmICFjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxUZXh0
SW1wbCAqPihjaGlsZCktPnNldERhdGEodGV4dCwgZXhjZXB0aW9uKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgYXBwZW5kQ2hpbGQobmV3IFRl
eHRJbXBsKGdldERvY3VtZW50KCksIHRleHQpLCBleGNlcHRpb24pOwotfQotCi1pbnQgSFRNTE9w
dGlvbkVsZW1lbnRJbXBsOjppbmRleCgpIGNvbnN0Ci17Ci0gICAgLy8gTGV0J3MgZG8gdGhpcyBk
eW5hbWljYWxseS4gTWlnaHQgYmUgYSBiaXQgc2xvdywgYnV0IHdlJ3JlIHN1cmUKLSAgICAvLyB3
ZSB3b24ndCBmb3JnZXQgdG8gdXBkYXRlIGEgbWVtYmVyIHZhcmlhYmxlIGluIHNvbWUgY2FzZXMu
Li4KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAg
IGlmIChzZWxlY3QpIHsKLSAgICAgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1z
ID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKLSAgICAgICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwot
ICAgICAgICBpbnQgb3B0aW9uSW5kZXggPSAwOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwg
bDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25U
YWcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zW2ldKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0
aW9uSW5kZXg7Ci0gICAgICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxl
bWVudEltcGw6OnNldEluZGV4KGludCwgaW50ICZleGNlcHRpb24pCi17Ci0gICAgZXhjZXB0aW9u
ID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgLy8gIyMj
Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShN
YXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gc2Vs
ZWN0ZWRBdHRyKQotICAgICAgICBtX3NlbGVjdGVkID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAg
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikKLSAgICAgICAgbV92YWx1ZSA9IGF0
dHItPnZhbHVlKCk7Ci0gICAgZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9u
RWxlbWVudEltcGw6OnZhbHVlKCkgY29uc3QKLXsKLSAgICBpZiAoICFtX3ZhbHVlLmlzTnVsbCgp
ICkKLSAgICAgICAgcmV0dXJuIG1fdmFsdWU7Ci0gICAgLy8gVXNlIHRoZSB0ZXh0IGlmIHRoZSB2
YWx1ZSB3YXNuJ3Qgc2V0LgotICAgIHJldHVybiB0ZXh0KCkucXN0cmluZygpLnN0cmlwV2hpdGVT
cGFjZSgpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7
Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRTZWxlY3RlZChib29sIF9zZWxl
Y3RlZCkKLXsKLSAgICBpZihtX3NlbGVjdGVkID09IF9zZWxlY3RlZCkKLSAgICAgICAgcmV0dXJu
OwotICAgIG1fc2VsZWN0ZWQgPSBfc2VsZWN0ZWQ7Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
ICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAgICBzZWxlY3Qt
Pm5vdGlmeU9wdGlvblNlbGVjdGVkKHRoaXMsX3NlbGVjdGVkKTsKLX0KLQotdm9pZCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICBIVE1MU2VsZWN0RWxlbWVu
dEltcGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgaWYgKHNlbGVjdCkKLSAgICAgICBzZWxl
Y3QtPmNoaWxkcmVuQ2hhbmdlZCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGwgKkhUTUxP
cHRpb25FbGVtZW50SW1wbDo6Z2V0U2VsZWN0KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqc2Vs
ZWN0ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFn
TmFtZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsK
LSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnRJbXBsKj4oc2VsZWN0KTsK
LX0KLQotYm9vbCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmRlZmF1bHRTZWxlY3RlZCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuICFnZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyKS5pc051bGwoKTsKLX0K
LQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldERlZmF1bHRTZWxlY3RlZChib29sIGIp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLURP
TVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmxhYmVsKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGxhYmVsQXR0cik7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJ
bXBsOjpzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShsYWJlbEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MVGV4
dEFyZWFFbGVtZW50SW1wbDo6SFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpk
b2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbCh0ZXh0YXJlYVRhZywgZG9jLCBmKSwgbV92YWx1ZUlzVmFsaWQoZmFsc2UpLCBtX3ZhbHVl
TWF0Y2hlc1JlbmRlcmVyKGZhbHNlKQotewotICAgIC8vIERURCByZXF1aXJlcyByb3dzICYgY29s
cyBiZSBzcGVjaWZpZWQsIGJ1dCB3ZSB3aWxsIHByb3ZpZGUgcmVhc29uYWJsZSBkZWZhdWx0cwot
ICAgIG1fcm93cyA9IDI7Ci0gICAgbV9jb2xzID0gMjA7Ci0gICAgbV93cmFwID0gdGFfVmlydHVh
bDsKLX0KLQotSFRNTFRleHRBcmVhRWxlbWVudEltcGw6On5IVE1MVGV4dEFyZWFFbGVtZW50SW1w
bCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJN
YWludGFpbnNTdGF0ZSh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gInRleHRhcmVhIjsKLX0KLQotUVN0cmlu
ZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICAvLyBNYWtlIHN1cmUg
dGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpzdGF0ZSgpICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOwotfQotCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsK
LSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRj
aGluZ1N0YXRlKHN0YXRlcyk7Ci0gICAgaWYgKHN0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0gICAg
c2V0RGVmYXVsdFZhbHVlKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpOwotICAgIC8vIHRo
ZSBjbG9zZSgpIGluIHRoZSByZW5kZXJ0cmVlIHdpbGwgdGFrZSBjYXJlIG9mIHRyYW5zZmVycmlu
ZyBkZWZhdWx0dmFsdWUgdG8gJ3ZhbHVlJwotfQotCi1pbnQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0YXJ0
KCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2Vs
ZWN0aW9uRW5kKCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvbkVuZCgpOwotICAgIHJl
dHVybiAwOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25T
dGFydChpbnQgc3RhcnQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsK
LX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBl
bmQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0
QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotfQotCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpzZWxlY3QoICApCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci19
Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBz
dGFydCwgaW50IGVuZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVu
ZCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgp
Ci17Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwotfQotICAgIAotdm9pZCBIVE1MVGV4
dEFyZWFFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1w
bCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHJvd3NBdHRyKSB7Ci0gICAgICAg
IG1fcm93cyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IDM7Ci0g
ICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNM
YXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBj
b2xzQXR0cikgewotICAgICAgICBtX2NvbHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1
ZSgpLnRvSW50KCkgOiA2MDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICBy
ZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IHdyYXBBdHRyKSB7Ci0gICAgICAgIC8vIHZpcnR1YWwgLyBwaHlz
aWNhbCBpcyBOZXRzY2FwZSBleHRlbnNpb24gb2YgSFRNTCAzLjAsIG5vdyBkZXByZWNhdGVkCi0g
ICAgICAgIC8vIHNvZnQvIGhhcmQgLyBvZmYgaXMgcmVjb21tZW5kYXRpb24gZm9yIEhUTUwgNCBl
eHRlbnNpb24gYnkgSUUgYW5kIE5TIDQKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0
dHItPnZhbHVlKCksICJ2aXJ0dWFsIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUo
KSwgInNvZnQiKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1ZpcnR1YWw7Ci0gICAgICAgIGVs
c2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJwaHlzaWNhbCIpIHx8IGVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJoYXJkIikpCi0gICAgICAgICAgICBtX3dy
YXAgPSB0YV9QaHlzaWNhbDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0
ci0+dmFsdWUoKSwgIm9uIiApKQotICAgICAgICAgICAgbV93cmFwID0gdGFfUGh5c2ljYWw7Ci0g
ICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKSkK
LSAgICAgICAgICAgIG1fd3JhcCA9IHRhX05vV3JhcDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkp
Ci0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAg
ICAgLy8gaWdub3JlIGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewot
ICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZl
bnRMaXN0ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5n
ZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1SZW5kZXJPYmplY3QgKkhU
TUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEs
IFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyVGV4
dEFyZWEodGhpcyk7Ci19Ci0KLWJvb2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFwcGVuZEZv
cm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RpbmcsIGJvb2wpCi17Ci0gICAgaWYgKG5hbWUoKS5p
c0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwg
dmFsdWUoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OnJlc2V0KCkKLXsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUoKSk7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnVwZGF0ZVZhbHVlKCkKLXsKLSAgICBpZiAoICFt
X3ZhbHVlSXNWYWxpZCApIHsKLSAgICAgICAgaWYgKCBtX3JlbmRlciApIHsKLSAgICAgICAgICAg
IG1fdmFsdWUgPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KCBtX3JlbmRlciApLT50ZXh0
KCkucXN0cmluZygpOwotICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gZGVmYXVsdFZhbHVlKCku
cXN0cmluZygpOwotICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwot
ICAgICAgICB9Ci0gICAgICAgIG1fdmFsdWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLURP
TVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dmFsdWUoKQotewotICAgIHVwZGF0ZVZh
bHVlKCk7Ci0gICAgcmV0dXJuIG1fdmFsdWUuaXNOdWxsKCkgPyBET01TdHJpbmcoIiIpIDogbV92
YWx1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWUucXN0cmluZygpOwotICAg
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3ZhbHVlSXNWYWxpZCA9IHRy
dWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1l
bnQoKTsKLSAgICAvLyBGSVhNRTogRm9yY2UgcmVsb2FkIGZyb20gcmVuZGVyZXIsIGFzIHJlbmRl
cmVyIG1heSBoYXZlIG5vcm1hbGl6ZWQgbGluZSBlbmRpbmdzLgotICAgIG1fdmFsdWVJc1ZhbGlk
ID0gZmFsc2U7Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotCi1ET01TdHJpbmcgSFRNTFRl
eHRBcmVhRWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpCi17Ci0gICAgRE9NU3RyaW5nIHZhbCA9
ICIiOwotICAgIC8vIHRoZXJlIG1heSBiZSBjb21tZW50cyAtIGp1c3QgZ3JhYiB0aGUgdGV4dCBu
b2RlcwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9
IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAg
ICAgICB2YWwgKz0gc3RhdGljX2Nhc3Q8VGV4dEltcGwqPihuKS0+ZGF0YSgpOwotICAgIAotICAg
IGlmICh2YWxbMF0gPT0gJ1xyJyAmJiB2YWxbMV0gPT0gJ1xuJykgewotICAgICAgICB2YWwgPSB2
YWwuY29weSgpOwotICAgICAgICB2YWwucmVtb3ZlKDAsMik7Ci0gICAgfSBlbHNlIGlmICh2YWxb
MF0gPT0gJ1xyJyB8fCB2YWxbMF0gPT0gJ1xuJykgewotICAgICAgICB2YWwgPSB2YWwuY29weSgp
OwotICAgICAgICB2YWwucmVtb3ZlKDAsMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLX0K
LQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0RGVmYXVsdFZhbHVlKGNvbnN0IERP
TVN0cmluZyAmZGVmYXVsdFZhbHVlKQotewotICAgIC8vIHRoZXJlIG1heSBiZSBjb21tZW50cyAt
IHJlbW92ZSBhbGwgdGhlIHRleHQgbm9kZXMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIG9uZQotICAg
IFFQdHJMaXN0PE5vZGVJbXBsPiB0b1JlbW92ZTsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3Ig
KG4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAo
bi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKG4pOwotICAgIFFQ
dHJMaXN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0KHRvUmVtb3ZlKTsKLSAgICBpbnQgZXhjZXB0aW9u
Y29kZSA9IDA7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkgewotICAgICAgICBOb2Rl
SW1wbCAqbiA9IGl0LmN1cnJlbnQoKTsKLSAgICAgICAgbi0+cmVmKCk7Ci0gICAgICAgIHJlbW92
ZUNoaWxkKG4sIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICBuLT5kZXJlZigpOwotICAgIH0KLSAg
ICBpbnNlcnRCZWZvcmUoZ2V0RG9jdW1lbnQoKS0+Y3JlYXRlVGV4dE5vZGUoZGVmYXVsdFZhbHVl
KSxmaXJzdENoaWxkKCksIGV4Y2VwdGlvbmNvZGUpOwotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1
ZSk7Ci19Ci0KLWJvb2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQotewot
ICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphY2Nl
c3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGZvY3VzKCk7Ci19Ci0K
LXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgbV92YWx1ZUlz
VmFsaWQgPSB0cnVlOwotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKTsK
LSAgICB1cGRhdGVWYWx1ZSgpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpk
ZXRhY2goKQotewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAg
ICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MVGV4
dEFyZWFFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBs
OjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsOjpzZXRDb2xzKGludCBjb2xzKQotewotICAgIHNldEF0dHJpYnV0ZShjb2xzQXR0ciwgUVN0
cmluZzo6bnVtYmVyKGNvbHMpKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
c2V0Um93cyhpbnQgcm93cykKLXsKLSAgICBzZXRBdHRyaWJ1dGUocm93c0F0dHIsIFFTdHJpbmc6
Om51bWJlcihyb3dzKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElzSW5kZXhF
bGVtZW50SW1wbDo6SFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRN
TEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxJbnB1dEVsZW1lbnRJbXBsKGlzaW5kZXhU
YWcsIGRvYywgZikKLXsKLSAgICBtX3R5cGUgPSBURVhUOwotICAgIG1fbmFtZSA9ICJpc2luZGV4
IjsKLX0KLQotdm9pZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGVJbXBsKiBhdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0g
cHJvbXB0QXR0cikKLQlzZXRWYWx1ZShhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNlCi0gICAgICAg
IC8vIGRvbid0IGNhbGwgSFRNTElucHV0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUgaGVy
ZSwgYXMgaXQgd291bGQKLSAgICAgICAgLy8gYWNjZXB0IGF0dHJpYnV0ZXMgdGhpcyBlbGVtZW50
IGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBh
cnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElzSW5kZXhFbGVt
ZW50SW1wbDo6cHJvbXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHByb21w
dEF0dHIpOwotfQotCi12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnNldFByb21wdChjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShwcm9tcHRBdHRyLCB2YWx1
ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdW5zaWduZWQgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVk
LgotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6OnNl
dExlbmd0aCh1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4K
LX0KLQotTm9kZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Oml0ZW0odW5zaWduZWQg
aW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICByZXR1cm4g
MDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Om5hbWVkSXRlbShj
b25zdCBET01TdHJpbmcgJm5hbWUpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRl
ZC4KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Gb3JtRGF0YUxp
c3Q6OkZvcm1EYXRhTGlzdChRVGV4dENvZGVjICpjKQotICAgIDogbV9jb2RlYyhjKQotewotfQot
Ci12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0IFFDU3RyaW5nICZzKQotewot
ICAgIG1fbGlzdC5hcHBlbmQocyk7Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJp
bmcoY29uc3QgUVN0cmluZyAmcykKLXsKLSAgICBRQ1N0cmluZyBjc3RyID0gZml4TGluZUJyZWFr
cyhtX2NvZGVjLT5mcm9tVW5pY29kZShzLCB0cnVlKSk7Ci0gICAgY3N0ci50cnVuY2F0ZShjc3Ry
Lmxlbmd0aCgpKTsKLSAgICBtX2xpc3QuYXBwZW5kKGNzdHIpOwotfQotCi12b2lkIEZvcm1EYXRh
TGlzdDo6YXBwZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZm
aWxlbmFtZSkKLXsKLSAgICBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7Ci0gICAgbV9saXN0
LmFwcGVuZChmaWxlbmFtZS5xc3RyaW5nKCkpOwotfQotCiB9IC8vIG5hbWVzcGFjZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5593</attachid>
            <date>2006-01-10 01:00:09 -0800</date>
            <delta_ts>2006-01-10 01:00:09 -0800</delta_ts>
            <desc>patch (3 of 3) splitting html_formimpl.* into multiple classes.</desc>
            <filename>form3.patch</filename>
            <type>text/plain</type>
            <size>928020</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL2h0bWwvSFRNTElucHV0RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGtodG1sL2h0bWwvSFRNTElucHV0RWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMTk3NikKKysr
IGtodG1sL2h0bWwvSFRNTElucHV0RWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5v
cmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5v
cmcpCiAgKiAgICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcp
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENv
cHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgogICogICAg
ICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQG55cG9wLmNvbSkKICAqCiAg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCkBAIC0yNCwzNTQ1ICsyNCwxMTg3IEBACiAgKgogICovCiAKLSN1bmRlZiBGT1JNU19E
RUJVRwotLy8jZGVmaW5lIEZPUk1TX0RFQlVHCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJodG1sL2h0bWxfZm9ybWltcGwuaCIKLQotI2luY2x1ZGUgImtodG1sdmlldy5oIgotI2lu
Y2x1ZGUgIk1hY0ZyYW1lLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgot
I2luY2x1ZGUgImh0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAia2h0bWxfc2V0dGluZ3MuaCIK
LSNpbmNsdWRlICJtaXNjL2Zvcm1kYXRhLmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudElt
cGwuaCIKKyNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiaHRtbF9p
bWFnZWltcGwuaCIgLy8gZm9yIEhUTUxJbWFnZUxvYWRlcgorI2luY2x1ZGUgImRvbTJfZXZlbnRz
aW1wbC5oIgorI2luY2x1ZGUgIkZvcm1EYXRhTGlzdC5oIgogCi0jaW5jbHVkZSAiZG9tL2RvbV9l
eGNlcHRpb24uaCIKLSNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgogI2luY2x1ZGUg
ImNzc3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJjc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJ4bWwv
ZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1
ZGUgInhtbC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAia2h0bWxfZXh0LmgiCi0KICNpbmNsdWRl
ICJyZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaCIKLSNpbmNsdWRlICJyZW5kZXJfYnV0dG9uLmgiCisj
aW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9idXR0b24uaCIKICNpbmNsdWRlICJyZW5kZXJfdGhl
bWUuaCIKIAogI2luY2x1ZGUgPGtsb2NhbGUuaD4KLSNpbmNsdWRlIDxxZmlsZS5oPgotI2luY2x1
ZGUgPHF0ZXh0Y29kZWMuaD4KLQotLy8gZm9yIGtleWdlbgotI2luY2x1ZGUgPHFzdHJpbmcuaD4K
LSNpbmNsdWRlIDxrc3Nsa2V5Z2VuLmg+CiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRl
ICJFdmVudE5hbWVzLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBraHRtbDsKK3VzaW5nIGtodG1sOjpD
b250cm9sU3RhdGU7CiAKIG5hbWVzcGFjZSBET00gewogCiB1c2luZyBuYW1lc3BhY2UgRXZlbnRO
YW1lczsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLXN0cnVjdCBGb3JtRGF0YUxpc3RJ
dGVtIHsKLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFDU3RyaW5nICZkYXRhKSA6IG1fZGF0
YShkYXRhKSB7IH0KLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFTdHJpbmcgJnBhdGgpIDog
bV9wYXRoKHBhdGgpIHsgfQotCi0gICAgUVN0cmluZyBtX3BhdGg7Ci0gICAgUUNTdHJpbmcgbV9k
YXRhOwotfTsKLQotY2xhc3MgRm9ybURhdGFMaXN0IHsKLXB1YmxpYzoKLSAgICBGb3JtRGF0YUxp
c3QoUVRleHRDb2RlYyAqKTsKLQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcg
JmtleSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5
LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZS5xc3RyaW5nKCkpOyB9Ci0gICAgdm9pZCBh
cHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBRU3RyaW5nICZ2YWx1ZSkKLSAg
ICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZSk7
IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IFFDU3Ry
aW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVu
ZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZr
ZXksIGludCB2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFw
cGVuZFN0cmluZyhRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsgfQotICAgIHZvaWQgYXBwZW5kRmls
ZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZmaWxlbmFtZSk7Ci0KLSAg
ICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBiZWdpbigpIGNvbnN0
Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5iZWdpbigpOyB9Ci0gICAgUVZhbHVlTGlzdENvbnN0
SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gZW5kKCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4g
bV9saXN0LmVuZCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmRTdHJpbmcoY29uc3Qg
UUNTdHJpbmcgJnMpOwotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0IFFTdHJpbmcgJnMpOwot
Ci0gICAgUVRleHRDb2RlYyAqbV9jb2RlYzsKLSAgICBRVmFsdWVMaXN0PEZvcm1EYXRhTGlzdEl0
ZW0+IG1fbGlzdDsKLX07Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6OkhUTUxGb3JtRWxlbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudEltcGwoZm9ybVRhZywgZG9j
KQotewotICAgIGNvbGxlY3Rpb25JbmZvID0gMDsKLSAgICBtX3Bvc3QgPSBmYWxzZTsKLSAgICBt
X211bHRpcGFydCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAgICBtX2lu
c3VibWl0ID0gZmFsc2U7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwotICAgIG1faW5yZXNl
dCA9IGZhbHNlOwotICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVu
Y29kZWQiOwotICAgIG1fYm91bmRhcnkgPSAiLS0tLS0tLS0tLTB4S2hUbUxiT3VOZEFyWSI7Ci0g
ICAgbV9hY2NlcHRjaGFyc2V0ID0gIlVOS05PV04iOwotICAgIG1fbWFsZm9ybWVkID0gZmFsc2U7
CitIVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBs
ICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCisgICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbChpbnB1dFRhZywgZG9jLCBmKQoreworICAgIGluaXQoKTsKIH0KIAotSFRNTEZvcm1F
bGVtZW50SW1wbDo6fkhUTUxGb3JtRWxlbWVudEltcGwoKQorSFRNTElucHV0RWxlbWVudEltcGw6
OkhUTUxJbnB1dEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQorICAgIDogSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwodGFnTmFtZSwgZG9jLCBmKQogewotICAgIGRlbGV0ZSBjb2xsZWN0aW9u
SW5mbzsKLSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNv
dW50KCk7ICsraSkKLSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbWdFbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAg
IGltZ0VsZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOworICAgIGluaXQoKTsKIH0KIAotCi1ib29sIEhU
TUxGb3JtRWxlbWVudEltcGw6OmZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERP
TVN0cmluZyAmdXJsKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aW5pdCgpCiB7Ci0gICAg
aWYgKHVybC5pc051bGwoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJl
dHVybiBnZXREb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKS5zdGFydHNXaXRo
KCJodHRwczoiLCBmYWxzZSk7Ci19CisgICAgbV9pbWFnZUxvYWRlciA9IDA7CisgICAgbV92YWx1
ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOworICAgIG1fdHlwZSA9IFRFWFQ7CisgICAgbV9tYXhM
ZW4gPSAtMTsKKyAgICBtX3NpemUgPSAyMDsKKyAgICBtX2NoZWNrZWQgPSBmYWxzZTsKKyAgICBt
X2RlZmF1bHRDaGVja2VkID0gZmFsc2U7CisgICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7
CisgICAgbV9pbmRldGVybWluYXRlID0gZmFsc2U7CiAKKyAgICBtX2hhdmVUeXBlID0gZmFsc2U7
CisgICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsKKyAgICBtX2F1dG9jb21wbGV0ZSA9IHRydWU7
CisgICAgbV9pbml0ZWQgPSBmYWxzZTsKIAotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjphdHRh
Y2goKQotewotICAgIEhUTUxFbGVtZW50SW1wbDo6YXR0YWNoKCk7CisgICAgeFBvcyA9IDA7Cisg
ICAgeVBvcyA9IDA7CiAKLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5nIHNl
Y3VyZUZvcm1SZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcKLSAgICAvLyB3
YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAgIGlmIChmb3Jt
V291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCkpCi0gICAgICAgIGdldERvY3VtZW50KCkt
PnNlY3VyZUZvcm1BZGRlZCgpOworICAgIG1fbWF4UmVzdWx0cyA9IC0xOworCisgICAgaWYgKG1f
Zm9ybSkKKyAgICAgICAgbV9hdXRvY29tcGxldGUgPSBtX2Zvcm0tPmF1dG9Db21wbGV0ZSgpOwog
fQogCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKK0hU
TUxJbnB1dEVsZW1lbnRJbXBsOjp+SFRNTElucHV0RWxlbWVudEltcGwoKQogewotICAgIGlmIChn
ZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9j
dW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwot
CWRvY3VtZW50LT5hZGROYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLQotICAgIEhUTUxF
bGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKKyAgICBpZiAoZ2V0RG9jdW1lbnQo
KSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOworICAgIGRl
bGV0ZSBtX2ltYWdlTG9hZGVyOwogfQogCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92
ZWRGcm9tRG9jdW1lbnQoKQorRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpuYW1lKCkg
Y29uc3QKIHsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotCUhU
TUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAq
PihnZXREb2N1bWVudCgpKTsKLQlkb2N1bWVudC0+cmVtb3ZlTmFtZWRJdGVtKG9sZE5hbWVBdHRy
KTsKLSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQo
KTsKKyAgICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBtX25hbWU7CiB9CiAKLWludCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjpsZW5ndGgoKSBjb25zdAorYm9vbCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0CiB7Ci0gICAgaW50IGxlbiA9IDA7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0J
aWYgKGZvcm1FbGVtZW50c1tpXS0+aXNFbnVtZXJhdGFibGUoKSkKLQkgICAgKytsZW47Ci0KLSAg
ICByZXR1cm4gbGVuOwotfQorICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3Qg
YmUgZm9jdXNlZCwgdGhlbiB3ZSBjYW4gc3RvcCBub3cuCisgICAgaWYgKCFIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CiAKKyAgICBpZiAobV90eXBlID09IFJBRElPKSB7CisgICAgICAgIC8vIFVubmFtZWQgcmFk
aW8gYnV0dG9ucyBhcmUgbmV2ZXIgZm9jdXNhYmxlIChtYXRjaGVzIFdpbklFKS4KKyAgICAgICAg
aWYgKG5hbWUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLXZvaWQg
SFRNTEZvcm1FbGVtZW50SW1wbDo6c3VibWl0Q2xpY2soKQotewotICAgIGJvb2wgc3VibWl0Rm91
bmQgPSBmYWxzZTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNv
dW50KCk7ICsraSkgewotICAgICAgICBpZiAoZm9ybUVsZW1lbnRzW2ldLT5oYXNMb2NhbE5hbWUo
aW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCAqZWxlbWVudCA9
IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KGZvcm1FbGVtZW50c1tpXSk7Ci0g
ICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgJiYgZWxl
bWVudC0+cmVuZGVyZXIoKSkgewotICAgICAgICAgICAgICAgIHN1Ym1pdEZvdW5kID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICBlbGVtZW50LT5jbGljayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIE5ldmVyIGFsbG93IGtleWJvYXJkIHRh
YmJpbmcgdG8gbGVhdmUgeW91IGluIHRoZSBzYW1lIHJhZGlvIGdyb3VwLiAgQWx3YXlzCisgICAg
ICAgIC8vIHNraXAgYW55IG90aGVyIGVsZW1lbnRzIGluIHRoZSBncm91cC4KKyAgICAgICAgTm9k
ZUltcGwqIGN1cnJlbnRGb2N1c05vZGUgPSBnZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKTsKKyAg
ICAgICAgaWYgKGN1cnJlbnRGb2N1c05vZGUgJiYgY3VycmVudEZvY3VzTm9kZS0+aGFzVGFnTmFt
ZShpbnB1dFRhZykpIHsKKyAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBmb2N1c2Vk
SW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnRGb2N1c05v
ZGUpOworICAgICAgICAgICAgaWYgKGZvY3VzZWRJbnB1dC0+aW5wdXRUeXBlKCkgPT0gUkFESU8g
JiYgZm9jdXNlZElucHV0LT5mb3JtKCkgPT0gbV9mb3JtICYmCisgICAgICAgICAgICAgICAgZm9j
dXNlZElucHV0LT5uYW1lKCkgPT0gbmFtZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQWxsb3cga2V5Ym9hcmQgZm9jdXMg
aWYgd2UncmUgY2hlY2tlZCBvciBpZiBub3RoaW5nIGluIHRoZSBncm91cCBpcyBjaGVja2VkLgor
ICAgICAgICByZXR1cm4gY2hlY2tlZCgpIHx8ICFnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9C
dXR0b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pOwogICAgIH0KLSAgICBpZiAoIXN1
Ym1pdEZvdW5kKSAvLyBzdWJtaXQgdGhlIGZvcm0gd2l0aG91dCBhIHN1Ym1pdCBvciBpbWFnZSBp
bnB1dAotICAgICAgICBwcmVwYXJlU3VibWl0KCk7CisgICAgCisgICAgcmV0dXJuIHRydWU7CiB9
CiAKLQotc3RhdGljIFFDU3RyaW5nIGVuY29kZUNTdHJpbmcoY29uc3QgUUNTdHJpbmcmIGUpCit2
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKIHsK
LSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gt
MTcuMTMuNC4xCi0gICAgLy8gc2FmZSBjaGFyYWN0ZXJzIGxpa2UgTlMgaGFuZGxlcyB0aGVtIGZv
ciBjb21wYXRpYmlsaXR5Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnNhZmUgPSAiLS5fKiI7Ci0g
ICAgaW50IGVsZW4gPSBlLmxlbmd0aCgpOwotICAgIFFDU3RyaW5nIGVuY29kZWQoKCBlbGVuK2Uu
Y29udGFpbnMoICdcbicgKSApKjMrMSk7Ci0gICAgaW50IGVuY2xlbiA9IDA7Ci0KLSAgICAvL1FD
U3RyaW5nIG9yaWcoZS5kYXRhKCksIGUuc2l6ZSgpKTsKLQotICAgIGZvcihpbnQgcG9zID0gMDsg
cG9zIDwgZWxlbjsgcG9zKyspIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gZVtwb3NdOwot
Ci0gICAgICAgIGlmICggKCggYyA+PSAnQScpICYmICggYyA8PSAnWicpKSB8fAotICAgICAgICAg
ICAgICgoIGMgPj0gJ2EnKSAmJiAoIGMgPD0gJ3onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49
ICcwJykgJiYgKCBjIDw9ICc5JykpIHx8Ci0gICAgICAgICAgICAgKHN0cmNocihzYWZlLCBjKSkK
LSAgICAgICAgICAgICkKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gYzsKLSAgICAg
ICAgZWxzZSBpZiAoIGMgPT0gJyAnICkKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0g
JysnOwotICAgICAgICBlbHNlIGlmICggYyA9PSAnXG4nIHx8ICggYyA9PSAnXHInICYmIGVbcG9z
KzFdICE9ICdcbicgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytd
ID0gJyUnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnMCc7Ci0gICAgICAgICAg
ICBlbmNvZGVkW2VuY2xlbisrXSA9ICdEJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytd
ID0gJyUnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnMCc7Ci0gICAgICAgICAg
ICBlbmNvZGVkW2VuY2xlbisrXSA9ICdBJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgg
YyAhPSAnXHInICkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAn
JSc7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgaCA9IGMgLyAxNjsKLSAgICAgICAgICAgIGgg
Kz0gKGggPiA5KSA/ICgnQScgLSAxMCkgOiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xl
bisrXSA9IGg7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBsID0gYyAlIDE2OwotICAgICAg
ICAgICAgbCArPSAobCA+IDkpID8gKCdBJyAtIDEwKSA6ICcwJzsKLSAgICAgICAgICAgIGVuY29k
ZWRbZW5jbGVuKytdID0gbDsKLSAgICAgICAgfQorICAgIGlmICh0LmlzRW1wdHkoKSkgeworICAg
ICAgICBpbnQgZXhjY29kZTsKKyAgICAgICAgcmVtb3ZlQXR0cmlidXRlKHR5cGVBdHRyLCBleGNj
b2RlKTsKICAgICB9Ci0gICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnXDAnOwotICAgIGVuY29kZWQu
dHJ1bmNhdGUoZW5jbGVuKTsKLQotICAgIHJldHVybiBlbmNvZGVkOworICAgIGVsc2UKKyAgICAg
ICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0KTsKIH0KIAotLy8gQ2hhbmdlIHBsYWluIENSIGFu
ZCBwbGFpbiBMRiB0byBDUkxGIHBhaXJzLgotc3RhdGljIFFDU3RyaW5nIGZpeExpbmVCcmVha3Mo
Y29uc3QgUUNTdHJpbmcgJnMpCit2b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbnB1dFR5
cGUoY29uc3QgRE9NU3RyaW5nJiB0KQogewotICAgIC8vIENvbXB1dGUgdGhlIGxlbmd0aC4KLSAg
ICB1bnNpZ25lZCBuZXdMZW4gPSAwOwotICAgIGNvbnN0IGNoYXIgKnAgPSBzLmRhdGEoKTsKLSAg
ICB3aGlsZSAoY2hhciBjID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAg
ICAgICAgICAvLyBTYWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGluZyAnXDAnLgot
ICAgICAgICAgICAgaWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAvLyBUdXJuIENS
IGludG8gQ1JMRi4KLSAgICAgICAgICAgICAgICBuZXdMZW4gKz0gMjsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8vIFR1cm4gTEYg
aW50byBDUkxGLgotICAgICAgICAgICAgbmV3TGVuICs9IDI7CisgICAgdHlwZUVudW0gbmV3VHlw
ZTsKKyAgICAKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInBhc3N3b3JkIikpCisgICAg
ICAgIG5ld1R5cGUgPSBQQVNTV09SRDsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0
LCAiY2hlY2tib3giKSkKKyAgICAgICAgbmV3VHlwZSA9IENIRUNLQk9YOworICAgIGVsc2UgaWYg
KGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYWRpbyIpKQorICAgICAgICBuZXdUeXBlID0gUkFESU87
CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInN1Ym1pdCIpKQorICAgICAgICBu
ZXdUeXBlID0gU1VCTUlUOworICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyZXNl
dCIpKQorICAgICAgICBuZXdUeXBlID0gUkVTRVQ7CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgImZpbGUiKSkKKyAgICAgICAgbmV3VHlwZSA9IEZJTEU7CisgICAgZWxzZSBpZiAo
ZXF1YWxJZ25vcmluZ0Nhc2UodCwgImhpZGRlbiIpKQorICAgICAgICBuZXdUeXBlID0gSElEREVO
OworICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJpbWFnZSIpKQorICAgICAgICBu
ZXdUeXBlID0gSU1BR0U7CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImJ1dHRv
biIpKQorICAgICAgICBuZXdUeXBlID0gQlVUVE9OOworICAgIGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKHQsICJraHRtbF9pc2luZGV4IikpCisgICAgICAgIG5ld1R5cGUgPSBJU0lOREVYOwor
ICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJzZWFyY2giKSkKKyAgICAgICAgbmV3
VHlwZSA9IFNFQVJDSDsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmFuZ2Ui
KSkKKyAgICAgICAgbmV3VHlwZSA9IFJBTkdFOworICAgIGVsc2UKKyAgICAgICAgbmV3VHlwZSA9
IFRFWFQ7CisKKyAgICAvLyAjIyMgSU1QT1JUQU5UOiBEb24ndCBhbGxvdyB0aGUgdHlwZSB0byBi
ZSBjaGFuZ2VkIHRvIEZJTEUgYWZ0ZXIgdGhlIGZpcnN0CisgICAgLy8gdHlwZSBjaGFuZ2UsIG90
aGVyd2lzZSBhIEphdmFTY3JpcHQgcHJvZ3JhbW1lciB3b3VsZCBiZSBhYmxlIHRvIHNldCBhIHRl
eHQKKyAgICAvLyBmaWVsZCdzIHZhbHVlIHRvIHNvbWV0aGluZyBsaWtlIC9ldGMvcGFzc3dkIGFu
ZCB0aGVuIGNoYW5nZSBpdCB0byBhIGZpbGUgZmllbGQuCisgICAgaWYgKG1fdHlwZSAhPSBuZXdU
eXBlKSB7CisgICAgICAgIGlmIChuZXdUeXBlID09IEZJTEUgJiYgbV9oYXZlVHlwZSkgeworICAg
ICAgICAgICAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgYmFjayB0byB0aGUgb2xkIHZhbHVlLgorICAg
ICAgICAgICAgLy8gVXNlZnVsIGluIGNhc2Ugd2Ugd2VyZSBjYWxsZWQgZnJvbSBpbnNpZGUgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUuCisgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodHlwZUF0dHIsIHR5
cGUoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBvdGhlciBjaGFy
YWN0ZXJzIGFsb25lLgotICAgICAgICAgICAgbmV3TGVuICs9IDE7CisgICAgICAgICAgICBpZiAo
bV90eXBlID09IFJBRElPICYmICFuYW1lKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAg
aWYgKGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBs
KCksIG1fZm9ybSkgPT0gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+
cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYm9vbCB3YXNBdHRhY2hlZCA9IG1fYXR0YWNoZWQ7CisgICAgICAg
ICAgICBpZiAod2FzQXR0YWNoZWQpCisgICAgICAgICAgICAgICAgZGV0YWNoKCk7CisgICAgICAg
ICAgICBib29sIGRpZFN0b3JlVmFsdWUgPSBzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0
ZSgpOworICAgICAgICAgICAgbV90eXBlID0gbmV3VHlwZTsKKyAgICAgICAgICAgIGJvb2wgd2ls
bFN0b3JlVmFsdWUgPSBzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpOworICAgICAg
ICAgICAgaWYgKGRpZFN0b3JlVmFsdWUgJiYgIXdpbGxTdG9yZVZhbHVlICYmICFtX3ZhbHVlLmlz
TnVsbCgpKSB7CisgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbV92YWx1
ZSk7CisgICAgICAgICAgICAgICAgbV92YWx1ZSA9IERPTVN0cmluZygpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKCFkaWRTdG9yZVZhbHVlICYmIHdpbGxTdG9yZVZhbHVlKSB7Cisg
ICAgICAgICAgICAgICAgbV92YWx1ZSA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgaWYgKHdhc0F0dGFjaGVkKQorICAgICAgICAgICAgICAgIGF0
dGFjaCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgb3VyIHR5cGUgbW9y
cGhzIGludG8gYSByYWRpbyBidXR0b24gYW5kIHdlIGFyZSBjaGVja2VkLCB0aGVuIGdvIGFoZWFk
CisgICAgICAgICAgICAvLyBhbmQgc2lnbmFsIHRoaXMgdG8gdGhlIGZvcm0uCisgICAgICAgICAg
ICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSkKKyAgICAgICAgICAgICAgICBnZXRE
b2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKICAgICAgICAgfQog
ICAgIH0KLSAgICBpZiAobmV3TGVuID09IHMubGVuZ3RoKCkpIHsKLSAgICAgICAgcmV0dXJuIHM7
Ci0gICAgfQorICAgIG1faGF2ZVR5cGUgPSB0cnVlOwogICAgIAotICAgIC8vIE1ha2UgYSBjb3B5
IG9mIHRoZSBzdHJpbmcuCi0gICAgcCA9IHMuZGF0YSgpOwotICAgIFFDU3RyaW5nIHJlc3VsdChu
ZXdMZW4gKyAxKTsKLSAgICBjaGFyICpxID0gcmVzdWx0LmRhdGEoKTsKLSAgICB3aGlsZSAoY2hh
ciBjID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBT
YWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGluZyAnXDAnLgotICAgICAgICAgICAg
aWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAvLyBUdXJuIENSIGludG8gQ1JMRi4K
LSAgICAgICAgICAgICAgICAqcSsrID0gJ1xyJzsKLSAgICAgICAgICAgICAgICAqcSsrID0gJ1xu
JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAg
ICAgICAgIC8vIFR1cm4gTEYgaW50byBDUkxGLgotICAgICAgICAgICAgKnErKyA9ICdccic7Ci0g
ICAgICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8v
IExlYXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICAqcSsrID0gYzsKLSAg
ICAgICAgfQorICAgIGlmIChtX3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikgeworICAg
ICAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKKyAgICAgICAgbV9pbWFnZUxvYWRlciA9IDA7CiAg
ICAgfQotICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBs
Ojpmb3JtRGF0YShGb3JtRGF0YSAmZm9ybV9kYXRhKSBjb25zdAorRE9NU3RyaW5nIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKIHsKLSAgICBRQ1N0cmluZyBlbmNfc3RyaW5nID0g
IiI7IC8vIHVzZWQgZm9yIG5vbi1tdWx0aXBhcnQgZGF0YQotCi0gICAgLy8gZmluZCBvdXQgdGhl
IFFUZXh0Y29kZWMgdG8gdXNlCi0gICAgUVN0cmluZyBzdHIgPSBtX2FjY2VwdGNoYXJzZXQucXN0
cmluZygpOwotICAgIHN0ci5yZXBsYWNlKCcsJywgJyAnKTsKLSAgICBRU3RyaW5nTGlzdCBjaGFy
c2V0cyA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnICcsIHN0cik7Ci0gICAgUVRleHRDb2RlYyogY29k
ZWMgPSAwOwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAg
Zm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBjaGFyc2V0cy5iZWdpbigpOyBpdCAhPSBj
aGFyc2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5nIGVuYyA9ICgqaXQpOwotICAg
ICAgICBpZiAoZW5jLmNvbnRhaW5zKCJVTktOT1dOIikpIHsKLSAgICAgICAgICAgIC8vIHVzZSBz
dGFuZGFyZCBkb2N1bWVudCBlbmNvZGluZwotICAgICAgICAgICAgZW5jID0gIklTTy04ODU5LTEi
OwotICAgICAgICAgICAgaWYgKGZyYW1lKQotICAgICAgICAgICAgICAgIGVuYyA9IGZyYW1lLT5l
bmNvZGluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY29kZWMgPSBRVGV4dENvZGVjOjpj
b2RlY0Zvck5hbWUoZW5jLmxhdGluMSgpKSkpCi0gICAgICAgICAgICBicmVhazsKKyAgICAvLyBu
ZWVkcyB0byBiZSBsb3dlcmNhc2UgYWNjb3JkaW5nIHRvIERPTSBzcGVjCisgICAgc3dpdGNoICht
X3R5cGUpIHsKKyAgICBjYXNlIFRFWFQ6IHJldHVybiAidGV4dCI7CisgICAgY2FzZSBQQVNTV09S
RDogcmV0dXJuICJwYXNzd29yZCI7CisgICAgY2FzZSBDSEVDS0JPWDogcmV0dXJuICJjaGVja2Jv
eCI7CisgICAgY2FzZSBSQURJTzogcmV0dXJuICJyYWRpbyI7CisgICAgY2FzZSBTVUJNSVQ6IHJl
dHVybiAic3VibWl0IjsKKyAgICBjYXNlIFJFU0VUOiByZXR1cm4gInJlc2V0IjsKKyAgICBjYXNl
IEZJTEU6IHJldHVybiAiZmlsZSI7CisgICAgY2FzZSBISURERU46IHJldHVybiAiaGlkZGVuIjsK
KyAgICBjYXNlIElNQUdFOiByZXR1cm4gImltYWdlIjsKKyAgICBjYXNlIEJVVFRPTjogcmV0dXJu
ICJidXR0b24iOworICAgIGNhc2UgU0VBUkNIOiByZXR1cm4gInNlYXJjaCI7CisgICAgY2FzZSBS
QU5HRTogcmV0dXJuICJyYW5nZSI7CisgICAgY2FzZSBJU0lOREVYOiByZXR1cm4gIiI7CiAgICAg
fQorICAgIHJldHVybiAiIjsKK30KIAotICAgIGlmICghY29kZWMpCi0gICAgICAgIGNvZGVjID0g
UVRleHRDb2RlYzo6Y29kZWNGb3JMb2NhbGUoKTsKLQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIEZvcm1E
YXRhTGlzdCBsc3QoY29kZWMpOwotCi0gICAgICAgIGlmICghY3VycmVudC0+ZGlzYWJsZWQoKSAm
JiBjdXJyZW50LT5hcHBlbmRGb3JtRGF0YShsc3QsIG1fbXVsdGlwYXJ0KSkgewotICAgICAgICAg
ICAgZm9yIChRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBpdCA9IGxz
dC5iZWdpbigpOyBpdCAhPSBsc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAo
IW1fbXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBJU0lOREVYIC8g
PGlucHV0IG5hbWU9aXNpbmRleD4gc3BlY2lhbAotICAgICAgICAgICAgICAgICAgICAvLyBidXQg
b25seSBpZiBpdHMgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZW5j
X3N0cmluZy5pc0VtcHR5KCkgJiYgKCppdCkubV9kYXRhID09ICJpc2luZGV4IiApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3Ry
aW5nICs9IGVuY29kZUNTdHJpbmcoICgqaXQpLm1fZGF0YSApOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAg
aWYoIWVuY19zdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu
Y19zdHJpbmcgKz0gJyYnOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9
IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVu
Y19zdHJpbmcgKz0gIj0iOwotICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZygoKml0KS5tX2RhdGEp
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFDU3RyaW5n
IGhzdHIoIi0tIik7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gbV9ib3VuZGFyeS5xc3Ry
aW5nKCkubGF0aW4xKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG4iOwotICAg
ICAgICAgICAgICAgICAgICBoc3RyICs9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7
IG5hbWU9XCIiOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICgqaXQpLm1fZGF0YS5kYXRh
KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAgICAgICAg
ICAgICAvLyBpZiB0aGUgY3VycmVudCB0eXBlIGlzIEZJTEUsIHRoZW4gd2UgYWxzbyBuZWVkIHRv
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGZpbGVuYW1lCi0gICAgICAgICAg
ICAgICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpICYmCi0gICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJl
bnQpLT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6RklMRSkKLSAgICAgICAg
ICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBwYXRoID0gc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+dmFsdWUoKS5xc3RyaW5n
KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsg
aWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgIiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gb3IgY29udHJvbCBjaGFyYWN0ZXJzIGxpa2UgQ1Igb3IgTEYuIFRoaXMgYWxzbyBkb2Vz
IHN0cmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaW5ncyBpZiB0aGUgZmlsZW5h
bWUgaW5jbHVkZXMgY2hhcmFjdGVycyB5b3UgY2FuJ3QgZW5jb2RlCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBpbiB0aGUgd2Vic2l0ZSdzIGNoYXJhY3RlciBzZXQuCi0gICAgICAgICAgICAg
ICAgICAgICAgICBoc3RyICs9ICI7IGZpbGVuYW1lPVwiIjsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGhzdHIgKz0gY29kZWMtPmZyb21Vbmljb2RlKHBhdGgubWlkKHBhdGguZmluZFJldignLycp
ICsgMSksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwotCi0g
ICAgICAgICAgICAgICAgICAgICAgICBpZighc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudElt
cGwqPihjdXJyZW50KS0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBtaW1lVHlwZSA9IGZyYW1l
ID8gTWFjKGZyYW1lKS0+bWltZVR5cGVGb3JGaWxlTmFtZShwYXRoKSA6IFFTdHJpbmcoKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUeXBlLmlzRW1wdHkoKSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuQ29udGVudC1UeXBlOiAi
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1pbWVUeXBlLmFzY2lp
KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaHN0ciAr
PSAiXHJcblxyXG4iOwotICAgICAgICAgICAgICAgICAgICArK2l0OworUVN0cmluZyBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c3RhdGUoICkKK3sKKyAgICBhc3NlcnQobV90eXBlICE9IFBBU1NXT1JE
KTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFzc3dvcmQgZmllbGRzCiAKLSAgICAg
ICAgICAgICAgICAgICAgLy8gYXBwZW5kIGJvZHkKLSAgICAgICAgICAgICAgICAgICAgZm9ybV9k
YXRhLmFwcGVuZERhdGEoaHN0ci5kYXRhKCksIGhzdHIubGVuZ3RoKCkpOwotICAgICAgICAgICAg
ICAgICAgICBjb25zdCBGb3JtRGF0YUxpc3RJdGVtICZpdGVtID0gKml0OwotICAgICAgICAgICAg
ICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBpdGVtLm1fZGF0YS5zaXplKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmIChkYXRhU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9y
bV9kYXRhLmFwcGVuZERhdGEoaXRlbS5tX2RhdGEsIGRhdGFTaXplIC0gMSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKCFpdGVtLm1fcGF0aC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRmlsZShpdGVtLm1fcGF0aCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKCJcclxuIiwgMik7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpOworICAgIHN3aXRjaCAobV90eXBlKSB7Cisg
ICAgY2FzZSBDSEVDS0JPWDoKKyAgICBjYXNlIFJBRElPOgorICAgICAgICByZXR1cm4gc3RhdGUg
KyAoY2hlY2tlZCgpID8gIm9uIiA6ICJvZmYiKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1
cm4gc3RhdGUgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7IC8vIE1ha2Ugc3VyZSB0aGUgc3RyaW5n
IGlzIG5vdCBlbXB0eSEKICAgICB9Ci0KLQotICAgIGlmIChtX211bHRpcGFydCkKLSAgICAgICAg
ZW5jX3N0cmluZyA9ICgiLS0iICsgbV9ib3VuZGFyeS5xc3RyaW5nKCkgKyAiLS1cclxuIikuYXNj
aWkoKTsKLQotICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGVuY19zdHJpbmcuZGF0YSgpLCBlbmNf
c3RyaW5nLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5nJiB0eXBlKQordm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpCiB7Ci0g
ICAgaWYodHlwZS5jb250YWlucygibXVsdGlwYXJ0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFpbnMo
ImZvcm0tZGF0YSIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAibXVsdGlwYXJ0L2Zv
cm0tZGF0YSI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHR5
cGUuY29udGFpbnMoInRleHQiLCBmYWxzZSkgfHwgdHlwZS5jb250YWlucygicGxhaW4iLCBmYWxz
ZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gInRleHQvcGxhaW4iOwotICAgICAgICBtX211bHRp
cGFydCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNh
dGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNl
OworICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUv
cmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKKyAgICAKKyAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKHN0YXRlcyk7CisgICAgaWYg
KHN0YXRlLmlzTnVsbCgpKSByZXR1cm47CisKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNh
c2UgQ0hFQ0tCT1g6CisgICAgY2FzZSBSQURJTzoKKyAgICAgICAgc2V0Q2hlY2tlZCgoc3RhdGUg
PT0gIm9uIikpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzZXRWYWx1
ZShET01TdHJpbmcoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSkpOworICAgICAgICBicmVh
azsKICAgICB9CiB9CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0Qm91bmRhcnkoIGNv
bnN0IERPTVN0cmluZyYgYm91bmQgKQorYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y2FuSGF2
ZVNlbGVjdGlvbigpCiB7Ci0gICAgbV9ib3VuZGFyeSA9IGJvdW5kOworICAgIHN3aXRjaCAobV90
eXBlKSB7CisgICAgICAgIGNhc2UgVEVYVDoKKyAgICAgICAgY2FzZSBQQVNTV09SRDoKKyAgICAg
ICAgY2FzZSBTRUFSQ0g6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJv
b2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6cHJlcGFyZVN1Ym1pdCgpCitpbnQgSFRNTElucHV0RWxl
bWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKIHsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1
bWVudCgpLT5mcmFtZSgpOwotICAgIGlmKG1faW5zdWJtaXQgfHwgIWZyYW1lIHx8IGZyYW1lLT5v
bmx5TG9jYWxSZWZlcmVuY2VzKCkpCi0gICAgICAgIHJldHVybiBtX2luc3VibWl0OwotCi0gICAg
bV9pbnN1Ym1pdCA9IHRydWU7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwotCi0gICAgaWYg
KCBkaXNwYXRjaEhUTUxFdmVudChzdWJtaXRFdmVudCxmYWxzZSx0cnVlKSAmJiAhbV9kb2luZ3N1
Ym1pdCApCi0gICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotCi0gICAgbV9pbnN1Ym1pdCA9
IGZhbHNlOwotCi0gICAgaWYgKCBtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgc3VibWl0KHRydWUp
OwotCi0gICAgcmV0dXJuIG1fZG9pbmdzdWJtaXQ7CisgICAgaWYgKCFtX3JlbmRlcikgcmV0dXJu
IDA7CisgICAgCisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICAgICAgY2FzZSBQQVNTV09SRDoK
KyAgICAgICAgY2FzZSBTRUFSQ0g6CisgICAgICAgIGNhc2UgVEVYVDoKKyAgICAgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0
YXJ0KCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAg
cmV0dXJuIDA7CiB9CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c3VibWl0KCBib29sIGFj
dGl2YXRlU3VibWl0QnV0dG9uICkKK2ludCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0aW9u
RW5kKCkKIHsKLSAgICBLSFRNTFZpZXcgKnZpZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0g
ICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXZpZXcg
fHwgIWZyYW1lKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIG1faW5zdWJt
aXQgKSB7Ci0gICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgbV9pbnN1Ym1pdCA9IHRydWU7Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbCogZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gMDsKLSAgICBib29sIG5lZWRC
dXR0b25BY3RpdmF0aW9uID0gYWN0aXZhdGVTdWJtaXRCdXR0b247CS8vIGRvIHdlIG5lZWQgdG8g
YWN0aXZhdGUgYSBzdWJtaXQgYnV0dG9uPwotICAgIAotICAgIE1hYyhmcmFtZSktPmNsZWFyUmVj
b3JkZWRGb3JtVmFsdWVzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVt
ZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwq
IGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIC8vIE91ciBhcHAgbmVlZHMgdG8g
Z2V0IGZvcm0gdmFsdWVzIGZvciBwYXNzd29yZCBmaWVsZHMgZm9yIGRvaW5nIHBhc3N3b3JkIGF1
dG9jb21wbGV0ZSwKLSAgICAgICAgLy8gc28gd2UgYXJlIG1vcmUgbGVuaWVudCBpbiBwdXNoaW5n
IHZhbHVlcywgYW5kIGxldCB0aGUgYXBwIGRlY2lkZSB3aGF0IHRvIHNhdmUgd2hlbi4KLSAgICAg
ICAgaWYgKGN1cnJlbnQtPmhhc0xvY2FsTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhU
TUxJbnB1dEVsZW1lbnRJbXBsICppbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJ
bXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQtPmlucHV0VHlwZSgpID09IEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpURVhUCi0gICAgICAgICAgICAgICAgfHwgaW5wdXQtPmlucHV0
VHlwZSgpID09ICBIVE1MSW5wdXRFbGVtZW50SW1wbDo6UEFTU1dPUkQKLSAgICAgICAgICAgICAg
ICB8fCBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkK
LSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYWMoZnJhbWUpLT5yZWNvcmRGb3JtVmFs
dWUoaW5wdXQtPm5hbWUoKS5xc3RyaW5nKCksIGlucHV0LT52YWx1ZSgpLnFzdHJpbmcoKSwgdGhp
cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0LT5yZW5kZXJlcigpICYmIGlucHV0LT5pbnB1
dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCo+KGlucHV0LT5yZW5kZXJlcigpKS0+YWRk
U2VhcmNoUmVzdWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAo
bmVlZEJ1dHRvbkFjdGl2YXRpb24pIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5pc0FjdGl2
YXRlZFN1Ym1pdCgpKSB7Ci0gICAgICAgICAgICAgICAgbmVlZEJ1dHRvbkFjdGl2YXRpb24gPSBm
YWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9u
ID09IDAgJiYgY3VycmVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkpIHsKLSAgICAgICAg
ICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSBjdXJyZW50OwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uICYm
IGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxT
dWJtaXRCdXR0b24tPnNldEFjdGl2YXRlZFN1Ym1pdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAo
IW1fcG9zdCkKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKKyAgICBpZiAoIW1fcmVuZGVy
KSByZXR1cm4gMDsKICAgICAKLSAgICBGb3JtRGF0YSBmb3JtX2RhdGE7Ci0gICAgaWYgKGZvcm1E
YXRhKGZvcm1fZGF0YSkpIHsKLSAgICAgICAgaWYobV9wb3N0KSB7Ci0gICAgICAgICAgICBmcmFt
ZS0+c3VibWl0Rm9ybSggInBvc3QiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0YSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmluZygpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN0eXBlKCkucXN0cmluZygpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSgpLnFzdHJpbmco
KSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnJhbWUtPnN1Ym1p
dEZvcm0oICJnZXQiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0YSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmluZygpICk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmlyc3RTdWNjZXNzZnVs
U3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbi0+c2V0
QWN0aXZhdGVkU3VibWl0KGZhbHNlKTsKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgICAgICBj
YXNlIFBBU1NXT1JEOgorICAgICAgICBjYXNlIFNFQVJDSDoKKyAgICAgICAgY2FzZSBURVhUOgor
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVy
KS0+c2VsZWN0aW9uRW5kKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsK
ICAgICB9Ci0gICAgCi0gICAgbV9kb2luZ3N1Ym1pdCA9IG1faW5zdWJtaXQgPSBmYWxzZTsKKyAg
ICByZXR1cm4gMDsKIH0KIAotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZXNldCggICkKK3Zv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKIHsK
LSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmKG1faW5y
ZXNldCB8fCAhZnJhbWUpIHJldHVybjsKLQotICAgIG1faW5yZXNldCA9IHRydWU7Ci0KLSAgICAv
LyAjIyMgRE9NMiBsYWJlbHMgdGhpcyBldmVudCBhcyBub3QgY2FuY2VsYWJsZSwgaG93ZXZlcgot
ICAgIC8vIGNvbW1vbiBicm93c2Vycyggc2ljayEgKSBhbGxvdyBpdCBiZSBjYW5jZWxsZWQuCi0g
ICAgaWYgKCAhZGlzcGF0Y2hIVE1MRXZlbnQocmVzZXRFdmVudCx0cnVlLCB0cnVlKSApIHsKLSAg
ICAgICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIW1fcmVu
ZGVyKSByZXR1cm47CisgICAgCisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICAgICAgY2FzZSBQ
QVNTV09SRDoKKyAgICAgICAgY2FzZSBTRUFSQ0g6CisgICAgICAgIGNhc2UgVEVYVDoKKyAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0
aW9uU3RhcnQoc3RhcnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICBicmVhazsKICAgICB9Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
Zm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkKLSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5yZXNl
dCgpOwotCi0gICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsK
LSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGFjdGlvbkF0dHIpIAotICAgIHsKLSAgICAgICAgYm9v
bCBvbGRVUkxXYXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7
Ci0gICAgICAgIG1fdXJsID0ga2h0bWw6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpOwotICAgICAg
ICBib29sIG5ld1VSTElzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91
cmwpOwotCi0gICAgICAgIGlmIChtX2F0dGFjaGVkICYmIChvbGRVUkxXYXNTZWN1cmUgIT0gbmV3
VVJMSXNTZWN1cmUpKQotICAgICAgICAgICAgaWYgKG5ld1VSTElzU2VjdXJlKQotICAgICAgICAg
ICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotICAgICAgICAgICAgZWxz
ZQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1SZW1vdmVkKCk7Ci0g
ICAgfQotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB0YXJnZXRBdHRyKSB7Ci0gICAgICAg
IG1fdGFyZ2V0ID0gYXR0ci0+dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBtZXRob2RBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1
ZSgpLCAicG9zdCIpKQotICAgICAgICAgICAgbV9wb3N0ID0gdHJ1ZTsKLSAgICAgICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImdldCIpKQotICAgICAgICAgICAg
bV9wb3N0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZW5jdHlwZUF0
dHIpIHsKLSAgICAgICAgcGFyc2VFbmN0eXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGFjY2VwdF9jaGFyc2V0QXR0cikgewotICAgICAgICAvLyBzcGFj
ZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyc2V0cyB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFjY2Vw
dHMgLSBzZWUgcmZjMjA0NQotICAgICAgICBtX2FjY2VwdGNoYXJzZXQgPSBhdHRyLT52YWx1ZSgp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2VwdEF0dHIpIHsKLSAgICAgICAg
Ly8gaWdub3JlIHRoaXMgb25lIGZvciB0aGUgbW9tZW50Li4uCi0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gYXV0b2NvbXBsZXRlQXR0cikgewotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9
ICFlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25zdWJtaXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExp
c3RlbmVyKHN1Ym1pdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbnJlc2V0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihyZXNldEV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAg
ICAgICBET01TdHJpbmcgbmV3TmFtZUF0dHIgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAo
aW5Eb2N1bWVudCgpICYmIGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAg
ICAgICAgIEhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3Vt
ZW50SW1wbCAqPihnZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgIGRvY3VtZW50LT5yZW1vdmVO
YW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgICAgICAgICAgZG9jdW1lbnQtPmFkZE5hbWVkSXRl
bShuZXdOYW1lQXR0cik7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1l
QXR0cjsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShhdHRyKTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5zZXJ0
SW50b1ZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIHVuc2lnbmVkIHBvcywgVCogaXRlbSkKK3Zv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQogewotICAg
IHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNv
dW50KCk7Ci0gICAgYXNzZXJ0KHBvcyA8PSBjb3VudCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQp
Ci0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAg
Zm9yICh1bnNpZ25lZCBpID0gY291bnQ7IGkgPiBwb3M7IC0taSkKLSAgICAgICAgdmVjLmluc2Vy
dChpLCB2ZWNbaSAtIDFdKTsgICAgCi0gICAgdmVjLmluc2VydChwb3MsIGl0ZW0pOworICAgIGlm
ICghbV9yZW5kZXIpIHJldHVybjsKKyAgICAKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgICAg
ICBjYXNlIFBBU1NXT1JEOgorICAgICAgICBjYXNlIFNFQVJDSDoKKyAgICAgICAgY2FzZSBURVhU
OgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5z
ZXRTZWxlY3Rpb25FbmQoZW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0
OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0
aWMgdm9pZCBhcHBlbmRUb1ZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIFQgKml0ZW0pCit2b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZWxlY3QoICApCiB7Ci0gICAgdW5zaWduZWQgc2l6ZSA9
IHZlYy5zaXplKCk7Ci0gICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBpZiAo
c2l6ZSA9PSBjb3VudCkKLSAgICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6ZSAq
IDMgLyAyKTsKLSAgICB2ZWMuaW5zZXJ0KGNvdW50LCBpdGVtKTsKLX0KKyAgICBpZighbV9yZW5k
ZXIpIHJldHVybjsKIAotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgcmVtb3ZlRnJvbVZl
Y3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAgaW50IHBvcyA9IHZlYy5m
aW5kUmVmKGl0ZW0pOwotICAgIGlmIChwb3MgPCAwKQotICAgICAgICByZXR1cm47Ci0gICAgdW5z
aWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBwb3M7IGkg
PCBjb3VudCAtIDE7ICsraSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2ZWNbaSArIDFdKTsKLSAg
ICB2ZWMucmVtb3ZlKGNvdW50IC0gMSk7Ci19Ci0KLXVuc2lnbmVkIEhUTUxGb3JtRWxlbWVudElt
cGw6OmZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0g
ICAgLy8gQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhpcyBlbGVtZW50IGlzIHRo
ZSB2ZXJ5IGxhc3QgdGhpbmcgaW4KLSAgICAvLyB0aGUgZm9ybSdzIHRyZWUgb2YgY2hpbGRyZW47
IHdlIGRvbid0IHdhbnQgdG8gd2FsayB0aGUgZW50aXJlIHRyZWUgaW4gdGhhdAotICAgIC8vIGNv
bW1vbiBjYXNlIHRoYXQgb2NjdXJzIGR1cmluZyBwYXJzaW5nOyBpbnN0ZWFkIHdlJ2xsIGp1c3Qg
cmV0dXJuIGEgdmFsdWUKLSAgICAvLyB0aGF0IHNheXMgImFkZCB0aGlzIGZvcm0gZWxlbWVudCB0
byB0aGUgZW5kIG9mIHRoZSBhcnJheSIuCi0gICAgaWYgKGUtPnRyYXZlcnNlTmV4dE5vZGUodGhp
cykpIHsKLSAgICAgICAgdW5zaWduZWQgaSA9IDA7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKm5v
ZGUgPSB0aGlzOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKSkgewot
ICAgICAgICAgICAgaWYgKG5vZGUgPT0gZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAg
ICAgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkKLSAgICAgICAgICAgICAgICAgICAg
JiYgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpLT5pc0dlbmVyaWNGb3JtRWxl
bWVudCgpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsICo+KG5vZGUpLT5mb3JtKCkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAr
K2k7Ci0gICAgICAgIH0KKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgICAgICBjYXNlIEZJTEU6
CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJGaWxlQnV0dG9uKj4obV9yZW5kZXIpLT5z
ZWxlY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBBU1NXT1JEOgorICAg
ICAgICBjYXNlIFNFQVJDSDoKKyAgICAgICAgY2FzZSBURVhUOgorICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8UmVuZGVyTGluZUVkaXQqPihtX3JlbmRlciktPnNlbGVjdCgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQlVUVE9OOgorICAgICAgICBjYXNlIENIRUNLQk9YOgorICAg
ICAgICBjYXNlIEhJRERFTjoKKyAgICAgICAgY2FzZSBJTUFHRToKKyAgICAgICAgY2FzZSBJU0lO
REVYOgorICAgICAgICBjYXNlIFJBRElPOgorICAgICAgICBjYXNlIFJBTkdFOgorICAgICAgICBj
YXNlIFJFU0VUOgorICAgICAgICBjYXNlIFNVQk1JVDoKKyAgICAgICAgICAgIGJyZWFrOwogICAg
IH0KLSAgICByZXR1cm4gZm9ybUVsZW1lbnRzLmNvdW50KCk7CiB9CiAKLXZvaWQgSFRNTEZvcm1F
bGVtZW50SW1wbDo6cmVnaXN0ZXJGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCAqZSkKK3ZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBz
dGFydCwgaW50IGVuZCkKIHsKLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7
Ci0gICAgaWYgKGRvYyAmJiBlLT5pc1JhZGlvQnV0dG9uKCkgJiYgIWUtPm5hbWUoKS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnRDaGVja2Vk
UmFkaW8gPSBkb2MtPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKGUtPm5hbWUoKS5pbXBsKCks
IChIVE1MRm9ybUVsZW1lbnRJbXBsKikgMCk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJh
ZGlvID09IGUpCi0gICAgICAgICAgICBkb2MtPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAoZS0+bmFt
ZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAgaWYgKGUtPmlz
Q2hlY2tlZCgpKQotICAgICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1
dEVsZW1lbnRJbXBsKikgZSwgdGhpcyk7CisgICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOworICAg
IAorICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgICAgIGNhc2UgUEFTU1dPUkQ6CisgICAgICAg
IGNhc2UgU0VBUkNIOgorICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBl
bmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBi
cmVhazsKICAgICB9Ci0gICAgaW5zZXJ0SW50b1ZlY3Rvcihmb3JtRWxlbWVudHMsIGZvcm1FbGVt
ZW50SW5kZXgoZSksIGUpOwogfQogCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92ZUZv
cm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICplKQordm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6Y2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMsIGJvb2wgc2hvd1ByZXNzZWRM
b29rKQogewotICAgIGlmICghZS0+bmFtZSgpLmlzRW1wdHkoKSAmJiBnZXREb2N1bWVudCgpKSB7
Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50Q2hlY2tlZFJhZGlv
ID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoZS0+bmFtZSgpLmlt
cGwoKSwgdGhpcyk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvID09IGUpCi0gICAg
ICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKGUtPm5hbWUoKS5p
bXBsKCksIHRoaXMpOworICAgIHN3aXRjaCAoaW5wdXRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBI
SURERU46CisgICAgICAgICAgICAvLyBhIG5vLW9wIGZvciB0aGlzIHR5cGUKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFNVQk1JVDoKKyAgICAgICAgY2FzZSBSRVNFVDoKKyAgICAg
ICAgY2FzZSBCVVRUT046CisgICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgRklMRToKKyAgICAgICAgICAgIGlmIChyZW5kZXJlcigpKSB7Cisg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbiAqPihyZW5kZXJlcigp
KS0+Y2xpY2soc2VuZE1vdXNlRXZlbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhz
ZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKKyAgICAgICAgY2FzZSBSQURJTzoKKyAgICAgICAgY2FzZSBJ
TUFHRToKKyAgICAgICAgY2FzZSBJU0lOREVYOgorICAgICAgICBjYXNlIFBBU1NXT1JEOgorICAg
ICAgICBjYXNlIFNFQVJDSDoKKyAgICAgICAgY2FzZSBSQU5HRToKKyAgICAgICAgY2FzZSBURVhU
OgorICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNlbmRNb3Vz
ZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAg
ICByZW1vdmVGcm9tVmVjdG9yKGZvcm1FbGVtZW50cywgZSk7Ci19Ci0KLWJvb2wgSFRNTEZvcm1F
bGVtZW50SW1wbDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3QKLXsK
LSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IGFjdGlvbkF0dHI7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6cmVnaXN0ZXJJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICpl
KQotewotICAgIGFwcGVuZFRvVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQotdm9pZCBIVE1M
Rm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICpl
KQotewotICAgIHJlbW92ZUZyb21WZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi1SZWZQdHI8
SFRNTENvbGxlY3Rpb25JbXBsPiBIVE1MRm9ybUVsZW1lbnRJbXBsOjplbGVtZW50cygpCi17Ci0g
ICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MRm9ybUNvbGxlY3Rp
b25JbXBsKHRoaXMpKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om5hbWUo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotfQotCi12b2lk
IEhUTUxGb3JtRWxlbWVudEltcGw6OnNldE5hbWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUobmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxG
b3JtRWxlbWVudEltcGw6OmFjY2VwdENoYXJzZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoYWNjZXB0X2NoYXJzZXRBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjpzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGFjY2VwdF9jaGFyc2V0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRN
TEZvcm1FbGVtZW50SW1wbDo6YWN0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGFjdGlvbkF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFjdGlv
bihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY3Rpb25BdHRy
LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0RW5jdHlwZShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShlbmN0eXBlQXR0ciwgdmFs
dWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6bWV0aG9kKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG1ldGhvZEF0dHIpOwotfQotCi12b2lkIEhUTUxG
b3JtRWxlbWVudEltcGw6OnNldE1ldGhvZChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShtZXRob2RBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9y
bUVsZW1lbnRJbXBsOjp0YXJnZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
dGFyZ2V0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0VGFyZ2V0KGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHRhcmdldEF0dHIsIHZh
bHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFn
TmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBI
VE1MRWxlbWVudEltcGwodGFnTmFtZSwgZG9jKQotewotICAgIG1fZGlzYWJsZWQgPSBtX3JlYWRP
bmx5ID0gZmFsc2U7Ci0KLSAgICBpZiAoZikKLQltX2Zvcm0gPSBmOwotICAgIGVsc2UKLQltX2Zv
cm0gPSBnZXRGb3JtKCk7Ci0gICAgaWYgKG1fZm9ybSkKLSAgICAgICAgbV9mb3JtLT5yZWdpc3Rl
ckZvcm1FbGVtZW50KHRoaXMpOwotfQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6fkhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCkKK3ZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmFj
Y2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCiB7Ci0gICAgaWYgKG1fZm9ybSkK
LSAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlzKTsKLX0KKyAgICBzd2l0Y2gg
KGlucHV0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgSElEREVOOgorICAgICAgICAgICAgLy8gYSBu
by1vcCBmb3IgdGhpcyB0eXBlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURVhU
OgorICAgICAgICBjYXNlIFBBU1NXT1JEOgorICAgICAgICBjYXNlIFNFQVJDSDoKKyAgICAgICAg
Y2FzZSBJU0lOREVYOgorICAgICAgICAgICAgZm9jdXMoKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIENIRUNLQk9YOgorICAgICAgICBjYXNlIFJBRElPOgorICAgICAgICBjYXNl
IFNVQk1JVDoKKyAgICAgICAgY2FzZSBSRVNFVDoKKyAgICAgICAgY2FzZSBJTUFHRToKKyAgICAg
ICAgY2FzZSBCVVRUT046CisgICAgICAgIGNhc2UgRklMRToKKyAgICAgICAgY2FzZSBSQU5HRToK
KyAgICAgICAgICAgIC8vIGZvY3VzCisgICAgICAgICAgICBmb2N1cygpOwogCi12b2lkIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAg
ICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBkaXNh
YmxlZEF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGREaXNhYmxlZCA9IG1fZGlzYWJsZWQ7Ci0gICAg
ICAgIG1fZGlzYWJsZWQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlmIChvbGREaXNhYmxl
ZCAhPSBtX2Rpc2FibGVkKSB7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAg
ICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkp
Ci0gICAgICAgICAgICAgICAgdGhlbWUoKS0+c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIEVuYWJs
ZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZWFk
b25seUF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGRSZWFkT25seSA9IG1fcmVhZE9ubHk7Ci0gICAg
ICAgIG1fcmVhZE9ubHkgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlmIChvbGRSZWFkT25s
eSAhPSBtX3JlYWRPbmx5KSBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxF
bGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7CisgICAgICAgICAgICAvLyBz
ZW5kIHRoZSBtb3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKKyAgICAgICAgICAgIC8vIGNhbGxl
ciBzcGVjaWZpZWQgc2VuZFRvQW55RWxlbWVudAorICAgICAgICAgICAgY2xpY2soc2VuZFRvQW55
RWxlbWVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CiB9CiAKLXZvaWQgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCitib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdAogewotICAgIGFzc2VydCghYXR0YWNoZWQoKSk7Ci0KLSAgICBI
VE1MRWxlbWVudEltcGw6OmF0dGFjaCgpOwotCi0gICAgLy8gVGhlIGNhbGwgdG8gdXBkYXRlRnJv
bUVsZW1lbnQoKSBuZWVkcyB0byBnbyBhZnRlciB0aGUgY2FsbCB0aHJvdWdoCi0gICAgLy8gdG8g
dGhlIGJhc2UgY2xhc3MncyBhdHRhY2goKSBiZWNhdXNlIHRoYXQgY2FuIHNvbWV0aW1lcyBkbyBh
IGNsb3NlCi0gICAgLy8gb24gdGhlIHJlbmRlcmVyLgotICAgIGlmIChtX3JlbmRlcikgewotICAg
ICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKKyAgICBpZiAoYXR0ck5hbWUgPT0g
d2lkdGhBdHRyIHx8CisgICAgICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIgfHwKKyAgICAgICAg
YXR0ck5hbWUgPT0gdnNwYWNlQXR0ciB8fAorICAgICAgICBhdHRyTmFtZSA9PSBoc3BhY2VBdHRy
KSB7CisgICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9IAogICAgIAotICAgICAgICAvLyBEZWxheWVkIGF0dGFjaG1lbnQgaW4gb3JkZXIgdG8g
cHJldmVudCBGT1VDIGNhbiByZXN1bHQgaW4gYW4gb2JqZWN0IGJlaW5nCi0gICAgICAgIC8vIHBy
b2dyYW1tYXRpY2FsbHkgZm9jdXNlZCBiZWZvcmUgaXQgaGFzIGEgcmVuZGVyIG9iamVjdC4gIElm
IHdlIGhhdmUgYmVlbiBmb2N1c2VkCi0gICAgICAgIC8vIChpLmUuLCBpZiB3ZSBhcmUgdGhlIGZv
Y3VzTm9kZSkgdGhlbiBnbyBhaGVhZCBhbmQgZm9jdXMgb3VyIGNvcnJlc3BvbmRpbmcgbmF0aXZl
IHdpZGdldC4KLSAgICAgICAgLy8gKEF0dGFjaC9kZXRhY2ggY2FuIGFsc28gaGFwcGVuIGFzIGEg
cmVzdWx0IG9mIGRpc3BsYXkgdHlwZSBjaGFuZ2VzLCBlLmcuLCBtYWtpbmcgYSB3aWRnZXQKLSAg
ICAgICAgLy8gYmxvY2sgaW5zdGVhZCBvZiBpbmxpbmUsIGFuZCBmb2N1cyBzaG91bGQgYmUgcmVz
dG9yZWQgaW4gdGhhdCBjYXNlIGFzIHdlbGwuKQotICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+
Zm9jdXNOb2RlKCkgPT0gdGhpcyAmJiBtX3JlbmRlci0+aXNXaWRnZXQoKSAmJiAKLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRnZXQoKSkKLSAg
ICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRnZXQo
KS0+c2V0Rm9jdXMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQotewotICAgIGlmICghbV9mb3JtKSB7Ci0g
ICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBmb3JtIGVsZW1lbnQgYmVp
bmcgY3JlYXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBpbnNlcnRlZCBpbnNpZGUg
YSBmb3JtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAgICAvLyBzZXR0aW5nIGEg
Zm9ybSwgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1ZSBmb3IgbV9mb3JtLCAK
LSAgICAgICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gICAgICAg
IG1fZm9ybSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBtX2Zvcm0tPnJlZ2lzdGVy
Rm9ybUVsZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgRG9jdW1lbnRJ
bXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRvYyAmJiBpc1JhZGlv
QnV0dG9uKCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2VkKCkpCi0gICAgICAgICAg
ICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJbXBsKil0aGlz
LCBtX2Zvcm0pOwotICAgICAgICB9CisgICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewor
ICAgICAgICByZXN1bHQgPSBlUmVwbGFjZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhl
IGFsaWdubWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOwog
ICAgIH0KLQotICAgIEhUTUxFbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsKKyAg
ICAKKyAgICByZXR1cm4gSFRNTEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1
bHQpOwogfQogCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVkRnJvbVRy
ZWUoYm9vbCBkZWVwKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKIHsKLSAgICAvLyBXaGVuIGJlaW5nIHJl
bW92ZWQgd2UgaGF2ZSB0byBwb3NzaWJseSBudWxsIG91dCBvdXIgZm9ybSBhbmQgcmVtb3ZlIG91
cnNlbHZlcyBmcm9tCi0gICAgLy8gdGhlIGZvcm0ncyBsaXN0IG9mIGVsZW1lbnRzLgotICAgIGlm
IChtX2Zvcm0pIHsKLSAgICAgICAgLy8gQXR0ZW1wdCB0byByZS1hY3F1aXJlIHRoZSBmb3JtLiAg
SWYgd2UgY2FuJ3QgcmUtYWNxdWlyZSwgdGhlbgotICAgICAgICAvLyByZW1vdmUgb3Vyc2VsdmVz
IGZyb20gdGhlIGZvcm0uCi0gICAgICAgIE5vZGVJbXBsKiBmb3JtID0gcGFyZW50Tm9kZSgpOwot
ICAgICAgICBOb2RlSW1wbCogcm9vdCA9IHRoaXM7Ci0gICAgICAgIHdoaWxlIChmb3JtKSB7Ci0g
ICAgICAgICAgICBpZiAoZm9ybS0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIHJvb3QgPSBmb3JtOwotICAgICAgICAgICAgZm9ybSA9IGZv
cm0tPnBhcmVudE5vZGUoKTsKKyAgICBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Cisg
ICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpICYmIG1fZm9ybSkgeworICAg
ICAgICAgICAgLy8gUmVtb3ZlIHRoZSByYWRpbyBmcm9tIGl0cyBvbGQgZ3JvdXAuCisgICAgICAg
ICAgICBpZiAobV90eXBlID09IFJBRElPICYmICFtX25hbWUuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAobV9uYW1lLmltcGwo
KSwgbV9mb3JtKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlIGZvcm0g
aGFzIGJlZW4gZGVtb3RlZCB0byBhIGxlYWYsIHRoZW4gd2Ugd29uJ3QgZmluZCBpdCBhcyBhbiBh
bmNlc3Rvci4KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByb290IG5vZGUgb2Ygb3Vy
IGN1cnJlbnQgZm9ybSBhbmQgb3VyIHJvb3Qgbm9kZQotICAgICAgICAvLyBtYXRjaC4gIElmIHNv
LCBwcmVzZXJ2ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgZm9ybS4KLSAgICAgICAgaWYgKCFmb3Jt
KSB7Ci0gICAgICAgICAgICBOb2RlSW1wbCogZm9ybVJvb3QgPSBtX2Zvcm07Ci0gICAgICAgICAg
ICB3aGlsZSAoZm9ybVJvb3QtPnBhcmVudCgpKSBmb3JtUm9vdCA9IGZvcm1Sb290LT5wYXJlbnQo
KTsKLSAgICAgICAgICAgIGlmIChmb3JtUm9vdCA9PSByb290KQotICAgICAgICAgICAgICAgIGZv
cm0gPSBtX2Zvcm07Ci0gICAgICAgIH0gCisgICAgICAgIC8vIFVwZGF0ZSBvdXIgY2FjaGVkIHJl
ZmVyZW5jZSB0byB0aGUgbmFtZS4KKyAgICAgICAgbV9uYW1lID0gYXR0ci0+dmFsdWUoKTsKICAg
ICAgICAgCi0gICAgICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgbV9mb3JtLT5yZW1vdmVG
b3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgICAgIG1fZm9ybSA9IDA7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgYXNzZXJ0KGZvcm0gPT0gbV9mb3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVk
IGZvcm0gc2hvdWxkIGJlIHRoZSBzYW1lLiBJZiBub3QsIHNvbWV0aGluZyByZWFsbHkgc3RyYW5n
ZSBoYXBwZW5lZC4KLSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9t
VHJlZShkZWVwKTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OmdldEZvcm0oKSBjb25zdAotewotICAgIE5vZGVJbXBsICpwID0gcGFyZW50Tm9k
ZSgpOwotICAgIHdoaWxlKHApIHsKLSAgICAgICAgaWYgKHAtPmhhc1RhZ05hbWUoZm9ybVRhZykp
Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50SW1wbCAqPihw
KTsKLSAgICAgICAgcCA9IHAtPnBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19
Ci0KLURPTVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17
Ci0gICAgRE9NU3RyaW5nIG4gPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIHJldHVybiBu
LmlzTnVsbCgpID8gIiIgOiBuOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5h
bWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9u
U2VsZWN0KCkKLXsKLSAgICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVu
dHMgYXJjaGl0ZWN0dXJlCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoc2VsZWN0RXZlbnQsdHJ1ZSxm
YWxzZSk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uQ2hhbmdlKCkK
LXsKLSAgICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0
ZWN0dXJlCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoY2hhbmdlRXZlbnQsdHJ1ZSxmYWxzZSk7Ci19
Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRpc2FibGVkKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9kaXNhYmxlZDsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6c2V0RGlzYWJsZWQoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShkaXNhYmxlZEF0
dHIsIGIgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpz
ZXRSZWFkT25seShib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0ciwgYiA/
ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0
eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgLy9ib29sIGNoYW5nZWQgPSBjaGFuZ2VkKCk7
Ci0gICAgSFRNTEVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLQotICAgIGlmIChtX3Jl
bmRlciAvKiYmIGNoYW5nZWQqLykKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50
KCk7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkg
Y29uc3QKLXsKLSAgICBpZiAoZGlzYWJsZWQoKSB8fCAhbV9yZW5kZXIgfHwgCi0gICAgICAgICht
X3JlbmRlci0+c3R5bGUoKSAmJiBtX3JlbmRlci0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJ
U0lCTEUpIHx8IAotICAgICAgICBtX3JlbmRlci0+d2lkdGgoKSA9PSAwIHx8IG1fcmVuZGVyLT5o
ZWlnaHQoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUo
KSBjb25zdAotewotICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgIGlmIChtX3JlbmRl
ci0+aXNXaWRnZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcldp
ZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCkgJiYKLSAgICAgICAgICAgICAgICAoc3RhdGljX2Nh
c3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQoKS0+Zm9jdXNQb2xpY3koKSAmIFFX
aWRnZXQ6OlRhYkZvY3VzKTsKLSAgICAgICAgfQotCWlmIChnZXREb2N1bWVudCgpLT5mcmFtZSgp
KQotCSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKS0+dGFic1RvQWxsQ29udHJvbHMo
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjppc01vdXNlRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNGb2N1c2Fi
bGUoKSkgewotICAgICAgICBpZiAobV9yZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYm
Ci0gICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+
d2lkZ2V0KCktPmZvY3VzUG9saWN5KCkgJiBRV2lkZ2V0OjpDbGlja0ZvY3VzKTsKLSAgICAgICAg
fQotICAgICAgICAvLyBGb3IgPGlucHV0IHR5cGU9aW1hZ2U+IGFuZCA8YnV0dG9uPiwgd2Ugd2ls
bCBhc3N1bWUgbm8gbW91c2UgZm9jdXNhYmlsaXR5LiAgVGhpcyBpcwotICAgICAgICAvLyBjb25z
aXN0ZW50IHdpdGggT1MgWCBiZWhhdmlvciBmb3IgYnV0dG9ucy4KLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8g
U3BlY2lhbCBjaGFycyB1c2VkIHRvIGVuY29kZSBmb3JtIHN0YXRlIHN0cmluZ3MuCi0vLyBXZSBw
aWNrIGNoYXJzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGJlIHVzZWQgaW4gYW4gSFRNTCBhdHRyLCBz
byB3ZSByYXJlbHkgaGF2ZSB0byByZWFsbHkgZW5jb2RlLgotY29uc3QgY2hhciBzdGF0ZVNlcGFy
YXRvciA9ICcmJzsKLWNvbnN0IGNoYXIgc3RhdGVFc2NhcGUgPSAnPCc7Ci1zdGF0aWMgY29uc3Qg
Y2hhciBzdGF0ZVNlcGFyYXRvck1hcmtlcltdID0gIjxBIjsKLXN0YXRpYyBjb25zdCBjaGFyIHN0
YXRlRXNjYXBlTWFya2VyW10gPSAiPDwiOwotCi0vLyBFbmNvZGUgYW4gZWxlbWVudCBuYW1lIHNv
IHdlIGNhbiBwdXQgaXQgaW4gYSBzdGF0ZSBzdHJpbmcgd2l0aG91dCBjb2xsaWRpbmcKLS8vIHdp
dGggb3VyIHNlcGFyYXRvciBjaGFyLgotc3RhdGljIFFTdHJpbmcgZW5jb2RlZEVsZW1lbnROYW1l
KFFTdHJpbmcgc3RyKQotewotICAgIGludCBzZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRv
cik7Ci0gICAgaW50IGVzY0xvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICBpZiAo
c2VwTG9jID49IDAgfHwgZXNjTG9jID49IDApIHsKLSAgICAgICAgUVN0cmluZyBuZXdTdHIgPSBz
dHI7Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiPCIgd2l0aCAiPDwiCi0gICAgICAgIHdoaWxlIChl
c2NMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2UoZXNjTG9jLCAxLCBzdGF0
ZUVzY2FwZU1hcmtlcik7Ci0gICAgICAgICAgICBlc2NMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFy
YXRvciwgZXNjTG9jKzEpOwotICAgICAgICB9Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiJiIgd2l0
aCAiPEEiCi0gICAgICAgIHdoaWxlIChzZXBMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3Ry
LnJlcGxhY2Uoc2VwTG9jLCAxLCBzdGF0ZVNlcGFyYXRvck1hcmtlcik7Ci0gICAgICAgICAgICBz
ZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwTG9jKzEpOwotICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiBuZXdTdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0cjsK
LSAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCAp
Ci17Ci0gICAgLy8gQnVpbGQgYSBzdHJpbmcgdGhhdCBjb250YWlucyBFbGVtZW50TmFtZSZFbGVt
ZW50VHlwZSYKLSAgICByZXR1cm4gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkp
ICsgc3RhdGVTZXBhcmF0b3IgKyB0eXBlKCkucXN0cmluZygpICsgc3RhdGVTZXBhcmF0b3I7Ci19
Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRl
KFFTdHJpbmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgUVN0cmluZyBlbmNOYW1lID0gZW5jb2RlZEVs
ZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpOwotICAgIFFTdHJpbmcgdHlwZVN0ciA9IHR5cGUo
KS5xc3RyaW5nKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBzdGF0ZXMu
YmVnaW4oKTsgaXQgIT0gc3RhdGVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgc3Rh
dGUgPSAqaXQ7Ci0gICAgICAgIGludCBzZXAxID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvcik7
Ci0gICAgICAgIGludCBzZXAyID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwMSsxKTsK
LSAgICAgICAgYXNzZXJ0KHNlcDEgPj0gMCk7Ci0gICAgICAgIGFzc2VydChzZXAyID49IDApOwot
Ci0gICAgICAgIFFTdHJpbmcgbmFtZUFuZFR5cGUgPSBzdGF0ZS5sZWZ0KHNlcDIpOwotICAgICAg
ICBpZiAoZW5jTmFtZS5sZW5ndGgoKSArIHR5cGVTdHIubGVuZ3RoKCkgKyAxID09ICh1aW50KXNl
cDIKLSAgICAgICAgICAgICYmIG5hbWVBbmRUeXBlLnN0YXJ0c1dpdGgoZW5jTmFtZSkKLSAgICAg
ICAgICAgICYmIG5hbWVBbmRUeXBlLmVuZHNXaXRoKHR5cGVTdHIpKQotICAgICAgICB7Ci0gICAg
ICAgICAgICBzdGF0ZXMucmVtb3ZlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5taWQo
c2VwMisxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKLX0K
LQotaW50IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp0YWJJbmRleCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0YWJpbmRleEF0dHIpLnRvSW50KCk7Ci19Ci0KLXZvaWQg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFRhYkluZGV4KGludCB2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUodGFiaW5kZXhBdHRyLCBRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6OkhUTUxCdXR0
b25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikK
LSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGJ1dHRvblRhZywgZG9jLCBmKQotewot
ICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVN1
Ym1pdCA9IGZhbHNlOwotfQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6On5IVE1MQnV0dG9uRWxl
bWVudEltcGwoKQotewotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6
Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17
Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZSh0eXBlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlm
IChhdHRyLT5uYW1lKCkgPT0gIHR5cGVBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShhdHRyLT52YWx1ZSgpLCAic3VibWl0IikpCi0gICAgICAgICAgICBtX3R5cGUgPSBTVUJN
SVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJy
ZXNldCIpKQotICAgICAgICAgICAgbV90eXBlID0gUkVTRVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJidXR0b24iKSkKLSAgICAgICAgICAgIG1f
dHlwZSA9IEJVVFRPTjsKKyAgICAgICAgLy8gQWRkIGl0IHRvIGl0cyBuZXcgZ3JvdXAuCisgICAg
ICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpKQorICAgICAgICAgICAgZ2V0RG9j
dW1lbnQoKS0+cmFkaW9CdXR0b25DaGVja2VkKHRoaXMsIG1fZm9ybSk7CisgICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYXV0b2NvbXBsZXRlQXR0cikgeworICAgICAgICBtX2F1dG9jb21w
bGV0ZSA9ICFlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIik7CisgICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gIHR5cGVBdHRyKSB7CisgICAgICAgIHNldElucHV0VHlw
ZShhdHRyLT52YWx1ZSgpKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0
dHIpIHsKLSAgICAgICAgbV92YWx1ZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIG1fY3VyclZh
bHVlID0gbV92YWx1ZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlB
dHRyKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNF
dmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikg
ewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpkZWZhdWx0RXZl
bnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlmIChtX3R5cGUgIT0gQlVUVE9OICYm
IChldnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSkgewotCi0gICAgICAgIGlmKG1fZm9y
bSAmJiBtX3R5cGUgPT0gU1VCTUlUKSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRy
dWU7Ci0gICAgICAgICAgICBtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKTsKLSAgICAgICAgICAgIG1f
YWN0aXZlU3VibWl0ID0gZmFsc2U7IC8vIGluIGNhc2Ugd2Ugd2VyZSBjYW5jZWxlZAotICAgICAg
ICB9Ci0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gUkVTRVQpIG1fZm9ybS0+cmVzZXQo
KTsKLSAgICB9Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhh
bmRsZXIoZXZ0KTsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0
b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4g
SG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3Ry
YWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVz
ZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAot
ICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBjb25zdHJhaW50IGZvciBub3cuCi0gICAgLy8gV2FzOiBt
X3R5cGUgPT0gU1VCTUlUICYmICFtX2Rpc2FibGVkICYmICFuYW1lKCkuaXNFbXB0eSgpCi0gICAg
cmV0dXJuIG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJsZWQ7Ci19Ci0KLWJvb2wgSFRNTEJ1
dHRvbkVsZW1lbnRJbXBsOjppc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fYWN0aXZlU3VibWl0OwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWN0
aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19
Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxp
c3QmIGVuY29kaW5nLCBib29sIC8qbXVsdGlwYXJ0Ki8pCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBT
VUJNSVQgfHwgbmFtZSgpLmlzRW1wdHkoKSB8fCAhbV9hY3RpdmVTdWJtaXQpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgbV9jdXJyVmFsdWUp
OwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNj
ZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsgICAKLSAgICAvLyBzZW5kIHRo
ZSBtb3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNl
bmRUb0FueUVsZW1lbnQKLSAgICBjbGljayhzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVt
ZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0
b25FbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
dmFsdWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFs
dWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxGaWVsZFNldEVsZW1lbnRJbXBs
OjpIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVt
ZW50SW1wbCAqZikKLSAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoZmllbGRzZXRUYWcs
IGRvYywgZikKLXsKLX0KLQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6On5IVE1MRmllbGRTZXRF
bGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmNoZWNr
RFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhh
c1RhZ05hbWUobGVnZW5kVGFnKSB8fCBIVE1MRWxlbWVudEltcGw6OmNoZWNrRFREKG5ld0NoaWxk
KTsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25z
dAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGaWVsZFNldEVsZW1l
bnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gImZpZWxkc2V0IjsKLX0KLQotUmVu
ZGVyT2JqZWN0KiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVy
QXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJl
bmEpIFJlbmRlckZpZWxkc2V0KHRoaXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpIVE1MSW5wdXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKGlucHV0VGFnLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MSW5wdXRFbGVt
ZW50SW1wbDo6SFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFt
ZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbCh0YWdOYW1lLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppbml0KCkKLXsKLSAgICBtX2ltYWdlTG9h
ZGVyID0gMDsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV90eXBl
ID0gVEVYVDsKLSAgICBtX21heExlbiA9IC0xOwotICAgIG1fc2l6ZSA9IDIwOwotICAgIG1fY2hl
Y2tlZCA9IGZhbHNlOwotICAgIG1fZGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX3VzZURl
ZmF1bHRDaGVja2VkID0gdHJ1ZTsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTsKLQotICAg
IG1faGF2ZVR5cGUgPSBmYWxzZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgIG1f
YXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAgICBtX2luaXRlZCA9IGZhbHNlOwotCi0gICAgeFBvcyA9
IDA7Ci0gICAgeVBvcyA9IDA7Ci0KLSAgICBtX21heFJlc3VsdHMgPSAtMTsKLQotICAgIGlmICht
X2Zvcm0pCi0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gbV9mb3JtLT5hdXRvQ29tcGxldGUoKTsK
LX0KLQotSFRNTElucHV0RWxlbWVudEltcGw6On5IVE1MSW5wdXRFbGVtZW50SW1wbCgpCi17Ci0g
ICAgaWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNT
dGF0ZSh0aGlzKTsKLSAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLX0KLQotRE9NU3RyaW5nIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uYW1lLmlz
TnVsbCgpID8gIiIgOiBtX25hbWU7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6Omlz
S2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIHNh
eXMgd2UgY2FuJ3QgYmUgZm9jdXNlZCwgdGhlbiB3ZSBjYW4gc3RvcCBub3cuCi0gICAgaWYgKCFI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPKSB7Ci0gICAgICAgIC8v
IFVubmFtZWQgcmFkaW8gYnV0dG9ucyBhcmUgbmV2ZXIgZm9jdXNhYmxlIChtYXRjaGVzIFdpbklF
KS4KLSAgICAgICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgLy8gTmV2ZXIgYWxsb3cga2V5Ym9hcmQgdGFiYmluZyB0byBsZWF2ZSB5
b3UgaW4gdGhlIHNhbWUgcmFkaW8gZ3JvdXAuICBBbHdheXMKLSAgICAgICAgLy8gc2tpcCBhbnkg
b3RoZXIgZWxlbWVudHMgaW4gdGhlIGdyb3VwLgotICAgICAgICBOb2RlSW1wbCogY3VycmVudEZv
Y3VzTm9kZSA9IGdldERvY3VtZW50KCktPmZvY3VzTm9kZSgpOwotICAgICAgICBpZiAoY3VycmVu
dEZvY3VzTm9kZSAmJiBjdXJyZW50Rm9jdXNOb2RlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewot
ICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGZvY3VzZWRJbnB1dCA9IHN0YXRpY19j
YXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudEZvY3VzTm9kZSk7Ci0gICAgICAgICAg
ICBpZiAoZm9jdXNlZElucHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBmb2N1c2VkSW5wdXQt
PmZvcm0oKSA9PSBtX2Zvcm0gJiYKLSAgICAgICAgICAgICAgICBmb2N1c2VkSW5wdXQtPm5hbWUo
KSA9PSBuYW1lKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBX
ZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9ybSBpcyBsb29raW5nIGF0IHRoZSBk
ZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KKyAgICAgICAgaWYgKG1fdmFsdWUuaXNOdWxsKCkpCisg
ICAgICAgICAgICBzZXRDaGFuZ2VkKCk7CisgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIg
PSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGVja2VkQXR0cikgewor
ICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHItPmlzTnVsbCgpOworICAgICAgICBpZiAo
bV91c2VEZWZhdWx0Q2hlY2tlZCkgeworICAgICAgICAgICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRD
aGVja2VkKTsKKyAgICAgICAgICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwogICAgICAg
ICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvdyBrZXlib2FyZCBmb2N1cyBpZiB3ZSdyZSBj
aGVja2VkIG9yIGlmIG5vdGhpbmcgaW4gdGhlIGdyb3VwIGlzIGNoZWNrZWQuCi0gICAgICAgIHJl
dHVybiBjaGVja2VkKCkgfHwgIWdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdy
b3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVl
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRUeXBlKGNvbnN0IERPTVN0cmlu
ZyYgdCkKLXsKLSAgICBpZiAodC5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y2NvZGU7Ci0g
ICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh0eXBlQXR0ciwgZXhjY29kZSk7Ci0gICAgfQotICAgIGVs
c2UKLSAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0KTsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICB0
eXBlRW51bSBuZXdUeXBlOwotICAgIAotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicGFz
c3dvcmQiKSkKLSAgICAgICAgbmV3VHlwZSA9IFBBU1NXT1JEOwotICAgIGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKHQsICJjaGVja2JveCIpKQotICAgICAgICBuZXdUeXBlID0gQ0hFQ0tCT1g7
Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhZGlvIikpCi0gICAgICAgIG5l
d1R5cGUgPSBSQURJTzsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic3VibWl0
IikpCi0gICAgICAgIG5ld1R5cGUgPSBTVUJNSVQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgInJlc2V0IikpCi0gICAgICAgIG5ld1R5cGUgPSBSRVNFVDsKLSAgICBlbHNlIGlm
IChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiZmlsZSIpKQotICAgICAgICBuZXdUeXBlID0gRklMRTsK
LSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaGlkZGVuIikpCi0gICAgICAgIG5l
d1R5cGUgPSBISURERU47Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImltYWdl
IikpCi0gICAgICAgIG5ld1R5cGUgPSBJTUFHRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZSh0LCAiYnV0dG9uIikpCi0gICAgICAgIG5ld1R5cGUgPSBCVVRUT047Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImtodG1sX2lzaW5kZXgiKSkKLSAgICAgICAgbmV3VHlw
ZSA9IElTSU5ERVg7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInNlYXJjaCIp
KQotICAgICAgICBuZXdUeXBlID0gU0VBUkNIOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKHQsICJyYW5nZSIpKQotICAgICAgICBuZXdUeXBlID0gUkFOR0U7Ci0gICAgZWxzZQotICAg
ICAgICBuZXdUeXBlID0gVEVYVDsKLQotICAgIC8vICMjIyBJTVBPUlRBTlQ6IERvbid0IGFsbG93
IHRoZSB0eXBlIHRvIGJlIGNoYW5nZWQgdG8gRklMRSBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyB0
eXBlIGNoYW5nZSwgb3RoZXJ3aXNlIGEgSmF2YVNjcmlwdCBwcm9ncmFtbWVyIHdvdWxkIGJlIGFi
bGUgdG8gc2V0IGEgdGV4dAotICAgIC8vIGZpZWxkJ3MgdmFsdWUgdG8gc29tZXRoaW5nIGxpa2Ug
L2V0Yy9wYXNzd2QgYW5kIHRoZW4gY2hhbmdlIGl0IHRvIGEgZmlsZSBmaWVsZC4KLSAgICBpZiAo
bV90eXBlICE9IG5ld1R5cGUpIHsKLSAgICAgICAgaWYgKG5ld1R5cGUgPT0gRklMRSAmJiBtX2hh
dmVUeXBlKSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBv
bGQgdmFsdWUuCi0gICAgICAgICAgICAvLyBVc2VmdWwgaW4gY2FzZSB3ZSB3ZXJlIGNhbGxlZCBm
cm9tIGluc2lkZSBwYXJzZU1hcHBlZEF0dHJpYnV0ZS4KLSAgICAgICAgICAgIHNldEF0dHJpYnV0
ZSh0eXBlQXR0ciwgdHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICht
X3R5cGUgPT0gUkFESU8gJiYgIW5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwo
KSwgbV9mb3JtKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5y
ZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBib29sIHdhc0F0dGFjaGVkID0gbV9hdHRhY2hlZDsKLSAgICAgICAg
ICAgIGlmICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAg
ICAgIGJvb2wgZGlkU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRl
KCk7Ci0gICAgICAgICAgICBtX3R5cGUgPSBuZXdUeXBlOwotICAgICAgICAgICAgYm9vbCB3aWxs
U3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAg
ICAgICBpZiAoZGlkU3RvcmVWYWx1ZSAmJiAhd2lsbFN0b3JlVmFsdWUgJiYgIW1fdmFsdWUuaXNO
dWxsKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBtX3ZhbHVl
KTsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBpZiAoIWRpZFN0b3JlVmFsdWUgJiYgd2lsbFN0b3JlVmFsdWUpIHsKLSAg
ICAgICAgICAgICAgICBtX3ZhbHVlID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBpZiAod2FzQXR0YWNoZWQpCi0gICAgICAgICAgICAgICAgYXR0
YWNoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiBvdXIgdHlwZSBtb3Jw
aHMgaW50byBhIHJhZGlvIGJ1dHRvbiBhbmQgd2UgYXJlIGNoZWNrZWQsIHRoZW4gZ28gYWhlYWQK
LSAgICAgICAgICAgIC8vIGFuZCBzaWduYWwgdGhpcyB0byB0aGUgZm9ybS4KLSAgICAgICAgICAg
IGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgIGdldERv
Y3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0g
ICAgfQotICAgIG1faGF2ZVR5cGUgPSB0cnVlOwotICAgIAotICAgIGlmIChtX3R5cGUgIT0gSU1B
R0UgJiYgbV9pbWFnZUxvYWRlcikgewotICAgICAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLSAg
ICAgICAgbV9pbWFnZUxvYWRlciA9IDA7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgSFRNTElucHV0
RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIC8vIG5lZWRzIHRvIGJlIGxvd2VyY2Fz
ZSBhY2NvcmRpbmcgdG8gRE9NIHNwZWMKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2Ug
VEVYVDogcmV0dXJuICJ0ZXh0IjsKLSAgICBjYXNlIFBBU1NXT1JEOiByZXR1cm4gInBhc3N3b3Jk
IjsKLSAgICBjYXNlIENIRUNLQk9YOiByZXR1cm4gImNoZWNrYm94IjsKLSAgICBjYXNlIFJBRElP
OiByZXR1cm4gInJhZGlvIjsKLSAgICBjYXNlIFNVQk1JVDogcmV0dXJuICJzdWJtaXQiOwotICAg
IGNhc2UgUkVTRVQ6IHJldHVybiAicmVzZXQiOwotICAgIGNhc2UgRklMRTogcmV0dXJuICJmaWxl
IjsKLSAgICBjYXNlIEhJRERFTjogcmV0dXJuICJoaWRkZW4iOwotICAgIGNhc2UgSU1BR0U6IHJl
dHVybiAiaW1hZ2UiOwotICAgIGNhc2UgQlVUVE9OOiByZXR1cm4gImJ1dHRvbiI7Ci0gICAgY2Fz
ZSBTRUFSQ0g6IHJldHVybiAic2VhcmNoIjsKLSAgICBjYXNlIFJBTkdFOiByZXR1cm4gInJhbmdl
IjsKLSAgICBjYXNlIElTSU5ERVg6IHJldHVybiAiIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwot
fQotCi1RU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIGFzc2Vy
dChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNz
d29yZCBmaWVsZHMKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6c3RhdGUoKTsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6
Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsgKGNoZWNrZWQoKSA/ICJv
biIgOiAib2ZmIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsgdmFsdWUo
KS5xc3RyaW5nKCkrJy4nOyAvLyBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0g
ICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmlu
Z0xpc3QgJnN0YXRlcykKLXsKLSAgICBhc3NlcnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8vIHNo
b3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFzc3dvcmQgZmllbGRzCi0gICAgCi0gICAgUVN0cmlu
ZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShz
dGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJuOwotCi0gICAgc3dpdGNoICht
X3R5cGUpIHsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHNl
dENoZWNrZWQoKHN0YXRlID09ICJvbiIpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoK
LSAgICAgICAgc2V0VmFsdWUoRE9NU3RyaW5nKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkp
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpjYW5IYXZlU2VsZWN0aW9uKCkKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBj
YXNlIFRFWFQ6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVu
dEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsK
LSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAg
ICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3RhcnQo
KTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1
cm4gMDsKLX0KLQotaW50IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZWxlY3Rpb25FbmQoKQotewot
ICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7
Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBj
YXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQg
Kj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c2V0U2VsZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAgIGlmICghbV9yZW5k
ZXIpIHJldHVybjsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rp
b25TdGFydChzdGFydCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwot
ICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAg
ICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNf
Y2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAg
ICBpZighbV9yZW5kZXIpIHJldHVybjsKLQotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAg
IGNhc2UgRklMRToKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24qPiht
X3JlbmRlciktPnNlbGVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFT
U1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hF
Q0tCT1g6Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAg
ICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6
Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rp
b25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJu
OwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0g
ICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0
YXJ0LCBlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmNsaWNr
KGJvb2wgc2VuZE1vdXNlRXZlbnRzLCBib29sIHNob3dQcmVzc2VkTG9vaykKLXsKLSAgICBzd2l0
Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8g
YSBuby1vcCBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBT
VUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAg
ICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywg
c2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJTEU6
Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlckZpbGVCdXR0b24gKj4ocmVuZGVyZXIoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50
cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJl
c3NlZExvb2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0g
ICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJ
TkRFWDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAg
ICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9v
ayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgc3dp
dGNoIChpbnB1dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8v
IGEgbm8tb3AgZm9yIHRoaXMgdHlwZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
VEVYVDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAg
ICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgIGZvY3VzKCk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAg
Y2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0g
ICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIGNhc2UgUkFO
R0U6Ci0gICAgICAgICAgICAvLyBmb2N1cwotICAgICAgICAgICAgZm9jdXMoKTsKLQotICAgICAg
ICAgICAgLy8gc2VuZCB0aGUgbW91c2UgYnV0dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgICAgICAg
ICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAgICAgICAgICAgIGNsaWNr
KHNlbmRUb0FueUVsZW1lbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29s
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0
dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChh
dHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8
fAotICAgICAgICBhdHRyTmFtZSA9PSB2c3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09
IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikg
ewotICAgICAgICByZXN1bHQgPSBlUmVwbGFjZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2Ug
dGhlIGFsaWdubWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gSFRNTEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGF0
dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRy
LT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBj
aGVja2VkKCkgJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJhZGlvIGZy
b20gaXRzIG9sZCBncm91cC4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW1f
bmFtZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFk
aW9CdXR0b25Hcm91cChtX25hbWUuaW1wbCgpLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICAvLyBVcGRhdGUgb3VyIGNhY2hlZCByZWZlcmVuY2UgdG8gdGhlIG5hbWUuCi0g
ICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQg
aXQgdG8gaXRzIG5ldyBncm91cC4KLSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVj
a2VkKCkpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhp
cywgbV9mb3JtKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVB
dHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gIWVxdWFsSWdub3JpbmdDYXNlKGF0dHIt
PnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0
dHIpIHsKLSAgICAgICAgc2V0SW5wdXRUeXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAgICAgICAvLyBXZSBvbmx5IG5lZWQg
dG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9ybSBpcyBsb29raW5nIGF0IHRoZSBkZWZhdWx0IHZhbHVl
IHJpZ2h0IG5vdy4KLSAgICAgICAgaWYgKG1fdmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBz
ZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGVja2VkQXR0cikgewotICAgICAgICBtX2Rl
ZmF1bHRDaGVja2VkID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICBpZiAobV91c2VEZWZhdWx0
Q2hlY2tlZCkgewotICAgICAgICAgICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAg
ICAgICAgICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikgewotICAgICAgICBtX21heExl
biA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc2l6ZUF0dHIp
IHsKLSAgICAgICAgbV9zaXplID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0lu
dCgpIDogMjA7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWx0QXR0cikgewotICAg
ICAgICBpZiAobV9yZW5kZXIgJiYgbV90eXBlID09IElNQUdFKQotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3JlbmRlciktPnVwZGF0ZUFsdFRleHQoKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAm
JiBtX3R5cGUgPT0gSU1BR0UpIHsKLSAgICAgICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAg
ICAgICAgICAgICAgICBtX2ltYWdlTG9hZGVyID0gbmV3IEhUTUxJbWFnZUxvYWRlcih0aGlzKTsK
LSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAg
IH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB1c2VtYXBBdHRyIHx8Ci0gICAgICAg
ICAgICAgICBhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhN
RTogaWdub3JlIGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
dnNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lO
X1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJP
UF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJP
UF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRy
LCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0
dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAg
ICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NT
TGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50
TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQs
IGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewot
ICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxF
dmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBvbmlucHV0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihpbnB1
dEV2ZW50LCBhdHRyKTsKLSAgICB9Ci0gICAgLy8gU2VhcmNoIGZpZWxkIGFuZCBzbGlkZXIgYXR0
cmlidXRlcyBhbGwganVzdCBjYXVzZSB1cGRhdGVGcm9tRWxlbWVudCB0byBiZSBjYWxsZWQgdGhy
b3VnaCBzdHlsZQotICAgIC8vIHJlY2FsY2luZy4KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gb25zZWFyY2hBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlYXJjaEV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZXN1bHRzQXR0cikg
ewotICAgICAgICBtX21heFJlc3VsdHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgp
LnRvSW50KCkgOiAtMTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgp
ID09IGluY3JlbWVudGFsQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHBs
YWNlaG9sZGVyQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIg
fHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtYXhBdHRyIHx8Ci0gICAgICAgICAg
ICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9uQXR0cikgewotICAgICAgICBzZXRDaGFuZ2Vk
KCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlw
ZSkKLSAgICB7Ci0gICAgY2FzZSBURVhUOgotICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBT
RUFSQ0g6Ci0gICAgY2FzZSBSQU5HRToKLSAgICBjYXNlIElTSU5ERVg6Ci0gICAgY2FzZSBDSEVD
S0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgIGNhc2UgU1VCTUlUOgotICAgIGNhc2UgSU1BR0U6
Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEZJTEU6Ci0gICAgY2FzZSBCVVRUT046ICAgcmV0
dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKHN0eWxlKTsK
LSAgICBjYXNlIEhJRERFTjogICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGFzc2VydChmYWxz
ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpz
dHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAg
Y2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNlIElTSU5ERVg6ICByZXR1
cm4gbmV3IChhcmVuYSkgUmVuZGVyTGluZUVkaXQodGhpcyk7Ci0gICAgY2FzZSBDSEVDS0JPWDoK
LSAgICBjYXNlIFJBRElPOgotICAgICAgICByZXR1cm4gUmVuZGVyT2JqZWN0OjpjcmVhdGVPYmpl
Y3QodGhpcywgc3R5bGUpOwotICAgIGNhc2UgU1VCTUlUOgotICAgIGNhc2UgUkVTRVQ6Ci0gICAg
Y2FzZSBCVVRUT046Ci0gICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhp
cyk7Ci0gICAgY2FzZSBJTUFHRTogICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckltYWdlQnV0
dG9uKHRoaXMpOwotICAgIGNhc2UgRklMRTogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJG
aWxlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgUkFOR0U6ICAgIHJldHVybiBuZXcgKGFyZW5hKSBS
ZW5kZXJTbGlkZXIodGhpcyk7Ci0gICAgY2FzZSBISURERU46ICAgYnJlYWs7Ci0gICAgfQotICAg
IGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OmF0dGFjaCgpCi17Ci0gICAgaWYgKCFtX2luaXRlZCkgewotICAgICAgICBpZiAoIW1f
aGF2ZVR5cGUpCi0gICAgICAgICAgICBzZXRJbnB1dFR5cGUoZ2V0QXR0cmlidXRlKHR5cGVBdHRy
KSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgZHluYW1pYywgZG9lc24n
dCBpdCwgc2luY2Ugc29tZW9uZSBjb3VsZCBzZXQgdGhpcwotICAgICAgICAvLyBhZnRlciBhdHRh
Y2htZW50PwotICAgICAgICBET01TdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7
Ci0gICAgICAgIGlmICgodWludCkgbV90eXBlIDw9IElTSU5ERVggJiYgIXZhbC5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIHN0dWZmLi4KLSAgICAgICAgICAgIFFT
dHJpbmcgbnZhbHVlOwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB2
YWwubGVuZ3RoKCk7ICsraSkKLSAgICAgICAgICAgICAgICBpZiAodmFsW2ldID49ICcgJykKLSAg
ICAgICAgICAgICAgICAgICAgbnZhbHVlICs9IHZhbFtpXTsKLQotICAgICAgICAgICAgaWYgKHZh
bC5sZW5ndGgoKSAhPSBudmFsdWUubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgc2V0QXR0cmli
dXRlKHZhbHVlQXR0ciwgbnZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1faW5pdGVkID0g
dHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBEaXNhbGxvdyB0aGUgd2lkdGggYXR0cmlidXRlIG9uIGlu
cHV0cyBvdGhlciB0aGFuIEhJRERFTiBhbmQgSU1BR0UuCi0gICAgLy8gRHVtYiBXZWIgc2l0ZXMg
d2lsbCB0cnkgdG8gc2V0IHRoZSB3aWR0aCBhcyBhbiBhdHRyaWJ1dGUgb24gZm9ybSBjb250cm9s
cyB0aGF0IGFyZW4ndAotICAgIC8vIGltYWdlcyBvciBoaWRkZW4uCi0gICAgaWYgKGhhc01hcHBl
ZEF0dHJpYnV0ZXMoKSAmJiBtX3R5cGUgIT0gSElEREVOICYmIG1fdHlwZSAhPSBJTUFHRSAmJiAh
Z2V0QXR0cmlidXRlKHdpZHRoQXR0cikuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBleGNDb2Rl
OwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUod2lkdGhBdHRyLCBleGNDb2RlKTsKLSAgICB9Ci0K
LSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAobV90
eXBlID09IElNQUdFKSB7Ci0gICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAg
IG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICBtX2lt
YWdlTG9hZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkg
ewotICAgICAgICAgICAgUmVuZGVySW1hZ2UqIGltYWdlT2JqID0gc3RhdGljX2Nhc3Q8UmVuZGVy
SW1hZ2UqPihyZW5kZXJlcigpKTsKLSAgICAgICAgICAgIGltYWdlT2JqLT5zZXRJbWFnZShtX2lt
YWdlTG9hZGVyLT5pbWFnZSgpKTsgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBub3Rl
IHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5nIHBhc3N3b3JkRmllbGRSZW1vdmVkKCkgb24gZGV0
YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcKLSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQg
b3VyIHN0YXRlIHRvbyBlYXJseQotICAgIGlmIChtX3R5cGUgPT0gUEFTU1dPUkQpCi0gICAgICAg
IGdldERvY3VtZW50KCktPnBhc3N3b3JkRmllbGRBZGRlZCgpOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpkZXRhY2goKQotewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpkZXRhY2goKTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURP
TVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWx0VGV4dCgpIGNvbnN0Ci17Ci0gICAgLy8g
aHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L2FwcGVuZGl4L25v
dGVzLmh0bWwjYWx0Z2VuCi0gICAgLy8gYWxzbyBoZWF2aWx5IGRpc2N1c3NlZCBieSBIaXhpZSBv
biBidWd6aWxsYQotICAgIC8vIG5vdGUgdGhpcyBpcyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCB0
byBIVE1MSW1hZ2VFbGVtZW50SW1wbDo6YWx0VGV4dCgpCi0gICAgRE9NU3RyaW5nIGFsdCA9IGdl
dEF0dHJpYnV0ZShhbHRBdHRyKTsKLSAgICAvLyBmYWxsIGJhY2sgdG8gdGl0bGUgYXR0cmlidXRl
Ci0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHRpdGxl
QXR0cik7Ci0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRl
KHZhbHVlQXR0cik7Ci0gICAgaWYgKGFsdC5pc0VtcHR5KCkpCi0gICAgICAgIGFsdCA9IGlucHV0
RWxlbWVudEFsdFRleHQoKTsKLQotICAgIHJldHVybiBhbHQ7Ci19Ci0KLWJvb2wgSFRNTElucHV0
RWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8g
SFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJl
IGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBk
byBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAv
LyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAg
ICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFdhczogKG1fdHlwZSA9PSBTVUJNSVQgJiYg
IW5hbWUoKS5pc0VtcHR5KCkpCi0gICAgcmV0dXJuICFtX2Rpc2FibGVkICYmIChtX3R5cGUgPT0g
SU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudElt
cGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJt
aXQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjdGl2YXRlZFN1Ym1pdChi
b29sIGZsYWcpCi17Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmbGFnOwotfQotCi1ib29sIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QgJmVuY29kaW5nLCBi
b29sIG11bHRpcGFydCkKLXsKLSAgICAvLyBpbWFnZSBnZW5lcmF0ZXMgaXRzIG93biBuYW1lcwot
ICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpICYmIG1fdHlwZSAhPSBJTUFHRSkgcmV0dXJuIGZhbHNl
OwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0g
ICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAvLyBhbHdheXMgc3VjY2Vzc2Z1bAot
ICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2Fz
ZSBSQURJTzoKLSAgICAgICAgICAgIGlmIChjaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBl
bmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBj
YXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgIC8vIHRob3NlIGJ1
dHRvbnMgYXJlIG5ldmVyIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0g
ICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngi
IDogKG5hbWUoKSArICIueCIpLCBjbGlja1goKSk7Ci0gICAgICAgICAgICAgICAgZW5jb2Rpbmcu
YXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gInkiIDogKG5hbWUoKSArICIueSIpLCBjbGlj
a1koKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFuYW1lKCkuaXNFbXB0eSgpICYmICF2YWx1ZSgp
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1l
KCksIHZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAg
ICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBET01TdHJpbmcgZW5jX3N0
ciA9IHZhbHVlV2l0aERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWVuY19zdHIuaXNF
bXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgp
LCBlbmNfc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2Fz
ZSBGSUxFOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBzdWJtaXQgZmlsZSBvbiBH
RVQKLSAgICAgICAgICAgIC8vIGRvbid0IHN1Ym1pdCBpZiBkaXNwbGF5OiBub25lIG9yIGRpc3Bs
YXk6IGhpZGRlbgotICAgICAgICAgICAgaWYoIW11bHRpcGFydCB8fCAhcmVuZGVyZXIoKSB8fCBy
ZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0ga2h0bWw6OlZJU0lCTEUpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICAvLyBpZiBubyBmaWxlbmFt
ZSBhdCBhbGwgaXMgZW50ZXJlZCwgcmV0dXJuIHN1Y2Nlc3NmdWwsIGhvd2V2ZXIgZW1wdHkKLSAg
ICAgICAgICAgIC8vIG51bGwgd291bGQgYmUgbW9yZSBsb2dpY2FsIGJ1dCBuZXRzY2FwZSBwb3N0
cyBhbiBlbXB0eSBmaWxlLiBhcmdoLgotICAgICAgICAgICAgaWYgKHZhbHVlKCkuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIFFTdHJpbmco
IiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRmlsZShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAg
ICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJv
bUF0dHJpYnV0ZSgpKQotICAgICAgICBzZXRWYWx1ZShET01TdHJpbmcoKSk7Ci0gICAgc2V0Q2hl
Y2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsK
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0Q2hlY2tlZChib29sIF9jaGVja2Vk
KQotewotICAgIC8vIFdpbklFIGRvZXMgbm90IGFsbG93IHVubmFtZWQgcmFkaW8gYnV0dG9ucyB0
byBldmVuIGJlIGNoZWNrZWQuCi0gICAgaWYgKGNoZWNrZWQoKSA9PSBfY2hlY2tlZCB8fCAobV90
eXBlID09IFJBRElPICYmIG5hbWUoKS5pc0VtcHR5KCkpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBpZiAobV90eXBlID09IFJBRElPICYmIF9jaGVja2VkKQotICAgICAgICBnZXREb2N1bWVudCgp
LT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLQotICAgIG1fdXNlRGVmYXVsdENo
ZWNrZWQgPSBmYWxzZTsKLSAgICBtX2NoZWNrZWQgPSBfY2hlY2tlZDsKLSAgICBzZXRDaGFuZ2Vk
KCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFy
YW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tl
ZFN0YXRlKTsKLSAgICBvbkNoYW5nZSgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpzZXRJbmRldGVybWluYXRlKGJvb2wgX2luZGV0ZXJtaW5hdGUpCi17Ci0gICAgLy8gT25seSBj
aGVja2JveGVzIGhvbm9yIGluZGV0ZXJtaW5hdGUuCi0gICAgaWYgKG1fdHlwZSAhPSBDSEVDS0JP
WCB8fCBpbmRldGVybWluYXRlKCkgPT0gX2luZGV0ZXJtaW5hdGUpCi0gICAgICAgIHJldHVybjsK
LQotICAgIG1faW5kZXRlcm1pbmF0ZSA9IF9pbmRldGVybWluYXRlOwotCi0gICAgc2V0Q2hhbmdl
ZCgpOwotCi0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBw
ZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hl
Y2tlZFN0YXRlKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y29weU5vbkF0dHJp
YnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudEltcGwgKnNvdXJjZSkKLXsKLSAgICBjb25zdCBI
VE1MSW5wdXRFbGVtZW50SW1wbCAqc291cmNlRWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxJ
bnB1dEVsZW1lbnRJbXBsICo+KHNvdXJjZSk7Ci0KLSAgICBtX3ZhbHVlID0gc291cmNlRWxlbS0+
bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQgPSBzb3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0gICAgbV9p
bmRldGVybWluYXRlID0gc291cmNlRWxlbS0+bV9pbmRldGVybWluYXRlOwotfQotCi1ET01TdHJp
bmcgSFRNTElucHV0RWxlbWVudEltcGw6OnZhbHVlKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcg
dmFsdWUgPSBtX3ZhbHVlOwotCi0gICAgLy8gSXQncyBpbXBvcnRhbnQgKm5vdCogdG8gZmFsbCBi
YWNrIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIGZpbGUgaW5wdXRzLAotICAgIC8vIGJlY2F1
c2UgdGhhdCB3b3VsZCBhbGxvdyBhIG1hbGljaW91cyB3ZWIgcGFnZSB0byB1cGxvYWQgZmlsZXMg
Ynkgc2V0dGluZyB0aGUKLSAgICAvLyB2YWx1ZSBhdHRyaWJ1dGUgaW4gbWFya3VwLgotICAgIGlm
ICh2YWx1ZS5pc051bGwoKSAmJiBtX3R5cGUgIT0gRklMRSkKLSAgICAgICAgdmFsdWUgPSBnZXRB
dHRyaWJ1dGUodmFsdWVBdHRyKTsKLQotICAgIC8vIElmIG5vIGF0dHJpYnV0ZSBleGlzdHMsIHRo
ZW4ganVzdCB1c2UgIm9uIiBvciAiIiBiYXNlZCBvZmYgdGhlIGNoZWNrZWQoKSBzdGF0ZSBvZiB0
aGUgY29udHJvbC4KLSAgICBpZiAodmFsdWUuaXNOdWxsKCkgJiYgKG1fdHlwZSA9PSBDSEVDS0JP
WCB8fCBtX3R5cGUgPT0gUkFESU8pKQotICAgICAgICByZXR1cm4gRE9NU3RyaW5nKGNoZWNrZWQo
KSA/ICJvbiIgOiAiIik7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLURPTVN0cmluZyBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6dmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0Ci17Ci0gICAgRE9NU3Ry
aW5nIHYgPSB2YWx1ZSgpOwotICAgIGlmICh2LmlzRW1wdHkoKSkgewotICAgICAgICBzd2l0Y2gg
KG1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAgICB2ID0g
cmVzZXRCdXR0b25EZWZhdWx0TGFiZWwoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAg
ICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgdiA9IHN1Ym1pdEJ1dHRvbkRl
ZmF1bHRMYWJlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNl
IEJVVFRPTjoKLSAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICBjYXNlIEZJ
TEU6Ci0gICAgICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0g
ICAgICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAg
ICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAg
ICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdjsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBp
ZiAobV90eXBlID09IEZJTEUpIHJldHVybjsKLQotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIg
PSBmYWxzZTsKLSAgICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkgewot
ICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAg
ICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAgICBzZXRDaGFuZ2VkKCk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwot
ICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWVGcm9tUmVuZGVy
ZXIoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAg
bV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlu
cHV0IiBET00gZXZlbnQuCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwg
ZmFsc2UpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzdG9yZXNWYWx1ZVNlcGFy
YXRlRnJvbUF0dHJpYnV0ZSgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAg
ICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgRklM
RToKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNh
c2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAg
ICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNl
IElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgot
ICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi12b2lkKiBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cHJlRGlzcGF0
Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgLy8gcHJldmVudERlZmF1bHQg
b3IgInJldHVybiBmYWxzZSIgYXJlIHVzZWQgdG8gcmV2ZXJzZSB0aGUgYXV0b21hdGljIGNoZWNr
aW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJlLgotICAgIC8vIFRoaXMgcmVzdWx0IGdpdmVzIHVzIGVu
b3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhlICJ1bmRvIiBpbiBwb3N0RGlzcGF0Y2ggb2YgdGhlIGFj
dGlvbiB3ZSB0YWtlIGhlcmUuCi0gICAgdm9pZCogcmVzdWx0ID0gMDsgCi0gICAgaWYgKChtX3R5
cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgp
ICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1v
dXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBl
ID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAgICAvLyBBcyBhIHdheSB0byBzdG9yZSB0aGUgc3Rh
dGUsIHdlIHJldHVybiAwIGlmIHdlIHdlcmUgdW5jaGVja2VkLCAxIGlmIHdlIHdlcmUgY2hlY2tl
ZCwgYW5kIDIgZm9yCi0gICAgICAgICAgICAvLyBpbmRldGVybWluYXRlLgotICAgICAgICAgICAg
aWYgKGluZGV0ZXJtaW5hdGUoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikw
eDI7Ci0gICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZShmYWxzZSk7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKCkpCi0gICAgICAgICAgICAg
ICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDE7Ci0gICAgICAgICAgICAgICAgc2V0Q2hlY2tlZCgh
Y2hlY2tlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IC8vIEZvciByYWRpbyBidXR0b25zLCBzdG9yZSB0aGUgY3VycmVudCBzZWxlY3RlZCByYWRpbyBv
YmplY3QuCi0gICAgICAgICAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSB8fCBjaGVja2VkKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIFVubmFtZWQgcmFkaW8gYnV0dG9ucyBkb250IGdl
dCBjaGVja2VkLiBDaGVja2VkIGJ1dHRvbnMganVzdCBzdGF5IGNoZWNrZWQuCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBOZWVkIHRvIGxlYXJuIHRvIHdvcmsgd2l0aG91dCBh
IGZvcm0uCi0KLSAgICAgICAgICAgIC8vIFdlIHJlYWxseSB3YW50IHJhZGlvIGdyb3VwcyB0byBl
bmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGkuZS4sIHRvIGhhdmUgc29tZXRoaW5nIGNoZWNrZWQuCi0g
ICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgbm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQs
IHdlIHdvbid0IGFsbG93IHRoaXMgYWN0aW9uIHRvIGJlICJ1bmRvbmUiLCBzaW5jZQotICAgICAg
ICAgICAgLy8gd2Ugd2FudCBzb21lIG9iamVjdCBpbiB0aGUgcmFkaW8gZ3JvdXAgdG8gYWN0dWFs
bHkgZ2V0IHNlbGVjdGVkLgotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGN1cnJS
YWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5p
bXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICBpZiAoY3VyclJhZGlvKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlvIGJ1dHRvbiBzZWxlY3RlZCB0aGF0IGlzIG5vdCB1cy4g
IENhY2hlIGl0IGluIG91ciByZXN1bHQgZmllbGQgYW5kIHJlZiBpdCBzbwotICAgICAgICAgICAg
ICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUgZGVzdHJveWVkLgotICAgICAgICAgICAgICAgIGN1cnJS
YWRpby0+cmVmKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VyclJhZGlvOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0K
LSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwb3N0
RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQqIGRhdGEpCi17Ci0gICAg
aWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91
c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRp
Y19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBp
ZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBjaGVj
a2luZyB3ZSBkaWQgaW4gcHJlRGlzcGF0Y2guCi0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZhdWx0
UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZhdWx0SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGRhdGEgPT0gKHZvaWQqKTB4MikKLSAgICAgICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1p
bmF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNl
dENoZWNrZWQoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkg
ewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0ID0gc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudEltcGwqPihkYXRhKTsKLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1
bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRlZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAg
ICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzZWxlY3RlZCByYWRpbyBidXR0b24gaWYgcG9zc2li
bGUuCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGlzIHN0aWxsIGEgcmFkaW8gYnV0
dG9uIGFuZCBvbmx5IGRvIHRoZSByZXN0b3JhdGlvbiBpZiBpdCBzdGlsbAotICAgICAgICAgICAg
ICAgIC8vIGJlbG9uZ3MgdG8gb3VyIGdyb3VwLgotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+
Zm9ybSgpID09IGZvcm0oKSAmJiBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXQt
Pm5hbWUoKSA9PSBuYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT2ssIHRoZSBvbGQg
cmFkaW8gYnV0dG9uIGlzIHN0aWxsIGluIG91ciBmb3JtIGFuZCBpbiBvdXIgZ3JvdXAgYW5kIGlz
IHN0aWxsIGEgCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhZGlvIGJ1dHRvbiwgc28gaXQncyBz
YWZlIHRvIHJlc3RvcmUgc2VsZWN0aW9uIHRvIGl0LgotICAgICAgICAgICAgICAgICAgICBpbnB1
dC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBpbnB1dC0+ZGVyZWYoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkK
LXsKLSAgICBpZiAobV90eXBlID09IElNQUdFICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0
LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiBtX3JlbmRlcikgewotICAgICAgICAvLyByZWNvcmQg
dGhlIG1vdXNlIHBvc2l0aW9uIGZvciB3aGVuIHdlIGdldCB0aGUgRE9NQWN0aXZhdGUgZXZlbnQK
LSAgICAgICAgTW91c2VFdmVudEltcGwgKm1lID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwq
PihldnQpOwotICAgICAgICBpbnQgb2Zmc2V0WCwgb2Zmc2V0WTsKLSAgICAgICAgbV9yZW5kZXIt
PmFic29sdXRlUG9zaXRpb24ob2Zmc2V0WCxvZmZzZXRZKTsKLSAgICAgICAgeFBvcyA9IG1lLT5j
bGllbnRYKCktb2Zmc2V0WDsKLSAgICAgICAgeVBvcyA9IG1lLT5jbGllbnRZKCktb2Zmc2V0WTsK
LQotCW1lLT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0KLQotICAgIC8vIERPTUFjdGl2YXRl
IGV2ZW50cyBjYXVzZSB0aGUgaW5wdXQgdG8gYmUgImFjdGl2YXRlZCIgLSBpbiB0aGUgY2FzZSBv
ZiBpbWFnZSBhbmQgc3VibWl0IGlucHV0cywgdGhpcyBtZWFucwotICAgIC8vIGFjdHVhbGx5IHN1
Ym1pdHRpbmcgdGhlIGZvcm0uIEZvciByZXNldCBpbnB1dHMsIHRoZSBmb3JtIGlzIHJlc2V0LiBU
aGVzZSBldmVudHMgYXJlIHNlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MKLSAgICAvLyBvbiB0aGUg
ZWxlbWVudCwgb3IgcHJlc3NlcyBlbnRlciB3aGlsZSBpdCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQu
IEphdmFjc3JpcHQgY29kZSB3aXNoaW5nIHRvIGFjdGl2YXRlIHRoZSBlbGVtZW50Ci0gICAgLy8g
bXVzdCBkaXNwYXRjaCBhIERPTUFjdGl2YXRlIGV2ZW50IC0gYSBjbGljayBldmVudCB3aWxsIG5v
dCBkbyB0aGUgam9iLgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSB7
Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCB8fCBtX3R5
cGUgPT0gUkVTRVQpIHsKLSAgICAgICAgICAgIGlmICghbV9mb3JtKQotICAgICAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkVTRVQpCi0gICAgICAgICAgICAg
ICAgbV9mb3JtLT5yZXNldCgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAg
bV9hY3RpdmVTdWJtaXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghbV9mb3JtLT5wcmVw
YXJlU3VibWl0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgeFBvcyA9IDA7Ci0gICAgICAgICAg
ICAgICAgICAgIHlQb3MgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBt
X2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0K
LQotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRl
ZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5k
aW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXBy
ZXNzRXZlbnQgJiYgZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkgewotICAgICAgICBib29sIGNsaWNr
RWxlbWVudCA9IGZhbHNlOwotICAgICAgICBib29sIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSBm
YWxzZTsKLQotICAgICAgICBET01TdHJpbmcga2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVu
dEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRpZmllcigpOwotCi0gICAgICAgIGlmIChrZXkgPT0gIlUr
MDAwMDIwIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAg
ICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAg
ICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAg
ICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAg
ICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIGZvciBzcGFjZWJhciBmb3IgdGhl
c2UgdHlwZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBBcHBLaXQg
YWxyZWFkeSBkb2VzIHRoaXMgZm9yIHNvbWUsIGJ1dCBub3QgYWxsLCBvZiB0aGVtLgotICAgICAg
ICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAgICAgICAgICAv
LyBJZiBhbiB1bnNlbGVjdGVkIHJhZGlvIGlzIHRhYmJlZCBpbnRvIChiZWNhdXNlIHRoZSBlbnRp
cmUgZ3JvdXAgaGFzIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tlZCwgb3Ig
YmVjYXVzZSBvZiBzb21lIGV4cGxpY2l0IC5mb2N1cygpIGNhbGwpLCB0aGVuIGFsbG93IHNwYWNl
IHRvIGNoZWNrIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrZWQoKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGNsaWNrRWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAg
IGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAg
ICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAg
ICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAg
ICAgICAgICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgSElEREVO
OgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAg
ICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBvbiB0aGUgZGVmYXVsdCBmb3JtIGJ1dHRvbiBmb3Ig
ZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBj
bGlja0RlZmF1bHRGb3JtQnV0dG9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6
Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1J
VDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIGVudGVy
IGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tF
bGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIERvbid0IGRvIGFu
eXRoaW5nIGZvciBlbnRlciBvbiBhIHJhZGlvIGJ1dHRvbi4KLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgKGtleSA9PSAiVXAiIHx8IGtl
eSA9PSAiRG93biIgfHwga2V5ID09ICJMZWZ0IiB8fCBrZXkgPT0gIlJpZ2h0IikpIHsKLSAgICAg
ICAgICAgIC8vIExlZnQgYW5kIHVwIG1lYW4gInByZXZpb3VzIHJhZGlvIGJ1dHRvbiIuCi0gICAg
ICAgICAgICAvLyBSaWdodCBhbmQgZG93biBtZWFuICJuZXh0IHJhZGlvIGJ1dHRvbiIuCi0gICAg
ICAgICAgICAvLyBUZXN0ZWQgaW4gV2luSUUsIGFuZCBldmVuIGZvciBSVEwsIGxlZnQgc3RpbGwg
bWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0dG9uIChhbmQgc28gbW92ZXMKLSAgICAgICAgICAgIC8v
IHRvIHRoZSByaWdodCkuICBTZWVtcyBzdHJhbmdlLCBidXQgd2UnbGwgbWF0Y2ggaXQuCi0gICAg
ICAgICAgICBib29sIGZvcndhcmQgPSAoa2V5ID09ICJEb3duIiB8fCBrZXkgPT0gIlJpZ2h0Iik7
Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IHN0YXkgd2l0aGluIHRo
ZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhlIGZvcm0gaGFzbid0IGJlZW4gZGVtb3RlZCB0byBhIGxl
YWYgYmVjYXVzZQotICAgICAgICAgICAgLy8gb2YgbWFsZm9ybWVkIEhUTUwuCi0gICAgICAgICAg
ICBOb2RlSW1wbCogbiA9IHRoaXM7Ci0gICAgICAgICAgICB3aGlsZSAoKG4gPSAoZm9yd2FyZCA/
IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpKSkgewot
ICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UgZW5jb3VudGVyIGEgZm9ybSBlbGVtZW50LCB3ZSBr
bm93IHdlJ3JlIHRocm91Z2guCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoZm9y
bVRhZykpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBtb3JlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICAg
ICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBlbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWx0LT5mb3JtKCkgIT0gbV9m
b3JtKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChuLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
SFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0RWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudEltcGwqPihuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsdC0+aW5w
dXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXRFbHQtPm5hbWUoKSA9PSBuYW1lKCkgJiYKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+aXNGb2N1c2FibGUoKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNldEZvY3VzTm9kZShpbnB1dEVs
dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQtPmNsaWNrKGZhbHNlLCBm
YWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxl
ZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsaWNrRWxlbWVudCkgewotICAg
ICAgICAgICAgY2xpY2soZmFsc2UpOwotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxl
ZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gJiYgbV9mb3Jt
KSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnN1Ym1pdENsaWNrKCk7Ci0gICAgICAgICAgICBldnQt
PnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjppc0VkaXRhYmxlKCkKLXsKLSAgICByZXR1cm4gKChtX3R5cGUg
PT0gVEVYVCkgfHwgKG1fdHlwZSA9PSBQQVNTV09SRCkgfHwKLSAgICAgICAgICAgIChtX3R5cGUg
PT0gU0VBUkNIKSB8fCAobV90eXBlID09IElTSU5ERVgpIHx8IChtX3R5cGUgPT0gRklMRSkpOwot
fQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJ
bXBsICphdHRyKSBjb25zdAotewotICAgIHJldHVybiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIp
OwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRN
TElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRDaGVja2VkKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
IWdldEF0dHJpYnV0ZShjaGVja2VkQXR0cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldERlZmF1bHRDaGVja2VkKGJvb2wgZGVmYXVsdENoZWNrZWQpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGNoZWNrZWRBdHRyLCBkZWZhdWx0Q2hlY2tlZCA/ICIiIDogMCk7Ci19
Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXB0KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2VwdEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoYWNjZXB0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxl
bWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShh
Y2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tl
eUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbGln
bigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5n
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoYWx0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsdChj
b25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2YWx1
ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldE1heExlbmd0aChpbnQgX21h
eExlbmd0aCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobWF4bGVuZ3RoQXR0ciwgUVN0cmluZzo6bnVt
YmVyKF9tYXhMZW5ndGgpKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2l6
ZSh1bnNpZ25lZCBfc2l6ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6
Om51bWJlcihfc2l6ZSkpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnNy
YygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKGdldEF0
dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNy
Yyhjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzcmNBdHRyLCB2
YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dXNlTWFwKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHVzZW1hcEF0dHIpOwotfQotCi12b2lkIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRVc2VNYXAoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUodXNlbWFwQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLUhUTUxMYWJlbEVsZW1lbnRJbXBsOjpIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50SW1wbChsYWJlbFRhZywgZG9jKQotewot
fQotCi1IVE1MTGFiZWxFbGVtZW50SW1wbDo6fkhUTUxMYWJlbEVsZW1lbnRJbXBsKCkKLXsKLX0K
LQotYm9vbCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6cGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+
bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZv
Y3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShh
dHRyKTsKLX0KLQotRWxlbWVudEltcGwgKkhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVu
dCgpCi17Ci0gICAgRE9NU3RyaW5nIGZvcm1FbGVtZW50SWQgPSBnZXRBdHRyaWJ1dGUoZm9yQXR0
cik7Ci0gICAgaWYgKGZvcm1FbGVtZW50SWQuaXNOdWxsKCkpIHsKLSAgICAgICAgLy8gU2VhcmNo
IGNoaWxkcmVuIG9mIHRoZSBsYWJlbCBlbGVtZW50IGZvciBhIGZvcm0gZWxlbWVudC4KLSAgICAg
ICAgTm9kZUltcGwgKm5vZGUgPSB0aGlzOwotICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50
cmF2ZXJzZU5leHROb2RlKHRoaXMpKSkgewotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVs
ZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0
YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAo
ZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgfQotICAgIGlmIChmb3JtRWxlbWVudElkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmdldEVsZW1lbnRCeUlkKGZvcm1FbGVtZW50
SWQpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYg
KEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+
Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9u
KGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZv
cm1FbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tl
eUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRN
TExhYmVsRWxlbWVudEltcGw6OmZvcm0oKQotewotICAgIGZvciAoTm9kZUltcGwgKnAgPSBwYXJl
bnROb2RlKCk7IHAgIT0gMDsgcCA9IHAtPnBhcmVudE5vZGUoKSkgewotICAgICAgICBpZiAocC0+
aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1M
Rm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQot
RE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExhYmVs
RWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1M
TGFiZWxFbGVtZW50SW1wbDo6aHRtbEZvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZShmb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0SHRtbEZv
cihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShmb3JBdHRyLCB2
YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExlZ2VuZEVsZW1lbnRJbXBs
OjpIVE1MTGVnZW5kRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVu
dEltcGwgKmYpCi06IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGxlZ2VuZFRhZywgZG9jLCBm
KQotewotfQotCi1IVE1MTGVnZW5kRWxlbWVudEltcGw6On5IVE1MTGVnZW5kRWxlbWVudEltcGwo
KQotewotfQotCi1ib29sIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25z
dAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MTGVnZW5kRWxl
bWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUq
IHN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMZWdlbmQodGhpcyk7Ci19
Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAg
IHJldHVybiAibGVnZW5kIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6
YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0
dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0
IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZh
bHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWxpZ24oKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1M
TGVnZW5kRWxlbWVudEltcGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1FbGVtZW50SW1wbCAqSFRN
TExlZ2VuZEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgLy8gQ2hlY2sgaWYgdGhl
cmUncyBhIGZpZWxkc2V0IGJlbG9uZ2luZyB0byB0aGlzIGxlZ2VuZC4KLSAgICBOb2RlSW1wbCAq
ZmllbGRzZXQgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKGZpZWxkc2V0ICYmICFmaWVsZHNl
dC0+aGFzVGFnTmFtZShmaWVsZHNldFRhZykpCi0gICAgICAgIGZpZWxkc2V0ID0gZmllbGRzZXQt
PnBhcmVudE5vZGUoKTsKLSAgICBpZiAoIWZpZWxkc2V0KQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIC8vIEZpbmQgZmlyc3QgZm9ybSBlbGVtZW50IGluc2lkZSB0aGUgZmllbGRzZXQuCi0gICAg
Ly8gRklYTUU6IFNob3VsZCB3ZSBjYXJlIGFib3V0IHRhYmluZGV4PwotICAgIE5vZGVJbXBsICpu
b2RlID0gZmllbGRzZXQ7Ci0gICAgd2hpbGUgKChub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9k
ZShmaWVsZHNldCkpKSB7Ci0gICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAg
ICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVt
ZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAgICAgIGlmICghZWxlbWVudC0+aGFzTG9jYWxOYW1l
KGxlZ2VuZFRhZykgJiYgZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAw
OwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlmIChF
bGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmZv
Y3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24o
Ym9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9
IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9B
bnlFbGVtZW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MU2VsZWN0RWxlbWVu
dEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1F
bGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHNlbGVjdFRh
ZywgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MU2VsZWN0
RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywgZiksIG1fb3B0aW9ucygw
KQotewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmluaXQo
KQotewotICAgIG1fb3B0aW9ucyA9IDA7Ci0gICAgbV9tdWx0aXBsZSA9IGZhbHNlOwotICAgIG1f
cmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci0gICAgLy8gMCBtZWFucyBpbnZhbGlkIChpLmUuIG5v
dCBzZXQpCi0gICAgbV9zaXplID0gMDsKLSAgICBtX21pbndpZHRoID0gMDsKLX0KLQotSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjp+SFRNTFNlbGVjdEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0
RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMp
OwotICAgIGlmIChtX29wdGlvbnMpIHsKLSAgICAgICAgbV9vcHRpb25zLT5kZXRhY2goKTsKLSAg
ICAgICAgbV9vcHRpb25zLT5kZXJlZigpOwotICAgIH0KLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1
cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShvcHRpb25U
YWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSB8fCBuZXdDaGlsZC0+aGFz
VGFnTmFtZShoclRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0
VGFnKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHls
ZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGhhc0NoYW5nZWRDaGlsZCgpICYmIG1fcmVuZGVyKSB7
Ci0gICAgICAgIHN0YXRpY19jYXN0PGtodG1sOjpSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNl
dE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLX0KLQotCi1ET01TdHJpbmcgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG1fbXVsdGlwbGUgPyAic2Vs
ZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qtb25lIik7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAotewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVy
IG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0ZWQKLSAgICB1aW50IG8gPSAwOwotICAgIFFNZW1B
cnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5z
aWduZWQgaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0
ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgaWYgKHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgIG8rKzsKLSAgICAgICAgfQotICAg
IH0KLSAgICBRX0FTU0VSVChtX211bHRpcGxlKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRTZWxlY3RlZEluZGV4KCBpbnQgIGluZGV4ICkKLXsK
LSAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucyBhbmQgc2VsZWN0IG9ubHkgdGhlIG5l
dyBvbmUKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMo
KTsKLSAgICBpbnQgbGlzdEluZGV4OwotICAgIGZvciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4
IDwgaW50KGl0ZW1zLnNpemUoKSk7IGxpc3RJbmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1ts
aXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3Rl
ZChmYWxzZSk7Ci0gICAgfQotICAgIGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4
KTsKLSAgICBpZiAobGlzdEluZGV4ID49IDApCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRp
b25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3RlZCh0cnVlKTsKLQot
ICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxl
bmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgdWludCBpOwotICAgIFFNZW1B
cnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAoaSA9
IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgbGVuKys7Ci0gICAgfQotICAgIHJldHVy
biBsZW47Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphZGQoIEhUTUxFbGVtZW50
SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29k
ZSApCi17Ci0gICAgUmVmUHRyPEhUTUxFbGVtZW50SW1wbD4gcHJvdGVjdE5ld0NoaWxkKGVsZW1l
bnQpOyAvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2Ug
ZG9uJ3QgbGVhayBpdAotCi0gICAgaWYgKCFlbGVtZW50IHx8ICEoZWxlbWVudC0+aGFzTG9jYWxO
YW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzTG9jYWxOYW1lKGhyVGFnKSkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGluc2VydEJlZm9yZShlbGVtZW50LCBiZWZvcmUsIGV4Y2VwdGlvbmNv
ZGUpOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1z
KCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmUoIGludCBpbmRleCAp
Ci17Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRp
b25Ub0xpc3RJbmRleChpbmRleCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4g
aXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZihsaXN0SW5kZXggPCAwIHx8IGluZGV4ID49IGlu
dChpdGVtcy5zaXplKCkpKQotICAgICAgICByZXR1cm47IC8vICMjIyB3aGF0IHNob3VsZCB3ZSBk
byA/IHJlbW92ZSB0aGUgbGFzdCBpdGVtPwotCi0gICAgTm9kZUltcGwgKml0ZW0gPSBpdGVtc1ts
aXN0SW5kZXhdOwotICAgIGl0ZW0tPnJlZigpOwotICAgIHJlbW92ZUNoaWxkKGl0ZW0sIGV4Y2Vw
dGlvbmNvZGUpOwotICAgIGl0ZW0tPmRlcmVmKCk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkK
LSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxF
bGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0
ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9w
dGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0p
LT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+dmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIERPTVN0
cmluZygiIik7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAg
cmV0dXJuOwotICAgIC8vIGZpbmQgdGhlIG9wdGlvbiB3aXRoIHZhbHVlKCkgbWF0Y2hpbmcgdGhl
IGdpdmVuIHBhcmFtZXRlcgotICAgIC8vIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHNlbGVjdGlv
bi4KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsK
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAg
IGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT52YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAg
ICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNl
dFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLVFT
dHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzdGF0ZSgpCi17Ci0gICAgUU1lbUFycmF5PEhU
TUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1z
LmNvdW50KCk7Ci0KLSAgICBRQ2hhciBzdGF0ZUNoYXJzW2xdOwotICAgIAotICAgIGZvcihpbnQg
aSA9IDA7IGkgPCBsOyBpKyspCi0gICAgICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSkt
PnNlbGVjdGVkKCkpCi0gICAgICAgICAgICBzdGF0ZUNoYXJzW2ldID0gJ1gnOwotICAgICAgICBl
bHNlCi0gICAgICAgICAgICBzdGF0ZUNoYXJzW2ldID0gJy4nOwotICAgIFFTdHJpbmcgc3RhdGUo
c3RhdGVDaGFycywgbCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnN0YXRlKCkgKyBzdGF0ZTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlc3Rv
cmVTdGF0ZShRU3RyaW5nTGlzdCAmX3N0YXRlcykKLXsKLSAgICBRU3RyaW5nIF9zdGF0ZSA9IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShfc3RhdGVzKTsKLSAg
ICBpZiAoX3N0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICByZWNhbGNMaXN0SXRlbXMoKTsK
LQotICAgIFFTdHJpbmcgc3RhdGUgPSBfc3RhdGU7Ci0gICAgaWYoIXN0YXRlLmlzRW1wdHkoKSAm
JiAhc3RhdGUuY29udGFpbnMoJ1gnKSAmJiAhbV9tdWx0aXBsZSkgewotICAgICAgICBxV2Fybmlu
Zygic2hvdWxkIG5vdCBoYXBwZW4gaW4gcmVzdG9yZVN0YXRlISIpOwotICAgICAgICAvLyBLV1FT
dHJpbmcgZG9lc24ndCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLiBTaG91bGQgbmV2ZXIgZ2V0IGhl
cmUgYW55d2F5LgotICAgICAgICAvL3N0YXRlWzBdID0gJ1gnOwotICAgIH0KLQotICAgIFFNZW1B
cnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotCi0gICAgaW50IGwg
PSBpdGVtcy5jb3VudCgpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAg
ICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBI
VE1MT3B0aW9uRWxlbWVudEltcGwqIG9lID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgb2UtPnNldFNlbGVjdGVkKHN0YXRlW2ldID09
ICdYJyk7CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikgewor
ICAgICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQo
KSA6IC0xOworICAgICAgICBzZXRDaGFuZ2VkKCk7CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gc2l6ZUF0dHIpIHsKKyAgICAgICAgbV9zaXplID0gIWF0dHItPmlzTnVsbCgpID8gYXR0
ci0+dmFsdWUoKS50b0ludCgpIDogMjA7CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YWx0QXR0cikgeworICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90eXBlID09IElNQUdFKQorICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3JlbmRlciktPnVwZGF0ZUFsdFRl
eHQoKTsKKyAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7CisgICAgICAg
IGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsKKyAgICAgICAgICAgIGlmICghbV9p
bWFnZUxvYWRlcikKKyAgICAgICAgICAgICAgICBtX2ltYWdlTG9hZGVyID0gbmV3IEhUTUxJbWFn
ZUxvYWRlcih0aGlzKTsKKyAgICAgICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVt
ZW50KCk7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotTm9k
ZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5l
d0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAg
Tm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZv
cmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUgKTsKLSAgICBpZiAoIWV4Y2VwdGlv
bmNvZGUpCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZigg
IWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1
cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmVD
aGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBO
b2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNoaWxk
KG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAg
ICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2Rl
SW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25j
b2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5v
ZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGls
ZCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0
dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3Np
emUgPSBrTWF4KGF0dHItPnZhbHVlKCkudG9JbnQoKSwgMSk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIG1fbWlud2lkdGggPSBrTWF4KCBhdHRy
LT52YWx1ZSgpLnRvSW50KCksIDAgKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBt
dWx0aXBsZUF0dHIpIHsKLSAgICAgICAgbV9tdWx0aXBsZSA9ICghYXR0ci0+aXNOdWxsKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKKyAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSB1c2VtYXBBdHRyIHx8CisgICAgICAgICAgICAgICBhdHRy
LT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewogICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZv
ciB0aGUgbW9tZW50CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikg
eworICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+
dmFsdWUoKSk7CisgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9U
VE9NLCBhdHRyLT52YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3Bh
Y2VBdHRyKSB7CisgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVG
VCwgYXR0ci0+dmFsdWUoKSk7CisgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9N
QVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGFsaWduQXR0cikgeworICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOworICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgeworICAgICAgICBhZGRDU1NMZW5n
dGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKKyAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIs
IENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7CiAgICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKICAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9j
dXNFdmVudCwgYXR0cik7CiAgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0
cikgewogICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOworICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgeworICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7CiAgICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7CiAgICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVy
KGNoYW5nZUV2ZW50LCBhdHRyKTsKKyAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmlu
cHV0QXR0cikgeworICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRy
KTsKKyAgICB9CisgICAgLy8gU2VhcmNoIGZpZWxkIGFuZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwg
anVzdCBjYXVzZSB1cGRhdGVGcm9tRWxlbWVudCB0byBiZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQor
ICAgIC8vIHJlY2FsY2luZy4KKyAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWFyY2hB
dHRyKSB7CisgICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsK
KyAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZXN1bHRzQXR0cikgeworICAgICAgICBt
X21heFJlc3VsdHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAt
MTsKKyAgICAgICAgc2V0Q2hhbmdlZCgpOworICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGF1dG9zYXZlQXR0ciB8fAorICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVu
dGFsQXR0ciB8fAorICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0
ciB8fAorICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKKyAgICAgICAg
ICAgICAgIGF0dHItPm5hbWUoKSA9PSBtYXhBdHRyIHx8CisgICAgICAgICAgICAgICBhdHRyLT5u
YW1lKCkgPT0gcHJlY2lzaW9uQXR0cikgeworICAgICAgICBzZXRDaGFuZ2VkKCk7CiAgICAgfSBl
bHNlCiAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKTsKIH0KIAotUmVuZGVyT2JqZWN0ICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNy
ZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewot
ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTZWxlY3QodGhpcyk7Ci19Ci0KLWJvb2wgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kZWRf
dmFsdWVzLCBib29sKQorYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRl
ZChSZW5kZXJTdHlsZSAqc3R5bGUpCiB7Ci0gICAgYm9vbCBzdWNjZXNzZnVsID0gZmFsc2U7Ci0g
ICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAg
ICB1aW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAg
ICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAg
IEhUTUxPcHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVs
ZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgaWYgKG9wdGlvbi0+c2VsZWN0ZWQo
KSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBv
cHRpb24tPnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gIyMjIHRoaXMgY2FzZSBzaG91
bGQgbm90IGhhcHBlbi4gbWFrZSBzdXJlIHRoYXQgd2Ugc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24K
LSAgICAvLyBpbiBhbnkgY2FzZS4gb3RoZXJ3aXNlIHdlIGhhdmUgbm8gY29uc2lzdGVuY3kgd2l0
aCB0aGUgRE9NIGludGVyZmFjZS4gRklYTUUhCi0gICAgLy8gd2UgcmV0dXJuIHRoZSBmaXJzdCBv
bmUgaWYgaXQgd2FzIGEgY29tYm9ib3ggc2VsZWN0Ci0gICAgaWYgKCFzdWNjZXNzZnVsICYmICFt
X211bHRpcGxlICYmIG1fc2l6ZSA8PSAxICYmIGl0ZW1zLnNpemUoKSAmJgotICAgICAgICAoaXRl
bXNbMF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSkgewotICAgICAgICBIVE1MT3B0aW9uRWxl
bWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0
ZW1zWzBdKTsKLSAgICAgICAgaWYgKG9wdGlvbi0+dmFsdWUoKS5pc051bGwoKSkKLSAgICAgICAg
ICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnRleHQoKS5xc3Ry
aW5nKCkuc3RyaXBXaGl0ZVNwYWNlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmNv
ZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAg
c3VjY2Vzc2Z1bCA9IHRydWU7CisgICAgc3dpdGNoKG1fdHlwZSkKKyAgICB7CisgICAgY2FzZSBU
RVhUOgorICAgIGNhc2UgUEFTU1dPUkQ6CisgICAgY2FzZSBTRUFSQ0g6CisgICAgY2FzZSBSQU5H
RToKKyAgICBjYXNlIElTSU5ERVg6CisgICAgY2FzZSBDSEVDS0JPWDoKKyAgICBjYXNlIFJBRElP
OgorICAgIGNhc2UgU1VCTUlUOgorICAgIGNhc2UgSU1BR0U6CisgICAgY2FzZSBSRVNFVDoKKyAg
ICBjYXNlIEZJTEU6CisgICAgY2FzZSBCVVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKHN0eWxlKTsKKyAgICBjYXNlIEhJRERFTjogICBy
ZXR1cm4gZmFsc2U7CiAgICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3NmdWw7CisgICAgYXNzZXJ0
KGZhbHNlKTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWludCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6Om9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3QKK1JlbmRlck9iamVj
dCAqSFRNTElucHV0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVu
YSwgUmVuZGVyU3R5bGUgKnN0eWxlKQogewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9u
SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlu
dCBsaXN0SW5kZXggPSAwOwotICAgIGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAoOwot
ICAgICAgICAgb3B0aW9uSW5kZXgyIDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5kZXgy
IDw9IG9wdGlvbkluZGV4OwotICAgICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlwbyEK
LSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQot
ICAgICAgICAgICAgb3B0aW9uSW5kZXgyKys7CisgICAgc3dpdGNoKG1fdHlwZSkKKyAgICB7Cisg
ICAgY2FzZSBURVhUOgorICAgIGNhc2UgUEFTU1dPUkQ6CisgICAgY2FzZSBTRUFSQ0g6CisgICAg
Y2FzZSBJU0lOREVYOiAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckxpbmVFZGl0KHRoaXMpOwor
ICAgIGNhc2UgQ0hFQ0tCT1g6CisgICAgY2FzZSBSQURJTzoKKyAgICAgICAgcmV0dXJuIFJlbmRl
ck9iamVjdDo6Y3JlYXRlT2JqZWN0KHRoaXMsIHN0eWxlKTsKKyAgICBjYXNlIFNVQk1JVDoKKyAg
ICBjYXNlIFJFU0VUOgorICAgIGNhc2UgQlVUVE9OOgorICAgICAgICByZXR1cm4gbmV3IChhcmVu
YSkgUmVuZGVyQnV0dG9uKHRoaXMpOworICAgIGNhc2UgSU1BR0U6ICAgIHJldHVybiBuZXcgKGFy
ZW5hKSBSZW5kZXJJbWFnZUJ1dHRvbih0aGlzKTsKKyAgICBjYXNlIEZJTEU6ICAgICByZXR1cm4g
bmV3IChhcmVuYSkgUmVuZGVyRmlsZUJ1dHRvbih0aGlzKTsKKyAgICBjYXNlIFJBTkdFOiAgICBy
ZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2xpZGVyKHRoaXMpOworICAgIGNhc2UgSElEREVOOiAg
IGJyZWFrOwogICAgIH0KLSAgICBsaXN0SW5kZXgtLTsKLSAgICByZXR1cm4gbGlzdEluZGV4Owot
fQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpsaXN0VG9PcHRpb25JbmRleChpbnQgbGlz
dEluZGV4KSBjb25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9
IGxpc3RJdGVtcygpOwotICAgIGlmIChsaXN0SW5kZXggPCAwIHx8IGxpc3RJbmRleCA+PSBpbnQo
aXRlbXMuc2l6ZSgpKSB8fAotICAgICAgICAhaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1l
KG9wdGlvblRhZykpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGludCBvcHRpb25JbmRleCA9
IDA7IC8vIGFjdHVhbCBpbmRleCBvZiBvcHRpb24gbm90IGNvdW50aW5nIE9QVEdST1VQIGVudHJp
ZXMgdGhhdCBtYXkgYmUgaW4gbGlzdAotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBs
aXN0SW5kZXg7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9u
VGFnKSkKLSAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgcmV0dXJuIG9wdGlvbkluZGV4
OworICAgIGFzc2VydChmYWxzZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKLS8vIEZJWE1FIDQxOTc5
OTc6IHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHB1YmxpYyBBUEkgLVtET01IVE1MU2VsZWN0
RWxlbWVudCBvcHRpb25zXSwgYnV0IGFsd2F5cyByZXR1cm5zCi0vLyBhbiBlbXB0eSBsaXN0Lgot
SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25z
KCkKK3ZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCiB7Ci0gICAgaWYgKCFtX29w
dGlvbnMpIHsKLSAgICAgICAgbV9vcHRpb25zID0gbmV3IEhUTUxPcHRpb25zQ29sbGVjdGlvbklt
cGwodGhpcyk7Ci0gICAgICAgIG1fb3B0aW9ucy0+cmVmKCk7Ci0gICAgfQotICAgIHJldHVybiBt
X29wdGlvbnM7Ci19CisgICAgaWYgKCFtX2luaXRlZCkgeworICAgICAgICBpZiAoIW1faGF2ZVR5
cGUpCisgICAgICAgICAgICBzZXRJbnB1dFR5cGUoZ2V0QXR0cmlidXRlKHR5cGVBdHRyKSk7CiAK
LS8vIEZJWE1FOiBEZWxldGUgb25jZSB0aGUgYWJvdmUgZnVuY3Rpb24gaXMgd29ya2luZyB3ZWxs
IGVub3VnaCB0byB1c2UgZm9yIHJlYWwuCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBIVE1M
U2VsZWN0RWxlbWVudEltcGw6Om9wdGlvbnNIVE1MQ29sbGVjdGlvbigpCi17Ci0gICAgcmV0dXJu
IFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywg
SFRNTENvbGxlY3Rpb25JbXBsOjpTRUxFQ1RfT1BUSU9OUykpOwotfQorICAgICAgICAvLyBGSVhN
RTogVGhpcyBuZWVkcyB0byBiZSBkeW5hbWljLCBkb2Vzbid0IGl0LCBzaW5jZSBzb21lb25lIGNv
dWxkIHNldCB0aGlzCisgICAgICAgIC8vIGFmdGVyIGF0dGFjaG1lbnQ/CisgICAgICAgIERPTVN0
cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKKyAgICAgICAgaWYgKCh1aW50KSBt
X3R5cGUgPD0gSVNJTkRFWCAmJiAhdmFsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gcmVt
b3ZlIG5ld2xpbmUgc3R1ZmYuLgorICAgICAgICAgICAgUVN0cmluZyBudmFsdWU7CisgICAgICAg
ICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZhbC5sZW5ndGgoKTsgKytpKQorICAg
ICAgICAgICAgICAgIGlmICh2YWxbaV0gPj0gJyAnKQorICAgICAgICAgICAgICAgICAgICBudmFs
dWUgKz0gdmFsW2ldOwogCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjTGlzdEl0
ZW1zKCkKLXsKLSAgICBOb2RlSW1wbCogY3VycmVudCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBtX2xp
c3RJdGVtcy5yZXNpemUoMCk7Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBmb3VuZFNlbGVj
dGVkID0gMDsKLSAgICB3aGlsZShjdXJyZW50KSB7Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNU
YWdOYW1lKG9wdGdyb3VwVGFnKSAmJiBjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKLSAgICAgICAg
ICAgIC8vICMjIyB3aGF0IGlmIG9wdGdyb3VwIGNvbnRhaW5zIGp1c3QgY29tbWVudHM/IGRvbid0
IHdhbnQgb25lIG9mIG5vIG9wdGlvbnMgaW4gaXQuLi4KLSAgICAgICAgICAgIG1fbGlzdEl0ZW1z
LnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1tt
X2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJy
ZW50KTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5maXJzdENoaWxkKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAg
ICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAg
ICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhU
TUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKCFmb3VuZFNlbGVjdGVk
ICYmICFtX211bHRpcGxlICYmIG1fc2l6ZSA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRT
ZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpOwot
ICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPm1fc2VsZWN0ZWQgPSB0cnVlOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZm91bmRTZWxlY3RlZCAmJiAhbV9tdWx0aXBs
ZSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KS0+c2VsZWN0
ZWQoKSkgewotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPm1fc2VsZWN0ZWQgPSBmYWxz
ZTsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlv
bkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUoaHJUYWcpKSB7Ci0gICAgICAgICAgICBtX2xpc3RJ
dGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRl
bXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4o
Y3VycmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZUltcGwgKnBhcmVudCA9IGN1cnJlbnQt
PnBhcmVudE5vZGUoKTsKLSAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7
Ci0gICAgICAgIGlmICghY3VycmVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSB0aGlz
KQotICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQtPm5leHRTaWJsaW5nKCk7CisgICAg
ICAgICAgICBpZiAodmFsLmxlbmd0aCgpICE9IG52YWx1ZS5sZW5ndGgoKSkKKyAgICAgICAgICAg
ICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBudmFsdWUpOwogICAgICAgICB9Ci0gICAgfQot
ICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci19CiAKLXZvaWQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwot
Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0UmVjYWxjTGlzdEl0ZW1zKCkKLXsKLSAg
ICBtX3JlY2FsY0xpc3RJdGVtcyA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBz
dGF0aWNfY2FzdDxraHRtbDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRPcHRpb25zQ2hh
bmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpyZXNldCgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1z
ID0gbGlzdEl0ZW1zKCk7Ci0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5z
aXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25U
YWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGJv
b2wgc2VsZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxs
KCkpOwotICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZChzZWxlY3RlZCk7Ci0gICAgICAg
IH0KKyAgICAgICAgbV9pbml0ZWQgPSB0cnVlOwogICAgIH0KLSAgICBpZiAoIG1fcmVuZGVyICkK
LSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rp
b25DaGFuZ2VkKHRydWUpOwotICAgIHNldENoYW5nZWQoIHRydWUgKTsKLX0KIAotdm9pZCBIVE1M
U2VsZWN0RWxlbWVudEltcGw6Om5vdGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50
SW1wbCAqc2VsZWN0ZWRPcHRpb24sIGJvb2wgc2VsZWN0ZWQpCi17Ci0gICAgaWYgKHNlbGVjdGVk
ICYmICFtX211bHRpcGxlKSB7Ci0gICAgICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25z
Ci0gICAgICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgICAgICB1aW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFn
KSkKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihp
dGVtc1tpXSktPm1fc2VsZWN0ZWQgPSAoaXRlbXNbaV0gPT0gc2VsZWN0ZWRPcHRpb24pOwotICAg
ICAgICB9CisgICAgLy8gRGlzYWxsb3cgdGhlIHdpZHRoIGF0dHJpYnV0ZSBvbiBpbnB1dHMgb3Ro
ZXIgdGhhbiBISURERU4gYW5kIElNQUdFLgorICAgIC8vIER1bWIgV2ViIHNpdGVzIHdpbGwgdHJ5
IHRvIHNldCB0aGUgd2lkdGggYXMgYW4gYXR0cmlidXRlIG9uIGZvcm0gY29udHJvbHMgdGhhdCBh
cmVuJ3QKKyAgICAvLyBpbWFnZXMgb3IgaGlkZGVuLgorICAgIGlmIChoYXNNYXBwZWRBdHRyaWJ1
dGVzKCkgJiYgbV90eXBlICE9IEhJRERFTiAmJiBtX3R5cGUgIT0gSU1BR0UgJiYgIWdldEF0dHJp
YnV0ZSh3aWR0aEF0dHIpLmlzRW1wdHkoKSkgeworICAgICAgICBpbnQgZXhjQ29kZTsKKyAgICAg
ICAgcmVtb3ZlQXR0cmlidXRlKHdpZHRoQXR0ciwgZXhjQ29kZSk7CiAgICAgfQotICAgIGlmICht
X3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5z
ZXRTZWxlY3Rpb25DaGFuZ2VkKHRydWUpOwogCi0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KKyAg
ICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCk7CiAKLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAg
IC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3Vz
ZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9m
IHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXByZXNzRXZl
bnQpIHsKLSAgICAKLSAgICAgICAgaWYgKCFtX2Zvcm0gfHwgIW1fcmVuZGVyIHx8ICFldnQtPmlz
S2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAg
RE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnRJbXBsICo+KGV2dCktPmtl
eUlkZW50aWZpZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChrZXkgPT0gIkVudGVyIikgewot
ICAgICAgICAgICAgbV9mb3JtLT5zdWJtaXRDbGljaygpOwotICAgICAgICAgICAgZXZ0LT5zZXRE
ZWZhdWx0SGFuZGxlZCgpOworICAgIGlmIChtX3R5cGUgPT0gSU1BR0UpIHsKKyAgICAgICAgaWYg
KCFtX2ltYWdlTG9hZGVyKQorICAgICAgICAgICAgbV9pbWFnZUxvYWRlciA9IG5ldyBIVE1MSW1h
Z2VMb2FkZXIodGhpcyk7CisgICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVtZW50
KCk7CisgICAgICAgIGlmIChyZW5kZXJlcigpKSB7CisgICAgICAgICAgICBSZW5kZXJJbWFnZSog
aW1hZ2VPYmogPSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKCkpOworICAgICAg
ICAgICAgaW1hZ2VPYmotPnNldEltYWdlKG1faW1hZ2VMb2FkZXItPmltYWdlKCkpOyAgICAKICAg
ICAgICAgfQogICAgIH0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2
ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWNjZXNz
S2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwotfQotCi12
b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0TXVsdGlwbGUoYm9vbCBtdWx0aXBsZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUobXVsdGlwbGVBdHRyLCBtdWx0aXBsZSA/ICIiIDogMCk7Ci19Ci0K
LXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRTaXplKGludCBzaXplKQotewotICAgIHNl
dEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKHNpemUpKTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MS2V5Z2VuRWxlbWVudEltcGw6OkhUTUxLZXlnZW5FbGVtZW50
SW1wbChEb2N1bWVudEltcGwqIGRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCogZikKLSAgICA6IEhU
TUxTZWxlY3RFbGVtZW50SW1wbChrZXlnZW5UYWcsIGRvYywgZikKLXsKLSAgICBRU3RyaW5nTGlz
dCBrZXlzID0gS1NTTEtleUdlbjo6c3VwcG9ydGVkS2V5U2l6ZXMoKTsKLSAgICBmb3IgKFFTdHJp
bmdMaXN0OjpJdGVyYXRvciBpID0ga2V5cy5iZWdpbigpOyBpICE9IGtleXMuZW5kKCk7ICsraSkg
ewotICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG8gPSBuZXcgSFRNTE9wdGlvbkVsZW1l
bnRJbXBsKGRvYywgZm9ybSgpKTsKLSAgICAgICAgYWRkQ2hpbGQobyk7Ci0gICAgICAgIG8tPmFk
ZENoaWxkKG5ldyBUZXh0SW1wbChkb2MsIERPTVN0cmluZygqaSkpKTsKLSAgICB9Ci19Ci0KLURP
TVN0cmluZyBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVy
biAia2V5Z2VuIjsKLX0KLQotdm9pZCBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSBjaGFsbGVuZ2VBdHRyKQotICAgICAgICBtX2NoYWxsZW5nZSA9IGF0dHItPnZhbHVl
KCk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGtleXR5cGVBdHRyKQotICAgICAgICBt
X2tleVR5cGUgPSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UKLSAgICAgICAgLy8gc2tpcCBIVE1M
U2VsZWN0RWxlbWVudEltcGwgcGFyc2luZyEKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxLZXlnZW5F
bGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywg
Ym9vbCkKLXsKLSAgICAvLyBPbmx5IFJTQSBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgotICAg
IGlmICghbV9rZXlUeXBlLmlzTnVsbCgpICYmICFlcXVhbElnbm9yaW5nQ2FzZShtX2tleVR5cGUs
ICJyc2EiKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFFTdHJpbmcgdmFsdWUgPSBLU1NM
S2V5R2VuOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVuZ2VTdHJpbmcoc2VsZWN0ZWRJbmRleCgp
LCBtX2NoYWxsZW5nZS5xc3RyaW5nKCksIGdldERvY3VtZW50KCktPmZyYW1lKCktPmJhc2VVUkwo
KSk7Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlLnV0ZjgoKSk7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTE9wdEdyb3VwRWxlbWVu
dEltcGw6OkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0Z3Jv
dXBUYWcsIGRvYywgZikKLXsKLX0KLQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6On5IVE1MT3B0
R3JvdXBFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6
OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJv
cHRncm91cCI7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aW5zZXJ0
QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhj
ZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUp
OwotICAgIGlmICggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25z
KCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsOjpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRDaGlsZCwg
ZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJlY2FsY1Nl
bGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAg
IGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAg
ICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6
OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQot
ewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBw
ZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29k
ZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0Owot
fQotCi1Ob2RlSW1wbCogSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBs
KiBuZXdDaGlsZCkKLXsKLSAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7CiAKLSAgICByZXR1cm4g
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAvLyBu
b3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5nIHBhc3N3b3JkRmllbGRSZW1vdmVkKCkgb24g
ZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcKKyAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFy
ZWQgb3VyIHN0YXRlIHRvbyBlYXJseQorICAgIGlmIChtX3R5cGUgPT0gUEFTU1dPUkQpCisgICAg
ICAgIGdldERvY3VtZW50KCktPnBhc3N3b3JkRmllbGRBZGRlZCgpOwogfQogCi12b2lkIEhUTUxP
cHRHcm91cEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJ
bXBsICphdHRyKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGV0YWNoKCkKIHsKLSAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci0g
ICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOworICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpkZXRhY2goKTsKKyAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7CiB9CiAKLXZv
aWQgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlY2FsY1NlbGVjdE9wdGlvbnMoKQorRE9NU3Ry
aW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHRUZXh0KCkgY29uc3QKIHsKLSAgICBOb2RlSW1w
bCAqc2VsZWN0ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+
aGFzVGFnTmFtZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5v
ZGUoKTsKLSAgICBpZiAoc2VsZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxl
bWVudEltcGwqPihzZWxlY3QpLT5zZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KKyAgICAvLyBodHRw
Oi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvYXBwZW5kaXgvbm90ZXMu
aHRtbCNhbHRnZW4KKyAgICAvLyBhbHNvIGhlYXZpbHkgZGlzY3Vzc2VkIGJ5IEhpeGllIG9uIGJ1
Z3ppbGxhCisgICAgLy8gbm90ZSB0aGlzIGlzIGludGVudGlvbmFsbHkgZGlmZmVyZW50IHRvIEhU
TUxJbWFnZUVsZW1lbnRJbXBsOjphbHRUZXh0KCkKKyAgICBET01TdHJpbmcgYWx0ID0gZ2V0QXR0
cmlidXRlKGFsdEF0dHIpOworICAgIC8vIGZhbGwgYmFjayB0byB0aXRsZSBhdHRyaWJ1dGUKKyAg
ICBpZiAoYWx0LmlzTnVsbCgpKQorICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRy
KTsKKyAgICBpZiAoYWx0LmlzTnVsbCgpKQorICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodmFs
dWVBdHRyKTsKKyAgICBpZiAoYWx0LmlzRW1wdHkoKSkKKyAgICAgICAgYWx0ID0gaW5wdXRFbGVt
ZW50QWx0VGV4dCgpOwogCi1ET01TdHJpbmcgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmxhYmVs
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxhYmVsQXR0cik7CisgICAgcmV0
dXJuIGFsdDsKIH0KIAotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6c2V0TGFiZWwoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKK2Jvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vz
c2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0CiB7Ci0gICAgc2V0QXR0cmlidXRlKGxhYmVsQXR0ciwg
dmFsdWUpOworICAgIC8vIEhUTUwgc3BlYyBzYXlzIHRoYXQgYnV0dG9ucyBtdXN0IGhhdmUgbmFt
ZXMKKyAgICAvLyB0byBiZSBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwuIEhvd2V2ZXIsIG90aGVyIGJy
b3dzZXJzCisgICAgLy8gZG8gbm90IGltcG9zZSB0aGlzIGNvbnN0cmFpbnQuIFRoZXJlZm9yZSwg
d2UgYmVoYXZlCisgICAgLy8gZGlmZmVyZW50bHkgYW5kIGNhbiB1c2UgZGlmZmVyZW50IGJ1dHRv
bnMgdGhhbiB0aGUgCisgICAgLy8gYXV0aG9yIGludGVuZGVkLiAKKyAgICAvLyBXYXM6IChtX3R5
cGUgPT0gU1VCTUlUICYmICFuYW1lKCkuaXNFbXB0eSgpKQorICAgIHJldHVybiAhbV9kaXNhYmxl
ZCAmJiAobV90eXBlID09IElNQUdFIHx8IG1fdHlwZSA9PSBTVUJNSVQpOwogfQogCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRpb25FbGVtZW50SW1wbDo6SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0aW9uVGFnLCBkb2MsIGYpCitib29sIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjppc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0CiB7Ci0gICAgbV9zZWxlY3Rl
ZCA9IGZhbHNlOworICAgIHJldHVybiBtX2FjdGl2ZVN1Ym1pdDsKIH0KIAotYm9vbCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKK3ZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OnNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCiB7Ci0gICAgcmV0dXJuIGZhbHNl
OworICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKIH0KIAotRE9NU3RyaW5nIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Citib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBl
bmRGb3JtRGF0YShGb3JtRGF0YUxpc3QgJmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKIHsKLSAg
ICByZXR1cm4gIm9wdGlvbiI7Ci19CisgICAgLy8gaW1hZ2UgZ2VuZXJhdGVzIGl0cyBvd24gbmFt
ZXMKKyAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSAmJiBtX3R5cGUgIT0gSU1BR0UpIHJldHVybiBm
YWxzZTsKIAotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dGV4dCgpIGNvbnN0Ci17
Ci0gICAgRE9NU3RyaW5nIHRleHQ7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICAgICAgY2Fz
ZSBISURERU46CisgICAgICAgIGNhc2UgVEVYVDoKKyAgICAgICAgY2FzZSBTRUFSQ0g6CisgICAg
ICAgIGNhc2UgUkFOR0U6CisgICAgICAgIGNhc2UgUEFTU1dPUkQ6CisgICAgICAgICAgICAvLyBh
bHdheXMgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCks
IHZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAvLyBXaW5JRSBkb2Vz
IG5vdCB1c2UgdGhlIGxhYmVsIGF0dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdub3JlIGl0
LgotICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUo
KSkgewotICAgICAgICBET01TdHJpbmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwot
ICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0g
ICAgfQorICAgICAgICBjYXNlIENIRUNLQk9YOgorICAgICAgICBjYXNlIFJBRElPOgorICAgICAg
ICAgICAgaWYgKGNoZWNrZWQoKSkgeworICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERh
dGEobmFtZSgpLCB2YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0
aGlzLT5maXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPm5vZGVU
eXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RFIHx8IG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6Q0RBVEFf
U0VDVElPTl9OT0RFKQotICAgICAgICAgICAgdGV4dCArPSBuLT5ub2RlVmFsdWUoKTsKLSAgICAg
ICAgLy8gc2tpcCBzY3JpcHQgY29udGVudAotICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgp
ICYmIG4tPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3JpcHRUYWcpKQotICAgICAgICAgICAgbiA9
IG4tPnRyYXZlcnNlTmV4dFNpYmxpbmcodGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpOwotICAgIH0KKyAgICAgICAgY2FzZSBCVVRU
T046CisgICAgICAgIGNhc2UgUkVTRVQ6CisgICAgICAgICAgICAvLyB0aG9zZSBidXR0b25zIGFy
ZSBuZXZlciBzdWNjZXNzZnVsCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1
cm4gdGV4dDsKLX0KKyAgICAgICAgY2FzZSBJTUFHRToKKyAgICAgICAgICAgIGlmIChtX2FjdGl2
ZVN1Ym1pdCkgeworICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLmlz
RW1wdHkoKSA/ICJ4IiA6IChuYW1lKCkgKyAiLngiKSwgY2xpY2tYKCkpOworICAgICAgICAgICAg
ICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLmlzRW1wdHkoKSA/ICJ5IiA6IChuYW1lKCkg
KyAiLnkiKSwgY2xpY2tZKCkpOworICAgICAgICAgICAgICAgIGlmICghbmFtZSgpLmlzRW1wdHko
KSAmJiAhdmFsdWUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLmFw
cGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi12b2lkIEhUTUxPcHRpb25FbGVt
ZW50SW1wbDo6c2V0VGV4dChjb25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhjZXB0aW9uKQot
ewotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVyZSdzIGV4
YWN0bHkgMSBjaGlsZCBub2RlLCBhbmQgaXQncyBhIHRleHQgbm9kZS4KLSAgICBOb2RlSW1wbCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1RleHROb2Rl
KCkgJiYgIWNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFRleHRJ
bXBsICo+KGNoaWxkKS0+c2V0RGF0YSh0ZXh0LCBleGNlcHRpb24pOwotICAgICAgICByZXR1cm47
Ci0gICAgfQorICAgICAgICBjYXNlIFNVQk1JVDoKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZVN1
Ym1pdCkgeworICAgICAgICAgICAgICAgIERPTVN0cmluZyBlbmNfc3RyID0gdmFsdWVXaXRoRGVm
YXVsdCgpOworICAgICAgICAgICAgICAgIGlmICghZW5jX3N0ci5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIGVuY19zdHIpOworICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAg
YXBwZW5kQ2hpbGQobmV3IFRleHRJbXBsKGdldERvY3VtZW50KCksIHRleHQpLCBleGNlcHRpb24p
OwotfQorICAgICAgICBjYXNlIEZJTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNhbid0
IHN1Ym1pdCBmaWxlIG9uIEdFVAorICAgICAgICAgICAgLy8gZG9uJ3Qgc3VibWl0IGlmIGRpc3Bs
YXk6IG5vbmUgb3IgZGlzcGxheTogaGlkZGVuCisgICAgICAgICAgICBpZighbXVsdGlwYXJ0IHx8
ICFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBraHRt
bDo6VklTSUJMRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLWludCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OmluZGV4KCkgY29uc3QKLXsKLSAgICAvLyBMZXQncyBkbyB0aGlzIGR5
bmFtaWNhbGx5LiBNaWdodCBiZSBhIGJpdCBzbG93LCBidXQgd2UncmUgc3VyZQotICAgIC8vIHdl
IHdvbid0IGZvcmdldCB0byB1cGRhdGUgYSBtZW1iZXIgdmFyaWFibGUgaW4gc29tZSBjYXNlcy4u
LgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICAg
aWYgKHNlbGVjdCkgewotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMg
PSBzZWxlY3QtPmxpc3RJdGVtcygpOwotICAgICAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0g
ICAgICAgIGludCBvcHRpb25JbmRleCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBs
OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRh
ZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKj4oaXRlbXNbaV0pID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRp
b25JbmRleDsKLSAgICAgICAgICAgICAgICBvcHRpb25JbmRleCsrOworICAgICAgICAgICAgLy8g
aWYgbm8gZmlsZW5hbWUgYXQgYWxsIGlzIGVudGVyZWQsIHJldHVybiBzdWNjZXNzZnVsLCBob3dl
dmVyIGVtcHR5CisgICAgICAgICAgICAvLyBudWxsIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBidXQg
bmV0c2NhcGUgcG9zdHMgYW4gZW1wdHkgZmlsZS4gYXJnaC4KKyAgICAgICAgICAgIGlmICh2YWx1
ZSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFt
ZSgpLCBRU3RyaW5nKCIiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZEZpbGUobmFtZSgpLCB2YWx1ZSgp
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGNhc2UgSVNJ
TkRFWDoKKyAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1
cm4gZmFsc2U7CiB9CiAKLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRJbmRleChpbnQs
IGludCAmZXhjZXB0aW9uKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQoKQogewot
ICAgIGV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJS
OwotICAgIC8vICMjIworICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgp
KQorICAgICAgICBzZXRWYWx1ZShET01TdHJpbmcoKSk7CisgICAgc2V0Q2hlY2tlZChtX2RlZmF1
bHRDaGVja2VkKTsKKyAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKIH0KIAotdm9pZCBI
VE1MT3B0aW9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpCit2b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRDaGVja2VkKGJvb2wg
X2NoZWNrZWQpCiB7Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzZWxlY3RlZEF0dHIpCi0gICAg
ICAgIG1fc2VsZWN0ZWQgPSAoIWF0dHItPmlzTnVsbCgpKTsKLSAgICBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gdmFsdWVBdHRyKQotICAgICAgICBtX3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAg
ICBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShhdHRyKTsKLX0KKyAgICAvLyBXaW5JRSBkb2VzIG5vdCBhbGxvdyB1bm5hbWVkIHJh
ZGlvIGJ1dHRvbnMgdG8gZXZlbiBiZSBjaGVja2VkLgorICAgIGlmIChjaGVja2VkKCkgPT0gX2No
ZWNrZWQgfHwgKG1fdHlwZSA9PSBSQURJTyAmJiBuYW1lKCkuaXNFbXB0eSgpKSkKKyAgICAgICAg
cmV0dXJuOwogCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0
Ci17Ci0gICAgaWYgKCAhbV92YWx1ZS5pc051bGwoKSApCi0gICAgICAgIHJldHVybiBtX3ZhbHVl
OwotICAgIC8vIFVzZSB0aGUgdGV4dCBpZiB0aGUgdmFsdWUgd2Fzbid0IHNldC4KLSAgICByZXR1
cm4gdGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKTsKLX0KKyAgICBpZiAobV90eXBl
ID09IFJBRElPICYmIF9jaGVja2VkKQorICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRv
bkNoZWNrZWQodGhpcywgbV9mb3JtKTsKIAotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNl
dFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVl
QXR0ciwgdmFsdWUpOworICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKKyAgICBtX2No
ZWNrZWQgPSBfY2hlY2tlZDsKKyAgICBzZXRDaGFuZ2VkKCk7CisgICAgaWYgKHJlbmRlcmVyKCkg
JiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQorICAgICAgICB0aGVtZSgp
LT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKKyAgICBvbkNoYW5nZSgp
OwogfQogCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0U2VsZWN0ZWQoYm9vbCBfc2Vs
ZWN0ZWQpCit2b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJvb2wg
X2luZGV0ZXJtaW5hdGUpCiB7Ci0gICAgaWYobV9zZWxlY3RlZCA9PSBfc2VsZWN0ZWQpCisgICAg
Ly8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0ZXJtaW5hdGUuCisgICAgaWYgKG1fdHlwZSAh
PSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkgPT0gX2luZGV0ZXJtaW5hdGUpCiAgICAgICAg
IHJldHVybjsKLSAgICBtX3NlbGVjdGVkID0gX3NlbGVjdGVkOwotICAgIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICAgaWYgKHNlbGVjdCkKLSAgICAgICAg
c2VsZWN0LT5ub3RpZnlPcHRpb25TZWxlY3RlZCh0aGlzLF9zZWxlY3RlZCk7Ci19CiAKLXZvaWQg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgIGlmIChzZWxlY3QpCi0gICAg
ICAgc2VsZWN0LT5jaGlsZHJlbkNoYW5nZWQoKTsKLX0KKyAgICBtX2luZGV0ZXJtaW5hdGUgPSBf
aW5kZXRlcm1pbmF0ZTsKIAotSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpIVE1MT3B0aW9uRWxlbWVu
dEltcGw6OmdldFNlbGVjdCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnNlbGVjdCA9IHBhcmVu
dE5vZGUoKTsKLSAgICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3QtPmhhc1RhZ05hbWUoc2VsZWN0
VGFnKSkKLSAgICAgICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnROb2RlKCk7Ci0gICAgcmV0dXJu
IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHNlbGVjdCk7Ci19CisgICAgc2V0
Q2hhbmdlZCgpOwogCi1ib29sIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6ZGVmYXVsdFNlbGVjdGVk
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVs
bCgpOworICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVh
cmFuY2UoKSkKKyAgICAgICAgdGhlbWUoKS0+c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIENoZWNr
ZWRTdGF0ZSk7CiB9CiAKLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXREZWZhdWx0U2Vs
ZWN0ZWQoYm9vbCBiKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y29weU5vbkF0dHJpYnV0
ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudEltcGwgKnNvdXJjZSkKIHsKLSAgICBzZXRBdHRyaWJ1
dGUoc2VsZWN0ZWRBdHRyLCBiID8gIiIgOiAwKTsKLX0KKyAgICBjb25zdCBIVE1MSW5wdXRFbGVt
ZW50SW1wbCAqc291cmNlRWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJ
bXBsICo+KHNvdXJjZSk7CiAKLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OmxhYmVs
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxhYmVsQXR0cik7CisgICAgbV92
YWx1ZSA9IHNvdXJjZUVsZW0tPm1fdmFsdWU7CisgICAgbV9jaGVja2VkID0gc291cmNlRWxlbS0+
bV9jaGVja2VkOworICAgIG1faW5kZXRlcm1pbmF0ZSA9IHNvdXJjZUVsZW0tPm1faW5kZXRlcm1p
bmF0ZTsKIH0KIAotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldExhYmVsKGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpCitET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnZhbHVlKCkg
Y29uc3QKIHsKLSAgICBzZXRBdHRyaWJ1dGUobGFiZWxBdHRyLCB2YWx1ZSk7Ci19CisgICAgRE9N
U3RyaW5nIHZhbHVlID0gbV92YWx1ZTsKKworICAgIC8vIEl0J3MgaW1wb3J0YW50ICpub3QqIHRv
IGZhbGwgYmFjayB0byB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBmaWxlIGlucHV0cywKKyAgICAv
LyBiZWNhdXNlIHRoYXQgd291bGQgYWxsb3cgYSBtYWxpY2lvdXMgd2ViIHBhZ2UgdG8gdXBsb2Fk
IGZpbGVzIGJ5IHNldHRpbmcgdGhlCisgICAgLy8gdmFsdWUgYXR0cmlidXRlIGluIG1hcmt1cC4K
KyAgICBpZiAodmFsdWUuaXNOdWxsKCkgJiYgbV90eXBlICE9IEZJTEUpCisgICAgICAgIHZhbHVl
ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAv
LyBJZiBubyBhdHRyaWJ1dGUgZXhpc3RzLCB0aGVuIGp1c3QgdXNlICJvbiIgb3IgIiIgYmFzZWQg
b2ZmIHRoZSBjaGVja2VkKCkgc3RhdGUgb2YgdGhlIGNvbnRyb2wuCisgICAgaWYgKHZhbHVlLmlz
TnVsbCgpICYmIChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSkKKyAgICAg
ICAgcmV0dXJuIERPTVN0cmluZyhjaGVja2VkKCkgPyAib24iIDogIiIpOwogCi1IVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6SFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCh0ZXh0YXJlYVRhZywgZG9jLCBmKSwgbV92YWx1ZUlzVmFsaWQoZmFsc2UpLCBtX3ZhbHVlTWF0
Y2hlc1JlbmRlcmVyKGZhbHNlKQotewotICAgIC8vIERURCByZXF1aXJlcyByb3dzICYgY29scyBi
ZSBzcGVjaWZpZWQsIGJ1dCB3ZSB3aWxsIHByb3ZpZGUgcmVhc29uYWJsZSBkZWZhdWx0cwotICAg
IG1fcm93cyA9IDI7Ci0gICAgbV9jb2xzID0gMjA7Ci0gICAgbV93cmFwID0gdGFfVmlydHVhbDsK
KyAgICByZXR1cm4gdmFsdWU7CiB9CiAKLUhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp+SFRNTFRl
eHRBcmVhRWxlbWVudEltcGwoKQorRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp2YWx1
ZVdpdGhEZWZhdWx0KCkgY29uc3QKIHsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1l
bnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOworICAgIERPTVN0cmluZyB2ID0g
dmFsdWUoKTsKKyAgICBpZiAodi5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3dpdGNoIChtX3R5cGUp
IHsKKyAgICAgICAgICAgIGNhc2UgUkVTRVQ6CisgICAgICAgICAgICAgICAgdiA9IHJlc2V0QnV0
dG9uRGVmYXVsdExhYmVsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAg
IGNhc2UgU1VCTUlUOgorICAgICAgICAgICAgICAgIHYgPSBzdWJtaXRCdXR0b25EZWZhdWx0TGFi
ZWwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBCVVRUT046
CisgICAgICAgICAgICBjYXNlIENIRUNLQk9YOgorICAgICAgICAgICAgY2FzZSBGSUxFOgorICAg
ICAgICAgICAgY2FzZSBISURERU46CisgICAgICAgICAgICBjYXNlIElNQUdFOgorICAgICAgICAg
ICAgY2FzZSBJU0lOREVYOgorICAgICAgICAgICAgY2FzZSBQQVNTV09SRDoKKyAgICAgICAgICAg
IGNhc2UgUkFESU86CisgICAgICAgICAgICBjYXNlIFJBTkdFOgorICAgICAgICAgICAgY2FzZSBT
RUFSQ0g6CisgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKLURPTVN0cmluZyBIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Cit2b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQogewotICAgIHJldHVybiAidGV4dGFyZWEi
OworICAgIGlmIChtX3R5cGUgPT0gRklMRSkgcmV0dXJuOworCisgICAgbV92YWx1ZU1hdGNoZXNS
ZW5kZXJlciA9IGZhbHNlOworICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0
ZSgpKSB7CisgICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKG1fcmVuZGVyKQor
ICAgICAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7CisgICAgICAgIHNldENo
YW5nZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2
YWx1ZSk7CisgICAgfQogfQogCi1RU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzdGF0
ZSggKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWVGcm9tUmVuZGVyZXIoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKIHsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBu
b3QgZW1wdHkhCi0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgp
ICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOworICAgIG1fdmFsdWUgPSB2YWx1ZTsKKyAgICBtX3Zh
bHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsKKyAgICAKKyAgICAvLyBGaXJlIHRoZSAiaW5wdXQi
IERPTSBldmVudC4KKyAgICBkaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxz
ZSk7CiB9CiAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3Ry
aW5nTGlzdCAmc3RhdGVzKQorYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3RvcmVzVmFsdWVT
ZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSBjb25zdAogewotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoc3RhdGVzKTsKLSAgICBp
ZiAoc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLSAgICBzZXREZWZhdWx0VmFsdWUoc3RhdGUubGVm
dChzdGF0ZS5sZW5ndGgoKS0xKSk7Ci0gICAgLy8gdGhlIGNsb3NlKCkgaW4gdGhlIHJlbmRlcnRy
ZWUgd2lsbCB0YWtlIGNhcmUgb2YgdHJhbnNmZXJyaW5nIGRlZmF1bHR2YWx1ZSB0byAndmFsdWUn
CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICAgICAgY2FzZSBCVVRUT046CisgICAgICAgIGNh
c2UgQ0hFQ0tCT1g6CisgICAgICAgIGNhc2UgRklMRToKKyAgICAgICAgY2FzZSBISURERU46Cisg
ICAgICAgIGNhc2UgSU1BR0U6CisgICAgICAgIGNhc2UgUkFESU86CisgICAgICAgIGNhc2UgUkFO
R0U6CisgICAgICAgIGNhc2UgUkVTRVQ6CisgICAgICAgIGNhc2UgU1VCTUlUOgorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIElTSU5ERVg6CisgICAgICAgIGNhc2UgUEFT
U1dPUkQ6CisgICAgICAgIGNhc2UgU0VBUkNIOgorICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1pbnQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKK3ZvaWQqIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpwcmVEaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKIHsKLSAg
ICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJl
YSAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgcmV0dXJuIDA7CisgICAgLy8g
cHJldmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJlIHVzZWQgdG8gcmV2ZXJzZSB0aGUg
YXV0b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJlLgorICAgIC8vIFRoaXMgcmVz
dWx0IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhlICJ1bmRvIiBpbiBwb3N0RGlz
cGF0Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCisgICAgdm9pZCogcmVzdWx0ID0gMDsg
CisgICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09IFJBRElPKSAmJiBldnQt
PmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgCisgICAgICAg
IHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9uKCkgPT0gMCkgeworICAg
ICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7CisgICAgICAgICAgICAvLyBBcyBhIHdheSB0
byBzdG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdlIHdlcmUgdW5jaGVja2VkLCAxIGlm
IHdlIHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCisgICAgICAgICAgICAvLyBpbmRldGVybWluYXRl
LgorICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkgeworICAgICAgICAgICAgICAgIHJl
c3VsdCA9ICh2b2lkKikweDI7CisgICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZShmYWxz
ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKCkp
CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDE7CisgICAgICAgICAgICAg
ICAgc2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBzdG9yZSB0aGUgY3VycmVudCBz
ZWxlY3RlZCByYWRpbyBvYmplY3QuCisgICAgICAgICAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSB8
fCBjaGVja2VkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIFVubmFtZWQgcmFkaW8g
YnV0dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1dHRvbnMganVzdCBzdGF5IGNoZWNr
ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBOZWVkIHRvIGxlYXJuIHRv
IHdvcmsgd2l0aG91dCBhIGZvcm0uCisKKyAgICAgICAgICAgIC8vIFdlIHJlYWxseSB3YW50IHJh
ZGlvIGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGkuZS4sIHRvIGhhdmUgc29tZXRo
aW5nIGNoZWNrZWQuCisgICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgbm90aGluZyBpcyBjdXJy
ZW50bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMgYWN0aW9uIHRvIGJlICJ1bmRvbmUi
LCBzaW5jZQorICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21lIG9iamVjdCBpbiB0aGUgcmFkaW8g
Z3JvdXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgorICAgICAgICAgICAgSFRNTElucHV0RWxl
bWVudEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZv
ckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7CisgICAgICAgICAgICBpZiAoY3VyclJhZGlv
KSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlvIGJ1dHRvbiBzZWxlY3RlZCB0
aGF0IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1bHQgZmllbGQgYW5kIHJlZiBpdCBz
bworICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUgZGVzdHJveWVkLgorICAgICAg
ICAgICAgICAgIGN1cnJSYWRpby0+cmVmKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3Vy
clJhZGlvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnNlbGVjdGlvbkVuZCgpCit2b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpw
b3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQqIGRhdGEpCiB7Ci0g
ICAgaWYgKG1fcmVuZGVyKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFy
ZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBpZiAo
KG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2
ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiAKKyAgICAgICAgc3RhdGljX2Nh
c3Q8TW91c2VFdmVudEltcGwqPihldnQpLT5idXR0b24oKSA9PSAwKSB7CisgICAgICAgIGlmICht
X3R5cGUgPT0gQ0hFQ0tCT1gpIHsKKyAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIGNoZWNraW5n
IHdlIGRpZCBpbiBwcmVEaXNwYXRjaC4KKyAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2
ZW50ZWQoKSB8fCBldnQtPmRlZmF1bHRIYW5kbGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAo
ZGF0YSA9PSAodm9pZCopMHgyKQorICAgICAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRl
KHRydWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2hl
Y2tlZChkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7Cisg
ICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50SW1wbCo+KGRhdGEpOworICAgICAgICAgICAgaWYgKGV2dC0+ZGVmYXVsdFBy
ZXZlbnRlZCgpIHx8IGV2dC0+ZGVmYXVsdEhhbmRsZWQoKSkgeworICAgICAgICAgICAgICAgIC8v
IFJlc3RvcmUgdGhlIG9yaWdpbmFsIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBpZiBwb3NzaWJsZS4K
KyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQgaXMgc3RpbGwgYSByYWRpbyBidXR0b24g
YW5kIG9ubHkgZG8gdGhlIHJlc3RvcmF0aW9uIGlmIGl0IHN0aWxsCisgICAgICAgICAgICAgICAg
Ly8gYmVsb25ncyB0byBvdXIgZ3JvdXAuCisgICAgICAgICAgICAgICAgaWYgKGlucHV0LT5mb3Jt
KCkgPT0gZm9ybSgpICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1dC0+bmFt
ZSgpID09IG5hbWUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBPaywgdGhlIG9sZCByYWRp
byBidXR0b24gaXMgc3RpbGwgaW4gb3VyIGZvcm0gYW5kIGluIG91ciBncm91cCBhbmQgaXMgc3Rp
bGwgYSAKKyAgICAgICAgICAgICAgICAgICAgLy8gcmFkaW8gYnV0dG9uLCBzbyBpdCdzIHNhZmUg
dG8gcmVzdG9yZSBzZWxlY3Rpb24gdG8gaXQuCisgICAgICAgICAgICAgICAgICAgIGlucHV0LT5z
ZXRDaGVja2VkKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlucHV0LT5kZXJlZigpOworICAgICAgICB9CisgICAgfQogfQogCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25TdGFydChpbnQgc3RhcnQpCit2b2lkIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQog
ewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEg
Kj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci19CisgICAgaWYgKG1fdHlw
ZSA9PSBJTUFHRSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNr
RXZlbnQgJiYgbV9yZW5kZXIpIHsKKyAgICAgICAgLy8gcmVjb3JkIHRoZSBtb3VzZSBwb3NpdGlv
biBmb3Igd2hlbiB3ZSBnZXQgdGhlIERPTUFjdGl2YXRlIGV2ZW50CisgICAgICAgIE1vdXNlRXZl
bnRJbXBsICptZSA9IHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KTsKKyAgICAgICAg
aW50IG9mZnNldFgsIG9mZnNldFk7CisgICAgICAgIG1fcmVuZGVyLT5hYnNvbHV0ZVBvc2l0aW9u
KG9mZnNldFgsb2Zmc2V0WSk7CisgICAgICAgIHhQb3MgPSBtZS0+Y2xpZW50WCgpLW9mZnNldFg7
CisgICAgICAgIHlQb3MgPSBtZS0+Y2xpZW50WSgpLW9mZnNldFk7CiAKLXZvaWQgSFRNTFRleHRB
cmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewotICAgIGlmIChtX3Jl
bmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5z
ZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KKwltZS0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICB9
CiAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZiAo
bV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4obV9yZW5kZXIp
LT5zZWxlY3QoKTsKLX0KKyAgICAvLyBET01BY3RpdmF0ZSBldmVudHMgY2F1c2UgdGhlIGlucHV0
IHRvIGJlICJhY3RpdmF0ZWQiIC0gaW4gdGhlIGNhc2Ugb2YgaW1hZ2UgYW5kIHN1Ym1pdCBpbnB1
dHMsIHRoaXMgbWVhbnMKKyAgICAvLyBhY3R1YWxseSBzdWJtaXR0aW5nIHRoZSBmb3JtLiBGb3Ig
cmVzZXQgaW5wdXRzLCB0aGUgZm9ybSBpcyByZXNldC4gVGhlc2UgZXZlbnRzIGFyZSBzZW50IHdo
ZW4gdGhlIHVzZXIgY2xpY2tzCisgICAgLy8gb24gdGhlIGVsZW1lbnQsIG9yIHByZXNzZXMgZW50
ZXIgd2hpbGUgaXQgaXMgdGhlIGFjdGl2ZSBlbGVtZW50LiBKYXZhY3NyaXB0IGNvZGUgd2lzaGlu
ZyB0byBhY3RpdmF0ZSB0aGUgZWxlbWVudAorICAgIC8vIG11c3QgZGlzcGF0Y2ggYSBET01BY3Rp
dmF0ZSBldmVudCAtIGEgY2xpY2sgZXZlbnQgd2lsbCBub3QgZG8gdGhlIGpvYi4KKyAgICBpZiAo
ZXZ0LT50eXBlKCkgPT0gRE9NQWN0aXZhdGVFdmVudCkgeworICAgICAgICBpZiAobV90eXBlID09
IElNQUdFIHx8IG1fdHlwZSA9PSBTVUJNSVQgfHwgbV90eXBlID09IFJFU0VUKSB7CisgICAgICAg
ICAgICBpZiAoIW1fZm9ybSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBp
ZiAobV90eXBlID09IFJFU0VUKQorICAgICAgICAgICAgICAgIG1fZm9ybS0+cmVzZXQoKTsKKyAg
ICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICBpZiAoIW1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpKSB7CisgICAgICAg
ICAgICAgICAgICAgIHhQb3MgPSAwOworICAgICAgICAgICAgICAgICAgICB5UG9zID0gMDsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICB9CiAKLXZvaWQgSFRNTFRleHRBcmVhRWxl
bWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgICBp
ZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVu
ZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci19CisgICAgLy8gVXNlIGtleSBw
cmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNlIGV2ZW50cworICAg
IC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2YgdGhlIGtleSBwcmVz
cyBldmVudC4KKyAgICBpZiAoZXZ0LT50eXBlKCkgPT0ga2V5cHJlc3NFdmVudCAmJiBldnQtPmlz
S2V5Ym9hcmRFdmVudCgpKSB7CisgICAgICAgIGJvb2wgY2xpY2tFbGVtZW50ID0gZmFsc2U7Cisg
ICAgICAgIGJvb2wgY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IGZhbHNlOwogCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFZhbHVlKGRl
ZmF1bHRWYWx1ZSgpKTsKLX0KLSAgICAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYg
KGF0dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewotICAgICAgICBtX3Jvd3MgPSAhYXR0ci0+aXNO
dWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAzOwotICAgICAgICBpZiAocmVuZGVyZXIo
KSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxj
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY29sc0F0dHIpIHsKLSAgICAgICAg
bV9jb2xzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogNjA7Ci0g
ICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNM
YXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3
cmFwQXR0cikgewotICAgICAgICAvLyB2aXJ0dWFsIC8gcGh5c2ljYWwgaXMgTmV0c2NhcGUgZXh0
ZW5zaW9uIG9mIEhUTUwgMy4wLCBub3cgZGVwcmVjYXRlZAotICAgICAgICAvLyBzb2Z0LyBoYXJk
IC8gb2ZmIGlzIHJlY29tbWVuZGF0aW9uIGZvciBIVE1MIDQgZXh0ZW5zaW9uIGJ5IElFIGFuZCBO
UyA0Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAidmlydHVh
bCIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJzb2Z0IikpCi0gICAgICAg
ICAgICBtX3dyYXAgPSB0YV9WaXJ0dWFsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShhdHRyLT52YWx1ZSgpLCAicGh5c2ljYWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRy
LT52YWx1ZSgpLCAiaGFyZCIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFfUGh5c2ljYWw7Ci0g
ICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvbiIgKSkK
LSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1BoeXNpY2FsOwotICAgICAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIikpCi0gICAgICAgICAgICBtX3dyYXAg
PSB0YV9Ob1dyYXA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIGlnbm9yZSBmb3IgdGhl
IG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50
TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbnNlbGVjdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc2VsZWN0RXZl
bnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uY2hhbmdlQXR0cikg
ewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwgYXR0cik7Ci0gICAg
fSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShhdHRyKTsKLX0KKyAgICAgICAgRE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtl
eWJvYXJkRXZlbnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsKIAotUmVuZGVyT2JqZWN0
ICpIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFy
ZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRl
clRleHRBcmVhKHRoaXMpOwotfQorICAgICAgICBpZiAoa2V5ID09ICJVKzAwMDAyMCIpIHsKKyAg
ICAgICAgICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBCVVRUT046
CisgICAgICAgICAgICAgICAgY2FzZSBDSEVDS0JPWDoKKyAgICAgICAgICAgICAgICBjYXNlIEZJ
TEU6CisgICAgICAgICAgICAgICAgY2FzZSBJTUFHRToKKyAgICAgICAgICAgICAgICBjYXNlIFJF
U0VUOgorICAgICAgICAgICAgICAgIGNhc2UgU1VCTUlUOgorICAgICAgICAgICAgICAgICAgICAv
LyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3Igc3BhY2ViYXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVs
ZW1lbnRzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQXBwS2l0IGFscmVhZHkgZG9lcyB0
aGlzIGZvciBzb21lLCBidXQgbm90IGFsbCwgb2YgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAg
Y2xpY2tFbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgY2FzZSBSQURJTzoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gdW5zZWxl
Y3RlZCByYWRpbyBpcyB0YWJiZWQgaW50byAoYmVjYXVzZSB0aGUgZW50aXJlIGdyb3VwIGhhcyBu
b3RoaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrZWQsIG9yIGJlY2F1c2Ugb2Ygc29t
ZSBleHBsaWNpdCAuZm9jdXMoKSBjYWxsKSwgdGhlbiBhbGxvdyBzcGFjZSB0byBjaGVjayBpdC4K
KyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkKCkpCisgICAgICAgICAgICAgICAgICAg
ICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBjYXNlIEhJRERFTjoKKyAgICAgICAgICAgICAgICBjYXNlIElTSU5ERVg6
CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRDoKKyAgICAgICAgICAgICAgICBjYXNlIFJB
TkdFOgorICAgICAgICAgICAgICAgIGNhc2UgU0VBUkNIOgorICAgICAgICAgICAgICAgIGNhc2Ug
VEVYVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KIAotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURh
dGFMaXN0JiBlbmNvZGluZywgYm9vbCkKLXsKLSAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSkgcmV0
dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KKyAgICAgICAgaWYgKGtleSA9PSAiRW50ZXIiKSB7CisgICAgICAg
ICAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgorICAg
ICAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6CisgICAgICAgICAgICAgICAgY2FzZSBISURERU46
CisgICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgorICAgICAgICAgICAgICAgIGNhc2UgUEFT
U1dPUkQ6CisgICAgICAgICAgICAgICAgY2FzZSBSQU5HRToKKyAgICAgICAgICAgICAgICBjYXNl
IFNFQVJDSDoKKyAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgICAg
IC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIG9uIHRoZSBkZWZhdWx0IGZvcm0gYnV0dG9uIGZvciBl
bnRlciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCisgICAgICAgICAgICAgICAgICAgIGNs
aWNrRGVmYXVsdEZvcm1CdXR0b24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICBjYXNlIEZJTEU6CisgICAgICAgICAgICAgICAgY2FzZSBJTUFHRToK
KyAgICAgICAgICAgICAgICBjYXNlIFJFU0VUOgorICAgICAgICAgICAgICAgIGNhc2UgU1VCTUlU
OgorICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3IgZW50ZXIg
Zm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgorICAgICAgICAgICAgICAgICAgICBjbGlja0Vs
ZW1lbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICBjYXNlIFJBRElPOgorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gRG9uJ3QgZG8gYW55
dGhpbmcgZm9yIGVudGVyIG9uIGEgcmFkaW8gYnV0dG9uLgorICAgICAgICAgICAgfQorICAgICAg
ICB9CiAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnJlc2V0KCkKLXsKLSAgICBzZXRW
YWx1ZShkZWZhdWx0VmFsdWUoKSk7Ci19CisgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYg
KGtleSA9PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09ICJMZWZ0IiB8fCBrZXkgPT0g
IlJpZ2h0IikpIHsKKyAgICAgICAgICAgIC8vIExlZnQgYW5kIHVwIG1lYW4gInByZXZpb3VzIHJh
ZGlvIGJ1dHRvbiIuCisgICAgICAgICAgICAvLyBSaWdodCBhbmQgZG93biBtZWFuICJuZXh0IHJh
ZGlvIGJ1dHRvbiIuCisgICAgICAgICAgICAvLyBUZXN0ZWQgaW4gV2luSUUsIGFuZCBldmVuIGZv
ciBSVEwsIGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0dG9uIChhbmQgc28gbW92
ZXMKKyAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVtcyBzdHJhbmdlLCBidXQgd2Un
bGwgbWF0Y2ggaXQuCisgICAgICAgICAgICBib29sIGZvcndhcmQgPSAoa2V5ID09ICJEb3duIiB8
fCBrZXkgPT0gIlJpZ2h0Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGNhbiBv
bmx5IHN0YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhlIGZvcm0gaGFzbid0IGJl
ZW4gZGVtb3RlZCB0byBhIGxlYWYgYmVjYXVzZQorICAgICAgICAgICAgLy8gb2YgbWFsZm9ybWVk
IEhUTUwuCisgICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7CisgICAgICAgICAgICB3aGls
ZSAoKG4gPSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6IG4tPnRyYXZlcnNlUHJl
dmlvdXNOb2RlKCkpKSkgeworICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UgZW5jb3VudGVyIGEg
Zm9ybSBlbGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCisgICAgICAgICAgICAgICAgaWYg
KG4tPmhhc1RhZ05hbWUoZm9ybVRhZykpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBtb3JlIHJhZGlv
IGJ1dHRvbnMuCisgICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7
CisgICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBlbHQgPSBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOworICAgICAgICAgICAgICAgICAgICBpZiAo
ZWx0LT5mb3JtKCkgIT0gbV9mb3JtKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0RWx0ID0gc3RhdGlj
X2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChpbnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXRFbHQtPm5hbWUoKSA9
PSBuYW1lKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+aXNGb2N1
c2FibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5zZXRDaGVj
a2VkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnNl
dEZvY3VzTm9kZShpbnB1dEVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRF
bHQtPmNsaWNrKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0
LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLXZvaWQgSFRNTFRleHRB
cmVhRWxlbWVudEltcGw6OnVwZGF0ZVZhbHVlKCkKLXsKLSAgICBpZiAoICFtX3ZhbHVlSXNWYWxp
ZCApIHsKLSAgICAgICAgaWYgKCBtX3JlbmRlciApIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBz
dGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KCBtX3JlbmRlciApLT50ZXh0KCkucXN0cmluZygp
OwotICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gZGVmYXVsdFZhbHVlKCkucXN0cmluZygpOwot
ICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOworICAgICAgICBpZiAo
Y2xpY2tFbGVtZW50KSB7CisgICAgICAgICAgICBjbGljayhmYWxzZSk7CisgICAgICAgICAgICBl
dnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2xpY2tEZWZhdWx0
Rm9ybUJ1dHRvbiAmJiBtX2Zvcm0pIHsKKyAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2so
KTsKKyAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKICAgICAgICAgfQotICAg
ICAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7CiAgICAgfQotfQotCi1ET01TdHJpbmcgSFRNTFRl
eHRBcmVhRWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1cGRhdGVWYWx1ZSgpOwotICAgIHJl
dHVybiBtX3ZhbHVlLmlzTnVsbCgpID8gRE9NU3RyaW5nKCIiKSA6IG1fdmFsdWU7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgbV92YWx1ZSA9IHZhbHVlLnFzdHJpbmcoKTsKLSAgICBtX3ZhbHVlTWF0Y2hl
c1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAgIGlmICht
X3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgLy8g
RklYTUU6IEZvcmNlIHJlbG9hZCBmcm9tIHJlbmRlcmVyLCBhcyByZW5kZXJlciBtYXkgaGF2ZSBu
b3JtYWxpemVkIGxpbmUgZW5kaW5ncy4KLSAgICBtX3ZhbHVlSXNWYWxpZCA9IGZhbHNlOwotICAg
IHNldENoYW5nZWQodHJ1ZSk7Ci19CiAKLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsOjpkZWZhdWx0VmFsdWUoKQotewotICAgIERPTVN0cmluZyB2YWwgPSAiIjsKLSAgICAvLyB0
aGVyZSBtYXkgYmUgY29tbWVudHMgLSBqdXN0IGdyYWIgdGhlIHRleHQgbm9kZXMKLSAgICBOb2Rl
SW1wbCAqbjsKLSAgICBmb3IgKG4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGlu
ZygpKQotICAgICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFsICs9IHN0
YXRpY19jYXN0PFRleHRJbXBsKj4obiktPmRhdGEoKTsKLSAgICAKLSAgICBpZiAodmFsWzBdID09
ICdccicgJiYgdmFsWzFdID09ICdcbicpIHsKLSAgICAgICAgdmFsID0gdmFsLmNvcHkoKTsKLSAg
ICAgICAgdmFsLnJlbW92ZSgwLDIpOwotICAgIH0gZWxzZSBpZiAodmFsWzBdID09ICdccicgfHwg
dmFsWzBdID09ICdcbicpIHsKLSAgICAgICAgdmFsID0gdmFsLmNvcHkoKTsKLSAgICAgICAgdmFs
LnJlbW92ZSgwLDEpOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQgSFRNTFRl
eHRBcmVhRWxlbWVudEltcGw6OnNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJmRlZmF1
bHRWYWx1ZSkKLXsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMgLSByZW1vdmUgYWxsIHRo
ZSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBvbmUKLSAgICBRUHRyTGlzdDxOb2Rl
SW1wbD4gdG9SZW1vdmU7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gZmlyc3RDaGls
ZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKG4tPmlzVGV4dE5vZGUo
KSkKLSAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChuKTsKLSAgICBRUHRyTGlzdEl0ZXJhdG9y
PE5vZGVJbXBsPiBpdCh0b1JlbW92ZSk7Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAg
IGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpIHsKLSAgICAgICAgTm9kZUltcGwgKm4gPSBpdC5j
dXJyZW50KCk7Ci0gICAgICAgIG4tPnJlZigpOwotICAgICAgICByZW1vdmVDaGlsZChuLCBleGNl
cHRpb25jb2RlKTsKLSAgICAgICAgbi0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgaW5zZXJ0QmVmb3Jl
KGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKGRlZmF1bHRWYWx1ZSksZmlyc3RDaGlsZCgp
LCBleGNlcHRpb25jb2RlKTsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUpOworICAgIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7CiB9CiAKLWJv
b2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQorYm9vbCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6aXNFZGl0YWJsZSgpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJu
ICgobV90eXBlID09IFRFWFQpIHx8IChtX3R5cGUgPT0gUEFTU1dPUkQpIHx8CisgICAgICAgICAg
ICAobV90eXBlID09IFNFQVJDSCkgfHwgKG1fdHlwZSA9PSBJU0lOREVYKSB8fCAobV90eXBlID09
IEZJTEUpKTsKIH0KIAotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0
aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKK2Jvb2wgSFRNTElucHV0RWxlbWVudEltcGw6Omlz
VVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0CiB7Ci0gICAgZm9jdXMoKTsK
KyAgICByZXR1cm4gKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKTsKIH0KIAotdm9pZCBIVE1MVGV4
dEFyZWFFbGVtZW50SW1wbDo6YXR0YWNoKCkKK0RPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6ZGVmYXVsdFZhbHVlKCkgY29uc3QKIHsKLSAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0g
ICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpOwotICAgIHVwZGF0ZVZhbHVl
KCk7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwogfQogCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpkZXRhY2goKQordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
c2V0RGVmYXVsdFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCiB7Ci0gICAgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIg
PSBmYWxzZTsKKyAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7CiB9CiAKLURPTVN0
cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKK2Jvb2wgSFRN
TElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRDaGVja2VkKCkgY29uc3QKIHsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOworICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKGNo
ZWNrZWRBdHRyKS5pc051bGwoKTsKIH0KIAotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6
c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCit2b2lkIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpzZXREZWZhdWx0Q2hlY2tlZChib29sIGRlZmF1bHRDaGVja2VkKQogewotICAgIHNl
dEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7CisgICAgc2V0QXR0cmlidXRlKGNoZWNr
ZWRBdHRyLCBkZWZhdWx0Q2hlY2tlZCA/ICIiIDogMCk7CiB9CiAKLXZvaWQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnNldENvbHMoaW50IGNvbHMpCitET01TdHJpbmcgSFRNTElucHV0RWxlbWVu
dEltcGw6OmFjY2VwdCgpIGNvbnN0CiB7Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNBdHRyLCBRU3Ry
aW5nOjpudW1iZXIoY29scykpOworICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0QXR0cik7
CiB9CiAKLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFJvd3MoaW50IHJvd3MpCit2
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKIHsKLSAgICBzZXRBdHRyaWJ1dGUocm93c0F0dHIsIFFTdHJpbmc6Om51bWJlcihyb3dzKSk7
CisgICAgc2V0QXR0cmlidXRlKGFjY2VwdEF0dHIsIHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1IVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpIVE1MSXNJbmRleEVsZW1lbnRJbXBs
KERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTElu
cHV0RWxlbWVudEltcGwoaXNpbmRleFRhZywgZG9jLCBmKQorRE9NU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAogewotICAgIG1fdHlwZSA9IFRFWFQ7Ci0gICAg
bV9uYW1lID0gImlzaW5kZXgiOworICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0
cik7CiB9CiAKLXZvaWQgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCogYXR0cikKK3ZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6
OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQogewotICAgIGlmIChhdHRyLT5u
YW1lKCkgPT0gcHJvbXB0QXR0cikKLQlzZXRWYWx1ZShhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNl
Ci0gICAgICAgIC8vIGRvbid0IGNhbGwgSFRNTElucHV0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUgaGVyZSwgYXMgaXQgd291bGQKLSAgICAgICAgLy8gYWNjZXB0IGF0dHJpYnV0ZXMgdGhp
cyBlbGVtZW50IGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOworICAgIHNldEF0dHJpYnV0ZShhY2Nl
c3NrZXlBdHRyLCB2YWx1ZSk7CiB9CiAKLURPTVN0cmluZyBIVE1MSXNJbmRleEVsZW1lbnRJbXBs
Ojpwcm9tcHQoKSBjb25zdAorRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbGlnbigp
IGNvbnN0CiB7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShwcm9tcHRBdHRyKTsKKyAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7CiB9CiAKLXZvaWQgSFRNTElzSW5kZXhFbGVtZW50
SW1wbDo6c2V0UHJvbXB0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCit2b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQogewotICAgIHNldEF0
dHJpYnV0ZShwcm9tcHRBdHRyLCB2YWx1ZSk7CisgICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwg
dmFsdWUpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVuc2lnbmVkIEhUTUxPcHRpb25z
Q29sbGVjdGlvbkltcGw6Omxlbmd0aCgpIGNvbnN0CitET01TdHJpbmcgSFRNTElucHV0RWxlbWVu
dEltcGw6OmFsdCgpIGNvbnN0CiB7Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICBy
ZXR1cm4gMDsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsdEF0dHIpOwogfQogCi12b2lkIEhU
TUxPcHRpb25zQ29sbGVjdGlvbkltcGw6OnNldExlbmd0aCh1bnNpZ25lZCBsZW5ndGgpCit2b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBbHQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKIHsK
LSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgorICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2
YWx1ZSk7CiB9CiAKLU5vZGVJbXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjppdGVtKHVu
c2lnbmVkIGluZGV4KSBjb25zdAordm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0TWF4TGVu
Z3RoKGludCBfbWF4TGVuZ3RoKQogewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAg
cmV0dXJuIDA7CisgICAgc2V0QXR0cmlidXRlKG1heGxlbmd0aEF0dHIsIFFTdHJpbmc6Om51bWJl
cihfbWF4TGVuZ3RoKSk7CiB9CiAKLU5vZGVJbXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBs
OjpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBjb25zdAordm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKIHsKLSAgICAvLyBOb3QgeWV0IGlt
cGxlbWVudGVkLgotICAgIHJldHVybiAwOworICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0
cmluZzo6bnVtYmVyKF9zaXplKSk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9ybURh
dGFMaXN0OjpGb3JtRGF0YUxpc3QoUVRleHRDb2RlYyAqYykKLSAgICA6IG1fY29kZWMoYykKK0RP
TVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3JjKCkgY29uc3QKIHsKKyAgICByZXR1cm4g
Z2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoZ2V0QXR0cmlidXRlKHNyY0F0dHIpKTsKIH0KIAot
dm9pZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcykKK3ZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZhbHVlKQogewot
ICAgIG1fbGlzdC5hcHBlbmQocyk7CisgICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsK
IH0KIAotdm9pZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRU3RyaW5nICZzKQor
RE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp1c2VNYXAoKSBjb25zdAogewotICAgIFFD
U3RyaW5nIGNzdHIgPSBmaXhMaW5lQnJlYWtzKG1fY29kZWMtPmZyb21Vbmljb2RlKHMsIHRydWUp
KTsKLSAgICBjc3RyLnRydW5jYXRlKGNzdHIubGVuZ3RoKCkpOwotICAgIG1fbGlzdC5hcHBlbmQo
Y3N0cik7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh1c2VtYXBBdHRyKTsKIH0KIAotdm9pZCBG
b3JtRGF0YUxpc3Q6OmFwcGVuZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0
cmluZyAmZmlsZW5hbWUpCit2b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRVc2VNYXAoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKIHsKLSAgICBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7
Ci0gICAgbV9saXN0LmFwcGVuZChmaWxlbmFtZS5xc3RyaW5nKCkpOworICAgIHNldEF0dHJpYnV0
ZSh1c2VtYXBBdHRyLCB2YWx1ZSk7CiB9Ci0KKyAgICAKIH0gLy8gbmFtZXNwYWNlCkluZGV4OiBr
aHRtbC9odG1sL0hUTUxJc0luZGV4RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1s
L2h0bWwvSFRNTElzSW5kZXhFbGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDExOTc2KQorKysga2h0
bWwvaHRtbC9IVE1MSXNJbmRleEVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNCw3
ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3Jn
KQogICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3Jn
KQogICogICAgICAgICAgIChDKSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQot
ICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqICAgICAg
ICAgICAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292IChhcEBueXBvcC5jb20pCiAgKgogICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgpAQCAtMjQsMzQ2OSArMjQsMTQgQEAKICAqCiAgKi8KIAotI3VuZGVmIEZPUk1TX0RFQlVH
Ci0vLyNkZWZpbmUgRk9STVNfREVCVUcKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
Imh0bWwvaHRtbF9mb3JtaW1wbC5oIgotCi0jaW5jbHVkZSAia2h0bWx2aWV3LmgiCi0jaW5jbHVk
ZSAiTWFjRnJhbWUuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5j
bHVkZSAiaHRtbF9pbWFnZWltcGwuaCIKLSNpbmNsdWRlICJraHRtbF9zZXR0aW5ncy5oIgotI2lu
Y2x1ZGUgIm1pc2MvZm9ybWRhdGEuaCIKLQotI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgi
Ci0jaW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJjc3Nwcm9wZXJ0
aWVzLmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1w
bC5oIgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJ4bWwvRXZl
bnROYW1lcy5oIgotI2luY2x1ZGUgImtodG1sX2V4dC5oIgotCi0jaW5jbHVkZSAicmVuZGVyaW5n
L3JlbmRlcl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgotI2luY2x1ZGUgInJl
bmRlcl90aGVtZS5oIgotCi0jaW5jbHVkZSA8a2xvY2FsZS5oPgotI2luY2x1ZGUgPHFmaWxlLmg+
Ci0jaW5jbHVkZSA8cXRleHRjb2RlYy5oPgotCi0vLyBmb3Iga2V5Z2VuCi0jaW5jbHVkZSA8cXN0
cmluZy5oPgotI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgot
Ci11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci0KLW5hbWVzcGFjZSBET00gewotCi11c2luZyBuYW1l
c3BhY2UgRXZlbnROYW1lczsKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLXN0cnVjdCBG
b3JtRGF0YUxpc3RJdGVtIHsKLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFDU3RyaW5nICZk
YXRhKSA6IG1fZGF0YShkYXRhKSB7IH0KLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFTdHJp
bmcgJnBhdGgpIDogbV9wYXRoKHBhdGgpIHsgfQotCi0gICAgUVN0cmluZyBtX3BhdGg7Ci0gICAg
UUNTdHJpbmcgbV9kYXRhOwotfTsKLQotY2xhc3MgRm9ybURhdGFMaXN0IHsKLXB1YmxpYzoKLSAg
ICBGb3JtRGF0YUxpc3QoUVRleHRDb2RlYyAqKTsKLQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25z
dCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBl
bmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZS5xc3RyaW5nKCkpOyB9
Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBRU3RyaW5n
ICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0
cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXks
IGNvbnN0IFFDU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJp
bmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3Qg
RE9NU3RyaW5nICZrZXksIGludCB2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFz
dHJpbmcoKSk7IGFwcGVuZFN0cmluZyhRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsgfQotICAgIHZv
aWQgYXBwZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZmaWxl
bmFtZSk7Ci0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBi
ZWdpbigpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5iZWdpbigpOyB9Ci0gICAgUVZh
bHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gZW5kKCkgY29uc3QKLSAgICAg
ICAgeyByZXR1cm4gbV9saXN0LmVuZCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmRT
dHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpOwotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0IFFT
dHJpbmcgJnMpOwotCi0gICAgUVRleHRDb2RlYyAqbV9jb2RlYzsKLSAgICBRVmFsdWVMaXN0PEZv
cm1EYXRhTGlzdEl0ZW0+IG1fbGlzdDsKLX07Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6OkhUTUxG
b3JtRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudEltcGwo
Zm9ybVRhZywgZG9jKQotewotICAgIGNvbGxlY3Rpb25JbmZvID0gMDsKLSAgICBtX3Bvc3QgPSBm
YWxzZTsKLSAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1
ZTsKLSAgICBtX2luc3VibWl0ID0gZmFsc2U7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwot
ICAgIG1faW5yZXNldCA9IGZhbHNlOwotICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94LXd3
dy1mb3JtLXVybGVuY29kZWQiOwotICAgIG1fYm91bmRhcnkgPSAiLS0tLS0tLS0tLTB4S2hUbUxi
T3VOZEFyWSI7Ci0gICAgbV9hY2NlcHRjaGFyc2V0ID0gIlVOS05PV04iOwotICAgIG1fbWFsZm9y
bWVkID0gZmFsc2U7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6On5IVE1MRm9ybUVsZW1lbnRJ
bXBsKCkKLXsKLSAgICBkZWxldGUgY29sbGVjdGlvbkluZm87Ci0gICAgCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZvcm1F
bGVtZW50c1tpXS0+bV9mb3JtID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW1n
RWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBpbWdFbGVtZW50c1tpXS0+bV9mb3JtID0g
MDsKLX0KLQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1Xb3VsZEhhdmVTZWN1cmVT
dWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKQotewotICAgIGlmICh1cmwuaXNOdWxsKCkp
IHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZ2V0RG9jdW1lbnQo
KS0+Y29tcGxldGVVUkwodXJsLnFzdHJpbmcoKSkuc3RhcnRzV2l0aCgiaHR0cHM6IiwgZmFsc2Up
OwotfQotCi0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBIVE1M
RWxlbWVudEltcGw6OmF0dGFjaCgpOwotCi0gICAgLy8gbm90ZSB3ZSBkb24ndCBkZWFsIHdpdGgg
Y2FsbGluZyBzZWN1cmVGb3JtUmVtb3ZlZCgpIG9uIGRldGFjaCwgYmVjYXVzZSB0aGUgdGltaW5n
Ci0gICAgLy8gd2FzIHN1Y2ggdGhhdCBpdCBjbGVhcmVkIG91ciBzdGF0ZSB0b28gZWFybHkKLSAg
ICBpZiAoZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpKQotICAgICAgICBnZXRE
b2N1bWVudCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmlz
SFRNTERvY3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19j
YXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1lbnQtPmFkZE5h
bWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjppbnNl
cnRlZEludG9Eb2N1bWVudCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92
ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVu
dCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9j
dW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3VtZW50LT5yZW1vdmVOYW1lZEl0ZW0o
b2xkTmFtZUF0dHIpOwotICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3ZlZEZy
b21Eb2N1bWVudCgpOwotfQotCi1pbnQgSFRNTEZvcm1FbGVtZW50SW1wbDo6bGVuZ3RoKCkgY29u
c3QKLXsKLSAgICBpbnQgbGVuID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9y
bUVsZW1lbnRzLmNvdW50KCk7ICsraSkKLQlpZiAoZm9ybUVsZW1lbnRzW2ldLT5pc0VudW1lcmF0
YWJsZSgpKQotCSAgICArK2xlbjsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQotdm9pZCBIVE1M
Rm9ybUVsZW1lbnRJbXBsOjpzdWJtaXRDbGljaygpCi17Ci0gICAgYm9vbCBzdWJtaXRGb3VuZCA9
IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQo
KTsgKytpKSB7Ci0gICAgICAgIGlmIChmb3JtRWxlbWVudHNbaV0tPmhhc0xvY2FsTmFtZShpbnB1
dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwgKj4oZm9ybUVsZW1lbnRzW2ldKTsKLSAgICAg
ICAgICAgIGlmIChlbGVtZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSAmJiBlbGVtZW50
LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3VibWl0Rm91bmQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgIGVsZW1lbnQtPmNsaWNrKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXN1Ym1pdEZvdW5k
KSAvLyBzdWJtaXQgdGhlIGZvcm0gd2l0aG91dCBhIHN1Ym1pdCBvciBpbWFnZSBpbnB1dAotICAg
ICAgICBwcmVwYXJlU3VibWl0KCk7Ci19Ci0KLQotc3RhdGljIFFDU3RyaW5nIGVuY29kZUNTdHJp
bmcoY29uc3QgUUNTdHJpbmcmIGUpCi17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRt
bDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMQotICAgIC8vIHNhZmUgY2hhcmFjdGVy
cyBsaWtlIE5TIGhhbmRsZXMgdGhlbSBmb3IgY29tcGF0aWJpbGl0eQotICAgIHN0YXRpYyBjb25z
dCBjaGFyICpzYWZlID0gIi0uXyoiOwotICAgIGludCBlbGVuID0gZS5sZW5ndGgoKTsKLSAgICBR
Q1N0cmluZyBlbmNvZGVkKCggZWxlbitlLmNvbnRhaW5zKCAnXG4nICkgKSozKzEpOwotICAgIGlu
dCBlbmNsZW4gPSAwOwotCi0gICAgLy9RQ1N0cmluZyBvcmlnKGUuZGF0YSgpLCBlLnNpemUoKSk7
Ci0KLSAgICBmb3IoaW50IHBvcyA9IDA7IHBvcyA8IGVsZW47IHBvcysrKSB7Ci0gICAgICAgIHVu
c2lnbmVkIGNoYXIgYyA9IGVbcG9zXTsKLQotICAgICAgICBpZiAoICgoIGMgPj0gJ0EnKSAmJiAo
IGMgPD0gJ1onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49ICdhJykgJiYgKCBjIDw9ICd6Jykp
IHx8Ci0gICAgICAgICAgICAgKCggYyA+PSAnMCcpICYmICggYyA8PSAnOScpKSB8fAotICAgICAg
ICAgICAgIChzdHJjaHIoc2FmZSwgYykpCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBlbmNv
ZGVkW2VuY2xlbisrXSA9IGM7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICcgJyApCi0gICAgICAg
ICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcrJzsKLSAgICAgICAgZWxzZSBpZiAoIGMgPT0gJ1xu
JyB8fCAoIGMgPT0gJ1xyJyAmJiBlW3BvcysxXSAhPSAnXG4nICkgKQotICAgICAgICB7Ci0gICAg
ICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5j
bGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnRCc7Ci0gICAg
ICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5j
bGVuKytdID0gJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnQSc7Ci0gICAg
ICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGMgIT0gJ1xyJyApCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IGgg
PSBjIC8gMTY7Ci0gICAgICAgICAgICBoICs9IChoID4gOSkgPyAoJ0EnIC0gMTApIDogJzAnOwot
ICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBoOwotCi0gICAgICAgICAgICB1bnNpZ25l
ZCBpbnQgbCA9IGMgJSAxNjsKLSAgICAgICAgICAgIGwgKz0gKGwgPiA5KSA/ICgnQScgLSAxMCkg
OiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGw7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnXDAnOwotICAgIGVuY29kZWQudHJ1bmNhdGUo
ZW5jbGVuKTsKLQotICAgIHJldHVybiBlbmNvZGVkOwotfQotCi0vLyBDaGFuZ2UgcGxhaW4gQ1Ig
YW5kIHBsYWluIExGIHRvIENSTEYgcGFpcnMuCi1zdGF0aWMgUUNTdHJpbmcgZml4TGluZUJyZWFr
cyhjb25zdCBRQ1N0cmluZyAmcykKLXsKLSAgICAvLyBDb21wdXRlIHRoZSBsZW5ndGguCi0gICAg
dW5zaWduZWQgbmV3TGVuID0gMDsKLSAgICBjb25zdCBjaGFyICpwID0gcy5kYXRhKCk7Ci0gICAg
d2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKLSAgICAgICAgaWYgKGMgPT0gJ1xyJykgewotICAgICAg
ICAgICAgLy8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2YgdHJhaWxpbmcgJ1wwJy4KLSAg
ICAgICAgICAgIGlmICgqcCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHVybiBDUiBp
bnRvIENSTEYuCi0gICAgICAgICAgICAgICAgbmV3TGVuICs9IDI7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAvLyBUdXJuIExGIGlu
dG8gQ1JMRi4KLSAgICAgICAgICAgIG5ld0xlbiArPSAyOwotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgLy8gTGVhdmUgb3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAgICAgICAgIG5l
d0xlbiArPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuZXdMZW4gPT0gcy5sZW5ndGgo
KSkgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgCi0gICAgLy8gTWFrZSBhIGNvcHkg
b2YgdGhlIHN0cmluZy4KLSAgICBwID0gcy5kYXRhKCk7Ci0gICAgUUNTdHJpbmcgcmVzdWx0KG5l
d0xlbiArIDEpOwotICAgIGNoYXIgKnEgPSByZXN1bHQuZGF0YSgpOwotICAgIHdoaWxlIChjaGFy
IGMgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAgICAgICAgIC8vIFNh
ZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0gICAgICAgICAgICBp
ZiAoKnAgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1IgaW50byBDUkxGLgot
ICAgICAgICAgICAgICAgICpxKysgPSAnXHInOwotICAgICAgICAgICAgICAgICpxKysgPSAnXG4n
OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAgICAg
ICAgICAgLy8gVHVybiBMRiBpbnRvIENSTEYuCi0gICAgICAgICAgICAqcSsrID0gJ1xyJzsKLSAg
ICAgICAgICAgICpxKysgPSAnXG4nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8g
TGVhdmUgb3RoZXIgY2hhcmFjdGVycyBhbG9uZS4KLSAgICAgICAgICAgICpxKysgPSBjOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotYm9vbCBIVE1MRm9ybUVs
ZW1lbnRJbXBsOjpmb3JtRGF0YShGb3JtRGF0YSAmZm9ybV9kYXRhKSBjb25zdAotewotICAgIFFD
U3RyaW5nIGVuY19zdHJpbmcgPSAiIjsgLy8gdXNlZCBmb3Igbm9uLW11bHRpcGFydCBkYXRhCi0K
LSAgICAvLyBmaW5kIG91dCB0aGUgUVRleHRjb2RlYyB0byB1c2UKLSAgICBRU3RyaW5nIHN0ciA9
IG1fYWNjZXB0Y2hhcnNldC5xc3RyaW5nKCk7Ci0gICAgc3RyLnJlcGxhY2UoJywnLCAnICcpOwot
ICAgIFFTdHJpbmdMaXN0IGNoYXJzZXRzID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCcgJywgc3RyKTsK
LSAgICBRVGV4dENvZGVjKiBjb2RlYyA9IDA7Ci0gICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1l
bnQoKS0+ZnJhbWUoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IGNoYXJz
ZXRzLmJlZ2luKCk7IGl0ICE9IGNoYXJzZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJp
bmcgZW5jID0gKCppdCk7Ci0gICAgICAgIGlmIChlbmMuY29udGFpbnMoIlVOS05PV04iKSkgewot
ICAgICAgICAgICAgLy8gdXNlIHN0YW5kYXJkIGRvY3VtZW50IGVuY29kaW5nCi0gICAgICAgICAg
ICBlbmMgPSAiSVNPLTg4NTktMSI7Ci0gICAgICAgICAgICBpZiAoZnJhbWUpCi0gICAgICAgICAg
ICAgICAgZW5jID0gZnJhbWUtPmVuY29kaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChj
b2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShlbmMubGF0aW4xKCkpKSkKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghY29kZWMpCi0gICAgICAgIGNvZGVjID0gUVRl
eHRDb2RlYzo6Y29kZWNGb3JMb2NhbGUoKTsKLQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIEZvcm1EYXRh
TGlzdCBsc3QoY29kZWMpOwotCi0gICAgICAgIGlmICghY3VycmVudC0+ZGlzYWJsZWQoKSAmJiBj
dXJyZW50LT5hcHBlbmRGb3JtRGF0YShsc3QsIG1fbXVsdGlwYXJ0KSkgewotICAgICAgICAgICAg
Zm9yIChRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBpdCA9IGxzdC5i
ZWdpbigpOyBpdCAhPSBsc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1f
bXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBJU0lOREVYIC8gPGlu
cHV0IG5hbWU9aXNpbmRleD4gc3BlY2lhbAotICAgICAgICAgICAgICAgICAgICAvLyBidXQgb25s
eSBpZiBpdHMgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZW5jX3N0
cmluZy5pc0VtcHR5KCkgJiYgKCppdCkubV9kYXRhID09ICJpc2luZGV4IiApIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5n
ICs9IGVuY29kZUNTdHJpbmcoICgqaXQpLm1fZGF0YSApOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYo
IWVuY19zdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19z
dHJpbmcgKz0gJyYnOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9IGVu
Y29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19z
dHJpbmcgKz0gIj0iOwotICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZygoKml0KS5tX2RhdGEpOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFFDU3RyaW5nIGhz
dHIoIi0tIik7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gbV9ib3VuZGFyeS5xc3RyaW5n
KCkubGF0aW4xKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG4iOwotICAgICAg
ICAgICAgICAgICAgICBoc3RyICs9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5h
bWU9XCIiOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICgqaXQpLm1fZGF0YS5kYXRhKCk7
Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAgICAgICAgICAg
ICAvLyBpZiB0aGUgY3VycmVudCB0eXBlIGlzIEZJTEUsIHRoZW4gd2UgYWxzbyBuZWVkIHRvCi0g
ICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGZpbGVuYW1lCi0gICAgICAgICAgICAg
ICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpICYmCi0gICAgICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQp
LT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6RklMRSkKLSAgICAgICAgICAg
ICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBwYXRoID0gc3RhdGlj
X2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+dmFsdWUoKS5xc3RyaW5nKCk7
Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgaWYg
dGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgIiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gb3IgY29udHJvbCBjaGFyYWN0ZXJzIGxpa2UgQ1Igb3IgTEYuIFRoaXMgYWxzbyBkb2VzIHN0
cmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaW5ncyBpZiB0aGUgZmlsZW5hbWUg
aW5jbHVkZXMgY2hhcmFjdGVycyB5b3UgY2FuJ3QgZW5jb2RlCi0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBpbiB0aGUgd2Vic2l0ZSdzIGNoYXJhY3RlciBzZXQuCi0gICAgICAgICAgICAgICAg
ICAgICAgICBoc3RyICs9ICI7IGZpbGVuYW1lPVwiIjsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGhzdHIgKz0gY29kZWMtPmZyb21Vbmljb2RlKHBhdGgubWlkKHBhdGguZmluZFJldignLycpICsg
MSksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwotCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpZighc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwq
PihjdXJyZW50KS0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyBtaW1lVHlwZSA9IGZyYW1lID8g
TWFjKGZyYW1lKS0+bWltZVR5cGVGb3JGaWxlTmFtZShwYXRoKSA6IFFTdHJpbmcoKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUeXBlLmlzRW1wdHkoKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuQ29udGVudC1UeXBlOiAiOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1pbWVUeXBlLmFzY2lpKCk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAi
XHJcblxyXG4iOwotICAgICAgICAgICAgICAgICAgICArK2l0OwotCi0gICAgICAgICAgICAgICAg
ICAgIC8vIGFwcGVuZCBib2R5Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmRE
YXRhKGhzdHIuZGF0YSgpLCBoc3RyLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29u
c3QgRm9ybURhdGFMaXN0SXRlbSAmaXRlbSA9ICppdDsKLSAgICAgICAgICAgICAgICAgICAgc2l6
ZV90IGRhdGFTaXplID0gaXRlbS5tX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoZGF0YVNpemUgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBl
bmREYXRhKGl0ZW0ubV9kYXRhLCBkYXRhU2l6ZSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBl
bHNlIGlmICghaXRlbS5tX3BhdGguaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAg
Zm9ybV9kYXRhLmFwcGVuZEZpbGUoaXRlbS5tX3BhdGgpOwotICAgICAgICAgICAgICAgICAgICBm
b3JtX2RhdGEuYXBwZW5kRGF0YSgiXHJcbiIsIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKG1fbXVsdGlwYXJ0KQotICAg
ICAgICBlbmNfc3RyaW5nID0gKCItLSIgKyBtX2JvdW5kYXJ5LnFzdHJpbmcoKSArICItLVxyXG4i
KS5hc2NpaSgpOwotCi0gICAgZm9ybV9kYXRhLmFwcGVuZERhdGEoZW5jX3N0cmluZy5kYXRhKCks
IGVuY19zdHJpbmcubGVuZ3RoKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxG
b3JtRWxlbWVudEltcGw6OnBhcnNlRW5jdHlwZShjb25zdCBET01TdHJpbmcmIHR5cGUpCi17Ci0g
ICAgaWYodHlwZS5jb250YWlucygibXVsdGlwYXJ0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFpbnMo
ImZvcm0tZGF0YSIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAibXVsdGlwYXJ0L2Zv
cm0tZGF0YSI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHR5
cGUuY29udGFpbnMoInRleHQiLCBmYWxzZSkgfHwgdHlwZS5jb250YWlucygicGxhaW4iLCBmYWxz
ZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gInRleHQvcGxhaW4iOwotICAgICAgICBtX211bHRp
cGFydCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNh
dGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNl
OwotICAgIH0KLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRCb3VuZGFyeSggY29u
c3QgRE9NU3RyaW5nJiBib3VuZCApCi17Ci0gICAgbV9ib3VuZGFyeSA9IGJvdW5kOwotfQotCi1i
b29sIEhUTUxGb3JtRWxlbWVudEltcGw6OnByZXBhcmVTdWJtaXQoKQotewotICAgIEZyYW1lICpm
cmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYobV9pbnN1Ym1pdCB8fCAhZnJh
bWUgfHwgZnJhbWUtPm9ubHlMb2NhbFJlZmVyZW5jZXMoKSkKLSAgICAgICAgcmV0dXJuIG1faW5z
dWJtaXQ7Ci0KLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLSAgICBtX2RvaW5nc3VibWl0ID0gZmFs
c2U7Ci0KLSAgICBpZiAoIGRpc3BhdGNoSFRNTEV2ZW50KHN1Ym1pdEV2ZW50LGZhbHNlLHRydWUp
ICYmICFtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0KLSAg
ICBtX2luc3VibWl0ID0gZmFsc2U7Ci0KLSAgICBpZiAoIG1fZG9pbmdzdWJtaXQgKQotICAgICAg
ICBzdWJtaXQodHJ1ZSk7Ci0KLSAgICByZXR1cm4gbV9kb2luZ3N1Ym1pdDsKLX0KLQotdm9pZCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjpzdWJtaXQoIGJvb2wgYWN0aXZhdGVTdWJtaXRCdXR0b24gKQot
ewotICAgIEtIVE1MVmlldyAqdmlldyA9IGdldERvY3VtZW50KCktPnZpZXcoKTsKLSAgICBGcmFt
ZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmICghdmlldyB8fCAhZnJh
bWUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggbV9pbnN1Ym1pdCApIHsK
LSAgICAgICAgbV9kb2luZ3N1Ym1pdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
KiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSAwOwotICAgIGJvb2wgbmVlZEJ1dHRvbkFj
dGl2YXRpb24gPSBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbjsJLy8gZG8gd2UgbmVlZCB0byBhY3RpdmF0
ZSBhIHN1Ym1pdCBidXR0b24/Ci0gICAgCi0gICAgTWFjKGZyYW1lKS0+Y2xlYXJSZWNvcmRlZEZv
cm1WYWx1ZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNv
dW50KCk7ICsraSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogY3VycmVu
dCA9IGZvcm1FbGVtZW50c1tpXTsKLSAgICAgICAgLy8gT3VyIGFwcCBuZWVkcyB0byBnZXQgZm9y
bSB2YWx1ZXMgZm9yIHBhc3N3b3JkIGZpZWxkcyBmb3IgZG9pbmcgcGFzc3dvcmQgYXV0b2NvbXBs
ZXRlLAotICAgICAgICAvLyBzbyB3ZSBhcmUgbW9yZSBsZW5pZW50IGluIHB1c2hpbmcgdmFsdWVz
LCBhbmQgbGV0IHRoZSBhcHAgZGVjaWRlIHdoYXQgdG8gc2F2ZSB3aGVuLgotICAgICAgICBpZiAo
Y3VycmVudC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0
RWxlbWVudEltcGwgKmlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihj
dXJyZW50KTsKLSAgICAgICAgICAgIGlmIChpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0
RWxlbWVudEltcGw6OlRFWFQKLSAgICAgICAgICAgICAgICB8fCBpbnB1dC0+aW5wdXRUeXBlKCkg
PT0gIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpQQVNTV09SRAotICAgICAgICAgICAgICAgIHx8IGlu
cHV0LT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAg
ICAgICAgewotICAgICAgICAgICAgICAgIE1hYyhmcmFtZSktPnJlY29yZEZvcm1WYWx1ZShpbnB1
dC0+bmFtZSgpLnFzdHJpbmcoKSwgaW5wdXQtPnZhbHVlKCkucXN0cmluZygpLCB0aGlzKTsKLSAg
ICAgICAgICAgICAgICBpZiAoaW5wdXQtPnJlbmRlcmVyKCkgJiYgaW5wdXQtPmlucHV0VHlwZSgp
ID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpTRUFSQ0gpCi0gICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0Kj4oaW5wdXQtPnJlbmRlcmVyKCkpLT5hZGRTZWFyY2hS
ZXN1bHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkQnV0
dG9uQWN0aXZhdGlvbikgewotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmlzQWN0aXZhdGVkU3Vi
bWl0KCkpIHsKLSAgICAgICAgICAgICAgICBuZWVkQnV0dG9uQWN0aXZhdGlvbiA9IGZhbHNlOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPT0gMCAm
JiBjdXJyZW50LT5pc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSkgewotICAgICAgICAgICAgICAg
IGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmlyc3RT
dWNjZXNzZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1
dHRvbi0+c2V0QWN0aXZhdGVkU3VibWl0KHRydWUpOwotICAgIH0KLQotICAgIGlmICghbV9wb3N0
KQotICAgICAgICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIAotICAgIEZvcm1EYXRhIGZvcm1f
ZGF0YTsKLSAgICBpZiAoZm9ybURhdGEoZm9ybV9kYXRhKSkgewotICAgICAgICBpZihtX3Bvc3Qp
IHsKLSAgICAgICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAicG9zdCIsIG1fdXJsLnFzdHJpbmco
KSwgZm9ybV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Rh
cmdldC5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu
Y3R5cGUoKS5xc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJvdW5kYXJ5KCkucXN0cmluZygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggImdldCIsIG1fdXJsLnFzdHJpbmcoKSwgZm9ybV9k
YXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RhcmdldC5xc3Ry
aW5nKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZWVkQnV0dG9uQWN0aXZhdGlv
biAmJiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsKLSAgICAgICAgZmlyc3RTdWNjZXNz
ZnVsU3VibWl0QnV0dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQoZmFsc2UpOwotICAgIH0KLSAgICAK
LSAgICBtX2RvaW5nc3VibWl0ID0gbV9pbnN1Ym1pdCA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxG
b3JtRWxlbWVudEltcGw6OnJlc2V0KCAgKQotewotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3Vt
ZW50KCktPmZyYW1lKCk7Ci0gICAgaWYobV9pbnJlc2V0IHx8ICFmcmFtZSkgcmV0dXJuOwotCi0g
ICAgbV9pbnJlc2V0ID0gdHJ1ZTsKLQotICAgIC8vICMjIyBET00yIGxhYmVscyB0aGlzIGV2ZW50
IGFzIG5vdCBjYW5jZWxhYmxlLCBob3dldmVyCi0gICAgLy8gY29tbW9uIGJyb3dzZXJzKCBzaWNr
ISApIGFsbG93IGl0IGJlIGNhbmNlbGxlZC4KLSAgICBpZiAoICFkaXNwYXRjaEhUTUxFdmVudChy
ZXNldEV2ZW50LHRydWUsIHRydWUpICkgewotICAgICAgICBtX2lucmVzZXQgPSBmYWxzZTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3Jt
RWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxlbWVudHNbaV0tPnJlc2V0KCk7
Ci0KLSAgICBtX2lucmVzZXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAg
IGlmIChhdHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cikgCi0gICAgewotICAgICAgICBib29sIG9s
ZFVSTFdhc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKTsKLSAg
ICAgICAgbV91cmwgPSBraHRtbDo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGJv
b2wgbmV3VVJMSXNTZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7
Ci0KLSAgICAgICAgaWYgKG1fYXR0YWNoZWQgJiYgKG9sZFVSTFdhc1NlY3VyZSAhPSBuZXdVUkxJ
c1NlY3VyZSkpCi0gICAgICAgICAgICBpZiAobmV3VVJMSXNTZWN1cmUpCi0gICAgICAgICAgICAg
ICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybVJlbW92ZWQoKTsKLSAgICB9
Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHRhcmdldEF0dHIpIHsKLSAgICAgICAgbV90
YXJnZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1l
dGhvZEF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCks
ICJwb3N0IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSB0cnVlOwotICAgICAgICBlbHNlIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiZ2V0IikpCi0gICAgICAgICAgICBtX3Bv
c3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBlbmN0eXBlQXR0cikg
ewotICAgICAgICBwYXJzZUVuY3R5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYWNjZXB0X2NoYXJzZXRBdHRyKSB7Ci0gICAgICAgIC8vIHNwYWNlIHNl
cGFyYXRlZCBsaXN0IG9mIGNoYXJzZXRzIHRoZSBzZXJ2ZXIKLSAgICAgICAgLy8gYWNjZXB0cyAt
IHNlZSByZmMyMDQ1Ci0gICAgICAgIG1fYWNjZXB0Y2hhcnNldCA9IGF0dHItPnZhbHVlKCk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0QXR0cikgewotICAgICAgICAvLyBp
Z25vcmUgdGhpcyBvbmUgZm9yIHRoZSBtb21lbnQuLi4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gIWVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbnN1Ym1pdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVu
ZXIoc3VibWl0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
cmVzZXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHJlc2V0RXZlbnQsIGF0
dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAg
IERPTVN0cmluZyBuZXdOYW1lQXR0ciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChpbkRv
Y3VtZW50KCkgJiYgZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICAg
ICAgSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJ
bXBsICo+KGdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgZG9jdW1lbnQtPnJlbW92ZU5hbWVk
SXRlbShvbGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2N1bWVudC0+YWRkTmFtZWRJdGVtKG5l
d05hbWVBdHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lQXR0ciA9IG5ld05hbWVBdHRy
OwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmli
dXRlKGF0dHIpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBpbnNlcnRJbnRv
VmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgdW5zaWduZWQgcG9zLCBUKiBpdGVtKQotewotICAg
IHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNv
dW50KCk7Ci0gICAgYXNzZXJ0KHBvcyA8PSBjb3VudCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQp
Ci0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAg
Zm9yICh1bnNpZ25lZCBpID0gY291bnQ7IGkgPiBwb3M7IC0taSkKLSAgICAgICAgdmVjLmluc2Vy
dChpLCB2ZWNbaSAtIDFdKTsgICAgCi0gICAgdmVjLmluc2VydChwb3MsIGl0ZW0pOwotfQotCi10
ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBhcHBlbmRUb1ZlY3RvcihRUHRyVmVjdG9yPFQ+
ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAgdW5zaWduZWQgc2l6ZSA9IHZlYy5zaXplKCk7Ci0gICAg
dW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBpZiAoc2l6ZSA9PSBjb3VudCkKLSAg
ICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6ZSAqIDMgLyAyKTsKLSAgICB2ZWMu
aW5zZXJ0KGNvdW50LCBpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQg
cmVtb3ZlRnJvbVZlY3RvcihRUHRyVmVjdG9yPFQ+ICZ2ZWMsIFQgKml0ZW0pCi17Ci0gICAgaW50
IHBvcyA9IHZlYy5maW5kUmVmKGl0ZW0pOwotICAgIGlmIChwb3MgPCAwKQotICAgICAgICByZXR1
cm47Ci0gICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSBwb3M7IGkgPCBjb3VudCAtIDE7ICsraSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2ZWNb
aSArIDFdKTsKLSAgICB2ZWMucmVtb3ZlKGNvdW50IC0gMSk7Ci19Ci0KLXVuc2lnbmVkIEhUTUxG
b3JtRWxlbWVudEltcGw6OmZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwgKmUpCi17Ci0gICAgLy8gQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhpcyBl
bGVtZW50IGlzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgaW4KLSAgICAvLyB0aGUgZm9ybSdzIHRyZWUg
b2YgY2hpbGRyZW47IHdlIGRvbid0IHdhbnQgdG8gd2FsayB0aGUgZW50aXJlIHRyZWUgaW4gdGhh
dAotICAgIC8vIGNvbW1vbiBjYXNlIHRoYXQgb2NjdXJzIGR1cmluZyBwYXJzaW5nOyBpbnN0ZWFk
IHdlJ2xsIGp1c3QgcmV0dXJuIGEgdmFsdWUKLSAgICAvLyB0aGF0IHNheXMgImFkZCB0aGlzIGZv
cm0gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSIuCi0gICAgaWYgKGUtPnRyYXZlcnNl
TmV4dE5vZGUodGhpcykpIHsKLSAgICAgICAgdW5zaWduZWQgaSA9IDA7Ci0gICAgICAgIGZvciAo
Tm9kZUltcGwgKm5vZGUgPSB0aGlzOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9k
ZSh0aGlzKSkgewotICAgICAgICAgICAgaWYgKG5vZGUgPT0gZSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gaTsKLSAgICAgICAgICAgIGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkKLSAgICAgICAg
ICAgICAgICAgICAgJiYgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpLT5pc0dl
bmVyaWNGb3JtRWxlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICo+KG5vZGUpLT5mb3JtKCkgPT0gdGhpcykKLSAgICAg
ICAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1FbGVtZW50
cy5jb3VudCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlZ2lzdGVyRm9ybUVs
ZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgRG9jdW1lbnRJbXBs
ICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGlmIChkb2MgJiYgZS0+aXNSYWRpb0J1dHRvbigp
ICYmICFlLT5uYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKiBjdXJyZW50Q2hlY2tlZFJhZGlvID0gZG9jLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JH
cm91cChlLT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDApOwotICAgICAg
ICBpZiAoY3VycmVudENoZWNrZWRSYWRpbyA9PSBlKQotICAgICAgICAgICAgZG9jLT5yZW1vdmVS
YWRpb0J1dHRvbkdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIChIVE1MRm9ybUVsZW1lbnRJbXBsKikg
MCk7Ci0gICAgICAgIGlmIChlLT5pc0NoZWNrZWQoKSkKLSAgICAgICAgICAgIGRvYy0+cmFkaW9C
dXR0b25DaGVja2VkKChIVE1MSW5wdXRFbGVtZW50SW1wbCopIGUsIHRoaXMpOwotICAgIH0KLSAg
ICBpbnNlcnRJbnRvVmVjdG9yKGZvcm1FbGVtZW50cywgZm9ybUVsZW1lbnRJbmRleChlKSwgZSk7
Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCi17Ci0gICAgaWYgKCFlLT5uYW1lKCkuaXNFbXB0eSgp
ICYmIGdldERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwq
IGN1cnJlbnRDaGVja2VkUmFkaW8gPSBnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0b25G
b3JHcm91cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAgICAgICAgaWYgKGN1cnJlbnRDaGVj
a2VkUmFkaW8gPT0gZSkKLSAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0
dG9uR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgfQotICAgIHJlbW92ZUZyb21W
ZWN0b3IoZm9ybUVsZW1lbnRzLCBlKTsKLX0KLQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpp
c1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBh
dHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cjsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpyZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKmUpCi17Ci0gICAgYXBw
ZW5kVG9WZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudElt
cGw6OnJlbW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKmUpCi17Ci0gICAgcmVt
b3ZlRnJvbVZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlv
bkltcGw+IEhUTUxGb3JtRWxlbWVudEltcGw6OmVsZW1lbnRzKCkKLXsKLSAgICByZXR1cm4gUmVm
UHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxGb3JtQ29sbGVjdGlvbkltcGwodGhpcykp
OwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVt
ZW50SW1wbDo6c2V0TmFtZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1w
bDo6YWNjZXB0Q2hhcnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nl
cHRfY2hhcnNldEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFjY2Vw
dENoYXJzZXQoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNj
ZXB0X2NoYXJzZXRBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJ
bXBsOjphY3Rpb24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWN0aW9uQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0QWN0aW9uKGNvbnN0IERPTVN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjdGlvbkF0dHIsIHZhbHVlKTsKLX0K
LQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRFbmN0eXBlKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGVuY3R5cGVBdHRyLCB2YWx1ZSk7Ci19Ci0KLURP
TVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjptZXRob2QoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUobWV0aG9kQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1w
bDo6c2V0TWV0aG9kKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KG1ldGhvZEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6
OnRhcmdldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsK
LX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRUYXJnZXQoY29uc3QgRE9NU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFyZ2V0QXR0ciwgdmFsdWUpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxFbGVtZW50SW1w
bCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9kaXNhYmxlZCA9IG1fcmVhZE9ubHkgPSBmYWxzZTsK
LQotICAgIGlmIChmKQotCW1fZm9ybSA9IGY7Ci0gICAgZWxzZQotCW1fZm9ybSA9IGdldEZvcm0o
KTsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlZ2lzdGVyRm9ybUVsZW1lbnQo
dGhpcyk7Ci19Ci0KLUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwoKQotewotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9ybS0+cmVtb3Zl
Rm9ybUVsZW1lbnQodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAg
aWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICAvLyBEbyBub3RoaW5nLgot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGRpc2FibGVkQXR0cikgewotICAgICAgICBi
b29sIG9sZERpc2FibGVkID0gbV9kaXNhYmxlZDsKLSAgICAgICAgbV9kaXNhYmxlZCA9ICFhdHRy
LT5pc051bGwoKTsKLSAgICAgICAgaWYgKG9sZERpc2FibGVkICE9IG1fZGlzYWJsZWQpIHsKLSAg
ICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJl
bmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgICAgICB0aGVt
ZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgRW5hYmxlZFN0YXRlKTsKLSAgICAgICAgfQot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlYWRvbmx5QXR0cikgewotICAgICAgICBi
b29sIG9sZFJlYWRPbmx5ID0gbV9yZWFkT25seTsKLSAgICAgICAgbV9yZWFkT25seSA9ICFhdHRy
LT5pc051bGwoKTsKLSAgICAgICAgaWYgKG9sZFJlYWRPbmx5ICE9IG1fcmVhZE9ubHkpIHNldENo
YW5nZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotCi0gICAgSFRNTEVsZW1lbnRJ
bXBsOjphdHRhY2goKTsKLQotICAgIC8vIFRoZSBjYWxsIHRvIHVwZGF0ZUZyb21FbGVtZW50KCkg
bmVlZHMgdG8gZ28gYWZ0ZXIgdGhlIGNhbGwgdGhyb3VnaAotICAgIC8vIHRvIHRoZSBiYXNlIGNs
YXNzJ3MgYXR0YWNoKCkgYmVjYXVzZSB0aGF0IGNhbiBzb21ldGltZXMgZG8gYSBjbG9zZQotICAg
IC8vIG9uIHRoZSByZW5kZXJlci4KLSAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAgbV9yZW5k
ZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgCi0gICAgICAgIC8vIERlbGF5ZWQgYXR0YWNo
bWVudCBpbiBvcmRlciB0byBwcmV2ZW50IEZPVUMgY2FuIHJlc3VsdCBpbiBhbiBvYmplY3QgYmVp
bmcKLSAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBmb2N1c2VkIGJlZm9yZSBpdCBoYXMgYSBy
ZW5kZXIgb2JqZWN0LiAgSWYgd2UgaGF2ZSBiZWVuIGZvY3VzZWQKLSAgICAgICAgLy8gKGkuZS4s
IGlmIHdlIGFyZSB0aGUgZm9jdXNOb2RlKSB0aGVuIGdvIGFoZWFkIGFuZCBmb2N1cyBvdXIgY29y
cmVzcG9uZGluZyBuYXRpdmUgd2lkZ2V0LgotICAgICAgICAvLyAoQXR0YWNoL2RldGFjaCBjYW4g
YWxzbyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgZGlzcGxheSB0eXBlIGNoYW5nZXMsIGUuZy4sIG1h
a2luZyBhIHdpZGdldAotICAgICAgICAvLyBibG9jayBpbnN0ZWFkIG9mIGlubGluZSwgYW5kIGZv
Y3VzIHNob3VsZCBiZSByZXN0b3JlZCBpbiB0aGF0IGNhc2UgYXMgd2VsbC4pCi0gICAgICAgIGlm
IChnZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKSA9PSB0aGlzICYmIG1fcmVuZGVyLT5pc1dpZGdl
dCgpICYmIAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVuZGVyZXIo
KSktPndpZGdldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4ocmVu
ZGVyZXIoKSktPndpZGdldCgpLT5zZXRGb2N1cygpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApCi17Ci0gICAg
aWYgKCFtX2Zvcm0pIHsKLSAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIGEgbmV3
IGZvcm0gZWxlbWVudCBiZWluZyBjcmVhdGVkIGJ5Ci0gICAgICAgIC8vIEphdmFTY3JpcHQgYW5k
IGluc2VydGVkIGluc2lkZSBhIGZvcm0uICBJbiB0aGUgY2FzZSBvZiB0aGUgcGFyc2VyCi0gICAg
ICAgIC8vIHNldHRpbmcgYSBmb3JtLCB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBhIG5vbi1udWxsIHZh
bHVlIGZvciBtX2Zvcm0sIAotICAgICAgICAvLyBhbmQgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBh
bnl0aGluZy4KLSAgICAgICAgbV9mb3JtID0gZ2V0Rm9ybSgpOwotCWlmIChtX2Zvcm0pCi0JICAg
IG1fZm9ybS0+cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsKLSAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBp
ZiAoZG9jICYmIGlzUmFkaW9CdXR0b24oKSAmJiAhbmFtZSgpLmlzRW1wdHkoKSAmJiBpc0NoZWNr
ZWQoKSkKLSAgICAgICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9uQ2hlY2tlZCgoSFRNTElucHV0
RWxlbWVudEltcGwqKXRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1M
RWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoZGVlcCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApCi17Ci0gICAgLy8g
V2hlbiBiZWluZyByZW1vdmVkIHdlIGhhdmUgdG8gcG9zc2libHkgbnVsbCBvdXQgb3VyIGZvcm0g
YW5kIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbQotICAgIC8vIHRoZSBmb3JtJ3MgbGlzdCBvZiBlbGVt
ZW50cy4KLSAgICBpZiAobV9mb3JtKSB7Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gcmUtYWNxdWly
ZSB0aGUgZm9ybS4gIElmIHdlIGNhbid0IHJlLWFjcXVpcmUsIHRoZW4KLSAgICAgICAgLy8gcmVt
b3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBmb3JtLgotICAgICAgICBOb2RlSW1wbCogZm9ybSA9IHBh
cmVudE5vZGUoKTsKLSAgICAgICAgTm9kZUltcGwqIHJvb3QgPSB0aGlzOwotICAgICAgICB3aGls
ZSAoZm9ybSkgewotICAgICAgICAgICAgaWYgKGZvcm0tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByb290ID0gZm9ybTsKLSAgICAgICAg
ICAgIGZvcm0gPSBmb3JtLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIC8vIElmIHRoZSBmb3JtIGhhcyBiZWVuIGRlbW90ZWQgdG8gYSBsZWFmLCB0aGVuIHdlIHdv
bid0IGZpbmQgaXQgYXMgYW4gYW5jZXN0b3IuCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0
aGUgcm9vdCBub2RlIG9mIG91ciBjdXJyZW50IGZvcm0gYW5kIG91ciByb290IG5vZGUKLSAgICAg
ICAgLy8gbWF0Y2guICBJZiBzbywgcHJlc2VydmUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGZvcm0u
Ci0gICAgICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgTm9kZUltcGwqIGZvcm1Sb290ID0g
bV9mb3JtOwotICAgICAgICAgICAgd2hpbGUgKGZvcm1Sb290LT5wYXJlbnQoKSkgZm9ybVJvb3Qg
PSBmb3JtUm9vdC0+cGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoZm9ybVJvb3QgPT0gcm9vdCkK
LSAgICAgICAgICAgICAgICBmb3JtID0gbV9mb3JtOwotICAgICAgICB9IAotICAgICAgICAKLSAg
ICAgICAgaWYgKCFmb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1FbGVtZW50
KHRoaXMpOwotICAgICAgICAgICAgbV9mb3JtID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAg
ICAgICBhc3NlcnQoZm9ybSA9PSBtX2Zvcm0pOyAvLyBUaGUgcmUtYWNxdWlyZWQgZm9ybSBzaG91
bGQgYmUgdGhlIHNhbWUuIElmIG5vdCwgc29tZXRoaW5nIHJlYWxseSBzdHJhbmdlIGhhcHBlbmVk
LgotICAgIH0KLSAgIAotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21UcmVlKGRlZXAp
OwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
Z2V0Rm9ybSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7Ci0gICAg
d2hpbGUocCkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAgICAg
ICBwID0gcC0+cGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAgICBET01T
dHJpbmcgbiA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0gICAgcmV0dXJuIG4uaXNOdWxsKCkg
PyAiIiA6IG47Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldE5hbWUo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobmFtZUF0dHIsIHZh
bHVlKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25TZWxlY3QoKQot
ewotICAgIC8vICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRl
Y3R1cmUKLSAgICBkaXNwYXRjaEhUTUxFdmVudChzZWxlY3RFdmVudCx0cnVlLGZhbHNlKTsKLX0K
LQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6b25DaGFuZ2UoKQotewotICAgIC8v
ICMjIyBtYWtlIHRoaXMgd29yayB3aXRoIG5ldyBmb3JtIGV2ZW50cyBhcmNoaXRlY3R1cmUKLSAg
ICBkaXNwYXRjaEhUTUxFdmVudChjaGFuZ2VFdmVudCx0cnVlLGZhbHNlKTsKLX0KLQotYm9vbCBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGlzYWJsZWQoKSBjb25zdAotewotICAgIHJldHVy
biBtX2Rpc2FibGVkOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRE
aXNhYmxlZChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKGRpc2FibGVkQXR0ciwgYiA/ICIi
IDogMCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNldFJlYWRPbmx5
KGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyLCBiID8gIiIgOiAwKTsK
LX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxl
Q2hhbmdlIGNoICkKLXsKLSAgICAvL2Jvb2wgY2hhbmdlZCA9IGNoYW5nZWQoKTsKLSAgICBIVE1M
RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotCi0gICAgaWYgKG1fcmVuZGVyIC8qJiYg
Y2hhbmdlZCovKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQot
Ym9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewot
ICAgIGlmIChkaXNhYmxlZCgpIHx8ICFtX3JlbmRlciB8fCAKLSAgICAgICAgKG1fcmVuZGVyLT5z
dHlsZSgpICYmIG1fcmVuZGVyLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkgfHwg
Ci0gICAgICAgIG1fcmVuZGVyLT53aWR0aCgpID09IDAgfHwgbV9yZW5kZXItPmhlaWdodCgpID09
IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0Ci17
Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyLT5pc1dpZGdl
dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9y
ZW5kZXIpLT53aWRnZXQoKSAmJgotICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxSZW5kZXJX
aWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpLT5mb2N1c1BvbGljeSgpICYgUVdpZGdldDo6VGFi
Rm9jdXMpOwotICAgICAgICB9Ci0JaWYgKGdldERvY3VtZW50KCktPmZyYW1lKCkpCi0JICAgIHJl
dHVybiBnZXREb2N1bWVudCgpLT5mcmFtZSgpLT50YWJzVG9BbGxDb250cm9scygpOwotICAgIH0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmlzTW91c2VGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlmIChpc0ZvY3VzYWJsZSgpKSB7Ci0g
ICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCkgJiYKLSAgICAgICAg
ICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQoKS0+
Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OkNsaWNrRm9jdXMpOwotICAgICAgICB9Ci0gICAgICAg
IC8vIEZvciA8aW5wdXQgdHlwZT1pbWFnZT4gYW5kIDxidXR0b24+LCB3ZSB3aWxsIGFzc3VtZSBu
byBtb3VzZSBmb2N1c2FiaWxpdHkuICBUaGlzIGlzCi0gICAgICAgIC8vIGNvbnNpc3RlbnQgd2l0
aCBPUyBYIGJlaGF2aW9yIGZvciBidXR0b25zLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBTcGVjaWFsIGNo
YXJzIHVzZWQgdG8gZW5jb2RlIGZvcm0gc3RhdGUgc3RyaW5ncy4KLS8vIFdlIHBpY2sgY2hhcnMg
dGhhdCBhcmUgdW5saWtlbHkgdG8gYmUgdXNlZCBpbiBhbiBIVE1MIGF0dHIsIHNvIHdlIHJhcmVs
eSBoYXZlIHRvIHJlYWxseSBlbmNvZGUuCi1jb25zdCBjaGFyIHN0YXRlU2VwYXJhdG9yID0gJyYn
OwotY29uc3QgY2hhciBzdGF0ZUVzY2FwZSA9ICc8JzsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRl
U2VwYXJhdG9yTWFya2VyW10gPSAiPEEiOwotc3RhdGljIGNvbnN0IGNoYXIgc3RhdGVFc2NhcGVN
YXJrZXJbXSA9ICI8PCI7Ci0KLS8vIEVuY29kZSBhbiBlbGVtZW50IG5hbWUgc28gd2UgY2FuIHB1
dCBpdCBpbiBhIHN0YXRlIHN0cmluZyB3aXRob3V0IGNvbGxpZGluZwotLy8gd2l0aCBvdXIgc2Vw
YXJhdG9yIGNoYXIuCi1zdGF0aWMgUVN0cmluZyBlbmNvZGVkRWxlbWVudE5hbWUoUVN0cmluZyBz
dHIpCi17Ci0gICAgaW50IHNlcExvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICBp
bnQgZXNjTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IpOwotICAgIGlmIChzZXBMb2MgPj0g
MCB8fCBlc2NMb2MgPj0gMCkgewotICAgICAgICBRU3RyaW5nIG5ld1N0ciA9IHN0cjsKLSAgICAg
ICAgLy8gICByZXBsYWNlICI8IiB3aXRoICI8PCIKLSAgICAgICAgd2hpbGUgKGVzY0xvYyA+PSAw
KSB7Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFjZShlc2NMb2MsIDEsIHN0YXRlRXNjYXBlTWFy
a2VyKTsKLSAgICAgICAgICAgIGVzY0xvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBlc2NM
b2MrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICByZXBsYWNlICImIiB3aXRoICI8QSIKLSAg
ICAgICAgd2hpbGUgKHNlcExvYyA+PSAwKSB7Ci0gICAgICAgICAgICBuZXdTdHIucmVwbGFjZShz
ZXBMb2MsIDEsIHN0YXRlU2VwYXJhdG9yTWFya2VyKTsKLSAgICAgICAgICAgIHNlcExvYyA9IHN0
ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXBMb2MrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIG5ld1N0cjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLX0K
LQotUVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICAv
LyBCdWlsZCBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIEVsZW1lbnROYW1lJkVsZW1lbnRUeXBlJgot
ICAgIHJldHVybiBlbmNvZGVkRWxlbWVudE5hbWUobmFtZSgpLnFzdHJpbmcoKSkgKyBzdGF0ZVNl
cGFyYXRvciArIHR5cGUoKS5xc3RyaW5nKCkgKyBzdGF0ZVNlcGFyYXRvcjsKLX0KLQotUVN0cmlu
ZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoUVN0cmluZ0xp
c3QgJnN0YXRlcykKLXsKLSAgICBRU3RyaW5nIGVuY05hbWUgPSBlbmNvZGVkRWxlbWVudE5hbWUo
bmFtZSgpLnFzdHJpbmcoKSk7Ci0gICAgUVN0cmluZyB0eXBlU3RyID0gdHlwZSgpLnFzdHJpbmco
KTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdCA9IHN0YXRlcy5iZWdpbigpOyBp
dCAhPSBzdGF0ZXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgUVN0cmluZyBzdGF0ZSA9ICppdDsK
LSAgICAgICAgaW50IHNlcDEgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICAgICAg
aW50IHNlcDIgPSBzdGF0ZS5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXAxKzEpOwotICAgICAgICBh
c3NlcnQoc2VwMSA+PSAwKTsKLSAgICAgICAgYXNzZXJ0KHNlcDIgPj0gMCk7Ci0KLSAgICAgICAg
UVN0cmluZyBuYW1lQW5kVHlwZSA9IHN0YXRlLmxlZnQoc2VwMik7Ci0gICAgICAgIGlmIChlbmNO
YW1lLmxlbmd0aCgpICsgdHlwZVN0ci5sZW5ndGgoKSArIDEgPT0gKHVpbnQpc2VwMgotICAgICAg
ICAgICAgJiYgbmFtZUFuZFR5cGUuc3RhcnRzV2l0aChlbmNOYW1lKQotICAgICAgICAgICAgJiYg
bmFtZUFuZFR5cGUuZW5kc1dpdGgodHlwZVN0cikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0
YXRlcy5yZW1vdmUoaXQpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLm1pZChzZXAyKzEpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBRU3RyaW5nOjpudWxsOwotfQotCi1pbnQgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnRhYkluZGV4KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKHRhYmluZGV4QXR0cikudG9JbnQoKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6c2V0VGFiSW5kZXgoaW50IHZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZSh0YWJpbmRleEF0dHIsIFFTdHJpbmc6Om51bWJlcih2YWx1ZSkpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6SFRNTEJ1dHRvbkVsZW1lbnRJ
bXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwoYnV0dG9uVGFnLCBkb2MsIGYpCi17Ci0gICAgbV90eXBl
ID0gU1VCTUlUOwotICAgIG1fZGlydHkgPSB0cnVlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFs
c2U7Ci19Ci0KLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6fkhUTUxCdXR0b25FbGVtZW50SW1wbCgp
Ci17Ci19Ci0KLVJlbmRlck9iamVjdCogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpjcmVhdGVSZW5k
ZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1
cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1
dHRvbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KHR5cGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHIt
PnZhbHVlKCksICJzdWJtaXQiKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAgICAg
ICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInJlc2V0IikpCi0g
ICAgICAgICAgICBtX3R5cGUgPSBSRVNFVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoYXR0ci0+dmFsdWUoKSwgImJ1dHRvbiIpKQotICAgICAgICAgICAgbV90eXBlID0gQlVU
VE9OOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAgICAg
ICBtX3ZhbHVlID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgbV9jdXJyVmFsdWUgPSBtX3ZhbHVl
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAg
ICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3Vz
QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNl
dEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsK
LX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZl
bnRJbXBsICpldnQpCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBCVVRUT04gJiYgKGV2dC0+dHlwZSgp
ID09IERPTUFjdGl2YXRlRXZlbnQpKSB7Ci0KLSAgICAgICAgaWYobV9mb3JtICYmIG1fdHlwZSA9
PSBTVUJNSVQpIHsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsKLSAgICAgICAg
ICAgIG1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpOwotICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQg
PSBmYWxzZTsgLy8gaW4gY2FzZSB3ZSB3ZXJlIGNhbmNlbGVkCi0gICAgICAgIH0KLSAgICAgICAg
aWYobV9mb3JtICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgpOwotICAgIH0KLSAg
ICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwot
fQotCi1ib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9u
KCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBoYXZl
IG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdGhl
ciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVyZWZv
cmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVudCBi
dXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gUmVtb3Zl
IHRoZSBuYW1lIGNvbnN0cmFpbnQgZm9yIG5vdy4KLSAgICAvLyBXYXM6IG1fdHlwZSA9PSBTVUJN
SVQgJiYgIW1fZGlzYWJsZWQgJiYgIW5hbWUoKS5pc0VtcHR5KCkKLSAgICByZXR1cm4gbV90eXBl
ID09IFNVQk1JVCAmJiAhbV9kaXNhYmxlZDsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudElt
cGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJt
aXQ7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJtaXQo
Ym9vbCBmbGFnKQotewotICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBIVE1M
QnV0dG9uRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2Rpbmcs
IGJvb2wgLyptdWx0aXBhcnQqLykKLXsKLSAgICBpZiAobV90eXBlICE9IFNVQk1JVCB8fCBuYW1l
KCkuaXNFbXB0eSgpIHx8ICFtX2FjdGl2ZVN1Ym1pdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBtX2N1cnJWYWx1ZSk7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24o
Ym9vbCBzZW5kVG9BbnlFbGVtZW50KQoteyAgIAotICAgIC8vIHNlbmQgdGhlIG1vdXNlIGJ1dHRv
biBldmVudHMgaWZmIHRoZQotICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2VuZFRvQW55RWxlbWVu
dAotICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRv
bkVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRB
Y2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNj
ZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
Ojp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwot
fQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OkhUTUxGaWVsZFNl
dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQot
ICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChmaWVsZHNldFRhZywgZG9jLCBmKQotewot
fQotCi1IVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6fkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCkK
LXsKLX0KLQotYm9vbCBIVE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3QgTm9k
ZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShsZWdl
bmRUYWcpIHx8IEhUTUxFbGVtZW50SW1wbDo6Y2hlY2tEVEQobmV3Q2hpbGQpOwotfQotCi1ib29s
IEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OnR5cGUo
KSBjb25zdAotewotICAgIHJldHVybiAiZmllbGRzZXQiOwotfQotCi1SZW5kZXJPYmplY3QqIEhU
TUxGaWVsZFNldEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEs
IFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyRmll
bGRzZXQodGhpcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElucHV0RWxlbWVu
dEltcGw6OkhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoaW5wdXRUYWcs
IGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpIVE1M
SW5wdXRFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1faW1hZ2VMb2FkZXIgPSAwOwotICAg
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3R5cGUgPSBURVhUOwotICAg
IG1fbWF4TGVuID0gLTE7Ci0gICAgbV9zaXplID0gMjA7Ci0gICAgbV9jaGVja2VkID0gZmFsc2U7
Ci0gICAgbV9kZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQg
PSB0cnVlOwotICAgIG1faW5kZXRlcm1pbmF0ZSA9IGZhbHNlOwotCi0gICAgbV9oYXZlVHlwZSA9
IGZhbHNlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci0gICAgbV9hdXRvY29tcGxldGUg
PSB0cnVlOwotICAgIG1faW5pdGVkID0gZmFsc2U7Ci0KLSAgICB4UG9zID0gMDsKLSAgICB5UG9z
ID0gMDsKLQotICAgIG1fbWF4UmVzdWx0cyA9IC0xOwotCi0gICAgaWYgKG1fZm9ybSkKLSAgICAg
ICAgbV9hdXRvY29tcGxldGUgPSBtX2Zvcm0tPmF1dG9Db21wbGV0ZSgpOwotfQotCi1IVE1MSW5w
dXRFbGVtZW50SW1wbDo6fkhUTUxJbnB1dEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9j
dW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwot
ICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVu
dEltcGw6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBtX25hbWUuaXNOdWxsKCkgPyAiIiA6
IG1fbmFtZTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3Vz
YWJsZSgpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIGJhc2UgY2xhc3Mgc2F5cyB3ZSBjYW4ndCBi
ZSBmb2N1c2VkLCB0aGVuIHdlIGNhbiBzdG9wIG5vdy4KLSAgICBpZiAoIUhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGlmIChtX3R5cGUgPT0gUkFESU8pIHsKLSAgICAgICAgLy8gVW5uYW1lZCByYWRp
byBidXR0b25zIGFyZSBuZXZlciBmb2N1c2FibGUgKG1hdGNoZXMgV2luSUUpLgotICAgICAgICBp
ZiAobmFtZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICAvLyBOZXZlciBhbGxvdyBrZXlib2FyZCB0YWJiaW5nIHRvIGxlYXZlIHlvdSBpbiB0aGUgc2Ft
ZSByYWRpbyBncm91cC4gIEFsd2F5cwotICAgICAgICAvLyBza2lwIGFueSBvdGhlciBlbGVtZW50
cyBpbiB0aGUgZ3JvdXAuCi0gICAgICAgIE5vZGVJbXBsKiBjdXJyZW50Rm9jdXNOb2RlID0gZ2V0
RG9jdW1lbnQoKS0+Zm9jdXNOb2RlKCk7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9jdXNOb2RlICYm
IGN1cnJlbnRGb2N1c05vZGUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBI
VE1MSW5wdXRFbGVtZW50SW1wbCogZm9jdXNlZElucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudEltcGwqPihjdXJyZW50Rm9jdXNOb2RlKTsKLSAgICAgICAgICAgIGlmIChmb2N1c2Vk
SW5wdXQtPmlucHV0VHlwZSgpID09IFJBRElPICYmIGZvY3VzZWRJbnB1dC0+Zm9ybSgpID09IG1f
Zm9ybSAmJgotICAgICAgICAgICAgICAgIGZvY3VzZWRJbnB1dC0+bmFtZSgpID09IG5hbWUoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIC8vIEFsbG93IGtleWJvYXJkIGZvY3VzIGlmIHdlJ3JlIGNoZWNrZWQgb3IgaWYgbm90aGlu
ZyBpbiB0aGUgZ3JvdXAgaXMgY2hlY2tlZC4KLSAgICAgICAgcmV0dXJuIGNoZWNrZWQoKSB8fCAh
Z2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwg
bV9mb3JtKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNldFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIGlmICh0
LmlzRW1wdHkoKSkgewotICAgICAgICBpbnQgZXhjY29kZTsKLSAgICAgICAgcmVtb3ZlQXR0cmli
dXRlKHR5cGVBdHRyLCBleGNjb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzZXRBdHRy
aWJ1dGUodHlwZUF0dHIsIHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJ
bnB1dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIHR5cGVFbnVtIG5ld1R5cGU7Ci0g
ICAgCi0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJwYXNzd29yZCIpKQotICAgICAgICBu
ZXdUeXBlID0gUEFTU1dPUkQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImNo
ZWNrYm94IikpCi0gICAgICAgIG5ld1R5cGUgPSBDSEVDS0JPWDsKLSAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZSh0LCAicmFkaW8iKSkKLSAgICAgICAgbmV3VHlwZSA9IFJBRElPOwotICAg
IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJzdWJtaXQiKSkKLSAgICAgICAgbmV3VHlw
ZSA9IFNVQk1JVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmVzZXQiKSkK
LSAgICAgICAgbmV3VHlwZSA9IFJFU0VUOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KHQsICJmaWxlIikpCi0gICAgICAgIG5ld1R5cGUgPSBGSUxFOwotICAgIGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKHQsICJoaWRkZW4iKSkKLSAgICAgICAgbmV3VHlwZSA9IEhJRERFTjsKLSAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiaW1hZ2UiKSkKLSAgICAgICAgbmV3VHlw
ZSA9IElNQUdFOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJidXR0b24iKSkK
LSAgICAgICAgbmV3VHlwZSA9IEJVVFRPTjsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZSh0LCAia2h0bWxfaXNpbmRleCIpKQotICAgICAgICBuZXdUeXBlID0gSVNJTkRFWDsKLSAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic2VhcmNoIikpCi0gICAgICAgIG5ld1R5cGUg
PSBTRUFSQ0g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhbmdlIikpCi0g
ICAgICAgIG5ld1R5cGUgPSBSQU5HRTsKLSAgICBlbHNlCi0gICAgICAgIG5ld1R5cGUgPSBURVhU
OwotCi0gICAgLy8gIyMjIElNUE9SVEFOVDogRG9uJ3QgYWxsb3cgdGhlIHR5cGUgdG8gYmUgY2hh
bmdlZCB0byBGSUxFIGFmdGVyIHRoZSBmaXJzdAotICAgIC8vIHR5cGUgY2hhbmdlLCBvdGhlcndp
c2UgYSBKYXZhU2NyaXB0IHByb2dyYW1tZXIgd291bGQgYmUgYWJsZSB0byBzZXQgYSB0ZXh0Ci0g
ICAgLy8gZmllbGQncyB2YWx1ZSB0byBzb21ldGhpbmcgbGlrZSAvZXRjL3Bhc3N3ZCBhbmQgdGhl
biBjaGFuZ2UgaXQgdG8gYSBmaWxlIGZpZWxkLgotICAgIGlmIChtX3R5cGUgIT0gbmV3VHlwZSkg
ewotICAgICAgICBpZiAobmV3VHlwZSA9PSBGSUxFICYmIG1faGF2ZVR5cGUpIHsKLSAgICAgICAg
ICAgIC8vIFNldCB0aGUgYXR0cmlidXRlIGJhY2sgdG8gdGhlIG9sZCB2YWx1ZS4KLSAgICAgICAg
ICAgIC8vIFVzZWZ1bCBpbiBjYXNlIHdlIHdlcmUgY2FsbGVkIGZyb20gaW5zaWRlIHBhcnNlTWFw
cGVkQXR0cmlidXRlLgotICAgICAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0eXBlKCkp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAh
bmFtZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5j
aGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pID09IHRoaXMp
Ci0gICAgICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3Jv
dXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJv
b2wgd2FzQXR0YWNoZWQgPSBtX2F0dGFjaGVkOwotICAgICAgICAgICAgaWYgKHdhc0F0dGFjaGVk
KQotICAgICAgICAgICAgICAgIGRldGFjaCgpOwotICAgICAgICAgICAgYm9vbCBkaWRTdG9yZVZh
bHVlID0gc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIG1f
dHlwZSA9IG5ld1R5cGU7Ci0gICAgICAgICAgICBib29sIHdpbGxTdG9yZVZhbHVlID0gc3RvcmVz
VmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIGlmIChkaWRTdG9yZVZh
bHVlICYmICF3aWxsU3RvcmVWYWx1ZSAmJiAhbV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICAg
ICAgICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIG1fdmFsdWUpOwotICAgICAgICAgICAgICAg
IG1fdmFsdWUgPSBET01TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgh
ZGlkU3RvcmVWYWx1ZSAmJiB3aWxsU3RvcmVWYWx1ZSkgewotICAgICAgICAgICAgICAgIG1fdmFs
dWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGlmICh3YXNBdHRhY2hlZCkKLSAgICAgICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgIC8vIElmIG91ciB0eXBlIG1vcnBocyBpbnRvIGEgcmFkaW8gYnV0
dG9uIGFuZCB3ZSBhcmUgY2hlY2tlZCwgdGhlbiBnbyBhaGVhZAotICAgICAgICAgICAgLy8gYW5k
IHNpZ25hbCB0aGlzIHRvIHRoZSBmb3JtLgotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJ
TyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmFkaW9CdXR0
b25DaGVja2VkKHRoaXMsIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9oYXZlVHlw
ZSA9IHRydWU7Ci0gICAgCi0gICAgaWYgKG1fdHlwZSAhPSBJTUFHRSAmJiBtX2ltYWdlTG9hZGVy
KSB7Ci0gICAgICAgIGRlbGV0ZSBtX2ltYWdlTG9hZGVyOwotICAgICAgICBtX2ltYWdlTG9hZGVy
ID0gMDsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dHlwZSgp
IGNvbnN0Ci17Ci0gICAgLy8gbmVlZHMgdG8gYmUgbG93ZXJjYXNlIGFjY29yZGluZyB0byBET00g
c3BlYwotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBURVhUOiByZXR1cm4gInRleHQi
OwotICAgIGNhc2UgUEFTU1dPUkQ6IHJldHVybiAicGFzc3dvcmQiOwotICAgIGNhc2UgQ0hFQ0tC
T1g6IHJldHVybiAiY2hlY2tib3giOwotICAgIGNhc2UgUkFESU86IHJldHVybiAicmFkaW8iOwot
ICAgIGNhc2UgU1VCTUlUOiByZXR1cm4gInN1Ym1pdCI7Ci0gICAgY2FzZSBSRVNFVDogcmV0dXJu
ICJyZXNldCI7Ci0gICAgY2FzZSBGSUxFOiByZXR1cm4gImZpbGUiOwotICAgIGNhc2UgSElEREVO
OiByZXR1cm4gImhpZGRlbiI7Ci0gICAgY2FzZSBJTUFHRTogcmV0dXJuICJpbWFnZSI7Ci0gICAg
Y2FzZSBCVVRUT046IHJldHVybiAiYnV0dG9uIjsKLSAgICBjYXNlIFNFQVJDSDogcmV0dXJuICJz
ZWFyY2giOwotICAgIGNhc2UgUkFOR0U6IHJldHVybiAicmFuZ2UiOwotICAgIGNhc2UgSVNJTkRF
WDogcmV0dXJuICIiOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLVFTdHJpbmcgSFRNTElu
cHV0RWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgYXNzZXJ0KG1fdHlwZSAhPSBQQVNTV09S
RCk7CQkvLyBzaG91bGQgbmV2ZXIgc2F2ZS9yZXN0b3JlIHBhc3N3b3JkIGZpZWxkcwotCi0gICAg
UVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpOwotICAg
IHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgot
ICAgICAgICByZXR1cm4gc3RhdGUgKyAoY2hlY2tlZCgpID8gIm9uIiA6ICJvZmYiKTsKLSAgICBk
ZWZhdWx0OgotICAgICAgICByZXR1cm4gc3RhdGUgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7IC8v
IE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICB9Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQotewot
ICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUvcmVz
dG9yZSBwYXNzd29yZCBmaWVsZHMKLSAgICAKLSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKHN0YXRlcyk7Ci0gICAgaWYgKHN0
YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2Ug
Q0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgc2V0Q2hlY2tlZCgoc3RhdGUgPT0g
Im9uIikpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBzZXRWYWx1ZShE
T01TdHJpbmcoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSkpOwotICAgICAgICBicmVhazsK
LSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmNhbkhhdmVTZWxlY3Rpb24o
KQotewotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAg
Y2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0aW9uU3Rh
cnQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3aXRjaCAo
bV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgot
ICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVy
TGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25TdGFydCgpOwotICAgICAgICBkZWZhdWx0
OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgSFRN
TElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikg
cmV0dXJuIDA7Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNT
V09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNlbGVj
dGlvbkVuZCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQot
ICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rp
b25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAot
ICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNh
c2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQoaW50
IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNoICht
X3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0g
ICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0
ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmKCFtX3JlbmRlcikgcmV0
dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbio+KG1fcmVuZGVyKS0+c2VsZWN0KCk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2Fz
ZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJl
bmRlckxpbmVFZGl0Kj4obV9yZW5kZXIpLT5zZWxlY3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2Fz
ZSBISURERU46Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAg
ICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNF
VDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwg
aW50IGVuZCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNo
IChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6
Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVF
ZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0K
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6Y2xpY2soYm9vbCBzZW5kTW91c2VFdmVu
dHMsIGJvb2wgc2hvd1ByZXNzZWRMb29rKQotewotICAgIHN3aXRjaCAoaW5wdXRUeXBlKCkpIHsK
LSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAvLyBhIG5vLW9wIGZvciB0aGlzIHR5
cGUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgY2Fz
ZSBSRVNFVDoKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGlmIChy
ZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRv
biAqPihyZW5kZXJlcigpKS0+Y2xpY2soc2VuZE1vdXNlRXZlbnRzKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoK
LSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICBjYXNl
IFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAg
ICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0
aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7
Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0
eXBlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBjYXNl
IFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBJU0lOREVYOgot
ICAgICAgICAgICAgZm9jdXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENI
RUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAg
ICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBCVVRUT046
Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgIC8v
IGZvY3VzCi0gICAgICAgICAgICBmb2N1cygpOwotCi0gICAgICAgICAgICAvLyBzZW5kIHRoZSBt
b3VzZSBidXR0b24gZXZlbnRzIGlmZiB0aGUKLSAgICAgICAgICAgIC8vIGNhbGxlciBzcGVjaWZp
ZWQgc2VuZFRvQW55RWxlbWVudAotICAgICAgICAgICAgY2xpY2soc2VuZFRvQW55RWxlbWVudCk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudElt
cGw6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJp
YnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0
ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1l
ID09IHZzcGFjZUF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaHNwYWNlQXR0cikgewotICAg
ICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAK
LSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9
IGVSZXBsYWNlZDsgLy8gU2hhcmUgd2l0aCA8aW1nPiBzaW5jZSB0aGUgYWxpZ25tZW50IGJlaGF2
aW9yIGlzIHRoZSBzYW1lLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAg
IHJldHVybiBIVE1MRWxlbWVudEltcGw6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19
Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBl
ZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0
cikgewotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSAmJiBtX2Zvcm0p
IHsKLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmFkaW8gZnJvbSBpdHMgb2xkIGdyb3VwLgot
ICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAhbV9uYW1lLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG1fbmFt
ZS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFVwZGF0
ZSBvdXIgY2FjaGVkIHJlZmVyZW5jZSB0byB0aGUgbmFtZS4KLSAgICAgICAgbV9uYW1lID0gYXR0
ci0+dmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCBpdCB0byBpdHMgbmV3IGdyb3Vw
LgotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSkKLSAgICAgICAgICAg
IGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAgbV9h
dXRvY29tcGxldGUgPSAhZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09ICB0eXBlQXR0cikgewotICAgICAgICBzZXRJ
bnB1dFR5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
dmFsdWVBdHRyKSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBzZXRDaGFuZ2VkIGlmIHRo
ZSBmb3JtIGlzIGxvb2tpbmcgYXQgdGhlIGRlZmF1bHQgdmFsdWUgcmlnaHQgbm93LgotICAgICAg
ICBpZiAobV92YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAg
ICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGNoZWNrZWRBdHRyKSB7Ci0gICAgICAgIG1fZGVmYXVsdENoZWNrZWQgPSAhYXR0
ci0+aXNOdWxsKCk7Ci0gICAgICAgIGlmIChtX3VzZURlZmF1bHRDaGVja2VkKSB7Ci0gICAgICAg
ICAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNrZWQpOwotICAgICAgICAgICAgbV91c2VEZWZh
dWx0Q2hlY2tlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBtYXhsZW5ndGhBdHRyKSB7Ci0gICAgICAgIG1fbWF4TGVuID0gIWF0dHItPmlzTnVsbCgp
ID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogLTE7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUg
PSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAyMDsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbHRBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAm
JiBtX3R5cGUgPT0gSU1BR0UpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+
KG1fcmVuZGVyKS0+dXBkYXRlQWx0VGV4dCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IHNyY0F0dHIpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyICYmIG1fdHlwZSA9PSBJTUFHRSkg
ewotICAgICAgICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgICAgIG1faW1h
Z2VMb2FkZXIgPSBuZXcgSFRNTEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICAgICAgbV9pbWFn
ZUxvYWRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IHVzZW1hcEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUo
KSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBt
b21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2c3BhY2VBdHRyKSB7Ci0gICAg
ICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fVE9QLCBhdHRyLT52YWx1ZSgp
KTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9CT1RUT00sIGF0
dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhzcGFjZUF0dHIp
IHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9MRUZULCBhdHRy
LT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9S
SUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWxp
Z25BdHRyKSB7Ci0gICAgICAgIGFkZEhUTUxBbGlnbm1lbnQoYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRy
LCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfSEVJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVu
dExpc3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdl
RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uaW5wdXRBdHRy
KSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGlucHV0RXZlbnQsIGF0dHIpOwotICAg
IH0KLSAgICAvLyBTZWFyY2ggZmllbGQgYW5kIHNsaWRlciBhdHRyaWJ1dGVzIGFsbCBqdXN0IGNh
dXNlIHVwZGF0ZUZyb21FbGVtZW50IHRvIGJlIGNhbGxlZCB0aHJvdWdoIHN0eWxlCi0gICAgLy8g
cmVjYWxjaW5nLgotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlYXJjaEF0dHIpIHsK
LSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc2VhcmNoRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJlc3VsdHNBdHRyKSB7Ci0gICAgICAgIG1fbWF4UmVz
dWx0cyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAg
ICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYXV0b3Nh
dmVBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gaW5jcmVtZW50YWxBdHRy
IHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcGxhY2Vob2xkZXJBdHRyIHx8Ci0g
ICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbWluQXR0ciB8fAotICAgICAgICAgICAgICAg
YXR0ci0+bmFtZSgpID09IG1heEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9
PSBwcmVjaXNpb25BdHRyKSB7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0
dHIpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKFJl
bmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBjYXNl
IFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNlIFJB
TkdFOgotICAgIGNhc2UgSVNJTkRFWDoKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFE
SU86Ci0gICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBJTUFHRToKLSAgICBjYXNlIFJFU0VUOgot
ICAgIGNhc2UgRklMRToKLSAgICBjYXNlIEJVVFRPTjogICByZXR1cm4gSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OnJlbmRlcmVySXNOZWVkZWQoc3R5bGUpOwotICAgIGNhc2UgSElEREVOOiAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTElucHV0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHN3aXRj
aChtX3R5cGUpCi0gICAgewotICAgIGNhc2UgVEVYVDoKLSAgICBjYXNlIFBBU1NXT1JEOgotICAg
IGNhc2UgU0VBUkNIOgotICAgIGNhc2UgSVNJTkRFWDogIHJldHVybiBuZXcgKGFyZW5hKSBSZW5k
ZXJMaW5lRWRpdCh0aGlzKTsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0g
ICAgICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci0g
ICAgY2FzZSBTVUJNSVQ6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEJVVFRPTjoKLSAgICAg
ICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLSAgICBjYXNlIElNQUdF
OiAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVySW1hZ2VCdXR0b24odGhpcyk7Ci0gICAgY2Fz
ZSBGSUxFOiAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpbGVCdXR0b24odGhpcyk7Ci0g
ICAgY2FzZSBSQU5HRTogICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclNsaWRlcih0aGlzKTsK
LSAgICBjYXNlIEhJRERFTjogICBicmVhazsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAg
ICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsK
LSAgICBpZiAoIW1faW5pdGVkKSB7Ci0gICAgICAgIGlmICghbV9oYXZlVHlwZSkKLSAgICAgICAg
ICAgIHNldElucHV0VHlwZShnZXRBdHRyaWJ1dGUodHlwZUF0dHIpKTsKLQotICAgICAgICAvLyBG
SVhNRTogVGhpcyBuZWVkcyB0byBiZSBkeW5hbWljLCBkb2Vzbid0IGl0LCBzaW5jZSBzb21lb25l
IGNvdWxkIHNldCB0aGlzCi0gICAgICAgIC8vIGFmdGVyIGF0dGFjaG1lbnQ/Ci0gICAgICAgIERP
TVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgaWYgKCh1aW50
KSBtX3R5cGUgPD0gSVNJTkRFWCAmJiAhdmFsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8g
cmVtb3ZlIG5ld2xpbmUgc3R1ZmYuLgotICAgICAgICAgICAgUVN0cmluZyBudmFsdWU7Ci0gICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZhbC5sZW5ndGgoKTsgKytpKQot
ICAgICAgICAgICAgICAgIGlmICh2YWxbaV0gPj0gJyAnKQotICAgICAgICAgICAgICAgICAgICBu
dmFsdWUgKz0gdmFsW2ldOwotCi0gICAgICAgICAgICBpZiAodmFsLmxlbmd0aCgpICE9IG52YWx1
ZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBudmFs
dWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9pbml0ZWQgPSB0cnVlOwotICAgIH0KLQotICAg
IC8vIERpc2FsbG93IHRoZSB3aWR0aCBhdHRyaWJ1dGUgb24gaW5wdXRzIG90aGVyIHRoYW4gSElE
REVOIGFuZCBJTUFHRS4KLSAgICAvLyBEdW1iIFdlYiBzaXRlcyB3aWxsIHRyeSB0byBzZXQgdGhl
IHdpZHRoIGFzIGFuIGF0dHJpYnV0ZSBvbiBmb3JtIGNvbnRyb2xzIHRoYXQgYXJlbid0Ci0gICAg
Ly8gaW1hZ2VzIG9yIGhpZGRlbi4KLSAgICBpZiAoaGFzTWFwcGVkQXR0cmlidXRlcygpICYmIG1f
dHlwZSAhPSBISURERU4gJiYgbV90eXBlICE9IElNQUdFICYmICFnZXRBdHRyaWJ1dGUod2lkdGhB
dHRyKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y0NvZGU7Ci0gICAgICAgIHJlbW92ZUF0
dHJpYnV0ZSh3aWR0aEF0dHIsIGV4Y0NvZGUpOwotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjphdHRhY2goKTsKLQotICAgIGlmIChtX3R5cGUgPT0gSU1BR0UpIHsKLSAg
ICAgICAgaWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgbV9pbWFnZUxvYWRlciA9IG5l
dyBIVE1MSW1hZ2VMb2FkZXIodGhpcyk7Ci0gICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZy
b21FbGVtZW50KCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICBSZW5k
ZXJJbWFnZSogaW1hZ2VPYmogPSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKCkp
OwotICAgICAgICAgICAgaW1hZ2VPYmotPnNldEltYWdlKG1faW1hZ2VMb2FkZXItPmltYWdlKCkp
OyAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3aXRo
IGNhbGxpbmcgcGFzc3dvcmRGaWVsZFJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhlIHRp
bWluZwotICAgIC8vIHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVhcmx5
Ci0gICAgaWYgKG1fdHlwZSA9PSBQQVNTV09SRCkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cGFz
c3dvcmRGaWVsZEFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmRldGFj
aCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwotICAgIG1f
dmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjphbHRUZXh0KCkgY29uc3QKLXsKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9U
Ui8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvYXBwZW5kaXgvbm90ZXMuaHRtbCNhbHRnZW4KLSAg
ICAvLyBhbHNvIGhlYXZpbHkgZGlzY3Vzc2VkIGJ5IEhpeGllIG9uIGJ1Z3ppbGxhCi0gICAgLy8g
bm90ZSB0aGlzIGlzIGludGVudGlvbmFsbHkgZGlmZmVyZW50IHRvIEhUTUxJbWFnZUVsZW1lbnRJ
bXBsOjphbHRUZXh0KCkKLSAgICBET01TdHJpbmcgYWx0ID0gZ2V0QXR0cmlidXRlKGFsdEF0dHIp
OwotICAgIC8vIGZhbGwgYmFjayB0byB0aXRsZSBhdHRyaWJ1dGUKLSAgICBpZiAoYWx0LmlzTnVs
bCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICBpZiAoYWx0
LmlzTnVsbCgpKQotICAgICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICBp
ZiAoYWx0LmlzRW1wdHkoKSkKLSAgICAgICAgYWx0ID0gaW5wdXRFbGVtZW50QWx0VGV4dCgpOwot
Ci0gICAgcmV0dXJuIGFsdDsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNTdWNj
ZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0
IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNz
ZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBj
b25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBj
YW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRl
ZC4gCi0gICAgLy8gV2FzOiAobV90eXBlID09IFNVQk1JVCAmJiAhbmFtZSgpLmlzRW1wdHkoKSkK
LSAgICByZXR1cm4gIW1fZGlzYWJsZWQgJiYgKG1fdHlwZSA9PSBJTUFHRSB8fCBtX3R5cGUgPT0g
U1VCTUlUKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNBY3RpdmF0ZWRTdWJt
aXQoKSBjb25zdAotewotICAgIHJldHVybiBtX2FjdGl2ZVN1Ym1pdDsKLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAgICBt
X2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmFw
cGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCAmZW5jb2RpbmcsIGJvb2wgbXVsdGlwYXJ0KQotewot
ICAgIC8vIGltYWdlIGdlbmVyYXRlcyBpdHMgb3duIG5hbWVzCi0gICAgaWYgKG5hbWUoKS5pc0Vt
cHR5KCkgJiYgbV90eXBlICE9IElNQUdFKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBzd2l0Y2ggKG1f
dHlwZSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBQQVNTV09S
RDoKLSAgICAgICAgICAgIC8vIGFsd2F5cyBzdWNjZXNzZnVsCi0gICAgICAgICAgICBlbmNvZGlu
Zy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAg
ICAgaWYgKGNoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEo
bmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAg
ICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgLy8gdGhvc2UgYnV0dG9ucyBhcmUgbmV2ZXIgc3Vj
Y2Vzc2Z1bAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNhc2UgSU1BR0U6
Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBlbmNv
ZGluZy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieCIgOiAobmFtZSgpICsgIi54Iiks
IGNsaWNrWCgpKTsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKS5p
c0VtcHR5KCkgPyAieSIgOiAobmFtZSgpICsgIi55IiksIGNsaWNrWSgpKTsKLSAgICAgICAgICAg
ICAgICBpZiAoIW5hbWUoKS5pc0VtcHR5KCkgJiYgIXZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVh
azsKLQotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVN1Ym1p
dCkgewotICAgICAgICAgICAgICAgIERPTVN0cmluZyBlbmNfc3RyID0gdmFsdWVXaXRoRGVmYXVs
dCgpOwotICAgICAgICAgICAgICAgIGlmICghZW5jX3N0ci5pc0VtcHR5KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIGVuY19zdHIpOwotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIHsK
LSAgICAgICAgICAgIC8vIGNhbid0IHN1Ym1pdCBmaWxlIG9uIEdFVAotICAgICAgICAgICAgLy8g
ZG9uJ3Qgc3VibWl0IGlmIGRpc3BsYXk6IG5vbmUgb3IgZGlzcGxheTogaGlkZGVuCi0gICAgICAg
ICAgICBpZighbXVsdGlwYXJ0IHx8ICFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCktPnN0eWxlKCkt
PnZpc2liaWxpdHkoKSAhPSBraHRtbDo6VklTSUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIGlmIG5vIGZpbGVuYW1lIGF0IGFsbCBpcyBlbnRlcmVk
LCByZXR1cm4gc3VjY2Vzc2Z1bCwgaG93ZXZlciBlbXB0eQotICAgICAgICAgICAgLy8gbnVsbCB3
b3VsZCBiZSBtb3JlIGxvZ2ljYWwgYnV0IG5ldHNjYXBlIHBvc3RzIGFuIGVtcHR5IGZpbGUuIGFy
Z2guCi0gICAgICAgICAgICBpZiAodmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAg
ICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgUVN0cmluZygiIikpOwotICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmNvZGluZy5h
cHBlbmRGaWxlKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBlbmNvZGluZy5hcHBl
bmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZXNl
dCgpCi17Ci0gICAgaWYgKHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkpCi0gICAg
ICAgIHNldFZhbHVlKERPTVN0cmluZygpKTsKLSAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNr
ZWQpOwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZXRDaGVja2VkKGJvb2wgX2NoZWNrZWQpCi17Ci0gICAgLy8gV2luSUUg
ZG9lcyBub3QgYWxsb3cgdW5uYW1lZCByYWRpbyBidXR0b25zIHRvIGV2ZW4gYmUgY2hlY2tlZC4K
LSAgICBpZiAoY2hlY2tlZCgpID09IF9jaGVja2VkIHx8IChtX3R5cGUgPT0gUkFESU8gJiYgbmFt
ZSgpLmlzRW1wdHkoKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3R5cGUgPT0gUkFE
SU8gJiYgX2NoZWNrZWQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tl
ZCh0aGlzLCBtX2Zvcm0pOwotCi0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAg
IG1fY2hlY2tlZCA9IF9jaGVja2VkOwotICAgIHNldENoYW5nZWQoKTsKLSAgICBpZiAocmVuZGVy
ZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHRo
ZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotICAgIG9uQ2hh
bmdlKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEluZGV0ZXJtaW5hdGUo
Ym9vbCBfaW5kZXRlcm1pbmF0ZSkKLXsKLSAgICAvLyBPbmx5IGNoZWNrYm94ZXMgaG9ub3IgaW5k
ZXRlcm1pbmF0ZS4KLSAgICBpZiAobV90eXBlICE9IENIRUNLQk9YIHx8IGluZGV0ZXJtaW5hdGUo
KSA9PSBfaW5kZXRlcm1pbmF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9pbmRldGVybWlu
YXRlID0gX2luZGV0ZXJtaW5hdGU7Ci0KLSAgICBzZXRDaGFuZ2VkKCk7Ci0KLSAgICBpZiAocmVu
ZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAg
IHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjb3B5Tm9uQXR0cmlidXRlUHJvcGVydGllcyhjb25z
dCBFbGVtZW50SW1wbCAqc291cmNlKQotewotICAgIGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBs
ICpzb3VyY2VFbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudEltcGwgKj4o
c291cmNlKTsKLQotICAgIG1fdmFsdWUgPSBzb3VyY2VFbGVtLT5tX3ZhbHVlOwotICAgIG1fY2hl
Y2tlZCA9IHNvdXJjZUVsZW0tPm1fY2hlY2tlZDsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBzb3Vy
Y2VFbGVtLT5tX2luZGV0ZXJtaW5hdGU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIERPTVN0cmluZyB2YWx1ZSA9IG1fdmFsdWU7Ci0K
LSAgICAvLyBJdCdzIGltcG9ydGFudCAqbm90KiB0byBmYWxsIGJhY2sgdG8gdGhlIHZhbHVlIGF0
dHJpYnV0ZSBmb3IgZmlsZSBpbnB1dHMsCi0gICAgLy8gYmVjYXVzZSB0aGF0IHdvdWxkIGFsbG93
IGEgbWFsaWNpb3VzIHdlYiBwYWdlIHRvIHVwbG9hZCBmaWxlcyBieSBzZXR0aW5nIHRoZQotICAg
IC8vIHZhbHVlIGF0dHJpYnV0ZSBpbiBtYXJrdXAuCi0gICAgaWYgKHZhbHVlLmlzTnVsbCgpICYm
IG1fdHlwZSAhPSBGSUxFKQotICAgICAgICB2YWx1ZSA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIp
OwotCi0gICAgLy8gSWYgbm8gYXR0cmlidXRlIGV4aXN0cywgdGhlbiBqdXN0IHVzZSAib24iIG9y
ICIiIGJhc2VkIG9mZiB0aGUgY2hlY2tlZCgpIHN0YXRlIG9mIHRoZSBjb250cm9sLgotICAgIGlm
ICh2YWx1ZS5pc051bGwoKSAmJiAobV90eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9PSBSQURJ
TykpCi0gICAgICAgIHJldHVybiBET01TdHJpbmcoY2hlY2tlZCgpID8gIm9uIiA6ICIiKTsKLQot
ICAgIHJldHVybiB2YWx1ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp2
YWx1ZVdpdGhEZWZhdWx0KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdiA9IHZhbHVlKCk7Ci0g
ICAgaWYgKHYuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAg
ICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIHYgPSByZXNldEJ1dHRvbkRlZmF1bHRM
YWJlbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNVQk1J
VDoKLSAgICAgICAgICAgICAgICB2ID0gc3VibWl0QnV0dG9uRGVmYXVsdExhYmVsKCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAg
ICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGNh
c2UgSElEREVOOgotICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgIGNhc2UgSVNJ
TkRFWDoKLSAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICBjYXNlIFJBRElP
OgotICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgfQotICAgIHJldHVybiB2OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRW
YWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIGlmIChtX3R5cGUgPT0gRklMRSkg
cmV0dXJuOwotCi0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIGlmIChz
dG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKSB7Ci0gICAgICAgIG1fdmFsdWUgPSB2
YWx1ZTsKLSAgICAgICAgaWYgKG1fcmVuZGVyKQotICAgICAgICAgICAgbV9yZW5kZXItPnVwZGF0
ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgewotICAg
ICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcg
JnZhbHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRl
cmVyID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGaXJlIHRoZSAiaW5wdXQiIERPTSBldmVudC4KLSAg
ICBkaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLWJvb2wg
SFRNTElucHV0RWxlbWVudEltcGw6OnN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkg
Y29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIEJVVFRPTjoKLSAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICBjYXNlIEhJ
RERFTjoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAg
Y2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAg
Y2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoK
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LXZvaWQqIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwcmVEaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVu
dEltcGwgKmV2dCkKLXsKLSAgICAvLyBwcmV2ZW50RGVmYXVsdCBvciAicmV0dXJuIGZhbHNlIiBh
cmUgdXNlZCB0byByZXZlcnNlIHRoZSBhdXRvbWF0aWMgY2hlY2tpbmcvc2VsZWN0aW9uIHdlIGRv
IGhlcmUuCi0gICAgLy8gVGhpcyByZXN1bHQgZ2l2ZXMgdXMgZW5vdWdoIGluZm8gdG8gcGVyZm9y
bSB0aGUgInVuZG8iIGluIHBvc3REaXNwYXRjaCBvZiB0aGUgYWN0aW9uIHdlIHRha2UgaGVyZS4K
LSAgICB2b2lkKiByZXN1bHQgPSAwOyAKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBt
X3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0g
Y2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQp
LT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gpIHsKLSAg
ICAgICAgICAgIC8vIEFzIGEgd2F5IHRvIHN0b3JlIHRoZSBzdGF0ZSwgd2UgcmV0dXJuIDAgaWYg
d2Ugd2VyZSB1bmNoZWNrZWQsIDEgaWYgd2Ugd2VyZSBjaGVja2VkLCBhbmQgMiBmb3IKLSAgICAg
ICAgICAgIC8vIGluZGV0ZXJtaW5hdGUuCi0gICAgICAgICAgICBpZiAoaW5kZXRlcm1pbmF0ZSgp
KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKTB4MjsKLSAgICAgICAgICAgICAg
ICBzZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZv
aWQqKTB4MTsKLSAgICAgICAgICAgICAgICBzZXRDaGVja2VkKCFjaGVja2VkKCkpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIHJhZGlvIGJ1dHRv
bnMsIHN0b3JlIHRoZSBjdXJyZW50IHNlbGVjdGVkIHJhZGlvIG9iamVjdC4KLSAgICAgICAgICAg
IGlmIChuYW1lKCkuaXNFbXB0eSgpIHx8IGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gMDsgLy8gVW5uYW1lZCByYWRpbyBidXR0b25zIGRvbnQgZ2V0IGNoZWNrZWQuIENoZWNrZWQg
YnV0dG9ucyBqdXN0IHN0YXkgY2hlY2tlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
RklYTUU6IE5lZWQgdG8gbGVhcm4gdG8gd29yayB3aXRob3V0IGEgZm9ybS4KLQotICAgICAgICAg
ICAgLy8gV2UgcmVhbGx5IHdhbnQgcmFkaW8gZ3JvdXBzIHRvIGVuZCB1cCBpbiBzYW5lIHN0YXRl
cywgaS5lLiwgdG8gaGF2ZSBzb21ldGhpbmcgY2hlY2tlZC4KLSAgICAgICAgICAgIC8vIFRoZXJl
Zm9yZSBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSBzZWxlY3RlZCwgd2Ugd29uJ3QgYWxsb3cgdGhp
cyBhY3Rpb24gdG8gYmUgInVuZG9uZSIsIHNpbmNlCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHNv
bWUgb2JqZWN0IGluIHRoZSByYWRpbyBncm91cCB0byBhY3R1YWxseSBnZXQgc2VsZWN0ZWQuCi0g
ICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY3VyclJhZGlvID0gZ2V0RG9jdW1lbnQo
KS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAg
ICAgICAgICAgIGlmIChjdXJyUmFkaW8pIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEg
cmFkaW8gYnV0dG9uIHNlbGVjdGVkIHRoYXQgaXMgbm90IHVzLiAgQ2FjaGUgaXQgaW4gb3VyIHJl
c3VsdCBmaWVsZCBhbmQgcmVmIGl0IHNvCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4n
dCBiZSBkZXN0cm95ZWQuCi0gICAgICAgICAgICAgICAgY3VyclJhZGlvLT5yZWYoKTsKLSAgICAg
ICAgICAgICAgICByZXN1bHQgPSBjdXJyUmFkaW87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBzZXRDaGVja2VkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnBvc3REaXNwYXRjaEV2ZW50SGFuZGxl
cihFdmVudEltcGwgKmV2dCwgdm9pZCogZGF0YSkKLXsKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVD
S0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50
eXBlKCkgPT0gY2xpY2tFdmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudElt
cGwqPihldnQpLT5idXR0b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tC
T1gpIHsKLSAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIGNoZWNraW5nIHdlIGRpZCBpbiBwcmVE
aXNwYXRjaC4KLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQt
PmRlZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSAodm9pZCop
MHgyKQotICAgICAgICAgICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKHRydWUpOwotICAgICAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZChkYXRhKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBIVE1M
SW5wdXRFbGVtZW50SW1wbCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1w
bCo+KGRhdGEpOwotICAgICAgICAgICAgaWYgKGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpIHx8IGV2
dC0+ZGVmYXVsdEhhbmRsZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9y
aWdpbmFsIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBpZiBwb3NzaWJsZS4KLSAgICAgICAgICAgICAg
ICAvLyBNYWtlIHN1cmUgaXQgaXMgc3RpbGwgYSByYWRpbyBidXR0b24gYW5kIG9ubHkgZG8gdGhl
IHJlc3RvcmF0aW9uIGlmIGl0IHN0aWxsCi0gICAgICAgICAgICAgICAgLy8gYmVsb25ncyB0byBv
dXIgZ3JvdXAuCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0LT5mb3JtKCkgPT0gZm9ybSgpICYm
IGlucHV0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1dC0+bmFtZSgpID09IG5hbWUoKSkg
ewotICAgICAgICAgICAgICAgICAgICAvLyBPaywgdGhlIG9sZCByYWRpbyBidXR0b24gaXMgc3Rp
bGwgaW4gb3VyIGZvcm0gYW5kIGluIG91ciBncm91cCBhbmQgaXMgc3RpbGwgYSAKLSAgICAgICAg
ICAgICAgICAgICAgLy8gcmFkaW8gYnV0dG9uLCBzbyBpdCdzIHNhZmUgdG8gcmVzdG9yZSBzZWxl
Y3Rpb24gdG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LT5zZXRDaGVja2VkKHRydWUp
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LT5k
ZXJlZigpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlmIChtX3R5cGUg
PT0gSU1BR0UgJiYgZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9PSBjbGlja0V2
ZW50ICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIC8vIHJlY29yZCB0aGUgbW91c2UgcG9zaXRpb24g
Zm9yIHdoZW4gd2UgZ2V0IHRoZSBET01BY3RpdmF0ZSBldmVudAotICAgICAgICBNb3VzZUV2ZW50
SW1wbCAqbWUgPSBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2dCk7Ci0gICAgICAgIGlu
dCBvZmZzZXRYLCBvZmZzZXRZOwotICAgICAgICBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlvbihv
ZmZzZXRYLG9mZnNldFkpOwotICAgICAgICB4UG9zID0gbWUtPmNsaWVudFgoKS1vZmZzZXRYOwot
ICAgICAgICB5UG9zID0gbWUtPmNsaWVudFkoKS1vZmZzZXRZOwotCi0JbWUtPnNldERlZmF1bHRI
YW5kbGVkKCk7Ci0gICAgfQotCi0gICAgLy8gRE9NQWN0aXZhdGUgZXZlbnRzIGNhdXNlIHRoZSBp
bnB1dCB0byBiZSAiYWN0aXZhdGVkIiAtIGluIHRoZSBjYXNlIG9mIGltYWdlIGFuZCBzdWJtaXQg
aW5wdXRzLCB0aGlzIG1lYW5zCi0gICAgLy8gYWN0dWFsbHkgc3VibWl0dGluZyB0aGUgZm9ybS4g
Rm9yIHJlc2V0IGlucHV0cywgdGhlIGZvcm0gaXMgcmVzZXQuIFRoZXNlIGV2ZW50cyBhcmUgc2Vu
dCB3aGVuIHRoZSB1c2VyIGNsaWNrcwotICAgIC8vIG9uIHRoZSBlbGVtZW50LCBvciBwcmVzc2Vz
IGVudGVyIHdoaWxlIGl0IGlzIHRoZSBhY3RpdmUgZWxlbWVudC4gSmF2YWNzcmlwdCBjb2RlIHdp
c2hpbmcgdG8gYWN0aXZhdGUgdGhlIGVsZW1lbnQKLSAgICAvLyBtdXN0IGRpc3BhdGNoIGEgRE9N
QWN0aXZhdGUgZXZlbnQgLSBhIGNsaWNrIGV2ZW50IHdpbGwgbm90IGRvIHRoZSBqb2IuCi0gICAg
aWYgKGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQpIHsKLSAgICAgICAgaWYgKG1fdHlw
ZSA9PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCkgewotICAg
ICAgICAgICAgaWYgKCFtX2Zvcm0pCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAg
ICAgaWYgKG1fdHlwZSA9PSBSRVNFVCkKLSAgICAgICAgICAgICAgICBtX2Zvcm0tPnJlc2V0KCk7
Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKSkgewotICAg
ICAgICAgICAgICAgICAgICB4UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgeVBvcyA9IDA7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFs
c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgLy8gVXNlIGtleSBw
cmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNlIGV2ZW50cwotICAg
IC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2YgdGhlIGtleSBwcmVz
cyBldmVudC4KLSAgICBpZiAoZXZ0LT50eXBlKCkgPT0ga2V5cHJlc3NFdmVudCAmJiBldnQtPmlz
S2V5Ym9hcmRFdmVudCgpKSB7Ci0gICAgICAgIGJvb2wgY2xpY2tFbGVtZW50ID0gZmFsc2U7Ci0g
ICAgICAgIGJvb2wgY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IGZhbHNlOwotCi0gICAgICAgIERP
TVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpLT5rZXlJ
ZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSAiVSswMDAwMjAiKSB7Ci0gICAgICAg
ICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAg
ICAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFOgot
ICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNFVDoK
LSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2lt
dWxhdGUgbW91c2UgY2xpY2sgZm9yIHNwYWNlYmFyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50
cy4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEFwcEtpdCBhbHJlYWR5IGRvZXMgdGhpcyBm
b3Igc29tZSwgYnV0IG5vdCBhbGwsIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgIGNsaWNr
RWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIHVuc2VsZWN0ZWQg
cmFkaW8gaXMgdGFiYmVkIGludG8gKGJlY2F1c2UgdGhlIGVudGlyZSBncm91cCBoYXMgbm90aGlu
ZwotICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkLCBvciBiZWNhdXNlIG9mIHNvbWUgZXhw
bGljaXQgLmZvY3VzKCkgY2FsbCksIHRoZW4gYWxsb3cgc3BhY2UgdG8gY2hlY2sgaXQuCi0gICAg
ICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAg
Y2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgotICAg
ICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSQU5HRToK
LSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGtleSA9PSAiRW50ZXIiKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgICAgIGNhc2Ug
Q0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAgICAg
Y2FzZSBJU0lOREVYOgotICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAg
ICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAg
ICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNl
IGNsaWNrIG9uIHRoZSBkZWZhdWx0IGZvcm0gYnV0dG9uIGZvciBlbnRlciBmb3IgdGhlc2UgdHlw
ZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrRGVmYXVsdEZvcm1CdXR0
b24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIEZJTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgICAgICBj
YXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgICAg
ICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9m
IGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgotICAg
ICAgICAgICAgICAgICAgICBicmVhazsgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIGVudGVyIG9u
IGEgcmFkaW8gYnV0dG9uLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KG1fdHlwZSA9PSBSQURJTyAmJiAoa2V5ID09ICJVcCIgfHwga2V5ID09ICJEb3duIiB8fCBrZXkg
PT0gIkxlZnQiIHx8IGtleSA9PSAiUmlnaHQiKSkgewotICAgICAgICAgICAgLy8gTGVmdCBhbmQg
dXAgbWVhbiAicHJldmlvdXMgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFJpZ2h0IGFu
ZCBkb3duIG1lYW4gIm5leHQgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFRlc3RlZCBp
biBXaW5JRSwgYW5kIGV2ZW4gZm9yIFJUTCwgbGVmdCBzdGlsbCBtZWFucyBwcmV2aW91cyByYWRp
byBidXR0b24gKGFuZCBzbyBtb3ZlcwotICAgICAgICAgICAgLy8gdG8gdGhlIHJpZ2h0KS4gIFNl
ZW1zIHN0cmFuZ2UsIGJ1dCB3ZSdsbCBtYXRjaCBpdC4KLSAgICAgICAgICAgIGJvb2wgZm9yd2Fy
ZCA9IChrZXkgPT0gIkRvd24iIHx8IGtleSA9PSAiUmlnaHQiKTsKLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgLy8gV2UgY2FuIG9ubHkgc3RheSB3aXRoaW4gdGhlIGZvcm0ncyBjaGlsZHJlbiBp
ZiB0aGUgZm9ybSBoYXNuJ3QgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiBiZWNhdXNlCi0gICAgICAg
ICAgICAvLyBvZiBtYWxmb3JtZWQgSFRNTC4KLSAgICAgICAgICAgIE5vZGVJbXBsKiBuID0gdGhp
czsKLSAgICAgICAgICAgIHdoaWxlICgobiA9IChmb3J3YXJkID8gbi0+dHJhdmVyc2VOZXh0Tm9k
ZSgpIDogbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
T25jZSB3ZSBlbmNvdW50ZXIgYSBmb3JtIGVsZW1lbnQsIHdlIGtub3cgd2UncmUgdGhyb3VnaC4K
LSAgICAgICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8v
IExvb2sgZm9yIG1vcmUgcmFkaW8gYnV0dG9ucy4KLSAgICAgICAgICAgICAgICBpZiAobi0+aGFz
VGFnTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVu
dEltcGwqIGVsdCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4obik7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChlbHQtPmZvcm0oKSAhPSBtX2Zvcm0pCi0gICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUo
aW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1w
bCogaW5wdXRFbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RWx0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAm
JiBpbnB1dEVsdC0+bmFtZSgpID09IG5hbWUoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlucHV0RWx0LT5pc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW5wdXRFbHQtPnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZ2V0RG9jdW1lbnQoKS0+c2V0Rm9jdXNOb2RlKGlucHV0RWx0KTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbnB1dEVsdC0+Y2xpY2soZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAoY2xpY2tFbGVtZW50KSB7Ci0gICAgICAgICAgICBjbGljayhmYWxz
ZSk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0gZWxz
ZSBpZiAoY2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiAmJiBtX2Zvcm0pIHsKLSAgICAgICAgICAgIG1f
Zm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQo
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpk
ZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6
OmlzRWRpdGFibGUoKQotewotICAgIHJldHVybiAoKG1fdHlwZSA9PSBURVhUKSB8fCAobV90eXBl
ID09IFBBU1NXT1JEKSB8fAotICAgICAgICAgICAgKG1fdHlwZSA9PSBTRUFSQ0gpIHx8IChtX3R5
cGUgPT0gSVNJTkRFWCkgfHwgKG1fdHlwZSA9PSBGSUxFKSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0
RWxlbWVudEltcGw6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIChhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cik7Ci19Ci0KLURPTVN0cmluZyBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6
OnNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6
ZGVmYXVsdENoZWNrZWQoKSBjb25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKGNoZWNr
ZWRBdHRyKS5pc051bGwoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0RGVm
YXVsdENoZWNrZWQoYm9vbCBkZWZhdWx0Q2hlY2tlZCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hl
Y2tlZEF0dHIsIGRlZmF1bHRDaGVja2VkID8gIiIgOiAwKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjphY2NlcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoYWNjZXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjY2Vw
dChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2NlcHRBdHRy
LCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQot
Ci1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFsaWduKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVu
dEltcGw6OnNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudElt
cGw6OmFsdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWx0KGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsdEF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6c2V0TWF4TGVuZ3RoKGludCBfbWF4TGVuZ3RoKQotewotICAgIHNl
dEF0dHJpYnV0ZShtYXhsZW5ndGhBdHRyLCBRU3RyaW5nOjpudW1iZXIoX21heExlbmd0aCkpOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTaXplKHVuc2lnbmVkIF9zaXplKQot
ewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9zaXplKSk7Ci19
Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3JjKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoZ2V0QXR0cmlidXRlKHNyY0F0dHIpKTsK
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U3JjKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp1c2VNYXAoKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUodXNlbWFwQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6
OnNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh1
c2VtYXBBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExhYmVs
RWxlbWVudEltcGw6OkhUTUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAg
IDogSFRNTEVsZW1lbnRJbXBsKGxhYmVsVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxMYWJlbEVsZW1l
bnRJbXBsOjp+SFRNTExhYmVsRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMYWJlbEVs
ZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBI
VE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1FbGVtZW50
SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm1FbGVtZW50KCkKLXsKLSAgICBET01TdHJp
bmcgZm9ybUVsZW1lbnRJZCA9IGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLSAgICBpZiAoZm9ybUVs
ZW1lbnRJZC5pc051bGwoKSkgewotICAgICAgICAvLyBTZWFyY2ggY2hpbGRyZW4gb2YgdGhlIGxh
YmVsIGVsZW1lbnQgZm9yIGEgZm9ybSBlbGVtZW50LgotICAgICAgICBOb2RlSW1wbCAqbm9kZSA9
IHRoaXM7Ci0gICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhp
cykpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAg
ICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1l
bnRJbXBsICo+KG5vZGUpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5pc0dlbmVyaWNG
b3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGZv
cm1FbGVtZW50SWQuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZ2V0
RG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZm9ybUVsZW1lbnRJZCk7Ci19Ci0KLXZvaWQgSFRN
TExhYmVsRWxlbWVudEltcGw6OmZvY3VzKCkKLXsKLSAgICBpZiAoRWxlbWVudEltcGwgKmVsZW1l
bnQgPSBmb3JtRWxlbWVudCgpKQotICAgICAgICBlbGVtZW50LT5mb2N1cygpOwotfQotCi12b2lk
IEhUTUxMYWJlbEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVt
ZW50KQotewotICAgIEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKTsKLSAgICBp
ZiAoZWxlbWVudCkKLSAgICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVs
ZW1lbnQpOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MTGFiZWxFbGVtZW50SW1wbDo6
Zm9ybSgpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKTsgcCAhPSAwOyBw
ID0gcC0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChwLT5oYXNUYWdOYW1lKGZvcm1UYWcp
KQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudEltcGwgKj4o
cCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotCi1ET01TdHJpbmcgSFRNTExhYmVs
RWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0QWNj
ZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpo
dG1sRm9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZvckF0dHIpOwotfQot
Ci12b2lkIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpzZXRIdG1sRm9yKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGZvckF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MTGVnZW5kRWxlbWVudEltcGw6OkhUTUxMZWdlbmRFbGVtZW50
SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLTogSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwobGVnZW5kVGFnLCBkb2MsIGYpCi17Ci19Ci0KLUhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6fkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRN
TExlZ2VuZEVsZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Y3JlYXRlUmVu
ZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0
dXJuIG5ldyAoYXJlbmEpIFJlbmRlckxlZ2VuZCh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxM
ZWdlbmRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJsZWdlbmQiOwot
fQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAot
ewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRN
TExlZ2VuZEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJp
bmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6
c2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxp
Z25BdHRyLCB2YWx1ZSk7Ci19Ci0KLUVsZW1lbnRJbXBsICpIVE1MTGVnZW5kRWxlbWVudEltcGw6
OmZvcm1FbGVtZW50KCkKLXsKLSAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgZmllbGRzZXQgYmVs
b25naW5nIHRvIHRoaXMgbGVnZW5kLgotICAgIE5vZGVJbXBsICpmaWVsZHNldCA9IHBhcmVudE5v
ZGUoKTsKLSAgICB3aGlsZSAoZmllbGRzZXQgJiYgIWZpZWxkc2V0LT5oYXNUYWdOYW1lKGZpZWxk
c2V0VGFnKSkKLSAgICAgICAgZmllbGRzZXQgPSBmaWVsZHNldC0+cGFyZW50Tm9kZSgpOwotICAg
IGlmICghZmllbGRzZXQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gRmluZCBmaXJzdCBm
b3JtIGVsZW1lbnQgaW5zaWRlIHRoZSBmaWVsZHNldC4KLSAgICAvLyBGSVhNRTogU2hvdWxkIHdl
IGNhcmUgYWJvdXQgdGFiaW5kZXg/Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBmaWVsZHNldDsKLSAg
ICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKGZpZWxkc2V0KSkpIHsKLSAg
ICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgSFRNTEVsZW1l
bnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpOwot
ICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5oYXNMb2NhbE5hbWUobGVnZW5kVGFnKSAmJiBlbGVt
ZW50LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVt
ZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTExl
Z2VuZEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50
ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBI
VE1MTGVnZW5kRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1l
bnQpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAg
ICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNlbGVjdEVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAg
IDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoc2VsZWN0VGFnLCBkb2MsIGYpLCBtX29wdGlv
bnMoMCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNl
bGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwodGFnTmFtZSwgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgpOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6aW5pdCgpCi17Ci0gICAgbV9vcHRpb25z
ID0gMDsKLSAgICBtX211bHRpcGxlID0gZmFsc2U7Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSBm
YWxzZTsKLSAgICAvLyAwIG1lYW5zIGludmFsaWQgKGkuZS4gbm90IHNldCkKLSAgICBtX3NpemUg
PSAwOwotICAgIG1fbWlud2lkdGggPSAwOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6On5I
VE1MU2VsZWN0RWxlbWVudEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1
bWVudCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci0gICAgaWYgKG1fb3B0aW9u
cykgewotICAgICAgICBtX29wdGlvbnMtPmRldGFjaCgpOwotICAgICAgICBtX29wdGlvbnMtPmRl
cmVmKCk7Ci0gICAgfQotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hlY2tEVEQo
Y29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aXNUZXh0
Tm9kZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhh
c1RhZ05hbWUob3B0Z3JvdXBUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGhyVGFnKSB8fAot
ICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi12b2lkIEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAg
ICBpZiAoaGFzQ2hhbmdlZENoaWxkKCkgJiYgbV9yZW5kZXIpIHsKLSAgICAgICAgc3RhdGljX2Nh
c3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1
ZSk7Ci0gICAgfQotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxl
KCBjaCApOwotfQotCi0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnR5cGUoKSBj
b25zdAotewotICAgIHJldHVybiAobV9tdWx0aXBsZSA/ICJzZWxlY3QtbXVsdGlwbGUiIDogInNl
bGVjdC1vbmUiKTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2VsZWN0ZWRJbmRl
eCgpIGNvbnN0Ci17Ci0gICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG9wdGlv
biBzZWxlY3RlZAotICAgIHVpbnQgbyA9IDA7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1w
bCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVs
ZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgICAgIHJldHVy
biBvOwotICAgICAgICAgICAgbysrOwotICAgICAgICB9Ci0gICAgfQotICAgIFFfQVNTRVJUKG1f
bXVsdGlwbGUpOwotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OnNldFNlbGVjdGVkSW5kZXgoIGludCAgaW5kZXggKQotewotICAgIC8vIGRlc2VsZWN0IGFs
bCBvdGhlciBvcHRpb25zIGFuZCBzZWxlY3Qgb25seSB0aGUgbmV3IG9uZQotICAgIFFNZW1BcnJh
eTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBsaXN0SW5k
ZXg7Ci0gICAgZm9yIChsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBpbnQoaXRlbXMuc2l6ZSgp
KTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnRJbXBsKj4oaXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICB9Ci0g
ICAgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoaW5kZXgpOwotICAgIGlmIChsaXN0SW5k
ZXggPj0gMCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRl
bXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKHRydWUpOwotCi0gICAgc2V0Q2hhbmdlZCh0cnVl
KTsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAg
ICBpbnQgbGVuID0gMDsKLSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1w
bCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUo
KTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykp
Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICB9Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotdm9pZCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZCggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBIVE1M
RWxlbWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBSZWZQdHI8
SFRNTEVsZW1lbnRJbXBsPiBwcm90ZWN0TmV3Q2hpbGQoZWxlbWVudCk7IC8vIG1ha2Ugc3VyZSB0
aGUgZWxlbWVudCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAg
ICBpZiAoIWVsZW1lbnQgfHwgIShlbGVtZW50LT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSB8fCBl
bGVtZW50LT5oYXNMb2NhbE5hbWUoaHJUYWcpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW5z
ZXJ0QmVmb3JlKGVsZW1lbnQsIGJlZm9yZSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCFleGNl
cHRpb25jb2RlKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotdm9pZCBIVE1M
U2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZSggaW50IGluZGV4ICkKLXsKLSAgICBpbnQgZXhjZXB0
aW9uY29kZSA9IDA7Ci0gICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4
KTsKLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIGlmKGxpc3RJbmRleCA8IDAgfHwgaW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0g
ICAgICAgIHJldHVybjsgLy8gIyMjIHdoYXQgc2hvdWxkIHdlIGRvID8gcmVtb3ZlIHRoZSBsYXN0
IGl0ZW0/Ci0KLSAgICBOb2RlSW1wbCAqaXRlbSA9IGl0ZW1zW2xpc3RJbmRleF07Ci0gICAgaXRl
bS0+cmVmKCk7Ci0gICAgcmVtb3ZlQ2hpbGQoaXRlbSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaXRl
bS0+ZGVyZWYoKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNM
aXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6dmFsdWUo
KQotewotICAgIHVpbnQgaTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMg
PSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsK
LSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNf
Y2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAg
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNb
aV0pLT52YWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gRE9NU3RyaW5nKCIiKTsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgaWYgKHZhbHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gZmlu
ZCB0aGUgb3B0aW9uIHdpdGggdmFsdWUoKSBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVyCi0g
ICAgLy8gYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgIFFNZW1BcnJheTxI
VE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNM
b2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihpdGVtc1tpXSktPnZhbHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7Ci0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQotUVN0cmluZyBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OnN0YXRlKCkKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKLQotICAgIFFD
aGFyIHN0YXRlQ2hhcnNbbF07Ci0gICAgCi0gICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykK
LSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpICYmIHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAg
ICAgICAgIHN0YXRlQ2hhcnNbaV0gPSAnWCc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0
YXRlQ2hhcnNbaV0gPSAnLic7Ci0gICAgUVN0cmluZyBzdGF0ZShzdGF0ZUNoYXJzLCBsKTsKLQot
ICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKSArIHN0YXRlOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0
ICZfc3RhdGVzKQotewotICAgIFFTdHJpbmcgX3N0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKF9zdGF0ZXMpOwotICAgIGlmIChfc3RhdGUuaXNOdWxs
KCkpIHJldHVybjsKLQotICAgIHJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgUVN0cmluZyBzdGF0
ZSA9IF9zdGF0ZTsKLSAgICBpZighc3RhdGUuaXNFbXB0eSgpICYmICFzdGF0ZS5jb250YWlucygn
WCcpICYmICFtX211bHRpcGxlKSB7Ci0gICAgICAgIHFXYXJuaW5nKCJzaG91bGQgbm90IGhhcHBl
biBpbiByZXN0b3JlU3RhdGUhIik7Ci0gICAgICAgIC8vIEtXUVN0cmluZyBkb2Vzbid0IHN1cHBv
cnQgdGhpcyBvcGVyYXRpb24uIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhbnl3YXkuCi0gICAgICAg
IC8vc3RhdGVbMF0gPSAnWCc7Ci0gICAgfQotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1w
bCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0g
ICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotICAgICAgICBpZihpdGVtc1tpXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1w
bCogb2UgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0g
ICAgICAgICAgICBvZS0+c2V0U2VsZWN0ZWQoc3RhdGVbaV0gPT0gJ1gnKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpy
ZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0g
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdDaGlsZCxyZWZDaGls
ZCwgZXhjZXB0aW9uY29kZSApOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAgc2V0
UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBO
b2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwg
KnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQobmV3Q2hp
bGQsb2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0g
ICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5v
ZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9s
ZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlv
bmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJ
dGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxl
bWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhj
ZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHNldENoYW5n
ZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwqIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHNldFJlY2Fs
Y0xpc3RJdGVtcygpOwotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YWRk
Q2hpbGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0
ci0+bmFtZSgpID09IHNpemVBdHRyKSB7Ci0gICAgICAgIG1fc2l6ZSA9IGtNYXgoYXR0ci0+dmFs
dWUoKS50b0ludCgpLCAxKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0
dHIpIHsKLSAgICAgICAgbV9taW53aWR0aCA9IGtNYXgoIGF0dHItPnZhbHVlKCkudG9JbnQoKSwg
MCApOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG11bHRpcGxlQXR0cikgewotICAg
ICAgICBtX211bHRpcGxlID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZv
ciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIp
IHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1M
RXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFu
Z2VFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpI
VE1MU2VsZWN0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwg
UmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTZWxl
Y3QodGhpcyk7Ci19Ci0KLWJvb2wgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0
YShGb3JtRGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIGJvb2wgc3VjY2Vz
c2Z1bCA9IGZhbHNlOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxp
c3RJdGVtcygpOwotCi0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXpl
KCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcp
KSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGlmIChv
cHRpb24tPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBl
bmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNz
ZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICMj
IyB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4uIG1ha2Ugc3VyZSB0aGF0IHdlIHNlbGVjdCB0
aGUgZmlyc3Qgb3B0aW9uCi0gICAgLy8gaW4gYW55IGNhc2UuIG90aGVyd2lzZSB3ZSBoYXZlIG5v
IGNvbnNpc3RlbmN5IHdpdGggdGhlIERPTSBpbnRlcmZhY2UuIEZJWE1FIQotICAgIC8vIHdlIHJl
dHVybiB0aGUgZmlyc3Qgb25lIGlmIGl0IHdhcyBhIGNvbWJvYm94IHNlbGVjdAotICAgIGlmICgh
c3VjY2Vzc2Z1bCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSAmJiBpdGVtcy5zaXplKCkg
JiYKLSAgICAgICAgKGl0ZW1zWzBdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkpIHsKLSAgICAg
ICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudEltcGwqPihpdGVtc1swXSk7Ci0gICAgICAgIGlmIChvcHRpb24tPnZhbHVlKCkuaXNO
dWxsKCkpCi0gICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgb3B0
aW9uLT50ZXh0KCkucXN0cmluZygpLnN0cmlwV2hpdGVTcGFjZSgpKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dmFs
dWUoKSk7Ci0gICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBz
dWNjZXNzZnVsOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25Ub0xpc3RJ
bmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50
SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKG9wdGlvbkluZGV4IDwgMCB8fCBv
cHRpb25JbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0g
ICAgaW50IGxpc3RJbmRleCA9IDA7Ci0gICAgaW50IG9wdGlvbkluZGV4MiA9IDA7Ci0gICAgZm9y
ICg7Ci0gICAgICAgICBvcHRpb25JbmRleDIgPCBpbnQoaXRlbXMuc2l6ZSgpKSAmJiBvcHRpb25J
bmRleDIgPD0gb3B0aW9uSW5kZXg7Ci0gICAgICAgICBsaXN0SW5kZXgrKykgeyAvLyBub3QgYSB0
eXBvIQotICAgICAgICBpZiAoaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRh
ZykpCi0gICAgICAgICAgICBvcHRpb25JbmRleDIrKzsKLSAgICB9Ci0gICAgbGlzdEluZGV4LS07
Ci0gICAgcmV0dXJuIGxpc3RJbmRleDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6
bGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3QKLXsKLSAgICBRTWVtQXJyYXk8
SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZiAobGlzdEluZGV4
IDwgMCB8fCBsaXN0SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkgfHwKLSAgICAgICAgIWl0ZW1z
W2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICByZXR1cm4gLTE7
Ci0KLSAgICBpbnQgb3B0aW9uSW5kZXggPSAwOyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9uIG5v
dCBjb3VudGluZyBPUFRHUk9VUCBlbnRyaWVzIHRoYXQgbWF5IGJlIGluIGxpc3QKLSAgICBpbnQg
aTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdEluZGV4OyBpKyspCi0gICAgICAgIGlmIChpdGVt
c1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBvcHRpb25JbmRleCsr
OwotICAgIHJldHVybiBvcHRpb25JbmRleDsKLX0KLQotLy8gRklYTUUgNDE5Nzk5NzogdGhpcyBt
ZXRob2QgaXMgdXNlZCBieSB0aGUgcHVibGljIEFQSSAtW0RPTUhUTUxTZWxlY3RFbGVtZW50IG9w
dGlvbnNdLCBidXQgYWx3YXlzIHJldHVybnMKLS8vIGFuIGVtcHR5IGxpc3QuCi1IVE1MT3B0aW9u
c0NvbGxlY3Rpb25JbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6Om9wdGlvbnMoKQotewotICAg
IGlmICghbV9vcHRpb25zKSB7Ci0gICAgICAgIG1fb3B0aW9ucyA9IG5ldyBIVE1MT3B0aW9uc0Nv
bGxlY3Rpb25JbXBsKHRoaXMpOwotICAgICAgICBtX29wdGlvbnMtPnJlZigpOwotICAgIH0KLSAg
ICByZXR1cm4gbV9vcHRpb25zOwotfQotCi0vLyBGSVhNRTogRGVsZXRlIG9uY2UgdGhlIGFib3Zl
IGZ1bmN0aW9uIGlzIHdvcmtpbmcgd2VsbCBlbm91Z2ggdG8gdXNlIGZvciByZWFsLgotUmVmUHRy
PEhUTUxDb2xsZWN0aW9uSW1wbD4gSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zSFRNTENv
bGxlY3Rpb24oKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcg
SFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6U0VMRUNUX09QVElP
TlMpKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlY2FsY0xpc3RJdGVtcygp
Ci17Ci0gICAgTm9kZUltcGwqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7Ci0gICAgbV9saXN0SXRl
bXMucmVzaXplKDApOwotICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCogZm91bmRTZWxlY3RlZCA9
IDA7Ci0gICAgd2hpbGUoY3VycmVudCkgewotICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFt
ZShvcHRncm91cFRhZykgJiYgY3VycmVudC0+Zmlyc3RDaGlsZCgpKSB7Ci0gICAgICAgICAgICAv
LyAjIyMgd2hhdCBpZiBvcHRncm91cCBjb250YWlucyBqdXN0IGNvbW1lbnRzPyBkb24ndCB3YW50
IG9uZSBvZiBubyBvcHRpb25zIGluIGl0Li4uCi0gICAgICAgICAgICBtX2xpc3RJdGVtcy5yZXNp
emUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9saXN0
SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7
Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAgICB9
Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAg
ICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAg
ICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxl
bWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIGlmICghZm91bmRTZWxlY3RlZCAmJiAh
bV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSkgewotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0
ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAg
ICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUgJiYg
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCktPnNlbGVjdGVkKCkp
IHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0g
ICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVt
ZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlm
IChjdXJyZW50LT5oYXNUYWdOYW1lKGhyVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRlbXMu
cmVzaXplKG1fbGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21f
bGlzdEl0ZW1zLnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJl
bnQpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsICpwYXJlbnQgPSBjdXJyZW50LT5wYXJl
bnROb2RlKCk7Ci0gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOwotICAg
ICAgICBpZiAoIWN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gdGhpcykKLSAg
ICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50LT5uZXh0U2libGluZygpOwotICAgICAgICB9
Ci0gICAgfQotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFJlY2FsY0xpc3RJ
dGVtcygpOwotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdl
ZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0UmVjYWxjTGlzdEl0ZW1z
KCkKLXsKLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQot
ICAgICAgICBzdGF0aWNfY2FzdDxraHRtbDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRP
cHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1w
bCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkg
PCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlv
biA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAg
ICAgICAgIGJvb2wgc2VsZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0
cikuaXNOdWxsKCkpOwotICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZChzZWxlY3RlZCk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCBtX3JlbmRlciApCi0gICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsK
LSAgICBzZXRDaGFuZ2VkKCB0cnVlICk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
Ojpub3RpZnlPcHRpb25TZWxlY3RlZChIVE1MT3B0aW9uRWxlbWVudEltcGwgKnNlbGVjdGVkT3B0
aW9uLCBib29sIHNlbGVjdGVkKQotewotICAgIGlmIChzZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSkg
ewotICAgICAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucwotICAgICAgICBRTWVtQXJy
YXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICAgICAgdWludCBp
OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAg
ICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5tX3NlbGVj
dGVkID0gKGl0ZW1zW2ldID09IHNlbGVjdGVkT3B0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAg
ICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNlbGVjdCo+KG1fcmVu
ZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7
Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2
ZW50SW1wbCAqZXZ0KQotewotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBz
ZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3Mg
dGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+
dHlwZSgpID09IGtleXByZXNzRXZlbnQpIHsKLSAgICAKLSAgICAgICAgaWYgKCFtX2Zvcm0gfHwg
IW1fcmVuZGVyIHx8ICFldnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICAKLSAgICAgICAgRE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtleWJvYXJk
RXZlbnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlm
IChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgbV9mb3JtLT5zdWJtaXRDbGljaygpOwot
ICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgfQot
ICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7
Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBz
ZW5kVG9BbnlFbGVtZW50KQotewotICAgIGZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsOjpzZXRNdWx0aXBsZShib29sIG11bHRpcGxlKQotewotICAgIHNldEF0dHJpYnV0
ZShtdWx0aXBsZUF0dHIsIG11bHRpcGxlID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnNldFNpemUoaW50IHNpemUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNpemVB
dHRyLCBRU3RyaW5nOjpudW1iZXIoc2l6ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LUhUTUxLZXlnZW5FbGVtZW50SW1wbDo6SFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3VtZW50SW1w
bCogZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsKiBmKQotICAgIDogSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsKGtleWdlblRhZywgZG9jLCBmKQotewotICAgIFFTdHJpbmdMaXN0IGtleXMgPSBLU1NMS2V5
R2VuOjpzdXBwb3J0ZWRLZXlTaXplcygpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9y
IGkgPSBrZXlzLmJlZ2luKCk7IGkgIT0ga2V5cy5lbmQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxP
cHRpb25FbGVtZW50SW1wbCogbyA9IG5ldyBIVE1MT3B0aW9uRWxlbWVudEltcGwoZG9jLCBmb3Jt
KCkpOwotICAgICAgICBhZGRDaGlsZChvKTsKLSAgICAgICAgby0+YWRkQ2hpbGQobmV3IFRleHRJ
bXBsKGRvYywgRE9NU3RyaW5nKCppKSkpOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIEhUTUxLZXln
ZW5FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJrZXlnZW4iOwotfQot
Ci12b2lkIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGNoYWxsZW5n
ZUF0dHIpCi0gICAgICAgIG1fY2hhbGxlbmdlID0gYXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0ga2V5dHlwZUF0dHIpCi0gICAgICAgIG1fa2V5VHlwZSA9IGF0dHIt
PnZhbHVlKCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBza2lwIEhUTUxTZWxlY3RFbGVtZW50SW1w
bCBwYXJzaW5nIQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEtleWdlbkVsZW1lbnRJbXBsOjphcHBl
bmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIC8v
IE9ubHkgUlNBIGlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuCi0gICAgaWYgKCFtX2tleVR5cGUu
aXNOdWxsKCkgJiYgIWVxdWFsSWdub3JpbmdDYXNlKG1fa2V5VHlwZSwgInJzYSIpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgUVN0cmluZyB2YWx1ZSA9IEtTU0xLZXlHZW46OnNpZ25lZFB1
YmxpY0tleUFuZENoYWxsZW5nZVN0cmluZyhzZWxlY3RlZEluZGV4KCksIG1fY2hhbGxlbmdlLnFz
dHJpbmcoKSwgZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKS0+YmFzZVVSTCgpKTsKLSAgICBpZiAodmFs
dWUuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGVkX3ZhbHVlcy5h
cHBlbmREYXRhKG5hbWUoKSwgdmFsdWUudXRmOCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6SFRNTE9wdEdy
b3VwRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYp
Ci0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChvcHRncm91cFRhZywgZG9jLCBmKQot
ewotfQotCi1IVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6fkhUTUxPcHRHcm91cEVsZW1lbnRJbXBs
KCkKLXsKLX0KLQotYm9vbCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBj
b25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIm9wdGdyb3VwIjsKLX0KLQot
Tm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1w
bCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsK
LSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2Vy
dEJlZm9yZShuZXdDaGlsZCxyZWZDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCAhZXhj
ZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlcGxhY2VD
aGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsK
LSAgICBpZighZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwot
ICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1w
bDo6cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSAp
Ci17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpy
ZW1vdmVDaGlsZChvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25j
b2RlICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQgKCBO
b2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwg
KnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZChuZXdDaGls
ZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgcmVj
YWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBI
VE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewot
ICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6YWRkQ2hpbGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRy
KQotewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShhdHRyKTsKLSAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdEdy
b3VwRWxlbWVudEltcGw6OnJlY2FsY1NlbGVjdE9wdGlvbnMoKQotewotICAgIE5vZGVJbXBsICpz
ZWxlY3QgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNU
YWdOYW1lKHNlbGVjdFRhZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgp
OwotICAgIGlmIChzZWxlY3QpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50
SW1wbCo+KHNlbGVjdCktPnNldFJlY2FsY0xpc3RJdGVtcygpOwotfQotCi1ET01TdHJpbmcgSFRN
TE9wdEdyb3VwRWxlbWVudEltcGw6OmxhYmVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGxhYmVsQXR0cik7Ci19Ci0KLXZvaWQgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnNl
dExhYmVsKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxhYmVs
QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRpb25FbGVt
ZW50SW1wbDo6SFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0aW9u
VGFnLCBkb2MsIGYpCi17Ci0gICAgbV9zZWxlY3RlZCA9IGZhbHNlOwotfQotCi1ib29sIEhUTUxP
cHRpb25FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuICJvcHRpb24iOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJ
bXBsOjp0ZXh0KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdGV4dDsKLQotICAgIC8vIFdpbklF
IGRvZXMgbm90IHVzZSB0aGUgbGFiZWwgYXR0cmlidXRlLCBzbyBhcyBhIHF1aXJrLCB3ZSBpZ25v
cmUgaXQuCi0gICAgaWYgKGdldERvY3VtZW50KCkgJiYgIWdldERvY3VtZW50KCktPmluQ29tcGF0
TW9kZSgpKSB7Ci0gICAgICAgIERPTVN0cmluZyB0ZXh0ID0gZ2V0QXR0cmlidXRlKGxhYmVsQXR0
cik7Ci0gICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdGV4
dDsKLSAgICB9Ci0KLSAgICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXMtPmZpcnN0Q2hpbGQoKTsK
LSAgICB3aGlsZSAobikgewotICAgICAgICBpZiAobi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhU
X05PREUgfHwgbi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREUpCi0gICAg
ICAgICAgICB0ZXh0ICs9IG4tPm5vZGVWYWx1ZSgpOwotICAgICAgICAvLyBza2lwIHNjcmlwdCBj
b250ZW50Ci0gICAgICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkgJiYgbi0+aGFzVGFnTmFtZShI
VE1MTmFtZXM6OnNjcmlwdFRhZykpCi0gICAgICAgICAgICBuID0gbi0+dHJhdmVyc2VOZXh0U2li
bGluZyh0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4
dE5vZGUodGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRleHQ7Ci19Ci0KLXZvaWQgSFRNTE9w
dGlvbkVsZW1lbnRJbXBsOjpzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmdGV4dCwgaW50ICZleGNl
cHRpb24pCi17Ci0gICAgLy8gSGFuZGxlIHRoZSBjb21tb24gc3BlY2lhbCBjYXNlIHdoZXJlIHRo
ZXJlJ3MgZXhhY3RseSAxIGNoaWxkIG5vZGUsIGFuZCBpdCdzIGEgdGV4dCBub2RlLgotICAgIE5v
ZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlz
VGV4dE5vZGUoKSAmJiAhY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgc3RhdGljX2Nh
c3Q8VGV4dEltcGwgKj4oY2hpbGQpLT5zZXREYXRhKHRleHQsIGV4Y2VwdGlvbik7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICByZW1vdmVDaGlsZHJlbigpOwotICAgIGFwcGVuZENoaWxk
KG5ldyBUZXh0SW1wbChnZXREb2N1bWVudCgpLCB0ZXh0KSwgZXhjZXB0aW9uKTsKLX0KLQotaW50
IEhUTUxPcHRpb25FbGVtZW50SW1wbDo6aW5kZXgoKSBjb25zdAotewotICAgIC8vIExldCdzIGRv
IHRoaXMgZHluYW1pY2FsbHkuIE1pZ2h0IGJlIGEgYml0IHNsb3csIGJ1dCB3ZSdyZSBzdXJlCi0g
ICAgLy8gd2Ugd29uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBhIG1lbWJlciB2YXJpYWJsZSBpbiBzb21l
IGNhc2VzLi4uCi0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3Qo
KTsKLSAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsID0gaXRlbXMuY291
bnQoKTsKLSAgICAgICAgaW50IG9wdGlvbkluZGV4ID0gMDsKLSAgICAgICAgZm9yKGludCBpID0g
MDsgaSA8IGw7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudEltcGwqPihpdGVtc1tpXSkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIG9wdGlvbkluZGV4OwotICAgICAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9w
dGlvbkVsZW1lbnRJbXBsOjpzZXRJbmRleChpbnQsIGludCAmZXhjZXB0aW9uKQotewotICAgIGV4
Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAg
IC8vICMjIwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgp
ID09IHNlbGVjdGVkQXR0cikKLSAgICAgICAgbV9zZWxlY3RlZCA9ICghYXR0ci0+aXNOdWxsKCkp
OwotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpCi0gICAgICAgIG1fdmFs
dWUgPSBhdHRyLT52YWx1ZSgpOwotICAgIGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRN
TE9wdGlvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCAhbV92YWx1ZS5p
c051bGwoKSApCi0gICAgICAgIHJldHVybiBtX3ZhbHVlOwotICAgIC8vIFVzZSB0aGUgdGV4dCBp
ZiB0aGUgdmFsdWUgd2Fzbid0IHNldC4KLSAgICByZXR1cm4gdGV4dCgpLnFzdHJpbmcoKS5zdHJp
cFdoaXRlU3BhY2UoKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFZhbHVl
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwg
dmFsdWUpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0U2VsZWN0ZWQoYm9v
bCBfc2VsZWN0ZWQpCi17Ci0gICAgaWYobV9zZWxlY3RlZCA9PSBfc2VsZWN0ZWQpCi0gICAgICAg
IHJldHVybjsKLSAgICBtX3NlbGVjdGVkID0gX3NlbGVjdGVkOwotICAgIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICAgaWYgKHNlbGVjdCkKLSAgICAgICAg
c2VsZWN0LT5ub3RpZnlPcHRpb25TZWxlY3RlZCh0aGlzLF9zZWxlY3RlZCk7Ci19Ci0KLXZvaWQg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgIGlmIChzZWxlY3QpCi0gICAg
ICAgc2VsZWN0LT5jaGlsZHJlbkNoYW5nZWQoKTsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBs
ICpIVE1MT3B0aW9uRWxlbWVudEltcGw6OmdldFNlbGVjdCgpIGNvbnN0Ci17Ci0gICAgTm9kZUlt
cGwgKnNlbGVjdCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3Qt
Pmhhc1RhZ05hbWUoc2VsZWN0VGFnKSkKLSAgICAgICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnRO
b2RlKCk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHNl
bGVjdCk7Ci19Ci0KLWJvb2wgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpkZWZhdWx0U2VsZWN0ZWQo
KSBjb25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxs
KCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXREZWZhdWx0U2VsZWN0ZWQo
Ym9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIsIGIgPyAiIiA6IDApOwot
fQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUobGFiZWxBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwodGV4dGFyZWFUYWcsIGRvYywgZiksIG1fdmFsdWVJc1ZhbGlkKGZhbHNlKSwg
bV92YWx1ZU1hdGNoZXNSZW5kZXJlcihmYWxzZSkKLXsKLSAgICAvLyBEVEQgcmVxdWlyZXMgcm93
cyAmIGNvbHMgYmUgc3BlY2lmaWVkLCBidXQgd2Ugd2lsbCBwcm92aWRlIHJlYXNvbmFibGUgZGVm
YXVsdHMKLSAgICBtX3Jvd3MgPSAyOwotICAgIG1fY29scyA9IDIwOwotICAgIG1fd3JhcCA9IHRh
X1ZpcnR1YWw7Ci19Ci0KLUhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp+SFRNTFRleHRBcmVhRWxl
bWVudEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJl
Z2lzdGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJ0ZXh0YXJlYSI7Ci19Ci0K
LVFTdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gTWFr
ZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6c3RhdGUoKSArIHZhbHVlKCkucXN0cmluZygpKycuJzsKLX0KLQotdm9p
ZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0
ZXMpCi17Ci0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpm
aW5kTWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJu
OwotICAgIHNldERlZmF1bHRWYWx1ZShzdGF0ZS5sZWZ0KHN0YXRlLmxlbmd0aCgpLTEpKTsKLSAg
ICAvLyB0aGUgY2xvc2UoKSBpbiB0aGUgcmVuZGVydHJlZSB3aWxsIHRha2UgY2FyZSBvZiB0cmFu
c2ZlcnJpbmcgZGVmYXVsdHZhbHVlIHRvICd2YWx1ZScKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rp
b25TdGFydCgpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsK
LSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2Vs
ZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChz
dGFydCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVu
ZChpbnQgZW5kKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9p
ZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmIChtX3JlbmRl
cikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPihtX3JlbmRlciktPnNlbGVj
dCgpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5n
ZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0
YXJ0LCBlbmQpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNo
YW5nZWQoKQotewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KLSAgICAKLXZvaWQg
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewot
ICAgICAgICBtX3Jvd3MgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkg
OiAzOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNl
dE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gY29sc0F0dHIpIHsKLSAgICAgICAgbV9jb2xzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0
ci0+dmFsdWUoKS50b0ludCgpIDogNjA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAg
ICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3cmFwQXR0cikgewotICAgICAgICAvLyB2aXJ0dWFs
IC8gcGh5c2ljYWwgaXMgTmV0c2NhcGUgZXh0ZW5zaW9uIG9mIEhUTUwgMy4wLCBub3cgZGVwcmVj
YXRlZAotICAgICAgICAvLyBzb2Z0LyBoYXJkIC8gb2ZmIGlzIHJlY29tbWVuZGF0aW9uIGZvciBI
VE1MIDQgZXh0ZW5zaW9uIGJ5IElFIGFuZCBOUyA0Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShhdHRyLT52YWx1ZSgpLCAidmlydHVhbCIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0dHIt
PnZhbHVlKCksICJzb2Z0IikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9WaXJ0dWFsOwotICAg
ICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicGh5c2ljYWwi
KSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiaGFyZCIpKQotICAgICAgICAg
ICAgbV93cmFwID0gdGFfUGh5c2ljYWw7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKGF0dHItPnZhbHVlKCksICJvbiIgKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1BoeXNp
Y2FsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAi
b2ZmIikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9Ob1dyYXA7Ci0gICAgICAgIGlmIChyZW5k
ZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhS
ZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7
Ci0gICAgICAgIC8vIGlnbm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZv
Y3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlbGVjdEF0dHIpIHsKLSAgICAgICAgc2V0
SFRNTEV2ZW50TGlzdGVuZXIoc2VsZWN0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihjaGFuZ2VFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2Jq
ZWN0ICpIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEg
KmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJl
bmRlclRleHRBcmVhKHRoaXMpOwotfQotCi1ib29sIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjph
cHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29sKQotewotICAgIGlmIChu
YW1lKCkuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RpbmcuYXBwZW5kRGF0YShu
YW1lKCksIHZhbHVlKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJl
YUVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwot
fQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp1cGRhdGVWYWx1ZSgpCi17Ci0gICAg
aWYgKCAhbV92YWx1ZUlzVmFsaWQgKSB7Ci0gICAgICAgIGlmICggbV9yZW5kZXIgKSB7Ci0gICAg
ICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPiggbV9yZW5kZXIg
KS0+dGV4dCgpLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIg
PSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV92YWx1ZSA9IGRlZmF1bHRW
YWx1ZSgpLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBm
YWxzZTsKLSAgICAgICAgfQotICAgICAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAgfQot
fQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1
cGRhdGVWYWx1ZSgpOwotICAgIHJldHVybiBtX3ZhbHVlLmlzTnVsbCgpID8gRE9NU3RyaW5nKCIi
KSA6IG1fdmFsdWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFZhbHVl
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgbV92YWx1ZSA9IHZhbHVlLnFzdHJpbmco
KTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV92YWx1ZUlzVmFs
aWQgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZy
b21FbGVtZW50KCk7Ci0gICAgLy8gRklYTUU6IEZvcmNlIHJlbG9hZCBmcm9tIHJlbmRlcmVyLCBh
cyByZW5kZXJlciBtYXkgaGF2ZSBub3JtYWxpemVkIGxpbmUgZW5kaW5ncy4KLSAgICBtX3ZhbHVl
SXNWYWxpZCA9IGZhbHNlOwotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLQotRE9NU3RyaW5n
IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpkZWZhdWx0VmFsdWUoKQotewotICAgIERPTVN0cmlu
ZyB2YWwgPSAiIjsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMgLSBqdXN0IGdyYWIgdGhl
IHRleHQgbm9kZXMKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSBmaXJzdENoaWxkKCk7
IG47IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQot
ICAgICAgICAgICAgdmFsICs9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4obiktPmRhdGEoKTsKLSAg
ICAKLSAgICBpZiAodmFsWzBdID09ICdccicgJiYgdmFsWzFdID09ICdcbicpIHsKLSAgICAgICAg
dmFsID0gdmFsLmNvcHkoKTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDIpOwotICAgIH0gZWxzZSBp
ZiAodmFsWzBdID09ICdccicgfHwgdmFsWzBdID09ICdcbicpIHsKLSAgICAgICAgdmFsID0gdmFs
LmNvcHkoKTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDEpOwotICAgIH0KLQotICAgIHJldHVybiB2
YWw7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldERlZmF1bHRWYWx1ZShj
b25zdCBET01TdHJpbmcgJmRlZmF1bHRWYWx1ZSkKLXsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29t
bWVudHMgLSByZW1vdmUgYWxsIHRoZSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBv
bmUKLSAgICBRUHRyTGlzdDxOb2RlSW1wbD4gdG9SZW1vdmU7Ci0gICAgTm9kZUltcGwgKm47Ci0g
ICAgZm9yIChuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAg
ICAgaWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChuKTsK
LSAgICBRUHRyTGlzdEl0ZXJhdG9yPE5vZGVJbXBsPiBpdCh0b1JlbW92ZSk7Ci0gICAgaW50IGV4
Y2VwdGlvbmNvZGUgPSAwOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpIHsKLSAgICAg
ICAgTm9kZUltcGwgKm4gPSBpdC5jdXJyZW50KCk7Ci0gICAgICAgIG4tPnJlZigpOwotICAgICAg
ICByZW1vdmVDaGlsZChuLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgbi0+ZGVyZWYoKTsKLSAg
ICB9Ci0gICAgaW5zZXJ0QmVmb3JlKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKGRlZmF1
bHRWYWx1ZSksZmlyc3RDaGlsZCgpLCBleGNlcHRpb25jb2RlKTsKLSAgICBzZXRWYWx1ZShkZWZh
dWx0VmFsdWUpOwotfQotCi1ib29sIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjppc0VkaXRhYmxl
KCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1w
bDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygp
OwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphdHRhY2goKQotewotICAgIG1f
dmFsdWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0
YWNoKCk7Ci0gICAgdXBkYXRlVmFsdWUoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6ZGV0YWNoKCkKLXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGV0YWNo
KCk7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotfQotCi1ET01TdHJpbmcg
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJIVE1MSXNJbmRleEVsZW1lbnRJbXBsLmgiCiAKLXZvaWQgSFRNTFRleHRBcmVh
RWxlbWVudEltcGw6OnNldENvbHMoaW50IGNvbHMpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNB
dHRyLCBRU3RyaW5nOjpudW1iZXIoY29scykpOwotfQordXNpbmcgbmFtZXNwYWNlIGtodG1sOwog
Ci12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRSb3dzKGludCByb3dzKQotewotICAg
IHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgUVN0cmluZzo6bnVtYmVyKHJvd3MpKTsKLX0KK25hbWVz
cGFjZSBET00gewogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwogCiBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpIVE1MSXNJbmRleEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQogICAgIDogSFRNTElucHV0
RWxlbWVudEltcGwoaXNpbmRleFRhZywgZG9jLCBmKQpAQCAtMzUxNSw1NCArNjAsNCBAQCB2b2lk
IEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnNldFByb21wdChjCiAgICAgc2V0QXR0cmlidXRlKHBy
b21wdEF0dHIsIHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11bnNpZ25lZCBI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIC8vIE5vdCB5
ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbDo6c2V0TGVuZ3RoKHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICAvLyBOb3QgeWV0
IGltcGxlbWVudGVkLgotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6
aXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVk
LgotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1w
bDo6bmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3QKLXsKLSAgICAvLyBOb3Qg
eWV0IGltcGxlbWVudGVkLgotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLUZvcm1EYXRhTGlzdDo6Rm9ybURhdGFMaXN0KFFUZXh0Q29kZWMgKmMpCi0gICAgOiBtX2Nv
ZGVjKGMpCi17Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJpbmcoY29uc3QgUUNT
dHJpbmcgJnMpCi17Ci0gICAgbV9saXN0LmFwcGVuZChzKTsKLX0KLQotdm9pZCBGb3JtRGF0YUxp
c3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRU3RyaW5nICZzKQotewotICAgIFFDU3RyaW5nIGNzdHIg
PSBmaXhMaW5lQnJlYWtzKG1fY29kZWMtPmZyb21Vbmljb2RlKHMsIHRydWUpKTsKLSAgICBjc3Ry
LnRydW5jYXRlKGNzdHIubGVuZ3RoKCkpOwotICAgIG1fbGlzdC5hcHBlbmQoY3N0cik7Ci19Ci0K
LXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25z
dCBET01TdHJpbmcgJmZpbGVuYW1lKQotewotICAgIGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygp
KTsKLSAgICBtX2xpc3QuYXBwZW5kKGZpbGVuYW1lLnFzdHJpbmcoKSk7Ci19Ci0KIH0gLy8gbmFt
ZXNwYWNlCkluZGV4OiBraHRtbC9odG1sL0hUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga2h0bWwvaHRtbC9IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5oCShyZXZp
c2lvbiAxMTk3NikKKysrIGtodG1sL2h0bWwvSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaAko
d29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJz
IEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZp
c3RvIChrb2l2aXN0b0BrZGUub3JnKQogICogICAgICAgICAgIChDKSAyMDAwIERpcmsgTXVlbGxl
ciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDA0IEFwcGxlIENvbXB1dGVy
LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIs
IEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjIsMTM0ICsyMiwxOSBAQAogICogQm9zdG9u
LCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZuZGVmIEhUTUxfRk9STUlNUExfSAot
I2RlZmluZSBIVE1MX0ZPUk1JTVBMX0gKKyNpZm5kZWYgSFRNTF9IVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbF9oCisjZGVmaW5lIEhUTUxfSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGxfaAogCiAj
aW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX21p
c2NpbXBsLmgiCiAKLSNpbmNsdWRlIDxxcHRydmVjdG9yLmg+Ci0jaW5jbHVkZSA8cW1lbWFycmF5
Lmg+Ci0jaW5jbHVkZSA8a3htbGNvcmUvSGFzaE1hcC5oPgotCi1jbGFzcyBLSFRNTFZpZXc7Ci1j
bGFzcyBRVGV4dENvZGVjOwotCi1uYW1lc3BhY2Uga2h0bWwKLXsKLSAgICBjbGFzcyBGb3JtRGF0
YTsKK25hbWVzcGFjZSBraHRtbCB7CiAgICAgY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQ7Ci0gICAg
Y2xhc3MgUmVuZGVyVGV4dEFyZWE7Ci0gICAgY2xhc3MgUmVuZGVyU2VsZWN0OwotICAgIGNsYXNz
IFJlbmRlckxpbmVFZGl0OwotICAgIGNsYXNzIFJlbmRlckZpbGVCdXR0b247Ci0gICAgY2xhc3Mg
UmVuZGVyU2xpZGVyOwogfQogCiBuYW1lc3BhY2UgRE9NIHsKIAotY2xhc3MgRE9NU3RyaW5nOwog
Y2xhc3MgRm9ybURhdGFMaXN0OwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotY2xhc3MgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbDsKLWNsYXNz
IEhUTUxJbWFnZUVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTEltYWdlTG9hZGVyOwotY2xhc3MgSFRN
TE9wdGlvbkVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDsKLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsIDogcHVibGlj
IEhUTUxFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxGb3JtRWxlbWVudEltcGwoRG9j
dW1lbnRJbXBsICpkb2MpOwotICAgIHZpcnR1YWwgfkhUTUxGb3JtRWxlbWVudEltcGwoKTsKLQot
ICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBj
b25zdCB7IHJldHVybiAzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmly
dHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92
ZWRGcm9tRG9jdW1lbnQoKTsKLSAKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBlbGVt
ZW50cygpOwotICAgIGludCBsZW5ndGgoKSBjb25zdDsKLQotICAgIERPTVN0cmluZyBlbmN0eXBl
KCkgY29uc3QgeyByZXR1cm4gbV9lbmN0eXBlOyB9Ci0gICAgdm9pZCBzZXRFbmN0eXBlKGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBib3VuZGFyeSgpIGNvbnN0IHsgcmV0dXJu
IG1fYm91bmRhcnk7IH0KLSAgICB2b2lkIHNldEJvdW5kYXJ5KGNvbnN0IERPTVN0cmluZyAmKTsK
LQotICAgIGJvb2wgYXV0b0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gbV9hdXRvY29tcGxldGU7
IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKTsKLQotICAgIHZvaWQgcmVnaXN0ZXJGb3JtRWxlbWVudChIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbCAqKTsKLSAgICB2b2lkIHJlbW92ZUZvcm1FbGVtZW50KEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVnaXN0ZXJJbWdFbGVtZW50KEhUTUxJ
bWFnZUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlSW1nRWxlbWVudChIVE1MSW1hZ2VF
bGVtZW50SW1wbCAqKTsKLQotICAgIGJvb2wgcHJlcGFyZVN1Ym1pdCgpOwotICAgIHZvaWQgc3Vi
bWl0KGJvb2wgYWN0aXZhdGVTdWJtaXRCdXR0b24gPSBmYWxzZSk7Ci0gICAgdm9pZCByZXNldCgp
OwotCi0gICAgdm9pZCBzZXRNYWxmb3JtZWQoYm9vbCBtYWxmb3JtZWQpIHsgbV9tYWxmb3JtZWQg
PSBtYWxmb3JtZWQ7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNNYWxmb3JtZWQoKSB7IHJldHVybiBt
X21hbGZvcm1lZDsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRy
aWJ1dGVJbXBsICphdHRyKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHN1Ym1pdENsaWNrKCk7Ci0g
ICAgYm9vbCBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihjb25zdCBET01TdHJpbmcgJnVy
bCk7Ci0KLSAgICBET01TdHJpbmcgbmFtZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0TmFtZShjb25z
dCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0Q2hhcnNldCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0QWNjZXB0Q2hhcnNldChjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01T
dHJpbmcgYWN0aW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY3Rpb24oY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgRE9NU3RyaW5nIG1ldGhvZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWV0aG9k
KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB0YXJnZXQoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFRhcmdldChjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBzdGF0aWMgdm9pZCBp
MThuRGF0YSgpOwotCi0gICAgZnJpZW5kIGNsYXNzIEhUTUxGb3JtRWxlbWVudDsKLSAgICBmcmll
bmQgY2xhc3MgSFRNTEZvcm1Db2xsZWN0aW9uSW1wbDsKLQotICAgIEhUTUxDb2xsZWN0aW9uSW1w
bDo6Q29sbGVjdGlvbkluZm8gKmNvbGxlY3Rpb25JbmZvOwotCi0gICAgUVB0clZlY3RvcjxIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbD4gZm9ybUVsZW1lbnRzOwotICAgIFFQdHJWZWN0b3I8SFRN
TEltYWdlRWxlbWVudEltcGw+IGltZ0VsZW1lbnRzOwotICAgIERPTVN0cmluZyBtX3VybDsKLSAg
ICBET01TdHJpbmcgbV90YXJnZXQ7Ci0gICAgRE9NU3RyaW5nIG1fZW5jdHlwZTsKLSAgICBET01T
dHJpbmcgbV9ib3VuZGFyeTsKLSAgICBET01TdHJpbmcgbV9hY2NlcHRjaGFyc2V0OwotICAgIGJv
b2wgbV9wb3N0IDogMTsKLSAgICBib29sIG1fbXVsdGlwYXJ0IDogMTsKLSAgICBib29sIG1fYXV0
b2NvbXBsZXRlIDogMTsKLSAgICBib29sIG1faW5zdWJtaXQgOiAxOwotICAgIGJvb2wgbV9kb2lu
Z3N1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2lucmVzZXQgOiAxOwotICAgIGJvb2wgbV9tYWxmb3Jt
ZWQgOiAxOwotICAgIAotcHJpdmF0ZToKLSAgICB2b2lkIHBhcnNlRW5jdHlwZShjb25zdCBET01T
dHJpbmcgJik7Ci0gICAgYm9vbCBmb3JtRGF0YShraHRtbDo6Rm9ybURhdGEgJikgY29uc3Q7Ci0K
LSAgICB1bnNpZ25lZCBmb3JtRWxlbWVudEluZGV4KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
ICopOwotCi0gICAgRE9NU3RyaW5nIG9sZE5hbWVBdHRyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorY2xhc3MgSFRNTEZvcm1FbGVtZW50SW1wbDsKIAogY2xhc3MgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCiB7CkBAIC0yMjcsNjA3ICsxMTIs
NiBAQCBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtX2luaXRlZCA6IDE7CiB9OwogCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZp
cnR1YWwgfkhUTUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0g
ICAgICAgIFNVQk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0K
LSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1s
OjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRl
clN0eWxlKik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRs
ZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3Jt
RGF0YUxpc3QmLCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3Vi
bWl0QnV0dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwot
Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQp
OwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgot
ICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0
eXBlRW51bSAgbV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9v
bCAgICAgIG1fYWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
Y2xhc3MgSFRNTEZpZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhU
TUxGaWVsZFNldEVsZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0
IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBj
b25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwg
RE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xh
c3MgSFRNTElucHV0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVu
ZCBjbGFzcyBraHRtbDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1M
U2VsZWN0RWxlbWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7
Ci0KLXB1YmxpYzoKLSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5
cGVFbnVtIHsKLSAgICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5E
RVgsCi0gICAgICAgIENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAot
ICAgICAgICBSRVNFVCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJ
TUFHRSwKLSAgICAgICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0g
ICAgfTsKLQotICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVu
dEltcGwgKmYgPSAwKTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAg
IHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVt
ZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBp
bnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wg
aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0
YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0
dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVj
a2VkKCkgY29uc3QgeyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5k
ZXRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9v
bCBpc1RleHRCdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlw
ZSA9PSBSRVNFVCB8fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFk
aW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wg
Y2hlY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tl
ZChib29sKTsKLSAgICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0
ZXJtaW5hdGU7IH0KLSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1h
eExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25z
dCB7IHJldHVybiBtX3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZv
aWQgc2V0VHlwZShjb25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01T
dHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21S
ZW5kZXJlcihjb25zdCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJl
cigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNl
dFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsg
fQotCi0gICAgdmlydHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9
IFBBU1NXT1JEOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2
b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVj
dGlvbigpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVu
ZCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVj
dGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlv
blJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5k
TW91c2VFdmVudHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2
aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmly
dHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpz
b3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCBy
ZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1s
OjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5k
ZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29s
IGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29s
IGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0Fj
dGl2YXRlZFN1Ym1pdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJt
aXQoYm9vbCBmbGFnKTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJu
IG1fdHlwZTsgfQotICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUp
OwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5w
dXQgdHlwZT1pbWFnZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1
cm4geFBvczsgfQotICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsK
LSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0
LCB2b2lkKiBkYXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVu
dEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0
cmluZyBhbHRUZXh0KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmli
dXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBj
b25zdCB7IHJldHVybiBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFs
dWUoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7
Ci0gICAgCi0gICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVm
YXVsdENoZWNrZWQoYm9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vz
c0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsK
LQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
QWx0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0K
LSAgICBET01TdHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3Ry
aW5nICYpOwotCi0gICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1
c2VNYXAoKSBjb25zdDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0K
LXByb3RlY3RlZDoKLSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkg
Y29uc3Q7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVl
OwotICAgIGludCAgICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9y
dCAgICAgbV9zaXplOwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4
UmVzdWx0czsKLQotICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5
cGVFbnVtIG1fdHlwZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9k
ZWZhdWx0Q2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAg
ICBib29sIG1faW5kZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAg
ICBib29sIG1fYWN0aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsK
LSAgICBib29sIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1jbGFzcyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVu
dEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1
YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBi
b29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAg
KiB0aGUgZm9ybSBlbGVtZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8K
LSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3JtRWxlbWVudElt
cGwgKmZvcm0oKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lk
IHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZv
cigpIGNvbnN0OwotICAgIHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAg
ICB2b2lkIGZvY3VzKCk7Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50
SUQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdlbmRFbGVtZW50
SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAg
IEhUTUxMZWdlbmRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpOwotCi0g
ICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBr
aHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6
UmVuZGVyU3R5bGUgKik7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7
Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRoZSBsZWdlbmQn
cyBmaWVsZHNldCAKLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQot
ICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2
b2lkIHNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lkIGZvY3VzKCk7
Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1w
bCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFz
cyBraHRtbDo6UmVuZGVyU2VsZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgfkhUTUxTZWxl
Y3RFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFn
UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA2OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFRE
KGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0
OwotCi0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSApOwotCi0gICAg
aW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoIGlu
dCBpbmRleCApOwotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotCi0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgaW50IG1pbldp
ZHRoKCkgY29uc3QgeyByZXR1cm4gbV9taW53aWR0aDsgfQotCi0gICAgaW50IHNpemUoKSBjb25z
dCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVy
biBtX211bHRpcGxlOyB9Ci0KLSAgICB2b2lkIGFkZCAoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVu
dCwgSFRNTEVsZW1lbnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZv
aWQgcmVtb3ZlICggaW50IGluZGV4ICk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2
b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBIVE1MT3B0aW9uc0Nv
bGxlY3Rpb25JbXBsICpvcHRpb25zKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4g
b3B0aW9uc0hUTUxDb2xsZWN0aW9uKCk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBhbmQgbWlncmF0
ZSB0byBvcHRpb25zKCkuCi0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJl
dHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2
b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwg
Kmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQg
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xk
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVu
ZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFs
IGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1s
OjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURh
dGFMaXN0JiwgYm9vbCk7Ci0KLSAgICAvLyBnZXQgdGhlIGFjdHVhbCBsaXN0Ym94IGluZGV4IG9m
IHRoZSBvcHRpb25JbmRleHRoIG9wdGlvbgotICAgIGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQg
b3B0aW9uSW5kZXgpIGNvbnN0OwotICAgIC8vIHJldmVyc2Ugb2Ygb3B0aW9uVG9MaXN0SW5kZXgg
LSBnZXQgb3B0aW9uSW5kZXggZnJvbSBsaXN0Ym94SW5kZXgKLSAgICBpbnQgbGlzdFRvT3B0aW9u
SW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFJlY2FsY0xpc3RJdGVt
cygpOwotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGxpc3RJdGVtcygpIGNvbnN0
Ci0gICAgIHsKLSAgICAgICAgIGlmIChtX3JlY2FsY0xpc3RJdGVtcykgY29uc3RfY2FzdDxIVE1M
U2VsZWN0RWxlbWVudEltcGwqPih0aGlzKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgICBy
ZXR1cm4gbV9saXN0SXRlbXM7Ci0gICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAg
ICB2b2lkIG5vdGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0
ZWRPcHRpb24sIGJvb2wgc2VsZWN0ZWQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVu
dEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rp
b24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIHZvaWQgc2V0TXVsdGlwbGUoYm9vbCk7
Ci0KLSAgICB2b2lkIHNldFNpemUoaW50KTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlY2FsY0xp
c3RJdGVtcygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgbXV0YWJsZSBRTWVtQXJyYXk8SFRNTEVsZW1l
bnRJbXBsKj4gbV9saXN0SXRlbXM7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqbV9v
cHRpb25zOwotICAgIHNob3J0IG1fbWlud2lkdGg7Ci0gICAgc2hvcnQgbV9zaXplOwotICAgIGJv
b2wgbV9tdWx0aXBsZTsKLSAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOwotfTsKLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MS2V5Z2VuRWxlbWVudEltcGwgOiBwdWJsaWMgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEtleWdlbkVsZW1lbnRJbXBs
KERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2
aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIERPTVN0
cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICAvLyAjIyMgdGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vl
c3MKLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZUltcGwgKmF0dHIpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0
YUxpc3QmLCBib29sKTsKLXByb3RlY3RlZDoKLSAgICBBdG9taWNTdHJpbmcgbV9jaGFsbGVuZ2U7
Ci0gICAgQXRvbWljU3RyaW5nIG1fa2V5VHlwZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotY2xhc3MgSFRNTE9wdEdyb3VwRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwg
fkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShI
VE1MTmFtZXM6Om9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpo
clRhZyk7IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNl
cnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZl
eGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9k
ZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSAp
OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxk
LCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGls
ZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVh
bCBOb2RlSW1wbCAqYWRkQ2hpbGQoIE5vZGVJbXBsKiBuZXdDaGlsZCApOwotICAgIHZpcnR1YWwg
dm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAg
ICB2b2lkIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIERPTVN0cmluZyBsYWJlbCgpIGNv
bnN0OwotICAgIHZvaWQgc2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICYpOwotfTsKLQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJbXBsIDogcHVibGlj
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpS
ZW5kZXJTZWxlY3Q7Ci0gICAgZnJpZW5kIGNsYXNzIERPTTo6SFRNTFNlbGVjdEVsZW1lbnRJbXBs
OwotCi1wdWJsaWM6Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9j
LCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0
dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMjsgfQotICAg
IHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJu
IG5ld0NoaWxkLT5pc1RleHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVz
OjpzY3JpcHRUYWcpOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsK
LQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgdGV4dCgpIGNv
bnN0OwotICAgIHZvaWQgc2V0VGV4dChjb25zdCBET01TdHJpbmcgJiwgaW50ICZleGNlcHRpb24p
OwotCi0gICAgaW50IGluZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRJbmRleChpbnQsIGludCAm
ZXhjZXB0aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIGJvb2wgc2VsZWN0ZWQo
KSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3RlZChib29s
IF9zZWxlY3RlZCk7Ci0KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKmdldFNlbGVjdCgpIGNv
bnN0OwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgYm9vbCBk
ZWZhdWx0U2VsZWN0ZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRTZWxlY3RlZCggYm9v
bCApOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbCgg
Y29uc3QgRE9NU3RyaW5nICYgKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVl
OwotICAgIGJvb2wgbV9zZWxlY3RlZDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4dEFyZWE7Ci0KLXB1
YmxpYzoKLSAgICBlbnVtIFdyYXBNZXRob2QgewotICAgICAgICB0YV9Ob1dyYXAsCi0gICAgICAg
IHRhX1ZpcnR1YWwsCi0gICAgICAgIHRhX1BoeXNpY2FsCi0gICAgfTsKLQotICAgIEhUTUxUZXh0
QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
ID0gMCk7Ci0gICAgfkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+
aXNUZXh0Tm9kZSgpOyB9Ci0KLSAgICBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsg
fQotICAgIGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICBXcmFwTWV0
aG9kIHdyYXAoKSBjb25zdCB7IHJldHVybiBtX3dyYXA7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBp
c0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIERPTVN0cmluZyB0
eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVy
biB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lk
IHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgp
OwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLQotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQo
aW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3Qg
KCAgKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLQotICAgIHZpcnR1
YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBraHRtbDo6
UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVy
U3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBk
ZXRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0Jiwg
Ym9vbCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0gICAgRE9NU3RyaW5nIHZhbHVlKCk7
Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLSAgICBET01TdHJp
bmcgZGVmYXVsdFZhbHVlKCk7Ci0gICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSk7Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsgbV92YWx1ZUlzVmFs
aWQgPSBmYWxzZTsgfQotICAgIHZvaWQgdXBkYXRlVmFsdWUoKTsKLQotICAgIGJvb2wgdmFsdWVN
YXRjaGVzUmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOyB9
Ci0gICAgdm9pZCBzZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpIHsgbV92YWx1ZU1hdGNoZXNSZW5k
ZXJlciA9IHRydWU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0gICAgCi0g
ICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwot
ICAgIAotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vz
c0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldENvbHMoaW50KTsKLQotICAg
IHZvaWQgc2V0Um93cyhpbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1fcm93czsKLSAgICBp
bnQgbV9jb2xzOwotICAgIFdyYXBNZXRob2QgbV93cmFwOwotICAgIFFTdHJpbmcgbV92YWx1ZTsK
LSAgICBib29sIG1fdmFsdWVJc1ZhbGlkOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5kZXJl
cjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElzSW5kZXhFbGVtZW50
SW1wbCA6IHB1YmxpYyBIVE1MSW5wdXRFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxJ
c0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwg
KmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50IHRh
Z1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgRE9NU3Ry
aW5nIHByb21wdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJvbXB0KGNvbnN0IERPTVN0cmluZyAm
KTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3Byb21wdDsKLX07Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCA6IHB1YmxpYyBr
aHRtbDo6U2hhcmVkPEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw+Ci17Ci1wdWJsaWM6Ci0gICAg
SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbChIVE1MU2VsZWN0RWxlbWVudEltcGwgKmltcGwpIDog
bV9zZWxlY3QoaW1wbCkgeyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAgICB2
b2lkIHNldExlbmd0aCh1bnNpZ25lZCk7Ci0gICAgTm9kZUltcGwgKml0ZW0odW5zaWduZWQgaW5k
ZXgpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1l
KSBjb25zdDsKLQotICAgIHZvaWQgZGV0YWNoKCkgeyBtX3NlbGVjdCA9IDA7IH0KLQotcHJpdmF0
ZToKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKm1fc2VsZWN0OwotfTsKLQogfSAvL25hbWVz
cGFjZQogCiAjZW5kaWYKSW5kZXg6IGtodG1sL2h0bWwvSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBraHRtbC9odG1sL0hUTUxPcHRpb25FbGVtZW50SW1wbC5jcHAJKHJl
dmlzaW9uIDExOTc2KQorKysga2h0bWwvaHRtbC9IVE1MT3B0aW9uRWxlbWVudEltcGwuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMg
S25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlz
dG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVy
IChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgQXBwbGUgQ29t
cHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBBcHBsZSBDb21w
dXRlciwgSW5jLgogICogICAgICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFw
QG55cG9wLmNvbSkKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNCwzMDcxICsyNCwxOCBAQAogICoKICAqLwog
Ci0jdW5kZWYgRk9STVNfREVCVUcKLS8vI2RlZmluZSBGT1JNU19ERUJVRwotCi0jaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCi0KLSNpbmNsdWRlICJr
aHRtbHZpZXcuaCIKLSNpbmNsdWRlICJNYWNGcmFtZS5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9k
b2N1bWVudGltcGwuaCIKLSNpbmNsdWRlICJodG1sX2ltYWdlaW1wbC5oIgotI2luY2x1ZGUgImto
dG1sX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAibWlzYy9mb3JtZGF0YS5oIgotCi0jaW5jbHVkZSAi
ZG9tL2RvbV9leGNlcHRpb24uaCIKLSNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgot
I2luY2x1ZGUgImNzc3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJjc3NoZWxwZXIuaCIKLSNpbmNs
dWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5o
IgotI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAia2h0bWxfZXh0LmgiCi0K
LSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaCIKLSNpbmNsdWRlICJyZW5kZXJfYnV0
dG9uLmgiCi0jaW5jbHVkZSAicmVuZGVyX3RoZW1lLmgiCi0KLSNpbmNsdWRlIDxrbG9jYWxlLmg+
Ci0jaW5jbHVkZSA8cWZpbGUuaD4KLSNpbmNsdWRlIDxxdGV4dGNvZGVjLmg+Ci0KLS8vIGZvciBr
ZXlnZW4KLSNpbmNsdWRlIDxxc3RyaW5nLmg+Ci0jaW5jbHVkZSA8a3NzbGtleWdlbi5oPgotCi0j
aW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBraHRtbDsKLQotbmFtZXNwYWNl
IERPTSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwotdXNpbmcgbmFtZXNwYWNlIEhU
TUxOYW1lczsKLQotc3RydWN0IEZvcm1EYXRhTGlzdEl0ZW0gewotICAgIEZvcm1EYXRhTGlzdEl0
ZW0oY29uc3QgUUNTdHJpbmcgJmRhdGEpIDogbV9kYXRhKGRhdGEpIHsgfQotICAgIEZvcm1EYXRh
TGlzdEl0ZW0oY29uc3QgUVN0cmluZyAmcGF0aCkgOiBtX3BhdGgocGF0aCkgeyB9Ci0KLSAgICBR
U3RyaW5nIG1fcGF0aDsKLSAgICBRQ1N0cmluZyBtX2RhdGE7Ci19OwotCi1jbGFzcyBGb3JtRGF0
YUxpc3QgewotcHVibGljOgotICAgIEZvcm1EYXRhTGlzdChRVGV4dENvZGVjICopOwotCi0gICAg
dm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5n
KHZhbHVlLnFzdHJpbmcoKSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5n
ICZrZXksIGNvbnN0IFFTdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXku
cXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsgfQotICAgIHZvaWQgYXBwZW5kRGF0YShj
b25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgUUNTdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFw
cGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsgfQotICAgIHZv
aWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgaW50IHZhbHVlKQotICAgICAgICB7
IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKFFTdHJpbmc6Om51bWJl
cih2YWx1ZSkpOyB9Ci0gICAgdm9pZCBhcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBj
b25zdCBET01TdHJpbmcgJmZpbGVuYW1lKTsKLQotICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9y
PEZvcm1EYXRhTGlzdEl0ZW0+IGJlZ2luKCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gbV9saXN0
LmJlZ2luKCk7IH0KLSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVt
PiBlbmQoKSBjb25zdAotICAgICAgICB7IHJldHVybiBtX2xpc3QuZW5kKCk7IH0KLQotcHJpdmF0
ZToKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcyk7Ci0gICAgdm9pZCBh
cHBlbmRTdHJpbmcoY29uc3QgUVN0cmluZyAmcyk7Ci0KLSAgICBRVGV4dENvZGVjICptX2NvZGVj
OwotICAgIFFWYWx1ZUxpc3Q8Rm9ybURhdGFMaXN0SXRlbT4gbV9saXN0OwotfTsKLQotSFRNTEZv
cm1FbGVtZW50SW1wbDo6SFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAg
ICA6IEhUTUxFbGVtZW50SW1wbChmb3JtVGFnLCBkb2MpCi17Ci0gICAgY29sbGVjdGlvbkluZm8g
PSAwOwotICAgIG1fcG9zdCA9IGZhbHNlOwotICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAg
bV9hdXRvY29tcGxldGUgPSB0cnVlOwotICAgIG1faW5zdWJtaXQgPSBmYWxzZTsKLSAgICBtX2Rv
aW5nc3VibWl0ID0gZmFsc2U7Ci0gICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgbV9lbmN0eXBl
ID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgbV9ib3VuZGFyeSA9
ICItLS0tLS0tLS0tMHhLaFRtTGJPdU5kQXJZIjsKLSAgICBtX2FjY2VwdGNoYXJzZXQgPSAiVU5L
Tk9XTiI7Ci0gICAgbV9tYWxmb3JtZWQgPSBmYWxzZTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1w
bDo6fkhUTUxGb3JtRWxlbWVudEltcGwoKQotewotICAgIGRlbGV0ZSBjb2xsZWN0aW9uSW5mbzsK
LSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7
ICsraSkKLSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOwotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBpbWdFbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGltZ0Vs
ZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOwotfQotCi0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6
Zm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwpCi17Ci0g
ICAgaWYgKHVybC5pc051bGwoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAg
IHJldHVybiBnZXREb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKS5zdGFydHNX
aXRoKCJodHRwczoiLCBmYWxzZSk7Ci19Ci0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjph
dHRhY2goKQotewotICAgIEhUTUxFbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICAvLyBub3Rl
IHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5nIHNlY3VyZUZvcm1SZW1vdmVkKCkgb24gZGV0YWNo
LCBiZWNhdXNlIHRoZSB0aW1pbmcKLSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3Vy
IHN0YXRlIHRvbyBlYXJseQotICAgIGlmIChmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbiht
X3VybCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotfQotCi12
b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBp
ZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotCUhUTUxEb2N1bWVudEltcGwg
KmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAqPihnZXREb2N1bWVudCgp
KTsKLQlkb2N1bWVudC0+YWRkTmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBI
VE1MRWxlbWVudEltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGdldERvY3Vt
ZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9
IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1l
bnQtPnJlbW92ZU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotICAgCi0gICAgSFRNTEVs
ZW1lbnRJbXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0KLWludCBIVE1MRm9ybUVsZW1l
bnRJbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIGludCBsZW4gPSAwOwotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotCWlmIChmb3JtRWxl
bWVudHNbaV0tPmlzRW51bWVyYXRhYmxlKCkpCi0JICAgICsrbGVuOwotCi0gICAgcmV0dXJuIGxl
bjsKLX0KLQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnN1Ym1pdENsaWNrKCkKLXsKLSAg
ICBib29sIHN1Ym1pdEZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgaWYgKGZvcm1FbGVtZW50c1tp
XS0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVu
dEltcGwgKmVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihmb3Jt
RWxlbWVudHNbaV0pOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1p
dEJ1dHRvbigpICYmIGVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgICAgICAgICBzdWJt
aXRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC0+Y2xpY2soZmFsc2UpOwot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
ICAgIGlmICghc3VibWl0Rm91bmQpIC8vIHN1Ym1pdCB0aGUgZm9ybSB3aXRob3V0IGEgc3VibWl0
IG9yIGltYWdlIGlucHV0Ci0gICAgICAgIHByZXBhcmVTdWJtaXQoKTsKLX0KLQotCi1zdGF0aWMg
UUNTdHJpbmcgZW5jb2RlQ1N0cmluZyhjb25zdCBRQ1N0cmluZyYgZSkKLXsKLSAgICAvLyBodHRw
Oi8vd3d3LnczLm9yZy9UUi9odG1sNC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNC4xCi0g
ICAgLy8gc2FmZSBjaGFyYWN0ZXJzIGxpa2UgTlMgaGFuZGxlcyB0aGVtIGZvciBjb21wYXRpYmls
aXR5Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnNhZmUgPSAiLS5fKiI7Ci0gICAgaW50IGVsZW4g
PSBlLmxlbmd0aCgpOwotICAgIFFDU3RyaW5nIGVuY29kZWQoKCBlbGVuK2UuY29udGFpbnMoICdc
bicgKSApKjMrMSk7Ci0gICAgaW50IGVuY2xlbiA9IDA7Ci0KLSAgICAvL1FDU3RyaW5nIG9yaWco
ZS5kYXRhKCksIGUuc2l6ZSgpKTsKLQotICAgIGZvcihpbnQgcG9zID0gMDsgcG9zIDwgZWxlbjsg
cG9zKyspIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gZVtwb3NdOwotCi0gICAgICAgIGlm
ICggKCggYyA+PSAnQScpICYmICggYyA8PSAnWicpKSB8fAotICAgICAgICAgICAgICgoIGMgPj0g
J2EnKSAmJiAoIGMgPD0gJ3onKSkgfHwKLSAgICAgICAgICAgICAoKCBjID49ICcwJykgJiYgKCBj
IDw9ICc5JykpIHx8Ci0gICAgICAgICAgICAgKHN0cmNocihzYWZlLCBjKSkKLSAgICAgICAgICAg
ICkKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gYzsKLSAgICAgICAgZWxzZSBpZiAo
IGMgPT0gJyAnICkKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJysnOwotICAgICAg
ICBlbHNlIGlmICggYyA9PSAnXG4nIHx8ICggYyA9PSAnXHInICYmIGVbcG9zKzFdICE9ICdcbicg
KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAg
ICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2Vu
Y2xlbisrXSA9ICdEJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAg
ICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2Vu
Y2xlbisrXSA9ICdBJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggYyAhPSAnXHInICkK
LSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAg
ICAgICB1bnNpZ25lZCBpbnQgaCA9IGMgLyAxNjsKLSAgICAgICAgICAgIGggKz0gKGggPiA5KSA/
ICgnQScgLSAxMCkgOiAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGg7Ci0K
LSAgICAgICAgICAgIHVuc2lnbmVkIGludCBsID0gYyAlIDE2OwotICAgICAgICAgICAgbCArPSAo
bCA+IDkpID8gKCdBJyAtIDEwKSA6ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytd
ID0gbDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICdcMCc7Ci0g
ICAgZW5jb2RlZC50cnVuY2F0ZShlbmNsZW4pOwotCi0gICAgcmV0dXJuIGVuY29kZWQ7Ci19Ci0K
LS8vIENoYW5nZSBwbGFpbiBDUiBhbmQgcGxhaW4gTEYgdG8gQ1JMRiBwYWlycy4KLXN0YXRpYyBR
Q1N0cmluZyBmaXhMaW5lQnJlYWtzKGNvbnN0IFFDU3RyaW5nICZzKQotewotICAgIC8vIENvbXB1
dGUgdGhlIGxlbmd0aC4KLSAgICB1bnNpZ25lZCBuZXdMZW4gPSAwOwotICAgIGNvbnN0IGNoYXIg
KnAgPSBzLmRhdGEoKTsKLSAgICB3aGlsZSAoY2hhciBjID0gKnArKykgewotICAgICAgICBpZiAo
YyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBTYWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBv
ZiB0cmFpbGluZyAnXDAnLgotICAgICAgICAgICAgaWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAg
ICAgICAgICAvLyBUdXJuIENSIGludG8gQ1JMRi4KLSAgICAgICAgICAgICAgICBuZXdMZW4gKz0g
MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAg
ICAgICAgIC8vIFR1cm4gTEYgaW50byBDUkxGLgotICAgICAgICAgICAgbmV3TGVuICs9IDI7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBvdGhlciBjaGFyYWN0ZXJzIGFs
b25lLgotICAgICAgICAgICAgbmV3TGVuICs9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYg
KG5ld0xlbiA9PSBzLmxlbmd0aCgpKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICAK
LSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nLgotICAgIHAgPSBzLmRhdGEoKTsKLSAg
ICBRQ1N0cmluZyByZXN1bHQobmV3TGVuICsgMSk7Ci0gICAgY2hhciAqcSA9IHJlc3VsdC5kYXRh
KCk7Ci0gICAgd2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKLSAgICAgICAgaWYgKGMgPT0gJ1xyJykg
ewotICAgICAgICAgICAgLy8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2YgdHJhaWxpbmcg
J1wwJy4KLSAgICAgICAgICAgIGlmICgqcCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8g
VHVybiBDUiBpbnRvIENSTEYuCi0gICAgICAgICAgICAgICAgKnErKyA9ICdccic7Ci0gICAgICAg
ICAgICAgICAgKnErKyA9ICdcbic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAo
YyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAvLyBUdXJuIExGIGludG8gQ1JMRi4KLSAgICAgICAg
ICAgICpxKysgPSAnXHInOwotICAgICAgICAgICAgKnErKyA9ICdcbic7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBvdGhlciBjaGFyYWN0ZXJzIGFsb25lLgotICAgICAg
ICAgICAgKnErKyA9IGM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1EYXRhKEZvcm1EYXRhICZmb3JtX2Rh
dGEpIGNvbnN0Ci17Ci0gICAgUUNTdHJpbmcgZW5jX3N0cmluZyA9ICIiOyAvLyB1c2VkIGZvciBu
b24tbXVsdGlwYXJ0IGRhdGEKLQotICAgIC8vIGZpbmQgb3V0IHRoZSBRVGV4dGNvZGVjIHRvIHVz
ZQotICAgIFFTdHJpbmcgc3RyID0gbV9hY2NlcHRjaGFyc2V0LnFzdHJpbmcoKTsKLSAgICBzdHIu
cmVwbGFjZSgnLCcsICcgJyk7Ci0gICAgUVN0cmluZ0xpc3QgY2hhcnNldHMgPSBRU3RyaW5nTGlz
dDo6c3BsaXQoJyAnLCBzdHIpOwotICAgIFFUZXh0Q29kZWMqIGNvZGVjID0gMDsKLSAgICBGcmFt
ZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6
Okl0ZXJhdG9yIGl0ID0gY2hhcnNldHMuYmVnaW4oKTsgaXQgIT0gY2hhcnNldHMuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgUVN0cmluZyBlbmMgPSAoKml0KTsKLSAgICAgICAgaWYgKGVuYy5jb250
YWlucygiVU5LTk9XTiIpKSB7Ci0gICAgICAgICAgICAvLyB1c2Ugc3RhbmRhcmQgZG9jdW1lbnQg
ZW5jb2RpbmcKLSAgICAgICAgICAgIGVuYyA9ICJJU08tODg1OS0xIjsKLSAgICAgICAgICAgIGlm
IChmcmFtZSkKLSAgICAgICAgICAgICAgICBlbmMgPSBmcmFtZS0+ZW5jb2RpbmcoKTsKLSAgICAg
ICAgfQotICAgICAgICBpZiAoKGNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGVuYy5s
YXRpbjEoKSkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFjb2RlYykK
LSAgICAgICAgY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0ZvckxvY2FsZSgpOwotCi0KLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkgewotICAg
ICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogY3VycmVudCA9IGZvcm1FbGVtZW50c1tp
XTsKLSAgICAgICAgRm9ybURhdGFMaXN0IGxzdChjb2RlYyk7Ci0KLSAgICAgICAgaWYgKCFjdXJy
ZW50LT5kaXNhYmxlZCgpICYmIGN1cnJlbnQtPmFwcGVuZEZvcm1EYXRhKGxzdCwgbV9tdWx0aXBh
cnQpKSB7Ci0gICAgICAgICAgICBmb3IgKFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRh
TGlzdEl0ZW0+IGl0ID0gbHN0LmJlZ2luKCk7IGl0ICE9IGxzdC5lbmQoKTsgKytpdCkgewotICAg
ICAgICAgICAgICAgIGlmICghbV9tdWx0aXBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8g
aGFuZGxlIElTSU5ERVggLyA8aW5wdXQgbmFtZT1pc2luZGV4PiBzcGVjaWFsCi0gICAgICAgICAg
ICAgICAgICAgIC8vIGJ1dCBvbmx5IGlmIGl0cyB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKCBlbmNfc3RyaW5nLmlzRW1wdHkoKSAmJiAoKml0KS5tX2RhdGEgPT0gImlz
aW5kZXgiICkgewotICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZyggKCppdCkubV9kYXRhICk7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZighZW5jX3N0cmluZy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSAnJic7Ci0KLSAgICAgICAgICAgICAgICAgICAg
ICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0cmluZygoKml0KS5tX2RhdGEpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSAiPSI7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICArK2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVDU3Ry
aW5nKCgqaXQpLm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAg
ICAgICAgICAgUUNTdHJpbmcgaHN0cigiLS0iKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciAr
PSBtX2JvdW5kYXJ5LnFzdHJpbmcoKS5sYXRpbjEoKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0
ciArPSAiXHJcbiI7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIkNvbnRlbnQtRGlzcG9z
aXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0g
KCppdCkubV9kYXRhLmRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwot
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IHR5cGUgaXMgRklMRSwgdGhl
biB3ZSBhbHNvIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgZmls
ZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmhhc0xvY2FsTmFtZShpbnB1
dFRhZykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKj4oY3VycmVudCktPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpGSUxFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBR
U3RyaW5nIHBhdGggPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQp
LT52YWx1ZSgpLnFzdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6
IFRoaXMgd29uJ3Qgd29yayBpZiB0aGUgZmlsZW5hbWUgaW5jbHVkZXMgYSAiIG1hcmssCi0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBvciBjb250cm9sIGNoYXJhY3RlcnMgbGlrZSBDUiBvciBM
Ri4gVGhpcyBhbHNvIGRvZXMgc3RyYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhp
bmdzIGlmIHRoZSBmaWxlbmFtZSBpbmNsdWRlcyBjaGFyYWN0ZXJzIHlvdSBjYW4ndCBlbmNvZGUK
LSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSB3ZWJzaXRlJ3MgY2hhcmFjdGVyIHNl
dC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIjsgZmlsZW5hbWU9XCIiOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSBjb2RlYy0+ZnJvbVVuaWNvZGUocGF0aC5taWQo
cGF0aC5maW5kUmV2KCcvJykgKyAxKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBo
c3RyICs9ICJcIiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQpLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5n
IG1pbWVUeXBlID0gZnJhbWUgPyBNYWMoZnJhbWUpLT5taW1lVHlwZUZvckZpbGVOYW1lKHBhdGgp
IDogUVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWltZVR5cGUu
aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxy
XG5Db250ZW50LVR5cGU6ICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIg
Kz0gbWltZVR5cGUuYXNjaWkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgICAgICBoc3RyICs9ICJcclxuXHJcbiI7Ci0gICAgICAgICAgICAgICAgICAgICsraXQ7
Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIGJvZHkKLSAgICAgICAgICAgICAgICAg
ICAgZm9ybV9kYXRhLmFwcGVuZERhdGEoaHN0ci5kYXRhKCksIGhzdHIubGVuZ3RoKCkpOwotICAg
ICAgICAgICAgICAgICAgICBjb25zdCBGb3JtRGF0YUxpc3RJdGVtICZpdGVtID0gKml0OwotICAg
ICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBpdGVtLm1fZGF0YS5zaXplKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgICAg
ICAgICAgZm9ybV9kYXRhLmFwcGVuZERhdGEoaXRlbS5tX2RhdGEsIGRhdGFTaXplIC0gMSk7Ci0g
ICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpdGVtLm1fcGF0aC5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRmlsZShpdGVtLm1fcGF0aCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKCJcclxuIiwgMik7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBp
ZiAobV9tdWx0aXBhcnQpCi0gICAgICAgIGVuY19zdHJpbmcgPSAoIi0tIiArIG1fYm91bmRhcnku
cXN0cmluZygpICsgIi0tXHJcbiIpLmFzY2lpKCk7Ci0KLSAgICBmb3JtX2RhdGEuYXBwZW5kRGF0
YShlbmNfc3RyaW5nLmRhdGEoKSwgZW5jX3N0cmluZy5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cGFyc2VFbmN0eXBlKGNvbnN0IERP
TVN0cmluZyYgdHlwZSkKLXsKLSAgICBpZih0eXBlLmNvbnRhaW5zKCJtdWx0aXBhcnQiLCBmYWxz
ZSkgfHwgdHlwZS5jb250YWlucygiZm9ybS1kYXRhIiwgZmFsc2UpKSB7Ci0gICAgICAgIG1fZW5j
dHlwZSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSB0cnVl
OwotICAgIH0gZWxzZSBpZiAodHlwZS5jb250YWlucygidGV4dCIsIGZhbHNlKSB8fCB0eXBlLmNv
bnRhaW5zKCJwbGFpbiIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAidGV4dC9wbGFp
biI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
bV9lbmN0eXBlID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgICAg
IG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudElt
cGw6OnNldEJvdW5kYXJ5KCBjb25zdCBET01TdHJpbmcmIGJvdW5kICkKLXsKLSAgICBtX2JvdW5k
YXJ5ID0gYm91bmQ7Ci19Ci0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6cHJlcGFyZVN1Ym1p
dCgpCi17Ci0gICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBp
ZihtX2luc3VibWl0IHx8ICFmcmFtZSB8fCBmcmFtZS0+b25seUxvY2FsUmVmZXJlbmNlcygpKQot
ICAgICAgICByZXR1cm4gbV9pbnN1Ym1pdDsKLQotICAgIG1faW5zdWJtaXQgPSB0cnVlOwotICAg
IG1fZG9pbmdzdWJtaXQgPSBmYWxzZTsKLQotICAgIGlmICggZGlzcGF0Y2hIVE1MRXZlbnQoc3Vi
bWl0RXZlbnQsZmFsc2UsdHJ1ZSkgJiYgIW1fZG9pbmdzdWJtaXQgKQotICAgICAgICBtX2RvaW5n
c3VibWl0ID0gdHJ1ZTsKLQotICAgIG1faW5zdWJtaXQgPSBmYWxzZTsKLQotICAgIGlmICggbV9k
b2luZ3N1Ym1pdCApCi0gICAgICAgIHN1Ym1pdCh0cnVlKTsKLQotICAgIHJldHVybiBtX2RvaW5n
c3VibWl0OwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnN1Ym1pdCggYm9vbCBhY3Rp
dmF0ZVN1Ym1pdEJ1dHRvbiApCi17Ci0gICAgS0hUTUxWaWV3ICp2aWV3ID0gZ2V0RG9jdW1lbnQo
KS0+dmlldygpOwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0g
ICAgaWYgKCF2aWV3IHx8ICFmcmFtZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
aWYgKCBtX2luc3VibWl0ICkgewotICAgICAgICBtX2RvaW5nc3VibWl0ID0gdHJ1ZTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1faW5zdWJtaXQgPSB0cnVlOwotCi0gICAgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwqIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IDA7Ci0g
ICAgYm9vbCBuZWVkQnV0dG9uQWN0aXZhdGlvbiA9IGFjdGl2YXRlU3VibWl0QnV0dG9uOwkvLyBk
byB3ZSBuZWVkIHRvIGFjdGl2YXRlIGEgc3VibWl0IGJ1dHRvbj8KLSAgICAKLSAgICBNYWMoZnJh
bWUpLT5jbGVhclJlY29yZGVkRm9ybVZhbHVlcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsKiBjdXJyZW50ID0gZm9ybUVsZW1lbnRzW2ldOwotICAgICAgICAvLyBPdXIg
YXBwIG5lZWRzIHRvIGdldCBmb3JtIHZhbHVlcyBmb3IgcGFzc3dvcmQgZmllbGRzIGZvciBkb2lu
ZyBwYXNzd29yZCBhdXRvY29tcGxldGUsCi0gICAgICAgIC8vIHNvIHdlIGFyZSBtb3JlIGxlbmll
bnQgaW4gcHVzaGluZyB2YWx1ZXMsIGFuZCBsZXQgdGhlIGFwcCBkZWNpZGUgd2hhdCB0byBzYXZl
IHdoZW4uCi0gICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpKSB7Ci0g
ICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCAqaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgaWYgKGlucHV0LT5pbnB1
dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6VEVYVAotICAgICAgICAgICAgICAgIHx8
IGlucHV0LT5pbnB1dFR5cGUoKSA9PSAgSFRNTElucHV0RWxlbWVudEltcGw6OlBBU1NXT1JECi0g
ICAgICAgICAgICAgICAgfHwgaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpTRUFSQ0gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWFjKGZyYW1lKS0+
cmVjb3JkRm9ybVZhbHVlKGlucHV0LT5uYW1lKCkucXN0cmluZygpLCBpbnB1dC0+dmFsdWUoKS5x
c3RyaW5nKCksIHRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+cmVuZGVyZXIoKSAm
JiBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQqPihpbnB1dC0+cmVu
ZGVyZXIoKSktPmFkZFNlYXJjaFJlc3VsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoY3Vy
cmVudC0+aXNBY3RpdmF0ZWRTdWJtaXQoKSkgewotICAgICAgICAgICAgICAgIG5lZWRCdXR0b25B
Y3RpdmF0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0U3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbiA9PSAwICYmIGN1cnJlbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigp
KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gY3VycmVu
dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZWVkQnV0dG9u
QWN0aXZhdGlvbiAmJiBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsKLSAgICAgICAgZmly
c3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQodHJ1ZSk7Ci0gICAg
fQotCi0gICAgaWYgKCFtX3Bvc3QpCi0gICAgICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAg
Ci0gICAgRm9ybURhdGEgZm9ybV9kYXRhOwotICAgIGlmIChmb3JtRGF0YShmb3JtX2RhdGEpKSB7
Ci0gICAgICAgIGlmKG1fcG9zdCkgewotICAgICAgICAgICAgZnJhbWUtPnN1Ym1pdEZvcm0oICJw
b3N0IiwgbV91cmwucXN0cmluZygpLCBmb3JtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fdGFyZ2V0LnFzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZW5jdHlwZSgpLnFzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkoKS5xc3RyaW5nKCkgKTsKLSAgICAgICAgfQot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAiZ2V0IiwgbV91
cmwucXN0cmluZygpLCBmb3JtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fdGFyZ2V0LnFzdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYg
KG5lZWRCdXR0b25BY3RpdmF0aW9uICYmIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbikgewot
ICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24tPnNldEFjdGl2YXRlZFN1Ym1pdChm
YWxzZSk7Ci0gICAgfQotICAgIAotICAgIG1fZG9pbmdzdWJtaXQgPSBtX2luc3VibWl0ID0gZmFs
c2U7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVzZXQoICApCi17Ci0gICAgRnJh
bWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2lucmVzZXQgfHwg
IWZyYW1lKSByZXR1cm47Ci0KLSAgICBtX2lucmVzZXQgPSB0cnVlOwotCi0gICAgLy8gIyMjIERP
TTIgbGFiZWxzIHRoaXMgZXZlbnQgYXMgbm90IGNhbmNlbGFibGUsIGhvd2V2ZXIKLSAgICAvLyBj
b21tb24gYnJvd3NlcnMoIHNpY2shICkgYWxsb3cgaXQgYmUgY2FuY2VsbGVkLgotICAgIGlmICgg
IWRpc3BhdGNoSFRNTEV2ZW50KHJlc2V0RXZlbnQsdHJ1ZSwgdHJ1ZSkgKSB7Ci0gICAgICAgIG1f
aW5yZXNldCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZvcm1F
bGVtZW50c1tpXS0+cmVzZXQoKTsKLQotICAgIG1faW5yZXNldCA9IGZhbHNlOwotfQotCi12b2lk
IEhUTUxGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyKSAKLSAg
ICB7Ci0gICAgICAgIGJvb2wgb2xkVVJMV2FzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1
Ym1pc3Npb24obV91cmwpOwotICAgICAgICBtX3VybCA9IGtodG1sOjpwYXJzZVVSTChhdHRyLT52
YWx1ZSgpKTsKLSAgICAgICAgYm9vbCBuZXdVUkxJc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1
cmVTdWJtaXNzaW9uKG1fdXJsKTsKLQotICAgICAgICBpZiAobV9hdHRhY2hlZCAmJiAob2xkVVJM
V2FzU2VjdXJlICE9IG5ld1VSTElzU2VjdXJlKSkKLSAgICAgICAgICAgIGlmIChuZXdVUkxJc1Nl
Y3VyZSkKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsK
LSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5zZWN1cmVG
b3JtUmVtb3ZlZCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdGFyZ2V0
QXR0cikgewotICAgICAgICBtX3RhcmdldCA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gbWV0aG9kQXR0cikgewotICAgICAgICBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoYXR0ci0+dmFsdWUoKSwgInBvc3QiKSkKLSAgICAgICAgICAgIG1fcG9zdCA9IHRydWU7
Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJnZXQi
KSkKLSAgICAgICAgICAgIG1fcG9zdCA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGVuY3R5cGVBdHRyKSB7Ci0gICAgICAgIHBhcnNlRW5jdHlwZShhdHRyLT52YWx1ZSgp
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2NlcHRfY2hhcnNldEF0dHIpIHsK
LSAgICAgICAgLy8gc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcnNldHMgdGhlIHNlcnZlcgot
ICAgICAgICAvLyBhY2NlcHRzIC0gc2VlIHJmYzIwNDUKLSAgICAgICAgbV9hY2NlcHRjaGFyc2V0
ID0gYXR0ci0+dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2NlcHRB
dHRyKSB7Ci0gICAgICAgIC8vIGlnbm9yZSB0aGlzIG9uZSBmb3IgdGhlIG1vbWVudC4uLgotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAg
bV9hdXRvY29tcGxldGUgPSAhZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uc3VibWl0QXR0cikgewotICAgICAg
ICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzdWJtaXRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25yZXNldEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlz
dGVuZXIocmVzZXRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
bmFtZUF0dHIpIHsKLSAgICAgICAgRE9NU3RyaW5nIG5ld05hbWVBdHRyID0gYXR0ci0+dmFsdWUo
KTsKLSAgICAgICAgaWYgKGluRG9jdW1lbnQoKSAmJiBnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1
bWVudCgpKSB7Ci0gICAgICAgICAgICBIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRp
Y19jYXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBk
b2N1bWVudC0+cmVtb3ZlTmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICAgICAgICAgIGRvY3Vt
ZW50LT5hZGROYW1lZEl0ZW0obmV3TmFtZUF0dHIpOwotICAgICAgICB9Ci0gICAgICAgIG9sZE5h
bWVBdHRyID0gbmV3TmFtZUF0dHI7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0
YXRpYyB2b2lkIGluc2VydEludG9WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCB1bnNpZ25lZCBw
b3MsIFQqIGl0ZW0pCi17Ci0gICAgdW5zaWduZWQgc2l6ZSA9IHZlYy5zaXplKCk7Ci0gICAgdW5z
aWduZWQgY291bnQgPSB2ZWMuY291bnQoKTsKLSAgICBhc3NlcnQocG9zIDw9IGNvdW50KTsKLSAg
ICBpZiAoc2l6ZSA9PSBjb3VudCkKLSAgICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDog
c2l6ZSAqIDMgLyAyKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBjb3VudDsgaSA+IHBvczsgLS1p
KQotICAgICAgICB2ZWMuaW5zZXJ0KGksIHZlY1tpIC0gMV0pOyAgICAKLSAgICB2ZWMuaW5zZXJ0
KHBvcywgaXRlbSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGFwcGVuZFRv
VmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgVCAqaXRlbSkKLXsKLSAgICB1bnNpZ25lZCBzaXpl
ID0gdmVjLnNpemUoKTsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwotICAgIGlm
IChzaXplID09IGNvdW50KQotICAgICAgICB2ZWMucmVzaXplKHNpemUgPT0gMCA/IDggOiBzaXpl
ICogMyAvIDIpOwotICAgIHZlYy5pbnNlcnQoY291bnQsIGl0ZW0pOwotfQotCi10ZW1wbGF0ZTxj
bGFzcyBUPiBzdGF0aWMgdm9pZCByZW1vdmVGcm9tVmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywg
VCAqaXRlbSkKLXsKLSAgICBpbnQgcG9zID0gdmVjLmZpbmRSZWYoaXRlbSk7Ci0gICAgaWYgKHBv
cyA8IDApCi0gICAgICAgIHJldHVybjsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IHBvczsgaSA8IGNvdW50IC0gMTsgKytpKQotICAgICAg
ICB2ZWMuaW5zZXJ0KGksIHZlY1tpICsgMV0pOwotICAgIHZlYy5yZW1vdmUoY291bnQgLSAxKTsK
LX0KLQotdW5zaWduZWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6Zm9ybUVsZW1lbnRJbmRleChIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICAvLyBDaGVjayBmb3IgdGhlIHNwZWNp
YWwgY2FzZSB3aGVyZSB0aGlzIGVsZW1lbnQgaXMgdGhlIHZlcnkgbGFzdCB0aGluZyBpbgotICAg
IC8vIHRoZSBmb3JtJ3MgdHJlZSBvZiBjaGlsZHJlbjsgd2UgZG9uJ3Qgd2FudCB0byB3YWxrIHRo
ZSBlbnRpcmUgdHJlZSBpbiB0aGF0Ci0gICAgLy8gY29tbW9uIGNhc2UgdGhhdCBvY2N1cnMgZHVy
aW5nIHBhcnNpbmc7IGluc3RlYWQgd2UnbGwganVzdCByZXR1cm4gYSB2YWx1ZQotICAgIC8vIHRo
YXQgc2F5cyAiYWRkIHRoaXMgZm9ybSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5Ii4K
LSAgICBpZiAoZS0+dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKSkgewotICAgICAgICB1bnNpZ25lZCBp
ID0gMDsKLSAgICAgICAgZm9yIChOb2RlSW1wbCAqbm9kZSA9IHRoaXM7IG5vZGU7IG5vZGUgPSBu
b2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZSA9PSBl
KQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRN
TEVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MRWxlbWVu
dEltcGwgKj4obm9kZSktPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkKLSAgICAgICAgICAgICAgICAg
ICAgJiYgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKj4obm9kZSktPmZv
cm0oKSA9PSB0aGlzKQotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gZm9ybUVsZW1lbnRzLmNvdW50KCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50
SW1wbDo6cmVnaXN0ZXJGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkK
LXsKLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvYyAm
JiBlLT5pc1JhZGlvQnV0dG9uKCkgJiYgIWUtPm5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnRDaGVja2VkUmFkaW8gPSBkb2MtPmNo
ZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIChIVE1MRm9ybUVsZW1l
bnRJbXBsKikgMCk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvID09IGUpCi0gICAg
ICAgICAgICBkb2MtPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgKEhU
TUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAgaWYgKGUtPmlzQ2hlY2tlZCgpKQotICAg
ICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJbXBsKikg
ZSwgdGhpcyk7Ci0gICAgfQotICAgIGluc2VydEludG9WZWN0b3IoZm9ybUVsZW1lbnRzLCBmb3Jt
RWxlbWVudEluZGV4KGUpLCBlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1v
dmVGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICBpZiAo
IWUtPm5hbWUoKS5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSkgewotICAgICAgICBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbCogY3VycmVudENoZWNrZWRSYWRpbyA9IGdldERvY3VtZW50KCkt
PmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAg
ICAgICBpZiAoY3VycmVudENoZWNrZWRSYWRpbyA9PSBlKQotICAgICAgICAgICAgZ2V0RG9jdW1l
bnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAg
ICB9Ci0gICAgcmVtb3ZlRnJvbVZlY3Rvcihmb3JtRWxlbWVudHMsIGUpOwotfQotCi1ib29sIEhU
TUxGb3JtRWxlbWVudEltcGw6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyOwotfQotCi12b2lk
IEhUTUxGb3JtRWxlbWVudEltcGw6OnJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50
SW1wbCAqZSkKLXsKLSAgICBhcHBlbmRUb1ZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0KLXZv
aWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVtb3ZlSW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50
SW1wbCAqZSkKLXsKLSAgICByZW1vdmVGcm9tVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQot
UmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gSFRNTEZvcm1FbGVtZW50SW1wbDo6ZWxlbWVudHMo
KQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTEZvcm1D
b2xsZWN0aW9uSW1wbCh0aGlzKSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLX0K
LQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjphY2NlcHRDaGFyc2V0KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFjY2VwdF9jaGFyc2V0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1F
bGVtZW50SW1wbDo6c2V0QWNjZXB0Q2hhcnNldChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhY2NlcHRfY2hhcnNldEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxGb3JtRWxlbWVudEltcGw6OmFjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShhY3Rpb25BdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpz
ZXRBY3Rpb24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWN0
aW9uQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEVuY3R5
cGUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZW5jdHlwZUF0
dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om1ldGhvZCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShtZXRob2RBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUobWV0aG9kQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcg
SFRNTEZvcm1FbGVtZW50SW1wbDo6dGFyZ2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKHRhcmdldEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldFRh
cmdldChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh0YXJnZXRB
dHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6OkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5h
bWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQot
ICAgIDogSFRNTEVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYykKLXsKLSAgICBtX2Rpc2FibGVkID0g
bV9yZWFkT25seSA9IGZhbHNlOwotCi0gICAgaWYgKGYpCi0JbV9mb3JtID0gZjsKLSAgICBlbHNl
Ci0JbV9mb3JtID0gZ2V0Rm9ybSgpOwotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9ybS0+
cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsKLX0KLQotSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6On5IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKG1fZm9ybSkKLSAg
ICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlzKTsKLX0KLQotdm9pZCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAg
ICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZGlzYWJs
ZWRBdHRyKSB7Ci0gICAgICAgIGJvb2wgb2xkRGlzYWJsZWQgPSBtX2Rpc2FibGVkOwotICAgICAg
ICBtX2Rpc2FibGVkID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICBpZiAob2xkRGlzYWJsZWQg
IT0gbV9kaXNhYmxlZCkgewotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAg
aWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQot
ICAgICAgICAgICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBFbmFibGVk
U3RhdGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gcmVhZG9u
bHlBdHRyKSB7Ci0gICAgICAgIGJvb2wgb2xkUmVhZE9ubHkgPSBtX3JlYWRPbmx5OwotICAgICAg
ICBtX3JlYWRPbmx5ID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICBpZiAob2xkUmVhZE9ubHkg
IT0gbV9yZWFkT25seSkgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxl
bWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi12b2lkIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKQotewotICAgIGFzc2VydCghYXR0YWNoZWQoKSk7
Ci0KLSAgICBIVE1MRWxlbWVudEltcGw6OmF0dGFjaCgpOwotCi0gICAgLy8gVGhlIGNhbGwgdG8g
dXBkYXRlRnJvbUVsZW1lbnQoKSBuZWVkcyB0byBnbyBhZnRlciB0aGUgY2FsbCB0aHJvdWdoCi0g
ICAgLy8gdG8gdGhlIGJhc2UgY2xhc3MncyBhdHRhY2goKSBiZWNhdXNlIHRoYXQgY2FuIHNvbWV0
aW1lcyBkbyBhIGNsb3NlCi0gICAgLy8gb24gdGhlIHJlbmRlcmVyLgotICAgIGlmIChtX3JlbmRl
cikgewotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAKLSAgICAg
ICAgLy8gRGVsYXllZCBhdHRhY2htZW50IGluIG9yZGVyIHRvIHByZXZlbnQgRk9VQyBjYW4gcmVz
dWx0IGluIGFuIG9iamVjdCBiZWluZwotICAgICAgICAvLyBwcm9ncmFtbWF0aWNhbGx5IGZvY3Vz
ZWQgYmVmb3JlIGl0IGhhcyBhIHJlbmRlciBvYmplY3QuICBJZiB3ZSBoYXZlIGJlZW4gZm9jdXNl
ZAotICAgICAgICAvLyAoaS5lLiwgaWYgd2UgYXJlIHRoZSBmb2N1c05vZGUpIHRoZW4gZ28gYWhl
YWQgYW5kIGZvY3VzIG91ciBjb3JyZXNwb25kaW5nIG5hdGl2ZSB3aWRnZXQuCi0gICAgICAgIC8v
IChBdHRhY2gvZGV0YWNoIGNhbiBhbHNvIGhhcHBlbiBhcyBhIHJlc3VsdCBvZiBkaXNwbGF5IHR5
cGUgY2hhbmdlcywgZS5nLiwgbWFraW5nIGEgd2lkZ2V0Ci0gICAgICAgIC8vIGJsb2NrIGluc3Rl
YWQgb2YgaW5saW5lLCBhbmQgZm9jdXMgc2hvdWxkIGJlIHJlc3RvcmVkIGluIHRoYXQgY2FzZSBh
cyB3ZWxsLikKLSAgICAgICAgaWYgKGdldERvY3VtZW50KCktPmZvY3VzTm9kZSgpID09IHRoaXMg
JiYgbV9yZW5kZXItPmlzV2lkZ2V0KCkgJiYgCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJXaWRnZXQqPihyZW5kZXJlcigpKS0+d2lkZ2V0KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJXaWRnZXQqPihyZW5kZXJlcigpKS0+d2lkZ2V0KCktPnNldEZvY3VzKCk7Ci0gICAg
fQotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRlZEludG9UcmVl
KGJvb2wgZGVlcCkKLXsKLSAgICBpZiAoIW1fZm9ybSkgewotICAgICAgICAvLyBUaGlzIGhhbmRs
ZXMgdGhlIGNhc2Ugb2YgYSBuZXcgZm9ybSBlbGVtZW50IGJlaW5nIGNyZWF0ZWQgYnkKLSAgICAg
ICAgLy8gSmF2YVNjcmlwdCBhbmQgaW5zZXJ0ZWQgaW5zaWRlIGEgZm9ybS4gIEluIHRoZSBjYXNl
IG9mIHRoZSBwYXJzZXIKLSAgICAgICAgLy8gc2V0dGluZyBhIGZvcm0sIHdlIHdpbGwgYWxyZWFk
eSBoYXZlIGEgbm9uLW51bGwgdmFsdWUgZm9yIG1fZm9ybSwgCi0gICAgICAgIC8vIGFuZCBzbyB3
ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgotICAgICAgICBtX2Zvcm0gPSBnZXRGb3JtKCk7
Ci0JaWYgKG1fZm9ybSkKLQkgICAgbV9mb3JtLT5yZWdpc3RlckZvcm1FbGVtZW50KHRoaXMpOwot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9jdW1l
bnQoKTsKLSAgICAgICAgICAgIGlmIChkb2MgJiYgaXNSYWRpb0J1dHRvbigpICYmICFuYW1lKCku
aXNFbXB0eSgpICYmIGlzQ2hlY2tlZCgpKQotICAgICAgICAgICAgICAgIGRvYy0+cmFkaW9CdXR0
b25DaGVja2VkKChIVE1MSW5wdXRFbGVtZW50SW1wbCopdGhpcywgbV9mb3JtKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIEhUTUxFbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsK
LX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlZEZyb21UcmVlKGJv
b2wgZGVlcCkKLXsKLSAgICAvLyBXaGVuIGJlaW5nIHJlbW92ZWQgd2UgaGF2ZSB0byBwb3NzaWJs
eSBudWxsIG91dCBvdXIgZm9ybSBhbmQgcmVtb3ZlIG91cnNlbHZlcyBmcm9tCi0gICAgLy8gdGhl
IGZvcm0ncyBsaXN0IG9mIGVsZW1lbnRzLgotICAgIGlmIChtX2Zvcm0pIHsKLSAgICAgICAgLy8g
QXR0ZW1wdCB0byByZS1hY3F1aXJlIHRoZSBmb3JtLiAgSWYgd2UgY2FuJ3QgcmUtYWNxdWlyZSwg
dGhlbgotICAgICAgICAvLyByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGZvcm0uCi0gICAgICAg
IE5vZGVJbXBsKiBmb3JtID0gcGFyZW50Tm9kZSgpOwotICAgICAgICBOb2RlSW1wbCogcm9vdCA9
IHRoaXM7Ci0gICAgICAgIHdoaWxlIChmb3JtKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybS0+aGFz
VGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHJv
b3QgPSBmb3JtOwotICAgICAgICAgICAgZm9ybSA9IGZvcm0tPnBhcmVudE5vZGUoKTsKLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlIGZvcm0gaGFzIGJlZW4gZGVtb3RlZCB0
byBhIGxlYWYsIHRoZW4gd2Ugd29uJ3QgZmluZCBpdCBhcyBhbiBhbmNlc3Rvci4KLSAgICAgICAg
Ly8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByb290IG5vZGUgb2Ygb3VyIGN1cnJlbnQgZm9ybSBhbmQg
b3VyIHJvb3Qgbm9kZQotICAgICAgICAvLyBtYXRjaC4gIElmIHNvLCBwcmVzZXJ2ZSB0aGUgY29u
bmVjdGlvbiB0byB0aGUgZm9ybS4KLSAgICAgICAgaWYgKCFmb3JtKSB7Ci0gICAgICAgICAgICBO
b2RlSW1wbCogZm9ybVJvb3QgPSBtX2Zvcm07Ci0gICAgICAgICAgICB3aGlsZSAoZm9ybVJvb3Qt
PnBhcmVudCgpKSBmb3JtUm9vdCA9IGZvcm1Sb290LT5wYXJlbnQoKTsKLSAgICAgICAgICAgIGlm
IChmb3JtUm9vdCA9PSByb290KQotICAgICAgICAgICAgICAgIGZvcm0gPSBtX2Zvcm07Ci0gICAg
ICAgIH0gCi0gICAgICAgIAotICAgICAgICBpZiAoIWZvcm0pIHsKLSAgICAgICAgICAgIG1fZm9y
bS0+cmVtb3ZlRm9ybUVsZW1lbnQodGhpcyk7Ci0gICAgICAgICAgICBtX2Zvcm0gPSAwOwotICAg
ICAgICB9IGVsc2UKLSAgICAgICAgICAgIGFzc2VydChmb3JtID09IG1fZm9ybSk7IC8vIFRoZSBy
ZS1hY3F1aXJlZCBmb3JtIHNob3VsZCBiZSB0aGUgc2FtZS4gSWYgbm90LCBzb21ldGhpbmcgcmVh
bGx5IHN0cmFuZ2UgaGFwcGVuZWQuCi0gICAgfQotICAgCi0gICAgSFRNTEVsZW1lbnRJbXBsOjpy
ZW1vdmVkRnJvbVRyZWUoZGVlcCk7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGwgKkhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjpnZXRGb3JtKCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqcCA9
IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZShwKSB7Ci0gICAgICAgIGlmIChwLT5oYXNUYWdOYW1l
KGZvcm1UYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVu
dEltcGwgKj4ocCk7Ci0gICAgICAgIHAgPSBwLT5wYXJlbnROb2RlKCk7Ci0gICAgfQotICAgIHJl
dHVybiAwOwotfQotCi1ET01TdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om5hbWUo
KSBjb25zdAotewotICAgIERPTVN0cmluZyBuID0gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLSAg
ICByZXR1cm4gbi5pc051bGwoKSA/ICIiIDogbjsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6c2V0TmFtZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpvblNlbGVjdCgpCi17Ci0gICAgLy8gIyMjIG1ha2UgdGhpcyB3b3JrIHdpdGggbmV3
IGZvcm0gZXZlbnRzIGFyY2hpdGVjdHVyZQotICAgIGRpc3BhdGNoSFRNTEV2ZW50KHNlbGVjdEV2
ZW50LHRydWUsZmFsc2UpOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpv
bkNoYW5nZSgpCi17Ci0gICAgLy8gIyMjIG1ha2UgdGhpcyB3b3JrIHdpdGggbmV3IGZvcm0gZXZl
bnRzIGFyY2hpdGVjdHVyZQotICAgIGRpc3BhdGNoSFRNTEV2ZW50KGNoYW5nZUV2ZW50LHRydWUs
ZmFsc2UpOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkaXNhYmxlZCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGlzYWJsZWQ7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OnNldERpc2FibGVkKGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
ZGlzYWJsZWRBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6c2V0UmVhZE9ubHkoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShyZWFkb25s
eUF0dHIsIGIgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKQotewotICAgIC8vYm9vbCBjaGFuZ2VkID0g
Y2hhbmdlZCgpOwotICAgIEhUTUxFbGVtZW50SW1wbDo6cmVjYWxjU3R5bGUoIGNoICk7Ci0KLSAg
ICBpZiAobV9yZW5kZXIgLyomJiBjaGFuZ2VkKi8pCi0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVG
cm9tRWxlbWVudCgpOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc0Zv
Y3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGRpc2FibGVkKCkgfHwgIW1fcmVuZGVyIHx8IAot
ICAgICAgICAobV9yZW5kZXItPnN0eWxlKCkgJiYgbV9yZW5kZXItPnN0eWxlKCktPnZpc2liaWxp
dHkoKSAhPSBWSVNJQkxFKSB8fCAKLSAgICAgICAgbV9yZW5kZXItPndpZHRoKCkgPT0gMCB8fCBt
X3JlbmRlci0+aGVpZ2h0KCkgPT0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVy
biB0cnVlOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc0tleWJvYXJk
Rm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAgICBp
ZiAobV9yZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAgICAg
KHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3VzUG9s
aWN5KCkgJiBRV2lkZ2V0OjpUYWJGb2N1cyk7Ci0gICAgICAgIH0KLQlpZiAoZ2V0RG9jdW1lbnQo
KS0+ZnJhbWUoKSkKLQkgICAgcmV0dXJuIGdldERvY3VtZW50KCktPmZyYW1lKCktPnRhYnNUb0Fs
bENvbnRyb2xzKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNNb3VzZUZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgaWYg
KGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgaWYgKG1fcmVuZGVyLT5pc1dpZGdldCgpKSB7Ci0g
ICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53
aWRnZXQoKSAmJgotICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPiht
X3JlbmRlciktPndpZGdldCgpLT5mb2N1c1BvbGljeSgpICYgUVdpZGdldDo6Q2xpY2tGb2N1cyk7
Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIDxpbnB1dCB0eXBlPWltYWdlPiBhbmQgPGJ1dHRv
bj4sIHdlIHdpbGwgYXNzdW1lIG5vIG1vdXNlIGZvY3VzYWJpbGl0eS4gIFRoaXMgaXMKLSAgICAg
ICAgLy8gY29uc2lzdGVudCB3aXRoIE9TIFggYmVoYXZpb3IgZm9yIGJ1dHRvbnMuCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc0VkaXRhYmxlKCkKLXsKLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLS8vIFNwZWNpYWwgY2hhcnMgdXNlZCB0byBlbmNvZGUgZm9ybSBzdGF0ZSBzdHJpbmdz
LgotLy8gV2UgcGljayBjaGFycyB0aGF0IGFyZSB1bmxpa2VseSB0byBiZSB1c2VkIGluIGFuIEhU
TUwgYXR0ciwgc28gd2UgcmFyZWx5IGhhdmUgdG8gcmVhbGx5IGVuY29kZS4KLWNvbnN0IGNoYXIg
c3RhdGVTZXBhcmF0b3IgPSAnJic7Ci1jb25zdCBjaGFyIHN0YXRlRXNjYXBlID0gJzwnOwotc3Rh
dGljIGNvbnN0IGNoYXIgc3RhdGVTZXBhcmF0b3JNYXJrZXJbXSA9ICI8QSI7Ci1zdGF0aWMgY29u
c3QgY2hhciBzdGF0ZUVzY2FwZU1hcmtlcltdID0gIjw8IjsKLQotLy8gRW5jb2RlIGFuIGVsZW1l
bnQgbmFtZSBzbyB3ZSBjYW4gcHV0IGl0IGluIGEgc3RhdGUgc3RyaW5nIHdpdGhvdXQgY29sbGlk
aW5nCi0vLyB3aXRoIG91ciBzZXBhcmF0b3IgY2hhci4KLXN0YXRpYyBRU3RyaW5nIGVuY29kZWRF
bGVtZW50TmFtZShRU3RyaW5nIHN0cikKLXsKLSAgICBpbnQgc2VwTG9jID0gc3RyLmZpbmQoc3Rh
dGVTZXBhcmF0b3IpOwotICAgIGludCBlc2NMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvcik7
Ci0gICAgaWYgKHNlcExvYyA+PSAwIHx8IGVzY0xvYyA+PSAwKSB7Ci0gICAgICAgIFFTdHJpbmcg
bmV3U3RyID0gc3RyOwotICAgICAgICAvLyAgIHJlcGxhY2UgIjwiIHdpdGggIjw8IgotICAgICAg
ICB3aGlsZSAoZXNjTG9jID49IDApIHsKLSAgICAgICAgICAgIG5ld1N0ci5yZXBsYWNlKGVzY0xv
YywgMSwgc3RhdGVFc2NhcGVNYXJrZXIpOwotICAgICAgICAgICAgZXNjTG9jID0gc3RyLmZpbmQo
c3RhdGVTZXBhcmF0b3IsIGVzY0xvYysxKTsKLSAgICAgICAgfQotICAgICAgICAvLyAgIHJlcGxh
Y2UgIiYiIHdpdGggIjxBIgotICAgICAgICB3aGlsZSAoc2VwTG9jID49IDApIHsKLSAgICAgICAg
ICAgIG5ld1N0ci5yZXBsYWNlKHNlcExvYywgMSwgc3RhdGVTZXBhcmF0b3JNYXJrZXIpOwotICAg
ICAgICAgICAgc2VwTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IsIHNlcExvYysxKTsKLSAg
ICAgICAgfQotICAgICAgICByZXR1cm4gbmV3U3RyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJl
dHVybiBzdHI7Ci0gICAgfQotfQotCi1RU3RyaW5nIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpzdGF0ZSggKQotewotICAgIC8vIEJ1aWxkIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgRWxlbWVu
dE5hbWUmRWxlbWVudFR5cGUmCi0gICAgcmV0dXJuIGVuY29kZWRFbGVtZW50TmFtZShuYW1lKCku
cXN0cmluZygpKSArIHN0YXRlU2VwYXJhdG9yICsgdHlwZSgpLnFzdHJpbmcoKSArIHN0YXRlU2Vw
YXJhdG9yOwotfQotCi1RU3RyaW5nIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0
Y2hpbmdTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQotewotICAgIFFTdHJpbmcgZW5jTmFtZSA9
IGVuY29kZWRFbGVtZW50TmFtZShuYW1lKCkucXN0cmluZygpKTsKLSAgICBRU3RyaW5nIHR5cGVT
dHIgPSB0eXBlKCkucXN0cmluZygpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0
ID0gc3RhdGVzLmJlZ2luKCk7IGl0ICE9IHN0YXRlcy5lbmQoKTsgKytpdCkgewotICAgICAgICBR
U3RyaW5nIHN0YXRlID0gKml0OwotICAgICAgICBpbnQgc2VwMSA9IHN0YXRlLmZpbmQoc3RhdGVT
ZXBhcmF0b3IpOwotICAgICAgICBpbnQgc2VwMiA9IHN0YXRlLmZpbmQoc3RhdGVTZXBhcmF0b3Is
IHNlcDErMSk7Ci0gICAgICAgIGFzc2VydChzZXAxID49IDApOwotICAgICAgICBhc3NlcnQoc2Vw
MiA+PSAwKTsKLQotICAgICAgICBRU3RyaW5nIG5hbWVBbmRUeXBlID0gc3RhdGUubGVmdChzZXAy
KTsKLSAgICAgICAgaWYgKGVuY05hbWUubGVuZ3RoKCkgKyB0eXBlU3RyLmxlbmd0aCgpICsgMSA9
PSAodWludClzZXAyCi0gICAgICAgICAgICAmJiBuYW1lQW5kVHlwZS5zdGFydHNXaXRoKGVuY05h
bWUpCi0gICAgICAgICAgICAmJiBuYW1lQW5kVHlwZS5lbmRzV2l0aCh0eXBlU3RyKSkKLSAgICAg
ICAgewotICAgICAgICAgICAgc3RhdGVzLnJlbW92ZShpdCk7Ci0gICAgICAgICAgICByZXR1cm4g
c3RhdGUubWlkKHNlcDIrMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFFTdHJpbmc6
Om51bGw7Ci19Ci0KLWludCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6dGFiSW5kZXgoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodGFiaW5kZXhBdHRyKS50b0ludCgpOwot
fQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRUYWJJbmRleChpbnQgdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHRhYmluZGV4QXR0ciwgUVN0cmluZzo6bnVtYmVyKHZh
bHVlKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
OjpIVE1MQnV0dG9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVu
dEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChidXR0b25UYWcsIGRv
YywgZikKLXsKLSAgICBtX3R5cGUgPSBTVUJNSVQ7Ci0gICAgbV9kaXJ0eSA9IHRydWU7Ci0gICAg
bV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsKLX0KLQotSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp+SFRN
TEJ1dHRvbkVsZW1lbnRJbXBsKCkKLXsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MQnV0dG9uRWxl
bWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUq
IHN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhpcyk7Ci19
Ci0KLURPTVN0cmluZyBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUodHlwZUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVt
ZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikK
LXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09ICB0eXBlQXR0cikgewotICAgICAgICBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInN1Ym1pdCIpKQotICAgICAgICAgICAgbV90
eXBlID0gU1VCTUlUOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52
YWx1ZSgpLCAicmVzZXQiKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IFJFU0VUOwotICAgICAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiYnV0dG9uIikpCi0gICAg
ICAgICAgICBtX3R5cGUgPSBCVVRUT047Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
dmFsdWVBdHRyKSB7Ci0gICAgICAgIG1fdmFsdWUgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBt
X2N1cnJWYWx1ZSA9IG1fdmFsdWU7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNj
ZXNza2V5QXR0cikgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVy
KGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1
ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6ZGVm
YXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlICE9IEJV
VFRPTiAmJiAoZXZ0LT50eXBlKCkgPT0gRE9NQWN0aXZhdGVFdmVudCkpIHsKLQotICAgICAgICBp
ZihtX2Zvcm0gJiYgbV90eXBlID09IFNVQk1JVCkgewotICAgICAgICAgICAgbV9hY3RpdmVTdWJt
aXQgPSB0cnVlOwotICAgICAgICAgICAgbV9mb3JtLT5wcmVwYXJlU3VibWl0KCk7Ci0gICAgICAg
ICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOyAvLyBpbiBjYXNlIHdlIHdlcmUgY2FuY2VsZWQK
LSAgICAgICAgfQotICAgICAgICBpZihtX2Zvcm0gJiYgbV90eXBlID09IFJFU0VUKSBtX2Zvcm0t
PnJlc2V0KCk7Ci0gICAgfQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0
RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjppc1N1
Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSBjb25zdAotewotICAgIC8vIEhUTUwgc3BlYyBzYXlzIHRo
YXQgYnV0dG9ucyBtdXN0IGhhdmUgbmFtZXMKLSAgICAvLyB0byBiZSBjb25zaWRlcmVkIHN1Y2Nl
c3NmdWwuIEhvd2V2ZXIsIG90aGVyIGJyb3dzZXJzCi0gICAgLy8gZG8gbm90IGltcG9zZSB0aGlz
IGNvbnN0cmFpbnQuIFRoZXJlZm9yZSwgd2UgYmVoYXZlCi0gICAgLy8gZGlmZmVyZW50bHkgYW5k
IGNhbiB1c2UgZGlmZmVyZW50IGJ1dHRvbnMgdGhhbiB0aGUgCi0gICAgLy8gYXV0aG9yIGludGVu
ZGVkLiAKLSAgICAvLyBSZW1vdmUgdGhlIG5hbWUgY29uc3RyYWludCBmb3Igbm93LgotICAgIC8v
IFdhczogbV90eXBlID09IFNVQk1JVCAmJiAhbV9kaXNhYmxlZCAmJiAhbmFtZSgpLmlzRW1wdHko
KQotICAgIHJldHVybiBtX3R5cGUgPT0gU1VCTUlUICYmICFtX2Rpc2FibGVkOwotfQotCi1ib29s
IEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdAotewotICAg
IHJldHVybiBtX2FjdGl2ZVN1Ym1pdDsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6
OnNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBm
bGFnOwotfQotCi1ib29sIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9y
bURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCAvKm11bHRpcGFydCovKQotewotICAgIGlmIChtX3R5
cGUgIT0gU1VCTUlUIHx8IG5hbWUoKS5pc0VtcHR5KCkgfHwgIW1fYWN0aXZlU3VibWl0KQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIG1fY3Vy
clZhbHVlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudElt
cGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17ICAgCi0gICAgLy8g
c2VuZCB0aGUgbW91c2UgYnV0dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgLy8gY2FsbGVyIHNwZWNp
ZmllZCBzZW5kVG9BbnlFbGVtZW50Ci0gICAgY2xpY2soc2VuZFRvQW55RWxlbWVudCk7Ci19Ci0K
LURPTVN0cmluZyBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MQnV0
dG9uRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBI
VE1MQnV0dG9uRWxlbWVudEltcGw6OnZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKHZhbHVlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRW
YWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0
dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MRmllbGRTZXRFbGVt
ZW50SW1wbDo6SFRNTEZpZWxkU2V0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYpCi0gICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGZpZWxk
c2V0VGFnLCBkb2MsIGYpCi17Ci19Ci0KLUhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp+SFRNTEZp
ZWxkU2V0RWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBs
OjpjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpCi17Ci0gICAgcmV0dXJuIG5ld0No
aWxkLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykgfHwgSFRNTEVsZW1lbnRJbXBsOjpjaGVja0RURChu
ZXdDaGlsZCk7Ci19Ci0KLWJvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmlzRm9jdXNhYmxl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MRmllbGRT
ZXRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJmaWVsZHNldCI7Ci19
Ci0KLVJlbmRlck9iamVjdCogSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVybiBu
ZXcgKGFyZW5hKSBSZW5kZXJGaWVsZHNldCh0aGlzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0RWxlbWVudEltcGwoRG9jdW1lbnRJ
bXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbChpbnB1dFRhZywgZG9jLCBmKQotewotICAgIGluaXQoKTsKLX0KLQotSFRNTElu
cHV0RWxlbWVudEltcGw6OkhUTUxJbnB1dEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUm
IHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAg
IDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwodGFnTmFtZSwgZG9jLCBmKQotewotICAgIGlu
aXQoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aW5pdCgpCi17Ci0gICAgbV9p
bWFnZUxvYWRlciA9IDA7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAg
IG1fdHlwZSA9IFRFWFQ7Ci0gICAgbV9tYXhMZW4gPSAtMTsKLSAgICBtX3NpemUgPSAyMDsKLSAg
ICBtX2NoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2RlZmF1bHRDaGVja2VkID0gZmFsc2U7Ci0gICAg
bV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7Ci0gICAgbV9pbmRldGVybWluYXRlID0gZmFsc2U7
Ci0KLSAgICBtX2hhdmVUeXBlID0gZmFsc2U7Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsK
LSAgICBtX2F1dG9jb21wbGV0ZSA9IHRydWU7Ci0gICAgbV9pbml0ZWQgPSBmYWxzZTsKLQotICAg
IHhQb3MgPSAwOwotICAgIHlQb3MgPSAwOwotCi0gICAgbV9tYXhSZXN1bHRzID0gLTE7Ci0KLSAg
ICBpZiAobV9mb3JtKQotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9IG1fZm9ybS0+YXV0b0NvbXBs
ZXRlKCk7Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjp+SFRNTElucHV0RWxlbWVudEltcGwo
KQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJlZ2lzdGVyTWFp
bnRhaW5zU3RhdGUodGhpcyk7Ci0gICAgZGVsZXRlIG1faW1hZ2VMb2FkZXI7Ci19Ci0KLURPTVN0
cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1f
bmFtZS5pc051bGwoKSA/ICIiIDogbV9uYW1lOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUgYmFzZSBj
bGFzcyBzYXlzIHdlIGNhbid0IGJlIGZvY3VzZWQsIHRoZW4gd2UgY2FuIHN0b3Agbm93LgotICAg
IGlmICghSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fdHlwZSA9PSBSQURJTykgewotICAg
ICAgICAvLyBVbm5hbWVkIHJhZGlvIGJ1dHRvbnMgYXJlIG5ldmVyIGZvY3VzYWJsZSAobWF0Y2hl
cyBXaW5JRSkuCi0gICAgICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIE5ldmVyIGFsbG93IGtleWJvYXJkIHRhYmJpbmcgdG8g
bGVhdmUgeW91IGluIHRoZSBzYW1lIHJhZGlvIGdyb3VwLiAgQWx3YXlzCi0gICAgICAgIC8vIHNr
aXAgYW55IG90aGVyIGVsZW1lbnRzIGluIHRoZSBncm91cC4KLSAgICAgICAgTm9kZUltcGwqIGN1
cnJlbnRGb2N1c05vZGUgPSBnZXREb2N1bWVudCgpLT5mb2N1c05vZGUoKTsKLSAgICAgICAgaWYg
KGN1cnJlbnRGb2N1c05vZGUgJiYgY3VycmVudEZvY3VzTm9kZS0+aGFzVGFnTmFtZShpbnB1dFRh
ZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBmb2N1c2VkSW5wdXQgPSBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnRGb2N1c05vZGUpOwotICAg
ICAgICAgICAgaWYgKGZvY3VzZWRJbnB1dC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgZm9jdXNl
ZElucHV0LT5mb3JtKCkgPT0gbV9mb3JtICYmCi0gICAgICAgICAgICAgICAgZm9jdXNlZElucHV0
LT5uYW1lKCkgPT0gbmFtZSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWxsb3cga2V5Ym9hcmQgZm9jdXMgaWYgd2UncmUg
Y2hlY2tlZCBvciBpZiBub3RoaW5nIGluIHRoZSBncm91cCBpcyBjaGVja2VkLgotICAgICAgICBy
ZXR1cm4gY2hlY2tlZCgpIHx8ICFnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JH
cm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1
ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VHlwZShjb25zdCBET01TdHJp
bmcmIHQpCi17Ci0gICAgaWYgKHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBleGNjb2RlOwot
ICAgICAgICByZW1vdmVBdHRyaWJ1dGUodHlwZUF0dHIsIGV4Y2NvZGUpOwotICAgIH0KLSAgICBl
bHNlCi0gICAgICAgIHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdCk7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNldElucHV0VHlwZShjb25zdCBET01TdHJpbmcmIHQpCi17Ci0gICAg
dHlwZUVudW0gbmV3VHlwZTsKLSAgICAKLSAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInBh
c3N3b3JkIikpCi0gICAgICAgIG5ld1R5cGUgPSBQQVNTV09SRDsKLSAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZSh0LCAiY2hlY2tib3giKSkKLSAgICAgICAgbmV3VHlwZSA9IENIRUNLQk9Y
OwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYWRpbyIpKQotICAgICAgICBu
ZXdUeXBlID0gUkFESU87Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInN1Ym1p
dCIpKQotICAgICAgICBuZXdUeXBlID0gU1VCTUlUOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKHQsICJyZXNldCIpKQotICAgICAgICBuZXdUeXBlID0gUkVTRVQ7Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImZpbGUiKSkKLSAgICAgICAgbmV3VHlwZSA9IEZJTEU7
Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImhpZGRlbiIpKQotICAgICAgICBu
ZXdUeXBlID0gSElEREVOOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJpbWFn
ZSIpKQotICAgICAgICBuZXdUeXBlID0gSU1BR0U7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgImJ1dHRvbiIpKQotICAgICAgICBuZXdUeXBlID0gQlVUVE9OOwotICAgIGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJraHRtbF9pc2luZGV4IikpCi0gICAgICAgIG5ld1R5
cGUgPSBJU0lOREVYOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJzZWFyY2gi
KSkKLSAgICAgICAgbmV3VHlwZSA9IFNFQVJDSDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZSh0LCAicmFuZ2UiKSkKLSAgICAgICAgbmV3VHlwZSA9IFJBTkdFOwotICAgIGVsc2UKLSAg
ICAgICAgbmV3VHlwZSA9IFRFWFQ7Ci0KLSAgICAvLyAjIyMgSU1QT1JUQU5UOiBEb24ndCBhbGxv
dyB0aGUgdHlwZSB0byBiZSBjaGFuZ2VkIHRvIEZJTEUgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgLy8g
dHlwZSBjaGFuZ2UsIG90aGVyd2lzZSBhIEphdmFTY3JpcHQgcHJvZ3JhbW1lciB3b3VsZCBiZSBh
YmxlIHRvIHNldCBhIHRleHQKLSAgICAvLyBmaWVsZCdzIHZhbHVlIHRvIHNvbWV0aGluZyBsaWtl
IC9ldGMvcGFzc3dkIGFuZCB0aGVuIGNoYW5nZSBpdCB0byBhIGZpbGUgZmllbGQuCi0gICAgaWYg
KG1fdHlwZSAhPSBuZXdUeXBlKSB7Ci0gICAgICAgIGlmIChuZXdUeXBlID09IEZJTEUgJiYgbV9o
YXZlVHlwZSkgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgYmFjayB0byB0aGUg
b2xkIHZhbHVlLgotICAgICAgICAgICAgLy8gVXNlZnVsIGluIGNhc2Ugd2Ugd2VyZSBjYWxsZWQg
ZnJvbSBpbnNpZGUgcGFyc2VNYXBwZWRBdHRyaWJ1dGUuCi0gICAgICAgICAgICBzZXRBdHRyaWJ1
dGUodHlwZUF0dHIsIHR5cGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAo
bV90eXBlID09IFJBRElPICYmICFuYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBs
KCksIG1fZm9ybSkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+
cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgYm9vbCB3YXNBdHRhY2hlZCA9IG1fYXR0YWNoZWQ7Ci0gICAgICAg
ICAgICBpZiAod2FzQXR0YWNoZWQpCi0gICAgICAgICAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAg
ICAgICBib29sIGRpZFN0b3JlVmFsdWUgPSBzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0
ZSgpOwotICAgICAgICAgICAgbV90eXBlID0gbmV3VHlwZTsKLSAgICAgICAgICAgIGJvb2wgd2ls
bFN0b3JlVmFsdWUgPSBzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpOwotICAgICAg
ICAgICAgaWYgKGRpZFN0b3JlVmFsdWUgJiYgIXdpbGxTdG9yZVZhbHVlICYmICFtX3ZhbHVlLmlz
TnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbV92YWx1
ZSk7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZSA9IERPTVN0cmluZygpOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYgKCFkaWRTdG9yZVZhbHVlICYmIHdpbGxTdG9yZVZhbHVlKSB7Ci0g
ICAgICAgICAgICAgICAgbV92YWx1ZSA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgaWYgKHdhc0F0dGFjaGVkKQotICAgICAgICAgICAgICAgIGF0
dGFjaCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgb3VyIHR5cGUgbW9y
cGhzIGludG8gYSByYWRpbyBidXR0b24gYW5kIHdlIGFyZSBjaGVja2VkLCB0aGVuIGdvIGFoZWFk
Ci0gICAgICAgICAgICAvLyBhbmQgc2lnbmFsIHRoaXMgdG8gdGhlIGZvcm0uCi0gICAgICAgICAg
ICBpZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICBnZXRE
b2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBtX2hhdmVUeXBlID0gdHJ1ZTsKLSAgICAKLSAgICBpZiAobV90eXBlICE9IElN
QUdFICYmIG1faW1hZ2VMb2FkZXIpIHsKLSAgICAgICAgZGVsZXRlIG1faW1hZ2VMb2FkZXI7Ci0g
ICAgICAgIG1faW1hZ2VMb2FkZXIgPSAwOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICAvLyBuZWVkcyB0byBiZSBsb3dlcmNh
c2UgYWNjb3JkaW5nIHRvIERPTSBzcGVjCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNl
IFRFWFQ6IHJldHVybiAidGV4dCI7Ci0gICAgY2FzZSBQQVNTV09SRDogcmV0dXJuICJwYXNzd29y
ZCI7Ci0gICAgY2FzZSBDSEVDS0JPWDogcmV0dXJuICJjaGVja2JveCI7Ci0gICAgY2FzZSBSQURJ
TzogcmV0dXJuICJyYWRpbyI7Ci0gICAgY2FzZSBTVUJNSVQ6IHJldHVybiAic3VibWl0IjsKLSAg
ICBjYXNlIFJFU0VUOiByZXR1cm4gInJlc2V0IjsKLSAgICBjYXNlIEZJTEU6IHJldHVybiAiZmls
ZSI7Ci0gICAgY2FzZSBISURERU46IHJldHVybiAiaGlkZGVuIjsKLSAgICBjYXNlIElNQUdFOiBy
ZXR1cm4gImltYWdlIjsKLSAgICBjYXNlIEJVVFRPTjogcmV0dXJuICJidXR0b24iOwotICAgIGNh
c2UgU0VBUkNIOiByZXR1cm4gInNlYXJjaCI7Ci0gICAgY2FzZSBSQU5HRTogcmV0dXJuICJyYW5n
ZSI7Ci0gICAgY2FzZSBJU0lOREVYOiByZXR1cm4gIiI7Ci0gICAgfQotICAgIHJldHVybiAiIjsK
LX0KLQotUVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICBhc3Nl
cnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFz
c3dvcmQgZmllbGRzCi0KLSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OnN0YXRlKCk7Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNLQk9Y
OgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHJldHVybiBzdGF0ZSArIChjaGVja2VkKCkgPyAi
b24iIDogIm9mZiIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBzdGF0ZSArIHZhbHVl
KCkucXN0cmluZygpKycuJzsgLy8gTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IQot
ICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJp
bmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgYXNzZXJ0KG1fdHlwZSAhPSBQQVNTV09SRCk7CQkvLyBz
aG91bGQgbmV2ZXIgc2F2ZS9yZXN0b3JlIHBhc3N3b3JkIGZpZWxkcwotICAgIAotICAgIFFTdHJp
bmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUo
c3RhdGVzKTsKLSAgICBpZiAoc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLQotICAgIHN3aXRjaCAo
bV90eXBlKSB7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICBz
ZXRDaGVja2VkKChzdGF0ZSA9PSAib24iKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIHNldFZhbHVlKERPTVN0cmluZyhzdGF0ZS5sZWZ0KHN0YXRlLmxlbmd0aCgpLTEp
KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6Y2FuSGF2ZVNlbGVjdGlvbigpCi17Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAg
Y2FzZSBURVhUOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoK
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW50IEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuIDA7
Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAg
ICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0YXJ0
KCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLWludCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0aW9uRW5kKCkKLXsK
LSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAg
Y2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0
ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uRW5kKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxl
bWVudEltcGw6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBpZiAoIW1fcmVu
ZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQ
QVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0
aW9uU3RhcnQoc3RhcnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6
OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsK
LSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAg
ICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZWxlY3QoICApCi17Ci0g
ICAgaWYoIW1fcmVuZGVyKSByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAg
ICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJGaWxlQnV0dG9uKj4o
bV9yZW5kZXIpLT5zZWxlY3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBB
U1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQqPihtX3JlbmRlciktPnNlbGVjdCgpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIENI
RUNLQk9YOgotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAg
ICAgY2FzZSBJU0lOREVYOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIFJBTkdF
OgotICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAg
IGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0
aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVy
bjsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgot
ICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25SYW5nZShz
dGFydCwgZW5kKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjbGlj
ayhib29sIHNlbmRNb3VzZUV2ZW50cywgYm9vbCBzaG93UHJlc3NlZExvb2spCi17Ci0gICAgc3dp
dGNoIChpbnB1dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8v
IGEgbm8tb3AgZm9yIHRoaXMgdHlwZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
U1VCTUlUOgotICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAg
ICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhzZW5kTW91c2VFdmVudHMs
IHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGSUxF
OgotICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxSZW5kZXJGaWxlQnV0dG9uICo+KHJlbmRlcmVyKCkpLT5jbGljayhzZW5kTW91c2VFdmVu
dHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1By
ZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIRUNLQk9YOgot
ICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIElT
SU5ERVg6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIFJBTkdFOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExv
b2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIHN3
aXRjaCAoaW5wdXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAv
LyBhIG5vLW9wIGZvciB0aGlzIHR5cGUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFRFWFQ6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBmb2N1cygpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAg
IGNhc2UgU1VCTUlUOgotICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICBjYXNlIElNQUdFOgot
ICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICBjYXNlIFJB
TkdFOgotICAgICAgICAgICAgLy8gZm9jdXMKLSAgICAgICAgICAgIGZvY3VzKCk7Ci0KLSAgICAg
ICAgICAgIC8vIHNlbmQgdGhlIG1vdXNlIGJ1dHRvbiBldmVudHMgaWZmIHRoZQotICAgICAgICAg
ICAgLy8gY2FsbGVyIHNwZWNpZmllZCBzZW5kVG9BbnlFbGVtZW50Ci0gICAgICAgICAgICBjbGlj
ayhzZW5kVG9BbnlFbGVtZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotYm9v
bCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBh
dHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAo
YXR0ck5hbWUgPT0gd2lkdGhBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIg
fHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdnNwYWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9
PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9IAotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0dHIp
IHsKLSAgICAgICAgcmVzdWx0ID0gZVJlcGxhY2VkOyAvLyBTaGFyZSB3aXRoIDxpbWc+IHNpbmNl
IHRoZSBhbGlnbm1lbnQgYmVoYXZpb3IgaXMgdGhlIHNhbWUuCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50SW1wbDo6bWFwVG9FbnRyeShh
dHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0
ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYg
Y2hlY2tlZCgpICYmIG1fZm9ybSkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByYWRpbyBm
cm9tIGl0cyBvbGQgZ3JvdXAuCi0gICAgICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmICFt
X25hbWUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJh
ZGlvQnV0dG9uR3JvdXAobV9uYW1lLmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAgfQotICAgICAg
ICAKLSAgICAgICAgLy8gVXBkYXRlIG91ciBjYWNoZWQgcmVmZXJlbmNlIHRvIHRoZSBuYW1lLgot
ICAgICAgICBtX25hbWUgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRk
IGl0IHRvIGl0cyBuZXcgZ3JvdXAuCi0gICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hl
Y2tlZCgpKQotICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmFkaW9CdXR0b25DaGVja2VkKHRo
aXMsIG1fZm9ybSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYXV0b2NvbXBsZXRl
QXR0cikgewotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9ICFlcXVhbElnbm9yaW5nQ2FzZShhdHRy
LT52YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gIHR5cGVB
dHRyKSB7Ci0gICAgICAgIHNldElucHV0VHlwZShhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKLSAgICAgICAgLy8gV2Ugb25seSBuZWVk
IHRvIHNldENoYW5nZWQgaWYgdGhlIGZvcm0gaXMgbG9va2luZyBhdCB0aGUgZGVmYXVsdCB2YWx1
ZSByaWdodCBub3cuCi0gICAgICAgIGlmIChtX3ZhbHVlLmlzTnVsbCgpKQotICAgICAgICAgICAg
c2V0Q2hhbmdlZCgpOwotICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2hlY2tlZEF0dHIpIHsKLSAgICAgICAgbV9k
ZWZhdWx0Q2hlY2tlZCA9ICFhdHRyLT5pc051bGwoKTsKLSAgICAgICAgaWYgKG1fdXNlRGVmYXVs
dENoZWNrZWQpIHsKLSAgICAgICAgICAgIHNldENoZWNrZWQobV9kZWZhdWx0Q2hlY2tlZCk7Ci0g
ICAgICAgICAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1heGxlbmd0aEF0dHIpIHsKLSAgICAgICAgbV9tYXhM
ZW4gPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAg
ICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHNpemVBdHRy
KSB7Ci0gICAgICAgIG1fc2l6ZSA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9J
bnQoKSA6IDIwOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsdEF0dHIpIHsKLSAg
ICAgICAgaWYgKG1fcmVuZGVyICYmIG1fdHlwZSA9PSBJTUFHRSkKLSAgICAgICAgICAgIHN0YXRp
Y19jYXN0PFJlbmRlckltYWdlKj4obV9yZW5kZXIpLT51cGRhdGVBbHRUZXh0KCk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIg
JiYgbV90eXBlID09IElNQUdFKSB7Ci0gICAgICAgICAgICBpZiAoIW1faW1hZ2VMb2FkZXIpCi0g
ICAgICAgICAgICAgICAgbV9pbWFnZUxvYWRlciA9IG5ldyBIVE1MSW1hZ2VMb2FkZXIodGhpcyk7
Ci0gICAgICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdXNlbWFwQXR0ciB8fAotICAgICAg
ICAgICAgICAgYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRklY
TUU6IGlnbm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IHZzcGFjZUF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJ
Tl9UT1AsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfTUFSR0lOX0JPVFRPTSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gaHNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfTUFSR0lOX0xFRlQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0
ciwgQ1NTX1BST1BfTUFSR0lOX1JJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgYWRkSFRNTEFsaWdubWVudChh
dHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAg
ICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIGFkZENT
U0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVu
dExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlbGVjdEF0dHIpIHsK
LSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoc2VsZWN0RXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uY2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1M
RXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25pbnB1dEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoaW5w
dXRFdmVudCwgYXR0cik7Ci0gICAgfQotICAgIC8vIFNlYXJjaCBmaWVsZCBhbmQgc2xpZGVyIGF0
dHJpYnV0ZXMgYWxsIGp1c3QgY2F1c2UgdXBkYXRlRnJvbUVsZW1lbnQgdG8gYmUgY2FsbGVkIHRo
cm91Z2ggc3R5bGUKLSAgICAvLyByZWNhbGNpbmcuCi0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG9uc2VhcmNoQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihzZWFyY2hF
dmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gcmVzdWx0c0F0dHIp
IHsKLSAgICAgICAgbV9tYXhSZXN1bHRzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUo
KS50b0ludCgpIDogLTE7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBhdXRvc2F2ZUF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUo
KSA9PSBpbmNyZW1lbnRhbEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBw
bGFjZWhvbGRlckF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtaW5BdHRy
IHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbWF4QXR0ciB8fAotICAgICAgICAg
ICAgICAgYXR0ci0+bmFtZSgpID09IHByZWNpc2lvbkF0dHIpIHsKLSAgICAgICAgc2V0Q2hhbmdl
ZCgpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6
OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHN3aXRjaChtX3R5
cGUpCi0gICAgewotICAgIGNhc2UgVEVYVDoKLSAgICBjYXNlIFBBU1NXT1JEOgotICAgIGNhc2Ug
U0VBUkNIOgotICAgIGNhc2UgUkFOR0U6Ci0gICAgY2FzZSBJU0lOREVYOgotICAgIGNhc2UgQ0hF
Q0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICBjYXNlIFNVQk1JVDoKLSAgICBjYXNlIElNQUdF
OgotICAgIGNhc2UgUkVTRVQ6Ci0gICAgY2FzZSBGSUxFOgotICAgIGNhc2UgQlVUVE9OOiAgIHJl
dHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChzdHlsZSk7
Ci0gICAgY2FzZSBISURERU46ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhc3NlcnQoZmFs
c2UpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAq
c3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBURVhUOgotICAg
IGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBJU0lOREVYOiAgcmV0
dXJuIG5ldyAoYXJlbmEpIFJlbmRlckxpbmVFZGl0KHRoaXMpOwotICAgIGNhc2UgQ0hFQ0tCT1g6
Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAgcmV0dXJuIFJlbmRlck9iamVjdDo6Y3JlYXRlT2Jq
ZWN0KHRoaXMsIHN0eWxlKTsKLSAgICBjYXNlIFNVQk1JVDoKLSAgICBjYXNlIFJFU0VUOgotICAg
IGNhc2UgQlVUVE9OOgotICAgICAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyQnV0dG9uKHRo
aXMpOwotICAgIGNhc2UgSU1BR0U6ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJJbWFnZUJ1
dHRvbih0aGlzKTsKLSAgICBjYXNlIEZJTEU6ICAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVy
RmlsZUJ1dHRvbih0aGlzKTsKLSAgICBjYXNlIFJBTkdFOiAgICByZXR1cm4gbmV3IChhcmVuYSkg
UmVuZGVyU2xpZGVyKHRoaXMpOwotICAgIGNhc2UgSElEREVOOiAgIGJyZWFrOwotICAgIH0KLSAg
ICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjphdHRhY2goKQotewotICAgIGlmICghbV9pbml0ZWQpIHsKLSAgICAgICAgaWYgKCFt
X2hhdmVUeXBlKQotICAgICAgICAgICAgc2V0SW5wdXRUeXBlKGdldEF0dHJpYnV0ZSh0eXBlQXR0
cikpOwotCi0gICAgICAgIC8vIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIGR5bmFtaWMsIGRvZXNu
J3QgaXQsIHNpbmNlIHNvbWVvbmUgY291bGQgc2V0IHRoaXMKLSAgICAgICAgLy8gYWZ0ZXIgYXR0
YWNobWVudD8KLSAgICAgICAgRE9NU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIp
OwotICAgICAgICBpZiAoKHVpbnQpIG1fdHlwZSA8PSBJU0lOREVYICYmICF2YWwuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgbmV3bGluZSBzdHVmZi4uCi0gICAgICAgICAgICBR
U3RyaW5nIG52YWx1ZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwg
dmFsLmxlbmd0aCgpOyArK2kpCi0gICAgICAgICAgICAgICAgaWYgKHZhbFtpXSA+PSAnICcpCi0g
ICAgICAgICAgICAgICAgICAgIG52YWx1ZSArPSB2YWxbaV07Ci0KLSAgICAgICAgICAgIGlmICh2
YWwubGVuZ3RoKCkgIT0gbnZhbHVlLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHNldEF0dHJp
YnV0ZSh2YWx1ZUF0dHIsIG52YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2luaXRlZCA9
IHRydWU7Ci0gICAgfQotCi0gICAgLy8gRGlzYWxsb3cgdGhlIHdpZHRoIGF0dHJpYnV0ZSBvbiBp
bnB1dHMgb3RoZXIgdGhhbiBISURERU4gYW5kIElNQUdFLgotICAgIC8vIER1bWIgV2ViIHNpdGVz
IHdpbGwgdHJ5IHRvIHNldCB0aGUgd2lkdGggYXMgYW4gYXR0cmlidXRlIG9uIGZvcm0gY29udHJv
bHMgdGhhdCBhcmVuJ3QKLSAgICAvLyBpbWFnZXMgb3IgaGlkZGVuLgotICAgIGlmIChoYXNNYXBw
ZWRBdHRyaWJ1dGVzKCkgJiYgbV90eXBlICE9IEhJRERFTiAmJiBtX3R5cGUgIT0gSU1BR0UgJiYg
IWdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpLmlzRW1wdHkoKSkgewotICAgICAgICBpbnQgZXhjQ29k
ZTsKLSAgICAgICAgcmVtb3ZlQXR0cmlidXRlKHdpZHRoQXR0ciwgZXhjQ29kZSk7Ci0gICAgfQot
Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpOwotCi0gICAgaWYgKG1f
dHlwZSA9PSBJTUFHRSkgewotICAgICAgICBpZiAoIW1faW1hZ2VMb2FkZXIpCi0gICAgICAgICAg
ICBtX2ltYWdlTG9hZGVyID0gbmV3IEhUTUxJbWFnZUxvYWRlcih0aGlzKTsKLSAgICAgICAgbV9p
bWFnZUxvYWRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkp
IHsKLSAgICAgICAgICAgIFJlbmRlckltYWdlKiBpbWFnZU9iaiA9IHN0YXRpY19jYXN0PFJlbmRl
ckltYWdlKj4ocmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBpbWFnZU9iai0+c2V0SW1hZ2UobV9p
bWFnZUxvYWRlci0+aW1hZ2UoKSk7ICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbm90
ZSB3ZSBkb24ndCBkZWFsIHdpdGggY2FsbGluZyBwYXNzd29yZEZpZWxkUmVtb3ZlZCgpIG9uIGRl
dGFjaCwgYmVjYXVzZSB0aGUgdGltaW5nCi0gICAgLy8gd2FzIHN1Y2ggdGhhdCBpdCBjbGVhcmVk
IG91ciBzdGF0ZSB0b28gZWFybHkKLSAgICBpZiAobV90eXBlID09IFBBU1NXT1JEKQotICAgICAg
ICBnZXREb2N1bWVudCgpLT5wYXNzd29yZEZpZWxkQWRkZWQoKTsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6ZGV0YWNoKCkKLXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6ZGV0YWNoKCk7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotfQotCi1E
T01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFsdFRleHQoKSBjb25zdAotewotICAgIC8v
IGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9hcHBlbmRpeC9u
b3Rlcy5odG1sI2FsdGdlbgotICAgIC8vIGFsc28gaGVhdmlseSBkaXNjdXNzZWQgYnkgSGl4aWUg
b24gYnVnemlsbGEKLSAgICAvLyBub3RlIHRoaXMgaXMgaW50ZW50aW9uYWxseSBkaWZmZXJlbnQg
dG8gSFRNTEltYWdlRWxlbWVudEltcGw6OmFsdFRleHQoKQotICAgIERPTVN0cmluZyBhbHQgPSBn
ZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci0gICAgLy8gZmFsbCBiYWNrIHRvIHRpdGxlIGF0dHJpYnV0
ZQotICAgIGlmIChhbHQuaXNOdWxsKCkpCi0gICAgICAgIGFsdCA9IGdldEF0dHJpYnV0ZSh0aXRs
ZUF0dHIpOwotICAgIGlmIChhbHQuaXNOdWxsKCkpCi0gICAgICAgIGFsdCA9IGdldEF0dHJpYnV0
ZSh2YWx1ZUF0dHIpOwotICAgIGlmIChhbHQuaXNFbXB0eSgpKQotICAgICAgICBhbHQgPSBpbnB1
dEVsZW1lbnRBbHRUZXh0KCk7Ci0KLSAgICByZXR1cm4gYWx0OwotfQotCi1ib29sIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjppc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSBjb25zdAotewotICAgIC8v
IEhUTUwgc3BlYyBzYXlzIHRoYXQgYnV0dG9ucyBtdXN0IGhhdmUgbmFtZXMKLSAgICAvLyB0byBi
ZSBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwuIEhvd2V2ZXIsIG90aGVyIGJyb3dzZXJzCi0gICAgLy8g
ZG8gbm90IGltcG9zZSB0aGlzIGNvbnN0cmFpbnQuIFRoZXJlZm9yZSwgd2UgYmVoYXZlCi0gICAg
Ly8gZGlmZmVyZW50bHkgYW5kIGNhbiB1c2UgZGlmZmVyZW50IGJ1dHRvbnMgdGhhbiB0aGUgCi0g
ICAgLy8gYXV0aG9yIGludGVuZGVkLiAKLSAgICAvLyBXYXM6IChtX3R5cGUgPT0gU1VCTUlUICYm
ICFuYW1lKCkuaXNFbXB0eSgpKQotICAgIHJldHVybiAhbV9kaXNhYmxlZCAmJiAobV90eXBlID09
IElNQUdFIHx8IG1fdHlwZSA9PSBTVUJNSVQpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjppc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3Vi
bWl0OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJtaXQo
Ym9vbCBmbGFnKQotewotICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0ICZlbmNvZGluZywg
Ym9vbCBtdWx0aXBhcnQpCi17Ci0gICAgLy8gaW1hZ2UgZ2VuZXJhdGVzIGl0cyBvd24gbmFtZXMK
LSAgICBpZiAobmFtZSgpLmlzRW1wdHkoKSAmJiBtX3R5cGUgIT0gSU1BR0UpIHJldHVybiBmYWxz
ZTsKLQotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAg
ICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFJBTkdFOgot
ICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgLy8gYWx3YXlzIHN1Y2Nlc3NmdWwK
LSAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNh
c2UgUkFESU86Ci0gICAgICAgICAgICBpZiAoY2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAg
ZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAg
Y2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICAvLyB0aG9zZSBi
dXR0b25zIGFyZSBuZXZlciBzdWNjZXNzZnVsCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVN1Ym1pdCkgewot
ICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLmlzRW1wdHkoKSA/ICJ4
IiA6IChuYW1lKCkgKyAiLngiKSwgY2xpY2tYKCkpOwotICAgICAgICAgICAgICAgIGVuY29kaW5n
LmFwcGVuZERhdGEobmFtZSgpLmlzRW1wdHkoKSA/ICJ5IiA6IChuYW1lKCkgKyAiLnkiKSwgY2xp
Y2tZKCkpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZSgpLmlzRW1wdHkoKSAmJiAhdmFsdWUo
KS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFt
ZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAg
ICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgRE9NU3RyaW5nIGVuY19z
dHIgPSB2YWx1ZVdpdGhEZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFlbmNfc3RyLmlz
RW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUo
KSwgZW5jX3N0cik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNh
c2UgRklMRToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2FuJ3Qgc3VibWl0IGZpbGUgb24g
R0VUCi0gICAgICAgICAgICAvLyBkb24ndCBzdWJtaXQgaWYgZGlzcGxheTogbm9uZSBvciBkaXNw
bGF5OiBoaWRkZW4KLSAgICAgICAgICAgIGlmKCFtdWx0aXBhcnQgfHwgIXJlbmRlcmVyKCkgfHwg
cmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IGtodG1sOjpWSVNJQkxFKQotICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgLy8gaWYgbm8gZmlsZW5h
bWUgYXQgYWxsIGlzIGVudGVyZWQsIHJldHVybiBzdWNjZXNzZnVsLCBob3dldmVyIGVtcHR5Ci0g
ICAgICAgICAgICAvLyBudWxsIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBidXQgbmV0c2NhcGUgcG9z
dHMgYW4gZW1wdHkgZmlsZS4gYXJnaC4KLSAgICAgICAgICAgIGlmICh2YWx1ZSgpLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBRU3RyaW5n
KCIiKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIGVuY29kaW5nLmFwcGVuZEZpbGUobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAg
ICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgpKTsKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnJlc2V0KCkKLXsKLSAgICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZy
b21BdHRyaWJ1dGUoKSkKLSAgICAgICAgc2V0VmFsdWUoRE9NU3RyaW5nKCkpOwotICAgIHNldENo
ZWNrZWQobV9kZWZhdWx0Q2hlY2tlZCk7Ci0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7
Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldENoZWNrZWQoYm9vbCBfY2hlY2tl
ZCkKLXsKLSAgICAvLyBXaW5JRSBkb2VzIG5vdCBhbGxvdyB1bm5hbWVkIHJhZGlvIGJ1dHRvbnMg
dG8gZXZlbiBiZSBjaGVja2VkLgotICAgIGlmIChjaGVja2VkKCkgPT0gX2NoZWNrZWQgfHwgKG1f
dHlwZSA9PSBSQURJTyAmJiBuYW1lKCkuaXNFbXB0eSgpKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBfY2hlY2tlZCkKLSAgICAgICAgZ2V0RG9jdW1lbnQo
KS0+cmFkaW9CdXR0b25DaGVja2VkKHRoaXMsIG1fZm9ybSk7Ci0KLSAgICBtX3VzZURlZmF1bHRD
aGVja2VkID0gZmFsc2U7Ci0gICAgbV9jaGVja2VkID0gX2NoZWNrZWQ7Ci0gICAgc2V0Q2hhbmdl
ZCgpOwotICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVh
cmFuY2UoKSkKLSAgICAgICAgdGhlbWUoKS0+c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIENoZWNr
ZWRTdGF0ZSk7Ci0gICAgb25DaGFuZ2UoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6c2V0SW5kZXRlcm1pbmF0ZShib29sIF9pbmRldGVybWluYXRlKQotewotICAgIC8vIE9ubHkg
Y2hlY2tib3hlcyBob25vciBpbmRldGVybWluYXRlLgotICAgIGlmIChtX3R5cGUgIT0gQ0hFQ0tC
T1ggfHwgaW5kZXRlcm1pbmF0ZSgpID09IF9pbmRldGVybWluYXRlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBfaW5kZXRlcm1pbmF0ZTsKLQotICAgIHNldENoYW5n
ZWQoKTsKLQotICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0Fw
cGVhcmFuY2UoKSkKLSAgICAgICAgdGhlbWUoKS0+c3RhdGVDaGFuZ2VkKHJlbmRlcmVyKCksIENo
ZWNrZWRTdGF0ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmNvcHlOb25BdHRy
aWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpCi17Ci0gICAgY29uc3Qg
SFRNTElucHV0RWxlbWVudEltcGwgKnNvdXJjZUVsZW0gPSBzdGF0aWNfY2FzdDxjb25zdCBIVE1M
SW5wdXRFbGVtZW50SW1wbCAqPihzb3VyY2UpOwotCi0gICAgbV92YWx1ZSA9IHNvdXJjZUVsZW0t
Pm1fdmFsdWU7Ci0gICAgbV9jaGVja2VkID0gc291cmNlRWxlbS0+bV9jaGVja2VkOwotICAgIG1f
aW5kZXRlcm1pbmF0ZSA9IHNvdXJjZUVsZW0tPm1faW5kZXRlcm1pbmF0ZTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5n
IHZhbHVlID0gbV92YWx1ZTsKLQotICAgIC8vIEl0J3MgaW1wb3J0YW50ICpub3QqIHRvIGZhbGwg
YmFjayB0byB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBmaWxlIGlucHV0cywKLSAgICAvLyBiZWNh
dXNlIHRoYXQgd291bGQgYWxsb3cgYSBtYWxpY2lvdXMgd2ViIHBhZ2UgdG8gdXBsb2FkIGZpbGVz
IGJ5IHNldHRpbmcgdGhlCi0gICAgLy8gdmFsdWUgYXR0cmlidXRlIGluIG1hcmt1cC4KLSAgICBp
ZiAodmFsdWUuaXNOdWxsKCkgJiYgbV90eXBlICE9IEZJTEUpCi0gICAgICAgIHZhbHVlID0gZ2V0
QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0KLSAgICAvLyBJZiBubyBhdHRyaWJ1dGUgZXhpc3RzLCB0
aGVuIGp1c3QgdXNlICJvbiIgb3IgIiIgYmFzZWQgb2ZmIHRoZSBjaGVja2VkKCkgc3RhdGUgb2Yg
dGhlIGNvbnRyb2wuCi0gICAgaWYgKHZhbHVlLmlzTnVsbCgpICYmIChtX3R5cGUgPT0gQ0hFQ0tC
T1ggfHwgbV90eXBlID09IFJBRElPKSkKLSAgICAgICAgcmV0dXJuIERPTVN0cmluZyhjaGVja2Vk
KCkgPyAib24iIDogIiIpOwotCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1ET01TdHJpbmcgSFRN
TElucHV0RWxlbWVudEltcGw6OnZhbHVlV2l0aERlZmF1bHQoKSBjb25zdAotewotICAgIERPTVN0
cmluZyB2ID0gdmFsdWUoKTsKLSAgICBpZiAodi5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3dpdGNo
IChtX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICAgICAgdiA9
IHJlc2V0QnV0dG9uRGVmYXVsdExhYmVsKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAg
ICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgICAgIHYgPSBzdWJtaXRCdXR0b25E
ZWZhdWx0TGFiZWwoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2Fz
ZSBCVVRUT046Ci0gICAgICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgY2FzZSBG
SUxFOgotICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICBjYXNlIElNQUdFOgot
ICAgICAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAg
ICAgICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAg
ICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAg
aWYgKG1fdHlwZSA9PSBGSUxFKSByZXR1cm47Ci0KLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
ID0gZmFsc2U7Ci0gICAgaWYgKHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkpIHsK
LSAgICAgICAgbV92YWx1ZSA9IHZhbHVlOwotICAgICAgICBpZiAobV9yZW5kZXIpCi0gICAgICAg
ICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAgICAgc2V0Q2hhbmdlZCgp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFZhbHVlRnJvbVJlbmRl
cmVyKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgbV92YWx1ZSA9IHZhbHVlOwotICAg
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0cnVlOwotICAgIAotICAgIC8vIEZpcmUgdGhlICJp
bnB1dCIgRE9NIGV2ZW50LgotICAgIGRpc3BhdGNoSFRNTEV2ZW50KGlucHV0RXZlbnQsIHRydWUs
IGZhbHNlKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c3RvcmVzVmFsdWVTZXBh
cmF0ZUZyb21BdHRyaWJ1dGUoKSBjb25zdAotewotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAg
ICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICBjYXNlIEZJ
TEU6Ci0gICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBj
YXNlIFJBRElPOgotICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICBjYXNlIFJFU0VUOgotICAg
ICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2Fz
ZSBJU0lOREVYOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoK
LSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCogSFRNTElucHV0RWxlbWVudEltcGw6OnByZURpc3Bh
dGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIC8vIHByZXZlbnREZWZhdWx0
IG9yICJyZXR1cm4gZmFsc2UiIGFyZSB1c2VkIHRvIHJldmVyc2UgdGhlIGF1dG9tYXRpYyBjaGVj
a2luZy9zZWxlY3Rpb24gd2UgZG8gaGVyZS4KLSAgICAvLyBUaGlzIHJlc3VsdCBnaXZlcyB1cyBl
bm91Z2ggaW5mbyB0byBwZXJmb3JtIHRoZSAidW5kbyIgaW4gcG9zdERpc3BhdGNoIG9mIHRoZSBh
Y3Rpb24gd2UgdGFrZSBoZXJlLgotICAgIHZvaWQqIHJlc3VsdCA9IDA7IAotICAgIGlmICgobV90
eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9PSBSQURJTykgJiYgZXZ0LT5pc01vdXNlRXZlbnQo
KSAmJiBldnQtPnR5cGUoKSA9PSBjbGlja0V2ZW50ICYmIAotICAgICAgICBzdGF0aWNfY2FzdDxN
b3VzZUV2ZW50SW1wbCo+KGV2dCktPmJ1dHRvbigpID09IDApIHsKLSAgICAgICAgaWYgKG1fdHlw
ZSA9PSBDSEVDS0JPWCkgewotICAgICAgICAgICAgLy8gQXMgYSB3YXkgdG8gc3RvcmUgdGhlIHN0
YXRlLCB3ZSByZXR1cm4gMCBpZiB3ZSB3ZXJlIHVuY2hlY2tlZCwgMSBpZiB3ZSB3ZXJlIGNoZWNr
ZWQsIGFuZCAyIGZvcgotICAgICAgICAgICAgLy8gaW5kZXRlcm1pbmF0ZS4KLSAgICAgICAgICAg
IGlmIChpbmRldGVybWluYXRlKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAodm9pZCop
MHgyOwotICAgICAgICAgICAgICAgIHNldEluZGV0ZXJtaW5hdGUoZmFsc2UpOwotICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCgpKQotICAgICAgICAgICAg
ICAgICAgICByZXN1bHQgPSAodm9pZCopMHgxOwotICAgICAgICAgICAgICAgIHNldENoZWNrZWQo
IWNoZWNrZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAvLyBGb3IgcmFkaW8gYnV0dG9ucywgc3RvcmUgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcmFkaW8g
b2JqZWN0LgotICAgICAgICAgICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkgfHwgY2hlY2tlZCgpKQot
ICAgICAgICAgICAgICAgIHJldHVybiAwOyAvLyBVbm5hbWVkIHJhZGlvIGJ1dHRvbnMgZG9udCBn
ZXQgY2hlY2tlZC4gQ2hlY2tlZCBidXR0b25zIGp1c3Qgc3RheSBjaGVja2VkLgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBGSVhNRTogTmVlZCB0byBsZWFybiB0byB3b3JrIHdpdGhvdXQg
YSBmb3JtLgotCi0gICAgICAgICAgICAvLyBXZSByZWFsbHkgd2FudCByYWRpbyBncm91cHMgdG8g
ZW5kIHVwIGluIHNhbmUgc3RhdGVzLCBpLmUuLCB0byBoYXZlIHNvbWV0aGluZyBjaGVja2VkLgot
ICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGlmIG5vdGhpbmcgaXMgY3VycmVudGx5IHNlbGVjdGVk
LCB3ZSB3b24ndCBhbGxvdyB0aGlzIGFjdGlvbiB0byBiZSAidW5kb25lIiwgc2luY2UKLSAgICAg
ICAgICAgIC8vIHdlIHdhbnQgc29tZSBvYmplY3QgaW4gdGhlIHJhZGlvIGdyb3VwIHRvIGFjdHVh
bGx5IGdldCBzZWxlY3RlZC4KLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBjdXJy
UmFkaW8gPSBnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChuYW1lKCku
aW1wbCgpLCBtX2Zvcm0pOwotICAgICAgICAgICAgaWYgKGN1cnJSYWRpbykgewotICAgICAgICAg
ICAgICAgIC8vIFdlIGhhdmUgYSByYWRpbyBidXR0b24gc2VsZWN0ZWQgdGhhdCBpcyBub3QgdXMu
ICBDYWNoZSBpdCBpbiBvdXIgcmVzdWx0IGZpZWxkIGFuZCByZWYgaXQgc28KLSAgICAgICAgICAg
ICAgICAvLyB0aGF0IGl0IGNhbid0IGJlIGRlc3Ryb3llZC4KLSAgICAgICAgICAgICAgICBjdXJy
UmFkaW8tPnJlZigpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJSYWRpbzsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIHNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cG9z
dERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKQotewotICAg
IGlmICgobV90eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9PSBSQURJTykgJiYgZXZ0LT5pc01v
dXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9PSBjbGlja0V2ZW50ICYmIAotICAgICAgICBzdGF0
aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2dCktPmJ1dHRvbigpID09IDApIHsKLSAgICAgICAg
aWYgKG1fdHlwZSA9PSBDSEVDS0JPWCkgewotICAgICAgICAgICAgLy8gUmV2ZXJzZSB0aGUgY2hl
Y2tpbmcgd2UgZGlkIGluIHByZURpc3BhdGNoLgotICAgICAgICAgICAgaWYgKGV2dC0+ZGVmYXVs
dFByZXZlbnRlZCgpIHx8IGV2dC0+ZGVmYXVsdEhhbmRsZWQoKSkgewotICAgICAgICAgICAgICAg
IGlmIChkYXRhID09ICh2b2lkKikweDIpCi0gICAgICAgICAgICAgICAgICAgIHNldEluZGV0ZXJt
aW5hdGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBz
ZXRDaGVja2VkKGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRhdGEp
IHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBpbnB1dCA9IHN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oZGF0YSk7Ci0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZh
dWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZhdWx0SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIGlmIHBvc3Np
YmxlLgotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBpcyBzdGlsbCBhIHJhZGlvIGJ1
dHRvbiBhbmQgb25seSBkbyB0aGUgcmVzdG9yYXRpb24gaWYgaXQgc3RpbGwKLSAgICAgICAgICAg
ICAgICAvLyBiZWxvbmdzIHRvIG91ciBncm91cC4KLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQt
PmZvcm0oKSA9PSBmb3JtKCkgJiYgaW5wdXQtPmlucHV0VHlwZSgpID09IFJBRElPICYmIGlucHV0
LT5uYW1lKCkgPT0gbmFtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9rLCB0aGUgb2xk
IHJhZGlvIGJ1dHRvbiBpcyBzdGlsbCBpbiBvdXIgZm9ybSBhbmQgaW4gb3VyIGdyb3VwIGFuZCBp
cyBzdGlsbCBhIAotICAgICAgICAgICAgICAgICAgICAvLyByYWRpbyBidXR0b24sIHNvIGl0J3Mg
c2FmZSB0byByZXN0b3JlIHNlbGVjdGlvbiB0byBpdC4KLSAgICAgICAgICAgICAgICAgICAgaW5w
dXQtPnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgaW5wdXQtPmRlcmVmKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQp
Ci17Ci0gICAgaWYgKG1fdHlwZSA9PSBJTUFHRSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2
dC0+dHlwZSgpID09IGNsaWNrRXZlbnQgJiYgbV9yZW5kZXIpIHsKLSAgICAgICAgLy8gcmVjb3Jk
IHRoZSBtb3VzZSBwb3NpdGlvbiBmb3Igd2hlbiB3ZSBnZXQgdGhlIERPTUFjdGl2YXRlIGV2ZW50
Ci0gICAgICAgIE1vdXNlRXZlbnRJbXBsICptZSA9IHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBs
Kj4oZXZ0KTsKLSAgICAgICAgaW50IG9mZnNldFgsIG9mZnNldFk7Ci0gICAgICAgIG1fcmVuZGVy
LT5hYnNvbHV0ZVBvc2l0aW9uKG9mZnNldFgsb2Zmc2V0WSk7Ci0gICAgICAgIHhQb3MgPSBtZS0+
Y2xpZW50WCgpLW9mZnNldFg7Ci0gICAgICAgIHlQb3MgPSBtZS0+Y2xpZW50WSgpLW9mZnNldFk7
Ci0KLQltZS0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICB9Ci0KLSAgICAvLyBET01BY3RpdmF0
ZSBldmVudHMgY2F1c2UgdGhlIGlucHV0IHRvIGJlICJhY3RpdmF0ZWQiIC0gaW4gdGhlIGNhc2Ug
b2YgaW1hZ2UgYW5kIHN1Ym1pdCBpbnB1dHMsIHRoaXMgbWVhbnMKLSAgICAvLyBhY3R1YWxseSBz
dWJtaXR0aW5nIHRoZSBmb3JtLiBGb3IgcmVzZXQgaW5wdXRzLCB0aGUgZm9ybSBpcyByZXNldC4g
VGhlc2UgZXZlbnRzIGFyZSBzZW50IHdoZW4gdGhlIHVzZXIgY2xpY2tzCi0gICAgLy8gb24gdGhl
IGVsZW1lbnQsIG9yIHByZXNzZXMgZW50ZXIgd2hpbGUgaXQgaXMgdGhlIGFjdGl2ZSBlbGVtZW50
LiBKYXZhY3NyaXB0IGNvZGUgd2lzaGluZyB0byBhY3RpdmF0ZSB0aGUgZWxlbWVudAotICAgIC8v
IG11c3QgZGlzcGF0Y2ggYSBET01BY3RpdmF0ZSBldmVudCAtIGEgY2xpY2sgZXZlbnQgd2lsbCBu
b3QgZG8gdGhlIGpvYi4KLSAgICBpZiAoZXZ0LT50eXBlKCkgPT0gRE9NQWN0aXZhdGVFdmVudCkg
ewotICAgICAgICBpZiAobV90eXBlID09IElNQUdFIHx8IG1fdHlwZSA9PSBTVUJNSVQgfHwgbV90
eXBlID09IFJFU0VUKSB7Ci0gICAgICAgICAgICBpZiAoIW1fZm9ybSkKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICBpZiAobV90eXBlID09IFJFU0VUKQotICAgICAgICAgICAg
ICAgIG1fZm9ybS0+cmVzZXQoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAg
IG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIW1fZm9ybS0+cHJl
cGFyZVN1Ym1pdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhQb3MgPSAwOwotICAgICAgICAg
ICAgICAgICAgICB5UG9zID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
bV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICB9
Ci0KLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGluZyBzaW11bGF0
ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBwcm9wZXIgc2Vu
ZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5cGUoKSA9PSBrZXlw
cmVzc0V2ZW50ICYmIGV2dC0+aXNLZXlib2FyZEV2ZW50KCkpIHsKLSAgICAgICAgYm9vbCBjbGlj
a0VsZW1lbnQgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0g
ZmFsc2U7Ci0KLSAgICAgICAgRE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZl
bnRJbXBsICo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsKLQotICAgICAgICBpZiAoa2V5ID09ICJV
KzAwMDAyMCIpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgICAgICAg
ICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAg
ICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAg
ICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAg
ICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBmb3Igc3BhY2ViYXIgZm9yIHRo
ZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQXBwS2l0
IGFscmVhZHkgZG9lcyB0aGlzIGZvciBzb21lLCBidXQgbm90IGFsbCwgb2YgdGhlbS4KLSAgICAg
ICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgICAgICAgICAg
Ly8gSWYgYW4gdW5zZWxlY3RlZCByYWRpbyBpcyB0YWJiZWQgaW50byAoYmVjYXVzZSB0aGUgZW50
aXJlIGdyb3VwIGhhcyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrZWQsIG9y
IGJlY2F1c2Ugb2Ygc29tZSBleHBsaWNpdCAuZm9jdXMoKSBjYWxsKSwgdGhlbiBhbGxvdyBzcGFj
ZSB0byBjaGVjayBpdC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkKCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgICAg
ICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAg
ICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAgICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAg
ICAgICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa2V5ID09ICJFbnRlciIpIHsKLSAgICAg
ICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCVVRUT046Ci0g
ICAgICAgICAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgICAgICAgICBjYXNlIEhJRERF
TjoKLSAgICAgICAgICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICAgICAgY2FzZSBQ
QVNTV09SRDoKLSAgICAgICAgICAgICAgICBjYXNlIFJBTkdFOgotICAgICAgICAgICAgICAgIGNh
c2UgU0VBUkNIOgotICAgICAgICAgICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICAg
ICAgLy8gU2ltdWxhdGUgbW91c2UgY2xpY2sgb24gdGhlIGRlZmF1bHQgZm9ybSBidXR0b24gZm9y
IGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAg
Y2xpY2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgICAgICBjYXNlIElNQUdF
OgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVUJN
SVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIGZvciBlbnRl
ciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgICAgIGNsaWNr
RWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIGNhc2UgUkFESU86Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBEb24ndCBkbyBh
bnl0aGluZyBmb3IgZW50ZXIgb24gYSByYWRpbyBidXR0b24uCi0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAobV90eXBlID09IFJBRElPICYmIChrZXkgPT0gIlVwIiB8fCBr
ZXkgPT0gIkRvd24iIHx8IGtleSA9PSAiTGVmdCIgfHwga2V5ID09ICJSaWdodCIpKSB7Ci0gICAg
ICAgICAgICAvLyBMZWZ0IGFuZCB1cCBtZWFuICJwcmV2aW91cyByYWRpbyBidXR0b24iLgotICAg
ICAgICAgICAgLy8gUmlnaHQgYW5kIGRvd24gbWVhbiAibmV4dCByYWRpbyBidXR0b24iLgotICAg
ICAgICAgICAgLy8gVGVzdGVkIGluIFdpbklFLCBhbmQgZXZlbiBmb3IgUlRMLCBsZWZ0IHN0aWxs
IG1lYW5zIHByZXZpb3VzIHJhZGlvIGJ1dHRvbiAoYW5kIHNvIG1vdmVzCi0gICAgICAgICAgICAv
LyB0byB0aGUgcmlnaHQpLiAgU2VlbXMgc3RyYW5nZSwgYnV0IHdlJ2xsIG1hdGNoIGl0LgotICAg
ICAgICAgICAgYm9vbCBmb3J3YXJkID0gKGtleSA9PSAiRG93biIgfHwga2V5ID09ICJSaWdodCIp
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSBjYW4gb25seSBzdGF5IHdpdGhpbiB0
aGUgZm9ybSdzIGNoaWxkcmVuIGlmIHRoZSBmb3JtIGhhc24ndCBiZWVuIGRlbW90ZWQgdG8gYSBs
ZWFmIGJlY2F1c2UKLSAgICAgICAgICAgIC8vIG9mIG1hbGZvcm1lZCBIVE1MLgotICAgICAgICAg
ICAgTm9kZUltcGwqIG4gPSB0aGlzOwotICAgICAgICAgICAgd2hpbGUgKChuID0gKGZvcndhcmQg
PyBuLT50cmF2ZXJzZU5leHROb2RlKCkgOiBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSkpIHsK
LSAgICAgICAgICAgICAgICAvLyBPbmNlIHdlIGVuY291bnRlciBhIGZvcm0gZWxlbWVudCwgd2Ug
a25vdyB3ZSdyZSB0aHJvdWdoLgotICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGZv
cm1UYWcpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgbW9yZSByYWRpbyBidXR0b25zLgotICAgICAg
ICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgICAg
ICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogZWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudEltcGwqPihuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsdC0+Zm9ybSgpICE9IG1f
Zm9ybSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAg
ICBpZiAobi0+aGFzVGFnTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBpbnB1dEVsdCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKj4obik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbHQtPmlu
cHV0VHlwZSgpID09IFJBRElPICYmIGlucHV0RWx0LT5uYW1lKCkgPT0gbmFtZSgpICYmCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQtPmlzRm9jdXNhYmxlKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5zZXRGb2N1c05vZGUoaW5wdXRF
bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5jbGljayhmYWxzZSwg
ZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGlja0VsZW1lbnQpIHsKLSAg
ICAgICAgICAgIGNsaWNrKGZhbHNlKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGlja0RlZmF1bHRGb3JtQnV0dG9uICYmIG1fZm9y
bSkgewotICAgICAgICAgICAgbV9mb3JtLT5zdWJtaXRDbGljaygpOwotICAgICAgICAgICAgZXZ0
LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotYm9vbCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6aXNFZGl0YWJsZSgpCi17Ci0gICAgcmV0dXJuICgobV90eXBl
ID09IFRFWFQpIHx8IChtX3R5cGUgPT0gUEFTU1dPUkQpIHx8Ci0gICAgICAgICAgICAobV90eXBl
ID09IFNFQVJDSCkgfHwgKG1fdHlwZSA9PSBJU0lOREVYKSB8fCAobV90eXBlID09IEZJTEUpKTsK
LX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRl
SW1wbCAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRy
KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZWZhdWx0VmFsdWUoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0RGVmYXVsdFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
ICFnZXRBdHRyaWJ1dGUoY2hlY2tlZEF0dHIpLmlzTnVsbCgpOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZXREZWZhdWx0Q2hlY2tlZChib29sIGRlZmF1bHRDaGVja2VkKQotewot
ICAgIHNldEF0dHJpYnV0ZShjaGVja2VkQXR0ciwgZGVmYXVsdENoZWNrZWQgPyAiIiA6IDApOwot
fQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2VwdCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2NlcHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6c2V0QWNjZXB0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGFjY2VwdEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
YWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjY2Vz
c0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3Nr
ZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWxp
Z24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmlu
ZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWx0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGFsdEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBbHQo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWx0QXR0ciwgdmFs
dWUpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRNYXhMZW5ndGgoaW50IF9t
YXhMZW5ndGgpCi17Ci0gICAgc2V0QXR0cmlidXRlKG1heGxlbmd0aEF0dHIsIFFTdHJpbmc6Om51
bWJlcihfbWF4TGVuZ3RoKSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNp
emUodW5zaWduZWQgX3NpemUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNpemVBdHRyLCBRU3RyaW5n
OjpudW1iZXIoX3NpemUpKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
cmMoKSBjb25zdAotewotICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5jb21wbGV0ZVVSTChnZXRB
dHRyaWJ1dGUoc3JjQXR0cikpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRT
cmMoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc3JjQXR0ciwg
dmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnVzZU1hcCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh1c2VtYXBBdHRyKTsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VXNlTWFwKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17
Ci0gICAgc2V0QXR0cmlidXRlKHVzZW1hcEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1IVE1MTGFiZWxFbGVtZW50SW1wbDo6SFRNTExhYmVsRWxlbWVudEltcGwoRG9j
dW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudEltcGwobGFiZWxUYWcsIGRvYykKLXsK
LX0KLQotSFRNTExhYmVsRWxlbWVudEltcGw6On5IVE1MTGFiZWxFbGVtZW50SW1wbCgpCi17Ci19
Ci0KLWJvb2wgSFRNTExhYmVsRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihm
b2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJB
dHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
YXR0cik7Ci19Ci0KLUVsZW1lbnRJbXBsICpIVE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9ybUVsZW1l
bnQoKQotewotICAgIERPTVN0cmluZyBmb3JtRWxlbWVudElkID0gZ2V0QXR0cmlidXRlKGZvckF0
dHIpOwotICAgIGlmIChmb3JtRWxlbWVudElkLmlzTnVsbCgpKSB7Ci0gICAgICAgIC8vIFNlYXJj
aCBjaGlsZHJlbiBvZiB0aGUgbGFiZWwgZWxlbWVudCBmb3IgYSBmb3JtIGVsZW1lbnQuCi0gICAg
ICAgIE5vZGVJbXBsICpub2RlID0gdGhpczsKLSAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZS0+
dHJhdmVyc2VOZXh0Tm9kZSh0aGlzKSkpIHsKLSAgICAgICAgICAgIGlmIChub2RlLT5pc0hUTUxF
bGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICBIVE1MRWxlbWVudEltcGwgKmVsZW1lbnQgPSBz
dGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwgKj4obm9kZSk7Ci0gICAgICAgICAgICAgICAgaWYg
KGVsZW1lbnQtPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBlbGVtZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAw
OwotICAgIH0KLSAgICBpZiAoZm9ybUVsZW1lbnRJZC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5nZXRFbGVtZW50QnlJZChmb3JtRWxlbWVu
dElkKTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlm
IChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQt
PmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlv
bihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgRWxlbWVudEltcGwgKmVsZW1lbnQgPSBm
b3JtRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50KQotICAgICAgICBlbGVtZW50LT5hY2Nlc3NL
ZXlBY3Rpb24oc2VuZFRvQW55RWxlbWVudCk7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGwgKkhU
TUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtKCkKLXsKLSAgICBmb3IgKE5vZGVJbXBsICpwID0gcGFy
ZW50Tm9kZSgpOyBwICE9IDA7IHAgPSBwLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYgKHAt
Pmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRN
TEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0K
LURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMYWJl
bEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRN
TExhYmVsRWxlbWVudEltcGw6Omh0bWxGb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoZm9yQXR0cik7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEh0bWxG
b3IoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZm9yQXR0ciwg
dmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMZWdlbmRFbGVtZW50SW1w
bDo6SFRNTExlZ2VuZEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmKQotOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChsZWdlbmRUYWcsIGRvYywg
ZikKLXsKLX0KLQotSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjp+SFRNTExlZ2VuZEVsZW1lbnRJbXBs
KCkKLXsKLX0KLQotYm9vbCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJlbmRlck9iamVjdCogSFRNTExlZ2VuZEVs
ZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxl
KiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyTGVnZW5kKHRoaXMpOwot
fQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gImxlZ2VuZCI7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5kRWxlbWVudEltcGw6
OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlB
dHRyKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyLCB2
YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmFsaWduKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TExlZ2VuZEVsZW1lbnRJbXBsOjpzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotRWxlbWVudEltcGwgKkhU
TUxMZWdlbmRFbGVtZW50SW1wbDo6Zm9ybUVsZW1lbnQoKQotewotICAgIC8vIENoZWNrIGlmIHRo
ZXJlJ3MgYSBmaWVsZHNldCBiZWxvbmdpbmcgdG8gdGhpcyBsZWdlbmQuCi0gICAgTm9kZUltcGwg
KmZpZWxkc2V0ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChmaWVsZHNldCAmJiAhZmllbGRz
ZXQtPmhhc1RhZ05hbWUoZmllbGRzZXRUYWcpKQotICAgICAgICBmaWVsZHNldCA9IGZpZWxkc2V0
LT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKCFmaWVsZHNldCkKLSAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICAvLyBGaW5kIGZpcnN0IGZvcm0gZWxlbWVudCBpbnNpZGUgdGhlIGZpZWxkc2V0LgotICAg
IC8vIEZJWE1FOiBTaG91bGQgd2UgY2FyZSBhYm91dCB0YWJpbmRleD8KLSAgICBOb2RlSW1wbCAq
bm9kZSA9IGZpZWxkc2V0OwotICAgIHdoaWxlICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5v
ZGUoZmllbGRzZXQpKSkgewotICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0g
ICAgICAgICAgICBIVE1MRWxlbWVudEltcGwgKmVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRWxl
bWVudEltcGwgKj4obm9kZSk7Ci0gICAgICAgICAgICBpZiAoIWVsZW1lbnQtPmhhc0xvY2FsTmFt
ZShsZWdlbmRUYWcpICYmIGVsZW1lbnQtPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmZvY3VzKCkKLXsKLSAgICBpZiAo
RWxlbWVudEltcGwgKmVsZW1lbnQgPSBmb3JtRWxlbWVudCgpKQotICAgICAgICBlbGVtZW50LT5m
b2N1cygpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9u
KGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBpZiAoRWxlbWVudEltcGwgKmVsZW1lbnQg
PSBmb3JtRWxlbWVudCgpKQotICAgICAgICBlbGVtZW50LT5hY2Nlc3NLZXlBY3Rpb24oc2VuZFRv
QW55RWxlbWVudCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpIVE1MU2VsZWN0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChzZWxlY3RU
YWcsIGRvYywgZiksIG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0KLQotSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpIVE1MU2VsZWN0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYg
dGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAg
OiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCh0YWdOYW1lLCBkb2MsIGYpLCBtX29wdGlvbnMo
MCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjppbml0
KCkKLXsKLSAgICBtX29wdGlvbnMgPSAwOwotICAgIG1fbXVsdGlwbGUgPSBmYWxzZTsKLSAgICBt
X3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOwotICAgIC8vIDAgbWVhbnMgaW52YWxpZCAoaS5lLiBu
b3Qgc2V0KQotICAgIG1fc2l6ZSA9IDA7Ci0gICAgbV9taW53aWR0aCA9IDA7Ci19Ci0KLUhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6fkhUTUxTZWxlY3RFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdl
dERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlz
KTsKLSAgICBpZiAobV9vcHRpb25zKSB7Ci0gICAgICAgIG1fb3B0aW9ucy0+ZGV0YWNoKCk7Ci0g
ICAgICAgIG1fb3B0aW9ucy0+ZGVyZWYoKTsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsOjpjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpCi17Ci0gICAgcmV0
dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUob3B0aW9u
VGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykgfHwgbmV3Q2hpbGQtPmhh
c1RhZ05hbWUoaHJUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlw
dFRhZyk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggU3R5
bGVDaGFuZ2UgY2ggKQotewotICAgIGlmIChoYXNDaGFuZ2VkQ2hpbGQoKSAmJiBtX3JlbmRlcikg
ewotICAgICAgICBzdGF0aWNfY2FzdDxraHRtbDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5z
ZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6cmVjYWxjU3R5bGUoIGNoICk7Ci19Ci0KLQotRE9NU3RyaW5nIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChtX211bHRpcGxlID8gInNl
bGVjdC1tdWx0aXBsZSIgOiAic2VsZWN0LW9uZSIpOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpzZWxlY3RlZEluZGV4KCkgY29uc3QKLXsKLSAgICAvLyByZXR1cm4gdGhlIG51bWJl
ciBvZiB0aGUgZmlyc3Qgb3B0aW9uIHNlbGVjdGVkCi0gICAgdWludCBvID0gMDsKLSAgICBRTWVt
QXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVu
c2lnbmVkIGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChp
dGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIGlmIChzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICBvKys7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgUV9BU1NFUlQobV9tdWx0aXBsZSk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi12b2lk
IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0U2VsZWN0ZWRJbmRleCggaW50ICBpbmRleCApCi17
Ci0gICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMgYW5kIHNlbGVjdCBvbmx5IHRoZSBu
ZXcgb25lCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1z
KCk7Ci0gICAgaW50IGxpc3RJbmRleDsKLSAgICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRl
eCA8IGludChpdGVtcy5zaXplKCkpOyBsaXN0SW5kZXgrKykgewotICAgICAgICBpZiAoaXRlbXNb
bGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBzdGF0aWNf
Y2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tsaXN0SW5kZXhdKS0+c2V0U2VsZWN0
ZWQoZmFsc2UpOwotICAgIH0KLSAgICBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRl
eCk7Ci0gICAgaWYgKGxpc3RJbmRleCA+PSAwKQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudEltcGwqPihpdGVtc1tsaXN0SW5kZXhdKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7Ci0K
LSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjps
ZW5ndGgoKSBjb25zdAotewotICAgIGludCBsZW4gPSAwOwotICAgIHVpbnQgaTsKLSAgICBRTWVt
QXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKGkg
PSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNM
b2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgICAgIGxlbisrOwotICAgIH0KLSAgICByZXR1
cm4gbGVuOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWRkKCBIVE1MRWxlbWVu
dEltcGwgKmVsZW1lbnQsIEhUTUxFbGVtZW50SW1wbCAqYmVmb3JlLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKQotewotICAgIFJlZlB0cjxIVE1MRWxlbWVudEltcGw+IHByb3RlY3ROZXdDaGlsZChlbGVt
ZW50KTsgLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHJlZidkIGFuZCBkZXJlZidkIHNvIHdl
IGRvbid0IGxlYWsgaXQKLQotICAgIGlmICghZWxlbWVudCB8fCAhKGVsZW1lbnQtPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpIHx8IGVsZW1lbnQtPmhhc0xvY2FsTmFtZShoclRhZykpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpbnNlcnRCZWZvcmUoZWxlbWVudCwgYmVmb3JlLCBleGNlcHRpb25j
b2RlKTsKLSAgICBpZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVt
cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVtb3ZlKCBpbnQgaW5kZXgg
KQotewotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAgICBpbnQgbGlzdEluZGV4ID0gb3B0
aW9uVG9MaXN0SW5kZXgoaW5kZXgpOwotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+
IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYobGlzdEluZGV4IDwgMCB8fCBpbmRleCA+PSBp
bnQoaXRlbXMuc2l6ZSgpKSkKLSAgICAgICAgcmV0dXJuOyAvLyAjIyMgd2hhdCBzaG91bGQgd2Ug
ZG8gPyByZW1vdmUgdGhlIGxhc3QgaXRlbT8KLQotICAgIE5vZGVJbXBsICppdGVtID0gaXRlbXNb
bGlzdEluZGV4XTsKLSAgICBpdGVtLT5yZWYoKTsKLSAgICByZW1vdmVDaGlsZChpdGVtLCBleGNl
cHRpb25jb2RlKTsKLSAgICBpdGVtLT5kZXJlZigpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSAp
Ci0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotfQotCi1ET01TdHJpbmcgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjp2YWx1ZSgpCi17Ci0gICAgdWludCBpOwotICAgIFFNZW1BcnJheTxIVE1M
RWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBp
dGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShv
cHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ld
KS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudEltcGwqPihpdGVtc1tpXSktPnZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiBET01T
dHJpbmcoIiIpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUuaXNOdWxsKCkpCi0gICAgICAg
IHJldHVybjsKLSAgICAvLyBmaW5kIHRoZSBvcHRpb24gd2l0aCB2YWx1ZSgpIG1hdGNoaW5nIHRo
ZSBnaXZlbiBwYXJhbWV0ZXIKLSAgICAvLyBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCBzZWxlY3Rp
b24uCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICAg
ICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhU
TUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+dmFsdWUoKSA9PSB2YWx1ZSkgewotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5z
ZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotfQotCi1R
U3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c3RhdGUoKQotewotICAgIFFNZW1BcnJheTxI
VE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotCi0gICAgaW50IGwgPSBpdGVt
cy5jb3VudCgpOwotCi0gICAgUUNoYXIgc3RhdGVDaGFyc1tsXTsKLSAgICAKLSAgICBmb3IoaW50
IGkgPSAwOyBpIDwgbDsgaSsrKQotICAgICAgICBpZihpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9w
dGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0p
LT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgc3RhdGVDaGFyc1tpXSA9ICdYJzsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgc3RhdGVDaGFyc1tpXSA9ICcuJzsKLSAgICBRU3RyaW5nIHN0YXRl
KHN0YXRlQ2hhcnMsIGwpOwotCi0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpzdGF0ZSgpICsgc3RhdGU7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZXN0
b3JlU3RhdGUoUVN0cmluZ0xpc3QgJl9zdGF0ZXMpCi17Ci0gICAgUVN0cmluZyBfc3RhdGUgPSBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1hdGNoaW5nU3RhdGUoX3N0YXRlcyk7Ci0g
ICAgaWYgKF9zdGF0ZS5pc051bGwoKSkgcmV0dXJuOwotCi0gICAgcmVjYWxjTGlzdEl0ZW1zKCk7
Ci0KLSAgICBRU3RyaW5nIHN0YXRlID0gX3N0YXRlOwotICAgIGlmKCFzdGF0ZS5pc0VtcHR5KCkg
JiYgIXN0YXRlLmNvbnRhaW5zKCdYJykgJiYgIW1fbXVsdGlwbGUpIHsKLSAgICAgICAgcVdhcm5p
bmcoInNob3VsZCBub3QgaGFwcGVuIGluIHJlc3RvcmVTdGF0ZSEiKTsKLSAgICAgICAgLy8gS1dR
U3RyaW5nIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbi4gU2hvdWxkIG5ldmVyIGdldCBo
ZXJlIGFueXdheS4KLSAgICAgICAgLy9zdGF0ZVswXSA9ICdYJzsKLSAgICB9Ci0KLSAgICBRTWVt
QXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLQotICAgIGludCBs
ID0gaXRlbXMuY291bnQoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0gICAg
ICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBvZSA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIG9lLT5zZXRTZWxlY3RlZChzdGF0ZVtpXSA9
PSAnWCcpOwotICAgICAgICB9Ci0gICAgfQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLU5v
ZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6Omluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpu
ZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aW5zZXJ0QmVm
b3JlKG5ld0NoaWxkLHJlZkNoaWxkLCBleGNlcHRpb25jb2RlICk7Ci0gICAgaWYgKCFleGNlcHRp
b25jb2RlKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQgKCBO
b2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYo
ICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0
dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVtb3Zl
Q2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAg
Tm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVDaGls
ZChvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAg
ICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9k
ZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZChuZXdDaGlsZCwgZXhjZXB0aW9u
Y29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0
ZW1zKCk7Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1O
b2RlSW1wbCogSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphZGRDaGlsZChOb2RlSW1wbCogbmV3Q2hp
bGQpCi17Ci0gICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgcmV0dXJuIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjphZGRDaGlsZChuZXdDaGlsZCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICph
dHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9z
aXplID0ga01heChhdHRyLT52YWx1ZSgpLnRvSW50KCksIDEpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBtX21pbndpZHRoID0ga01heCggYXR0
ci0+dmFsdWUoKS50b0ludCgpLCAwICk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
bXVsdGlwbGVBdHRyKSB7Ci0gICAgICAgIG1fbXVsdGlwbGUgPSAoIWF0dHItPmlzTnVsbCgpKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAg
IC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1
c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRy
KSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhU
TUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwot
fQotCi1SZW5kZXJPYmplY3QgKkhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIo
UmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5l
dyAoYXJlbmEpIFJlbmRlclNlbGVjdCh0aGlzKTsKLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RlZF92YWx1ZXMsIGJvb2wp
Ci17Ci0gICAgYm9vbCBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICB1aW50IGk7Ci0gICAgZm9yIChp
ID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1w
bCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0p
OwotICAgICAgICAgICAgaWYgKG9wdGlvbi0+c2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAg
IGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwotICAg
ICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotCi0gICAgLy8gIyMjIHRoaXMgY2FzZSBzaG91bGQgbm90IGhhcHBlbi4gbWFrZSBz
dXJlIHRoYXQgd2Ugc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24KLSAgICAvLyBpbiBhbnkgY2FzZS4g
b3RoZXJ3aXNlIHdlIGhhdmUgbm8gY29uc2lzdGVuY3kgd2l0aCB0aGUgRE9NIGludGVyZmFjZS4g
RklYTUUhCi0gICAgLy8gd2UgcmV0dXJuIHRoZSBmaXJzdCBvbmUgaWYgaXQgd2FzIGEgY29tYm9i
b3ggc2VsZWN0Ci0gICAgaWYgKCFzdWNjZXNzZnVsICYmICFtX211bHRpcGxlICYmIG1fc2l6ZSA8
PSAxICYmIGl0ZW1zLnNpemUoKSAmJgotICAgICAgICAoaXRlbXNbMF0tPmhhc0xvY2FsTmFtZShv
cHRpb25UYWcpKSkgewotICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zWzBdKTsKLSAgICAgICAgaWYg
KG9wdGlvbi0+dmFsdWUoKS5pc051bGwoKSkKLSAgICAgICAgICAgIGVuY29kZWRfdmFsdWVzLmFw
cGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnRleHQoKS5xc3RyaW5nKCkuc3RyaXBXaGl0ZVNwYWNl
KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRh
KG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3NmdWw7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6Om9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3QKLXsKLSAgICBR
TWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZiAo
b3B0aW9uSW5kZXggPCAwIHx8IG9wdGlvbkluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAg
ICAgICByZXR1cm4gLTE7Ci0KLSAgICBpbnQgbGlzdEluZGV4ID0gMDsKLSAgICBpbnQgb3B0aW9u
SW5kZXgyID0gMDsKLSAgICBmb3IgKDsKLSAgICAgICAgIG9wdGlvbkluZGV4MiA8IGludChpdGVt
cy5zaXplKCkpICYmIG9wdGlvbkluZGV4MiA8PSBvcHRpb25JbmRleDsKLSAgICAgICAgIGxpc3RJ
bmRleCsrKSB7IC8vIG5vdCBhIHR5cG8hCi0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5o
YXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgICAgIG9wdGlvbkluZGV4MisrOwotICAg
IH0KLSAgICBsaXN0SW5kZXgtLTsKLSAgICByZXR1cm4gbGlzdEluZGV4OwotfQotCi1pbnQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpsaXN0VG9PcHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBjb25z
dAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygp
OwotICAgIGlmIChsaXN0SW5kZXggPCAwIHx8IGxpc3RJbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgp
KSB8fAotICAgICAgICAhaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykp
Ci0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGludCBvcHRpb25JbmRleCA9IDA7IC8vIGFjdHVh
bCBpbmRleCBvZiBvcHRpb24gbm90IGNvdW50aW5nIE9QVEdST1VQIGVudHJpZXMgdGhhdCBtYXkg
YmUgaW4gbGlzdAotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0SW5kZXg7IGkr
KykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAg
ICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgcmV0dXJuIG9wdGlvbkluZGV4OwotfQotCi0vLyBG
SVhNRSA0MTk3OTk3OiB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBwdWJsaWMgQVBJIC1bRE9N
SFRNTFNlbGVjdEVsZW1lbnQgb3B0aW9uc10sIGJ1dCBhbHdheXMgcmV0dXJucwotLy8gYW4gZW1w
dHkgbGlzdC4KLUhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6b3B0aW9ucygpCi17Ci0gICAgaWYgKCFtX29wdGlvbnMpIHsKLSAgICAgICAgbV9vcHRpb25z
ID0gbmV3IEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwodGhpcyk7Ci0gICAgICAgIG1fb3B0aW9u
cy0+cmVmKCk7Ci0gICAgfQotICAgIHJldHVybiBtX29wdGlvbnM7Ci19Ci0KLS8vIEZJWE1FOiBE
ZWxldGUgb25jZSB0aGUgYWJvdmUgZnVuY3Rpb24gaXMgd29ya2luZyB3ZWxsIGVub3VnaCB0byB1
c2UgZm9yIHJlYWwuCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6Om9wdGlvbnNIVE1MQ29sbGVjdGlvbigpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1M
Q29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rp
b25JbXBsOjpTRUxFQ1RfT1BUSU9OUykpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6cmVjYWxjTGlzdEl0ZW1zKCkKLXsKLSAgICBOb2RlSW1wbCogY3VycmVudCA9IGZpcnN0Q2hp
bGQoKTsKLSAgICBtX2xpc3RJdGVtcy5yZXNpemUoMCk7Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKiBmb3VuZFNlbGVjdGVkID0gMDsKLSAgICB3aGlsZShjdXJyZW50KSB7Ci0gICAgICAgIGlm
IChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSAmJiBjdXJyZW50LT5maXJzdENoaWxk
KCkpIHsKLSAgICAgICAgICAgIC8vICMjIyB3aGF0IGlmIG9wdGdyb3VwIGNvbnRhaW5zIGp1c3Qg
Y29tbWVudHM/IGRvbid0IHdhbnQgb25lIG9mIG5vIG9wdGlvbnMgaW4gaXQuLi4KLSAgICAgICAg
ICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAg
ICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxl
bWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5maXJz
dENoaWxkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlzdEl0ZW1zLnNp
emUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUoKS0xXSA9
IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgaWYg
KCFmb3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIG1fc2l6ZSA8PSAxKSB7Ci0gICAgICAg
ICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1w
bCo+KGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPm1fc2VsZWN0ZWQg
PSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZm91bmRTZWxlY3Rl
ZCAmJiAhbV9tdWx0aXBsZSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihj
dXJyZW50KS0+c2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPm1f
c2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGlj
X2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUoaHJUYWcpKSB7Ci0gICAg
ICAgICAgICBtX2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAg
ICAgICAgbV9saXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRN
TEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZUltcGwgKnBh
cmVudCA9IGN1cnJlbnQtPnBhcmVudE5vZGUoKTsKLSAgICAgICAgY3VycmVudCA9IGN1cnJlbnQt
Pm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGlmICghY3VycmVudCkgewotICAgICAgICAgICAgaWYg
KHBhcmVudCAhPSB0aGlzKQotICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQtPm5leHRT
aWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSBmYWxz
ZTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17
Ci0gICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjpzZXRSZWNhbGNMaXN0SXRlbXMoKQotewotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gdHJ1ZTsK
LSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PGtodG1sOjpSZW5kZXJTZWxl
Y3QqPihtX3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgIHNldENoYW5nZWQo
KTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlc2V0KCkKLXsKLSAgICBRTWVt
QXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICB1aW50IGk7
Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChp
dGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRp
b25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBs
Kj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgYm9vbCBzZWxlY3RlZCA9ICghb3B0aW9uLT5nZXRB
dHRyaWJ1dGUoc2VsZWN0ZWRBdHRyKS5pc051bGwoKSk7Ci0gICAgICAgICAgICBvcHRpb24tPnNl
dFNlbGVjdGVkKHNlbGVjdGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIG1fcmVuZGVy
ICkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRTZWxl
Y3Rpb25DaGFuZ2VkKHRydWUpOwotICAgIHNldENoYW5nZWQoIHRydWUgKTsKLX0KLQotdm9pZCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6Om5vdGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVt
ZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24sIGJvb2wgc2VsZWN0ZWQpCi17Ci0gICAgaWYgKHNlbGVj
dGVkICYmICFtX211bHRpcGxlKSB7Ci0gICAgICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRp
b25zCi0gICAgICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVt
cygpOwotICAgICAgICB1aW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXpl
KCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9u
VGFnKSkKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihpdGVtc1tpXSktPm1fc2VsZWN0ZWQgPSAoaXRlbXNbaV0gPT0gc2VsZWN0ZWRPcHRpb24pOwot
ICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8
UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25DaGFuZ2VkKHRydWUpOwotCi0g
ICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmRl
ZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgLy8gVXNlIGtleSBwcmVz
cyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNlIGV2ZW50cwotICAgIC8v
IG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2YgdGhlIGtleSBwcmVzcyBl
dmVudC4KLSAgICBpZiAoZXZ0LT50eXBlKCkgPT0ga2V5cHJlc3NFdmVudCkgewotICAgIAotICAg
ICAgICBpZiAoIW1fZm9ybSB8fCAhbV9yZW5kZXIgfHwgIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkp
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBET01TdHJpbmcga2V5ID0g
c3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRpZmllcigpOwot
ICAgICAgICAKLSAgICAgICAgaWYgKGtleSA9PSAiRW50ZXIiKSB7Ci0gICAgICAgICAgICBtX2Zv
cm0tPnN1Ym1pdENsaWNrKCk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1
bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFj
Y2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgZm9jdXMoKTsKLX0K
LQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldE11bHRpcGxlKGJvb2wgbXVsdGlwbGUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKG11bHRpcGxlQXR0ciwgbXVsdGlwbGUgPyAiIiA6IDApOwot
fQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0U2l6ZShpbnQgc2l6ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihzaXplKSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEtleWdlbkVsZW1lbnRJbXBsOjpIVE1MS2V5Z2VuRWxl
bWVudEltcGwoRG9jdW1lbnRJbXBsKiBkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwqIGYpCi0gICAg
OiBIVE1MU2VsZWN0RWxlbWVudEltcGwoa2V5Z2VuVGFnLCBkb2MsIGYpCi17Ci0gICAgUVN0cmlu
Z0xpc3Qga2V5cyA9IEtTU0xLZXlHZW46OnN1cHBvcnRlZEtleVNpemVzKCk7Ci0gICAgZm9yIChR
U3RyaW5nTGlzdDo6SXRlcmF0b3IgaSA9IGtleXMuYmVnaW4oKTsgaSAhPSBrZXlzLmVuZCgpOyAr
K2kpIHsKLSAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBvID0gbmV3IEhUTUxPcHRpb25F
bGVtZW50SW1wbChkb2MsIGZvcm0oKSk7Ci0gICAgICAgIGFkZENoaWxkKG8pOwotICAgICAgICBv
LT5hZGRDaGlsZChuZXcgVGV4dEltcGwoZG9jLCBET01TdHJpbmcoKmkpKSk7Ci0gICAgfQotfQot
Ci1ET01TdHJpbmcgSFRNTEtleWdlbkVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gImtleWdlbiI7Ci19Ci0KLXZvaWQgSFRNTEtleWdlbkVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsKiBhdHRyKQotewotICAgIGlmIChhdHRy
LT5uYW1lKCkgPT0gY2hhbGxlbmdlQXR0cikKLSAgICAgICAgbV9jaGFsbGVuZ2UgPSBhdHRyLT52
YWx1ZSgpOwotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBrZXl0eXBlQXR0cikKLSAgICAg
ICAgbV9rZXlUeXBlID0gYXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICAgIC8vIHNraXAg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsIHBhcnNpbmchCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1MS2V5
Z2VuRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RlZF92YWx1
ZXMsIGJvb2wpCi17Ci0gICAgLy8gT25seSBSU0EgaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4K
LSAgICBpZiAoIW1fa2V5VHlwZS5pc051bGwoKSAmJiAhZXF1YWxJZ25vcmluZ0Nhc2UobV9rZXlU
eXBlLCAicnNhIikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBRU3RyaW5nIHZhbHVlID0g
S1NTTEtleUdlbjo6c2lnbmVkUHVibGljS2V5QW5kQ2hhbGxlbmdlU3RyaW5nKHNlbGVjdGVkSW5k
ZXgoKSwgbV9jaGFsbGVuZ2UucXN0cmluZygpLCBnZXREb2N1bWVudCgpLT5mcmFtZSgpLT5iYXNl
VVJMKCkpOwotICAgIGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZS51dGY4KCkpOwotICAg
IHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsOjpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRN
TEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9w
dGdyb3VwVGFnLCBkb2MsIGYpCi17Ci19Ci0KLUhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjp+SFRN
TE9wdEdyb3VwRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxPcHRHcm91cEVsZW1lbnRJ
bXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ET01T
dHJpbmcgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVy
biAib3B0Z3JvdXAiOwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6Omlu
c2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlKG5ld0NoaWxkLHJlZkNoaWxkLCBleGNlcHRpb25j
b2RlKTsKLSAgICBpZiAoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0
aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBF
bGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAq
b2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQobmV3Q2hpbGQsb2xkQ2hp
bGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCFleGNlcHRpb25jb2RlKQotICAgICAgICByZWNh
bGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhU
TUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwg
aW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsK
LSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7
Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJ
bXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlv
bmNvZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3Vs
dDsKLX0KLQotTm9kZUltcGwqIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjphZGRDaGlsZChOb2Rl
SW1wbCogbmV3Q2hpbGQpCi17Ci0gICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotCi0gICAgcmV0
dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphZGRDaGlsZChuZXdDaGlsZCk7Ci19Ci0K
LXZvaWQgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBl
ZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsK
LX0KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJIVE1MT3B0aW9uRWxlbWVudEltcGwu
aCIKKyNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaCIKIAotdm9pZCBIVE1MT3B0R3Jv
dXBFbGVtZW50SW1wbDo6cmVjYWxjU2VsZWN0T3B0aW9ucygpCi17Ci0gICAgTm9kZUltcGwgKnNl
bGVjdCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3QtPmhhc1Rh
Z05hbWUoc2VsZWN0VGFnKSkKLSAgICAgICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnROb2RlKCk7
Ci0gICAgaWYgKHNlbGVjdCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnRJ
bXBsKj4oc2VsZWN0KS0+c2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19CisjaW5jbHVkZSAiZG9tX3Rl
eHRpbXBsLmgiCisjaW5jbHVkZSAiZG9tX2V4Y2VwdGlvbi5oIgogCi1ET01TdHJpbmcgSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OmxhYmVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGxhYmVsQXR0cik7Ci19Cit1c2luZyBuYW1lc3BhY2Uga2h0bWw7CiAKLXZvaWQgSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OnNldExhYmVsKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGxhYmVsQXR0ciwgdmFsdWUpOwotfQorbmFtZXNwYWNlIERPTSB7CiAK
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKIEhUTUxP
cHRpb25FbGVtZW50SW1wbDo6SFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9j
LCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQogICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwob3B0aW9uVGFnLCBkb2MsIGYpCkBAIC0zMjM4LDMzMSArMTg1LDQgQEAgdm9pZCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OnNldExhYmVsKGNvbgogICAgIHNldEF0dHJpYnV0ZShsYWJlbEF0dHIs
IHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6SFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCh0ZXh0YXJl
YVRhZywgZG9jLCBmKSwgbV92YWx1ZUlzVmFsaWQoZmFsc2UpLCBtX3ZhbHVlTWF0Y2hlc1JlbmRl
cmVyKGZhbHNlKQotewotICAgIC8vIERURCByZXF1aXJlcyByb3dzICYgY29scyBiZSBzcGVjaWZp
ZWQsIGJ1dCB3ZSB3aWxsIHByb3ZpZGUgcmVhc29uYWJsZSBkZWZhdWx0cwotICAgIG1fcm93cyA9
IDI7Ci0gICAgbV9jb2xzID0gMjA7Ci0gICAgbV93cmFwID0gdGFfVmlydHVhbDsKLX0KLQotSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6On5IVE1MVGV4dEFyZWFFbGVtZW50SW1wbCgpCi17Ci0gICAg
aWYgKGdldERvY3VtZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0
ZSh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp0eXBlKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gInRleHRhcmVhIjsKLX0KLQotUVN0cmluZyBIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6c3RhdGUoICkKLXsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIHN0cmluZyBp
cyBub3QgZW1wdHkhCi0gICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0
ZSgpICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBRU3RyaW5n
IHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKHN0
YXRlcyk7Ci0gICAgaWYgKHN0YXRlLmlzTnVsbCgpKSByZXR1cm47Ci0gICAgc2V0RGVmYXVsdFZh
bHVlKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpOwotICAgIC8vIHRoZSBjbG9zZSgpIGlu
IHRoZSByZW5kZXJ0cmVlIHdpbGwgdGFrZSBjYXJlIG9mIHRyYW5zZmVycmluZyBkZWZhdWx0dmFs
dWUgdG8gJ3ZhbHVlJwotfQotCi1pbnQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdGlv
blN0YXJ0KCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxSZW5kZXJUZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2VsZWN0aW9uRW5kKCkK
LXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJU
ZXh0QXJlYSAqPihtX3JlbmRlciktPnNlbGVjdGlvbkVuZCgpOwotICAgIHJldHVybiAwOwotfQot
Ci12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25TdGFydChpbnQgc3Rh
cnQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0
QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsKLX0KLQotdm9pZCBI
VE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17Ci0gICAg
aWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSAqPihtX3Jl
bmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsOjpzZWxlY3QoICApCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNf
Y2FzdDxSZW5kZXJUZXh0QXJlYSo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci19Ci0KLXZvaWQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVu
ZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRB
cmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgc2V0
VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwotfQotICAgIAotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsK
LSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHJvd3NBdHRyKSB7Ci0gICAgICAgIG1fcm93cyA9ICFh
dHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IDM7Ci0gICAgICAgIGlmIChy
ZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5N
YXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjb2xzQXR0cikgewot
ICAgICAgICBtX2NvbHMgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkg
OiA2MDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5z
ZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IHdyYXBBdHRyKSB7Ci0gICAgICAgIC8vIHZpcnR1YWwgLyBwaHlzaWNhbCBpcyBOZXRz
Y2FwZSBleHRlbnNpb24gb2YgSFRNTCAzLjAsIG5vdyBkZXByZWNhdGVkCi0gICAgICAgIC8vIHNv
ZnQvIGhhcmQgLyBvZmYgaXMgcmVjb21tZW5kYXRpb24gZm9yIEhUTUwgNCBleHRlbnNpb24gYnkg
SUUgYW5kIE5TIDQKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCks
ICJ2aXJ0dWFsIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInNvZnQiKSkK
LSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1ZpcnR1YWw7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJwaHlzaWNhbCIpIHx8IGVxdWFsSWdub3JpbmdD
YXNlKGF0dHItPnZhbHVlKCksICJoYXJkIikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9QaHlz
aWNhbDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwg
Im9uIiApKQotICAgICAgICAgICAgbV93cmFwID0gdGFfUGh5c2ljYWw7Ci0gICAgICAgIGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKSkKLSAgICAgICAgICAg
IG1fd3JhcCA9IHRhX05vV3JhcDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAg
ICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gaWdub3Jl
IGZvciB0aGUgbW9tZW50Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihz
ZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25jaGFu
Z2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBhdHRy
KTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxl
ICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyVGV4dEFyZWEodGhpcyk7
Ci19Ci0KLWJvb2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1E
YXRhTGlzdCYgZW5jb2RpbmcsIGJvb2wpCi17Ci0gICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpIHJl
dHVybiBmYWxzZTsKLSAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnJlc2V0
KCkKLXsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUoKSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRB
cmVhRWxlbWVudEltcGw6OnVwZGF0ZVZhbHVlKCkKLXsKLSAgICBpZiAoICFtX3ZhbHVlSXNWYWxp
ZCApIHsKLSAgICAgICAgaWYgKCBtX3JlbmRlciApIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBz
dGF0aWNfY2FzdDxSZW5kZXJUZXh0QXJlYSo+KCBtX3JlbmRlciApLT50ZXh0KCkucXN0cmluZygp
OwotICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gZGVmYXVsdFZhbHVlKCkucXN0cmluZygpOwot
ICAgICAgICAgICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgICAgICB9Ci0g
ICAgICAgIG1fdmFsdWVJc1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6dmFsdWUoKQotewotICAgIHVwZGF0ZVZhbHVlKCk7Ci0gICAg
cmV0dXJuIG1fdmFsdWUuaXNOdWxsKCkgPyBET01TdHJpbmcoIiIpIDogbV92YWx1ZTsKLX0KLQot
dm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWUucXN0cmluZygpOwotICAgIG1fdmFsdWVNYXRj
aGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAgaWYg
KG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICAv
LyBGSVhNRTogRm9yY2UgcmVsb2FkIGZyb20gcmVuZGVyZXIsIGFzIHJlbmRlcmVyIG1heSBoYXZl
IG5vcm1hbGl6ZWQgbGluZSBlbmRpbmdzLgotICAgIG1fdmFsdWVJc1ZhbGlkID0gZmFsc2U7Ci0g
ICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OmRlZmF1bHRWYWx1ZSgpCi17Ci0gICAgRE9NU3RyaW5nIHZhbCA9ICIiOwotICAgIC8v
IHRoZXJlIG1heSBiZSBjb21tZW50cyAtIGp1c3QgZ3JhYiB0aGUgdGV4dCBub2RlcwotICAgIE5v
ZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJs
aW5nKCkpCi0gICAgICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB2YWwgKz0g
c3RhdGljX2Nhc3Q8VGV4dEltcGwqPihuKS0+ZGF0YSgpOwotICAgIAotICAgIGlmICh2YWxbMF0g
PT0gJ1xyJyAmJiB2YWxbMV0gPT0gJ1xuJykgewotICAgICAgICB2YWwgPSB2YWwuY29weSgpOwot
ICAgICAgICB2YWwucmVtb3ZlKDAsMik7Ci0gICAgfSBlbHNlIGlmICh2YWxbMF0gPT0gJ1xyJyB8
fCB2YWxbMF0gPT0gJ1xuJykgewotICAgICAgICB2YWwgPSB2YWwuY29weSgpOwotICAgICAgICB2
YWwucmVtb3ZlKDAsMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0RGVmYXVsdFZhbHVlKGNvbnN0IERPTVN0cmluZyAmZGVm
YXVsdFZhbHVlKQotewotICAgIC8vIHRoZXJlIG1heSBiZSBjb21tZW50cyAtIHJlbW92ZSBhbGwg
dGhlIHRleHQgbm9kZXMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIG9uZQotICAgIFFQdHJMaXN0PE5v
ZGVJbXBsPiB0b1JlbW92ZTsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSBmaXJzdENo
aWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBpZiAobi0+aXNUZXh0Tm9k
ZSgpKQotICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKG4pOwotICAgIFFQdHJMaXN0SXRlcmF0
b3I8Tm9kZUltcGw+IGl0KHRvUmVtb3ZlKTsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0g
ICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkgewotICAgICAgICBOb2RlSW1wbCAqbiA9IGl0
LmN1cnJlbnQoKTsKLSAgICAgICAgbi0+cmVmKCk7Ci0gICAgICAgIHJlbW92ZUNoaWxkKG4sIGV4
Y2VwdGlvbmNvZGUpOwotICAgICAgICBuLT5kZXJlZigpOwotICAgIH0KLSAgICBpbnNlcnRCZWZv
cmUoZ2V0RG9jdW1lbnQoKS0+Y3JlYXRlVGV4dE5vZGUoZGVmYXVsdFZhbHVlKSxmaXJzdENoaWxk
KCksIGV4Y2VwdGlvbmNvZGUpOwotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLWJv
b2wgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQotewotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24o
Ym9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIGZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTFRl
eHRBcmVhRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgbV92YWx1ZUlzVmFsaWQgPSB0cnVl
OwotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKTsKLSAgICB1cGRhdGVW
YWx1ZSgpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpkZXRhY2goKQotewot
ICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3ZhbHVlTWF0
Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NL
ZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5
QXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRDb2xz
KGludCBjb2xzKQotewotICAgIHNldEF0dHJpYnV0ZShjb2xzQXR0ciwgUVN0cmluZzo6bnVtYmVy
KGNvbHMpKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0Um93cyhpbnQg
cm93cykKLXsKLSAgICBzZXRBdHRyaWJ1dGUocm93c0F0dHIsIFFTdHJpbmc6Om51bWJlcihyb3dz
KSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6
SFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZikKLSAgICA6IEhUTUxJbnB1dEVsZW1lbnRJbXBsKGlzaW5kZXhUYWcsIGRvYywgZikK
LXsKLSAgICBtX3R5cGUgPSBURVhUOwotICAgIG1fbmFtZSA9ICJpc2luZGV4IjsKLX0KLQotdm9p
ZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsKiBhdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcHJvbXB0QXR0cikK
LQlzZXRWYWx1ZShhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNlCi0gICAgICAgIC8vIGRvbid0IGNh
bGwgSFRNTElucHV0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUgaGVyZSwgYXMgaXQgd291
bGQKLSAgICAgICAgLy8gYWNjZXB0IGF0dHJpYnV0ZXMgdGhpcyBlbGVtZW50IGRvZXMgbm90IHN1
cHBvcnQKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6cHJv
bXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHByb21wdEF0dHIpOwotfQot
Ci12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnNldFByb21wdChjb25zdCBET01TdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShwcm9tcHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotdW5zaWduZWQgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6
bGVuZ3RoKCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAgIHJldHVy
biAwOwotfQotCi12b2lkIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6OnNldExlbmd0aCh1bnNp
Z25lZCBsZW5ndGgpCi17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLX0KLQotTm9kZUlt
cGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Oml0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0
Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICByZXR1cm4gMDsKLX0KLQotTm9k
ZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Om5hbWVkSXRlbShjb25zdCBET01TdHJp
bmcgJm5hbWUpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICByZXR1
cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Gb3JtRGF0YUxpc3Q6OkZvcm1EYXRh
TGlzdChRVGV4dENvZGVjICpjKQotICAgIDogbV9jb2RlYyhjKQotewotfQotCi12b2lkIEZvcm1E
YXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0IFFDU3RyaW5nICZzKQotewotICAgIG1fbGlzdC5h
cHBlbmQocyk7Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJpbmcoY29uc3QgUVN0
cmluZyAmcykKLXsKLSAgICBRQ1N0cmluZyBjc3RyID0gZml4TGluZUJyZWFrcyhtX2NvZGVjLT5m
cm9tVW5pY29kZShzLCB0cnVlKSk7Ci0gICAgY3N0ci50cnVuY2F0ZShjc3RyLmxlbmd0aCgpKTsK
LSAgICBtX2xpc3QuYXBwZW5kKGNzdHIpOwotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5k
RmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZmaWxlbmFtZSkKLXsK
LSAgICBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7Ci0gICAgbV9saXN0LmFwcGVuZChmaWxl
bmFtZS5xc3RyaW5nKCkpOwotfQotCiB9IC8vIG5hbWVzcGFjZQpJbmRleDoga2h0bWwvaHRtbC9I
VE1MVGV4dEFyZWFFbGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9IVE1M
VGV4dEFyZWFFbGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDExOTc2KQorKysga2h0bWwvaHRtbC9I
VE1MVGV4dEFyZWFFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQsNyArNCw3IEBA
CiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAg
ICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAg
ICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHly
aWdodCAoQykgMjAwNCwgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChD
KSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKiAgICAgICAgICAgKEMp
IDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAbnlwb3AuY29tKQogICoKICAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAg
LTI0LDMyMjEgKzI0LDIwIEBACiAgKgogICovCiAKLSN1bmRlZiBGT1JNU19ERUJVRwotLy8jZGVm
aW5lIEZPUk1TX0RFQlVHCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sL2h0
bWxfZm9ybWltcGwuaCIKLQotI2luY2x1ZGUgImtodG1sdmlldy5oIgotI2luY2x1ZGUgIk1hY0Zy
YW1lLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0
bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAia2h0bWxfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJt
aXNjL2Zvcm1kYXRhLmgiCi0KLSNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgotI2luY2x1
ZGUgImNzcy9jc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiY3NzcHJvcGVydGllcy5oIgot
I2luY2x1ZGUgImNzc2hlbHBlci5oIgotI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKLSNp
bmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAieG1sL0V2ZW50TmFtZXMu
aCIKLSNpbmNsdWRlICJraHRtbF9leHQuaCIKLQotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJf
Zm9ybS5oIgotI2luY2x1ZGUgInJlbmRlcl9idXR0b24uaCIKLSNpbmNsdWRlICJyZW5kZXJfdGhl
bWUuaCIKLQotI2luY2x1ZGUgPGtsb2NhbGUuaD4KLSNpbmNsdWRlIDxxZmlsZS5oPgotI2luY2x1
ZGUgPHF0ZXh0Y29kZWMuaD4KLQotLy8gZm9yIGtleWdlbgotI2luY2x1ZGUgPHFzdHJpbmcuaD4K
LSNpbmNsdWRlIDxrc3Nsa2V5Z2VuLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotdXNpbmcg
bmFtZXNwYWNlIGtodG1sOwotCi1uYW1lc3BhY2UgRE9NIHsKLQotdXNpbmcgbmFtZXNwYWNlIEV2
ZW50TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1zdHJ1Y3QgRm9ybURhdGFM
aXN0SXRlbSB7Ci0gICAgRm9ybURhdGFMaXN0SXRlbShjb25zdCBRQ1N0cmluZyAmZGF0YSkgOiBt
X2RhdGEoZGF0YSkgeyB9Ci0gICAgRm9ybURhdGFMaXN0SXRlbShjb25zdCBRU3RyaW5nICZwYXRo
KSA6IG1fcGF0aChwYXRoKSB7IH0KLQotICAgIFFTdHJpbmcgbV9wYXRoOwotICAgIFFDU3RyaW5n
IG1fZGF0YTsKLX07Ci0KLWNsYXNzIEZvcm1EYXRhTGlzdCB7Ci1wdWJsaWM6Ci0gICAgRm9ybURh
dGFMaXN0KFFUZXh0Q29kZWMgKik7Ci0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3Ry
aW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5n
KGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFsdWUucXN0cmluZygpKTsgfQotICAgIHZv
aWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgUVN0cmluZyAmdmFsdWUp
Ci0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBhcHBlbmRTdHJpbmcodmFs
dWUpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBR
Q1N0cmluZyAmdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOyBh
cHBlbmRTdHJpbmcodmFsdWUpOyB9Ci0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmlu
ZyAma2V5LCBpbnQgdmFsdWUpCi0gICAgICAgIHsgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkp
OyBhcHBlbmRTdHJpbmcoUVN0cmluZzo6bnVtYmVyKHZhbHVlKSk7IH0KLSAgICB2b2lkIGFwcGVu
ZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmZmlsZW5hbWUpOwot
Ci0gICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gYmVnaW4oKSBj
b25zdAotICAgICAgICB7IHJldHVybiBtX2xpc3QuYmVnaW4oKTsgfQotICAgIFFWYWx1ZUxpc3RD
b25zdEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+IGVuZCgpIGNvbnN0Ci0gICAgICAgIHsgcmV0
dXJuIG1fbGlzdC5lbmQoKTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNv
bnN0IFFDU3RyaW5nICZzKTsKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhjb25zdCBRU3RyaW5nICZz
KTsKLQotICAgIFFUZXh0Q29kZWMgKm1fY29kZWM7Ci0gICAgUVZhbHVlTGlzdDxGb3JtRGF0YUxp
c3RJdGVtPiBtX2xpc3Q7Ci19OwotCi1IVE1MRm9ybUVsZW1lbnRJbXBsOjpIVE1MRm9ybUVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnRJbXBsKGZvcm1UYWcs
IGRvYykKLXsKLSAgICBjb2xsZWN0aW9uSW5mbyA9IDA7Ci0gICAgbV9wb3N0ID0gZmFsc2U7Ci0g
ICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICBtX2F1dG9jb21wbGV0ZSA9IHRydWU7Ci0gICAg
bV9pbnN1Ym1pdCA9IGZhbHNlOwotICAgIG1fZG9pbmdzdWJtaXQgPSBmYWxzZTsKLSAgICBtX2lu
cmVzZXQgPSBmYWxzZTsKLSAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11
cmxlbmNvZGVkIjsKLSAgICBtX2JvdW5kYXJ5ID0gIi0tLS0tLS0tLS0weEtoVG1MYk91TmRBclki
OwotICAgIG1fYWNjZXB0Y2hhcnNldCA9ICJVTktOT1dOIjsKLSAgICBtX21hbGZvcm1lZCA9IGZh
bHNlOwotfQotCi1IVE1MRm9ybUVsZW1lbnRJbXBsOjp+SFRNTEZvcm1FbGVtZW50SW1wbCgpCi17
Ci0gICAgZGVsZXRlIGNvbGxlY3Rpb25JbmZvOwotICAgIAotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxlbWVudHNb
aV0tPm1fZm9ybSA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGltZ0VsZW1lbnRz
LmNvdW50KCk7ICsraSkKLSAgICAgICAgaW1nRWxlbWVudHNbaV0tPm1fZm9ybSA9IDA7Ci19Ci0K
LQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lv
bihjb25zdCBET01TdHJpbmcgJnVybCkKLXsKLSAgICBpZiAodXJsLmlzTnVsbCgpKSB7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERvY3VtZW50KCktPmNvbXBs
ZXRlVVJMKHVybC5xc3RyaW5nKCkpLnN0YXJ0c1dpdGgoImh0dHBzOiIsIGZhbHNlKTsKLX0KLQot
Ci12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgSFRNTEVsZW1lbnRJ
bXBsOjphdHRhY2goKTsKLQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3aXRoIGNhbGxpbmcg
c2VjdXJlRm9ybVJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhlIHRpbWluZwotICAgIC8v
IHdhcyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVhcmx5Ci0gICAgaWYgKGZv
cm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKSkKLSAgICAgICAgZ2V0RG9jdW1lbnQo
KS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6aW5z
ZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1
bWVudCgpKSB7Ci0JSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
RG9jdW1lbnRJbXBsICo+KGdldERvY3VtZW50KCkpOwotCWRvY3VtZW50LT5hZGROYW1lZEl0ZW0o
b2xkTmFtZUF0dHIpOwotICAgIH0KLQotICAgIEhUTUxFbGVtZW50SW1wbDo6aW5zZXJ0ZWRJbnRv
RG9jdW1lbnQoKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVkRnJvbURv
Y3VtZW50KCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewot
CUhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1w
bCAqPihnZXREb2N1bWVudCgpKTsKLQlkb2N1bWVudC0+cmVtb3ZlTmFtZWRJdGVtKG9sZE5hbWVB
dHRyKTsKLSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tRG9jdW1l
bnQoKTsKLX0KLQotaW50IEhUTUxGb3JtRWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0g
ICAgaW50IGxlbiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50
cy5jb3VudCgpOyArK2kpCi0JaWYgKGZvcm1FbGVtZW50c1tpXS0+aXNFbnVtZXJhdGFibGUoKSkK
LQkgICAgKytsZW47Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi0KLXZvaWQgSFRNTEZvcm1FbGVt
ZW50SW1wbDo6c3VibWl0Q2xpY2soKQotewotICAgIGJvb2wgc3VibWl0Rm91bmQgPSBmYWxzZTsK
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkg
ewotICAgICAgICBpZiAoZm9ybUVsZW1lbnRzW2ldLT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpKSB7
Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KGZvcm1FbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICBp
ZiAoZWxlbWVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgJiYgZWxlbWVudC0+cmVuZGVy
ZXIoKSkgewotICAgICAgICAgICAgICAgIHN1Ym1pdEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICBlbGVtZW50LT5jbGljayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzdWJtaXRGb3VuZCkgLy8gc3Vi
bWl0IHRoZSBmb3JtIHdpdGhvdXQgYSBzdWJtaXQgb3IgaW1hZ2UgaW5wdXQKLSAgICAgICAgcHJl
cGFyZVN1Ym1pdCgpOwotfQotCi0KLXN0YXRpYyBRQ1N0cmluZyBlbmNvZGVDU3RyaW5nKGNvbnN0
IFFDU3RyaW5nJiBlKQotewotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludGVy
YWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40LjEKLSAgICAvLyBzYWZlIGNoYXJhY3RlcnMgbGlrZSBO
UyBoYW5kbGVzIHRoZW0gZm9yIGNvbXBhdGliaWxpdHkKLSAgICBzdGF0aWMgY29uc3QgY2hhciAq
c2FmZSA9ICItLl8qIjsKLSAgICBpbnQgZWxlbiA9IGUubGVuZ3RoKCk7Ci0gICAgUUNTdHJpbmcg
ZW5jb2RlZCgoIGVsZW4rZS5jb250YWlucyggJ1xuJyApICkqMysxKTsKLSAgICBpbnQgZW5jbGVu
ID0gMDsKLQotICAgIC8vUUNTdHJpbmcgb3JpZyhlLmRhdGEoKSwgZS5zaXplKCkpOwotCi0gICAg
Zm9yKGludCBwb3MgPSAwOyBwb3MgPCBlbGVuOyBwb3MrKykgewotICAgICAgICB1bnNpZ25lZCBj
aGFyIGMgPSBlW3Bvc107Ci0KLSAgICAgICAgaWYgKCAoKCBjID49ICdBJykgJiYgKCBjIDw9ICda
JykpIHx8Ci0gICAgICAgICAgICAgKCggYyA+PSAnYScpICYmICggYyA8PSAneicpKSB8fAotICAg
ICAgICAgICAgICgoIGMgPj0gJzAnKSAmJiAoIGMgPD0gJzknKSkgfHwKLSAgICAgICAgICAgICAo
c3RyY2hyKHNhZmUsIGMpKQotICAgICAgICAgICAgKQotICAgICAgICAgICAgZW5jb2RlZFtlbmNs
ZW4rK10gPSBjOwotICAgICAgICBlbHNlIGlmICggYyA9PSAnICcgKQotICAgICAgICAgICAgZW5j
b2RlZFtlbmNsZW4rK10gPSAnKyc7Ci0gICAgICAgIGVsc2UgaWYgKCBjID09ICdcbicgfHwgKCBj
ID09ICdccicgJiYgZVtwb3MrMV0gIT0gJ1xuJyApICkKLSAgICAgICAgewotICAgICAgICAgICAg
ZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9
ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ0QnOwotICAgICAgICAgICAg
ZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9
ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ0EnOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UgaWYgKCBjICE9ICdccicgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNv
ZGVkW2VuY2xlbisrXSA9ICclJzsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBoID0gYyAvIDE2
OwotICAgICAgICAgICAgaCArPSAoaCA+IDkpID8gKCdBJyAtIDEwKSA6ICcwJzsKLSAgICAgICAg
ICAgIGVuY29kZWRbZW5jbGVuKytdID0gaDsKLQotICAgICAgICAgICAgdW5zaWduZWQgaW50IGwg
PSBjICUgMTY7Ci0gICAgICAgICAgICBsICs9IChsID4gOSkgPyAoJ0EnIC0gMTApIDogJzAnOwot
ICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBsOwotICAgICAgICB9Ci0gICAgfQotICAg
IGVuY29kZWRbZW5jbGVuKytdID0gJ1wwJzsKLSAgICBlbmNvZGVkLnRydW5jYXRlKGVuY2xlbik7
Ci0KLSAgICByZXR1cm4gZW5jb2RlZDsKLX0KLQotLy8gQ2hhbmdlIHBsYWluIENSIGFuZCBwbGFp
biBMRiB0byBDUkxGIHBhaXJzLgotc3RhdGljIFFDU3RyaW5nIGZpeExpbmVCcmVha3MoY29uc3Qg
UUNTdHJpbmcgJnMpCi17Ci0gICAgLy8gQ29tcHV0ZSB0aGUgbGVuZ3RoLgotICAgIHVuc2lnbmVk
IG5ld0xlbiA9IDA7Ci0gICAgY29uc3QgY2hhciAqcCA9IHMuZGF0YSgpOwotICAgIHdoaWxlIChj
aGFyIGMgPSAqcCsrKSB7Ci0gICAgICAgIGlmIChjID09ICdccicpIHsKLSAgICAgICAgICAgIC8v
IFNhZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCi0gICAgICAgICAg
ICBpZiAoKnAgIT0gJ1xuJykgewotICAgICAgICAgICAgICAgIC8vIFR1cm4gQ1IgaW50byBDUkxG
LgotICAgICAgICAgICAgICAgIG5ld0xlbiArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9
IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgLy8gVHVybiBMRiBpbnRvIENSTEYu
Ci0gICAgICAgICAgICBuZXdMZW4gKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IC8vIExlYXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICBuZXdMZW4gKz0g
MTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobmV3TGVuID09IHMubGVuZ3RoKCkpIHsKLSAg
ICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIAotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBz
dHJpbmcuCi0gICAgcCA9IHMuZGF0YSgpOwotICAgIFFDU3RyaW5nIHJlc3VsdChuZXdMZW4gKyAx
KTsKLSAgICBjaGFyICpxID0gcmVzdWx0LmRhdGEoKTsKLSAgICB3aGlsZSAoY2hhciBjID0gKnAr
KykgewotICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBTYWZlIHRvIGxv
b2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGluZyAnXDAnLgotICAgICAgICAgICAgaWYgKCpwICE9
ICdcbicpIHsKLSAgICAgICAgICAgICAgICAvLyBUdXJuIENSIGludG8gQ1JMRi4KLSAgICAgICAg
ICAgICAgICAqcSsrID0gJ1xyJzsKLSAgICAgICAgICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8v
IFR1cm4gTEYgaW50byBDUkxGLgotICAgICAgICAgICAgKnErKyA9ICdccic7Ci0gICAgICAgICAg
ICAqcSsrID0gJ1xuJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExlYXZlIG90
aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAgICAgICAgICAqcSsrID0gYzsKLSAgICAgICAgfQot
ICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1w
bDo6Zm9ybURhdGEoRm9ybURhdGEgJmZvcm1fZGF0YSkgY29uc3QKLXsKLSAgICBRQ1N0cmluZyBl
bmNfc3RyaW5nID0gIiI7IC8vIHVzZWQgZm9yIG5vbi1tdWx0aXBhcnQgZGF0YQotCi0gICAgLy8g
ZmluZCBvdXQgdGhlIFFUZXh0Y29kZWMgdG8gdXNlCi0gICAgUVN0cmluZyBzdHIgPSBtX2FjY2Vw
dGNoYXJzZXQucXN0cmluZygpOwotICAgIHN0ci5yZXBsYWNlKCcsJywgJyAnKTsKLSAgICBRU3Ry
aW5nTGlzdCBjaGFyc2V0cyA9IFFTdHJpbmdMaXN0OjpzcGxpdCgnICcsIHN0cik7Ci0gICAgUVRl
eHRDb2RlYyogY29kZWMgPSAwOwotICAgIEZyYW1lICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZy
YW1lKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBjaGFyc2V0cy5iZWdp
bigpOyBpdCAhPSBjaGFyc2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5nIGVuYyA9
ICgqaXQpOwotICAgICAgICBpZiAoZW5jLmNvbnRhaW5zKCJVTktOT1dOIikpIHsKLSAgICAgICAg
ICAgIC8vIHVzZSBzdGFuZGFyZCBkb2N1bWVudCBlbmNvZGluZwotICAgICAgICAgICAgZW5jID0g
IklTTy04ODU5LTEiOwotICAgICAgICAgICAgaWYgKGZyYW1lKQotICAgICAgICAgICAgICAgIGVu
YyA9IGZyYW1lLT5lbmNvZGluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY29kZWMgPSBR
VGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoZW5jLmxhdGluMSgpKSkpCi0gICAgICAgICAgICBicmVh
azsKLSAgICB9Ci0KLSAgICBpZiAoIWNvZGVjKQotICAgICAgICBjb2RlYyA9IFFUZXh0Q29kZWM6
OmNvZGVjRm9yTG9jYWxlKCk7Ci0KLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3Jt
RWxlbWVudHMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKiBjdXJyZW50ID0gZm9ybUVsZW1lbnRzW2ldOwotICAgICAgICBGb3JtRGF0YUxpc3QgbHN0
KGNvZGVjKTsKLQotICAgICAgICBpZiAoIWN1cnJlbnQtPmRpc2FibGVkKCkgJiYgY3VycmVudC0+
YXBwZW5kRm9ybURhdGEobHN0LCBtX211bHRpcGFydCkpIHsKLSAgICAgICAgICAgIGZvciAoUVZh
bHVlTGlzdENvbnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gaXQgPSBsc3QuYmVnaW4oKTsg
aXQgIT0gbHN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX211bHRpcGFy
dCkgewotICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgSVNJTkRFWCAvIDxpbnB1dCBuYW1l
PWlzaW5kZXg+IHNwZWNpYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYgaXRz
IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgICAgICAgICBpZiAoIGVuY19zdHJpbmcuaXNF
bXB0eSgpICYmICgqaXQpLm1fZGF0YSA9PSAiaXNpbmRleCIgKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICArK2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNv
ZGVDU3RyaW5nKCAoKml0KS5tX2RhdGEgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbmNfc3Ry
aW5nLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9
ICcmJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVDU3Ry
aW5nKCgqaXQpLm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNfc3RyaW5nICs9
ICI9IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBRQ1N0cmluZyBoc3RyKCItLSIp
OwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9IG1fYm91bmRhcnkucXN0cmluZygpLmxhdGlu
MSgpOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcclxuIjsKLSAgICAgICAgICAgICAg
ICAgICAgaHN0ciArPSAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIjsK
LSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAoKml0KS5tX2RhdGEuZGF0YSgpOwotICAgICAg
ICAgICAgICAgICAgICBoc3RyICs9ICJcIiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYg
dGhlIGN1cnJlbnQgdHlwZSBpcyBGSUxFLCB0aGVuIHdlIGFsc28gbmVlZCB0bwotICAgICAgICAg
ICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBmaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICBp
ZiAoY3VycmVudC0+aGFzTG9jYWxOYW1lKGlucHV0VGFnKSAmJgotICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+aW5wdXRU
eXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OkZJTEUpCi0gICAgICAgICAgICAgICAgICAg
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgcGF0aCA9IHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCktPnZhbHVlKCkucXN0cmluZygpOwotCi0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGlmIHRoZSBmaWxl
bmFtZSBpbmNsdWRlcyBhICIgbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGNv
bnRyb2wgY2hhcmFjdGVycyBsaWtlIENSIG9yIExGLiBUaGlzIGFsc28gZG9lcyBzdHJhbmdlCi0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluZ3MgaWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVz
IGNoYXJhY3RlcnMgeW91IGNhbid0IGVuY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8g
aW4gdGhlIHdlYnNpdGUncyBjaGFyYWN0ZXIgc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAg
aHN0ciArPSAiOyBmaWxlbmFtZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9
IGNvZGVjLT5mcm9tVW5pY29kZShwYXRoLm1pZChwYXRoLmZpbmRSZXYoJy8nKSArIDEpLCB0cnVl
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsKLQotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYoIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVu
dCktPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgbWltZVR5cGUgPSBmcmFtZSA/IE1hYyhmcmFt
ZSktPm1pbWVUeXBlRm9yRmlsZU5hbWUocGF0aCkgOiBRU3RyaW5nKCk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKCFtaW1lVHlwZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXHJcbkNvbnRlbnQtVHlwZTogIjsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaHN0ciArPSBtaW1lVHlwZS5hc2NpaSgpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG5cclxu
IjsKLSAgICAgICAgICAgICAgICAgICAgKytpdDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBh
cHBlbmQgYm9keQotICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShoc3Ry
LmRhdGEoKSwgaHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1E
YXRhTGlzdEl0ZW0gJml0ZW0gPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRh
U2l6ZSA9IGl0ZW0ubV9kYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFT
aXplICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShp
dGVtLm1fZGF0YSwgZGF0YVNpemUgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAo
IWl0ZW0ubV9wYXRoLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fZGF0
YS5hcHBlbmRGaWxlKGl0ZW0ubV9wYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRh
LmFwcGVuZERhdGEoIlxyXG4iLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmIChtX211bHRpcGFydCkKLSAgICAgICAgZW5j
X3N0cmluZyA9ICgiLS0iICsgbV9ib3VuZGFyeS5xc3RyaW5nKCkgKyAiLS1cclxuIikuYXNjaWko
KTsKLQotICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGVuY19zdHJpbmcuZGF0YSgpLCBlbmNfc3Ry
aW5nLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1l
bnRJbXBsOjpwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5nJiB0eXBlKQotewotICAgIGlmKHR5
cGUuY29udGFpbnMoIm11bHRpcGFydCIsIGZhbHNlKSB8fCB0eXBlLmNvbnRhaW5zKCJmb3JtLWRh
dGEiLCBmYWxzZSkpIHsKLSAgICAgICAgbV9lbmN0eXBlID0gIm11bHRpcGFydC9mb3JtLWRhdGEi
OwotICAgICAgICBtX211bHRpcGFydCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh0eXBlLmNvbnRh
aW5zKCJ0ZXh0IiwgZmFsc2UpIHx8IHR5cGUuY29udGFpbnMoInBsYWluIiwgZmFsc2UpKSB7Ci0g
ICAgICAgIG1fZW5jdHlwZSA9ICJ0ZXh0L3BsYWluIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBm
YWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2VuY3R5cGUgPSAiYXBwbGljYXRpb24veC13
d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICB9
Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0Qm91bmRhcnkoIGNvbnN0IERPTVN0
cmluZyYgYm91bmQgKQotewotICAgIG1fYm91bmRhcnkgPSBib3VuZDsKLX0KLQotYm9vbCBIVE1M
Rm9ybUVsZW1lbnRJbXBsOjpwcmVwYXJlU3VibWl0KCkKLXsKLSAgICBGcmFtZSAqZnJhbWUgPSBn
ZXREb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmKG1faW5zdWJtaXQgfHwgIWZyYW1lIHx8IGZy
YW1lLT5vbmx5TG9jYWxSZWZlcmVuY2VzKCkpCi0gICAgICAgIHJldHVybiBtX2luc3VibWl0Owot
Ci0gICAgbV9pbnN1Ym1pdCA9IHRydWU7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwotCi0g
ICAgaWYgKCBkaXNwYXRjaEhUTUxFdmVudChzdWJtaXRFdmVudCxmYWxzZSx0cnVlKSAmJiAhbV9k
b2luZ3N1Ym1pdCApCi0gICAgICAgIG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotCi0gICAgbV9pbnN1
Ym1pdCA9IGZhbHNlOwotCi0gICAgaWYgKCBtX2RvaW5nc3VibWl0ICkKLSAgICAgICAgc3VibWl0
KHRydWUpOwotCi0gICAgcmV0dXJuIG1fZG9pbmdzdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTEZvcm1F
bGVtZW50SW1wbDo6c3VibWl0KCBib29sIGFjdGl2YXRlU3VibWl0QnV0dG9uICkKLXsKLSAgICBL
SFRNTFZpZXcgKnZpZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgRnJhbWUgKmZyYW1l
ID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWZyYW1lKSB7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIG1faW5zdWJtaXQgKSB7Ci0gICAgICAg
IG1fZG9pbmdzdWJtaXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9p
bnN1Ym1pdCA9IHRydWU7Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCogZmlyc3RT
dWNjZXNzZnVsU3VibWl0QnV0dG9uID0gMDsKLSAgICBib29sIG5lZWRCdXR0b25BY3RpdmF0aW9u
ID0gYWN0aXZhdGVTdWJtaXRCdXR0b247CS8vIGRvIHdlIG5lZWQgdG8gYWN0aXZhdGUgYSBzdWJt
aXQgYnV0dG9uPwotICAgIAotICAgIE1hYyhmcmFtZSktPmNsZWFyUmVjb3JkZWRGb3JtVmFsdWVz
KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyAr
K2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3Jt
RWxlbWVudHNbaV07Ci0gICAgICAgIC8vIE91ciBhcHAgbmVlZHMgdG8gZ2V0IGZvcm0gdmFsdWVz
IGZvciBwYXNzd29yZCBmaWVsZHMgZm9yIGRvaW5nIHBhc3N3b3JkIGF1dG9jb21wbGV0ZSwKLSAg
ICAgICAgLy8gc28gd2UgYXJlIG1vcmUgbGVuaWVudCBpbiBwdXNoaW5nIHZhbHVlcywgYW5kIGxl
dCB0aGUgYXBwIGRlY2lkZSB3aGF0IHRvIHNhdmUgd2hlbi4KLSAgICAgICAgaWYgKGN1cnJlbnQt
Pmhhc0xvY2FsTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsICppbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCk7
Ci0gICAgICAgICAgICBpZiAoaW5wdXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpURVhUCi0gICAgICAgICAgICAgICAgfHwgaW5wdXQtPmlucHV0VHlwZSgpID09ICBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6UEFTU1dPUkQKLSAgICAgICAgICAgICAgICB8fCBpbnB1dC0+aW5w
dXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAgICAgICAgICAgIHsK
LSAgICAgICAgICAgICAgICBNYWMoZnJhbWUpLT5yZWNvcmRGb3JtVmFsdWUoaW5wdXQtPm5hbWUo
KS5xc3RyaW5nKCksIGlucHV0LT52YWx1ZSgpLnFzdHJpbmcoKSwgdGhpcyk7Ci0gICAgICAgICAg
ICAgICAgaWYgKGlucHV0LT5yZW5kZXJlcigpICYmIGlucHV0LT5pbnB1dFR5cGUoKSA9PSBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxSZW5kZXJMaW5lRWRpdCo+KGlucHV0LT5yZW5kZXJlcigpKS0+YWRkU2VhcmNoUmVzdWx0KCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZEJ1dHRvbkFjdGl2
YXRpb24pIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5pc0FjdGl2YXRlZFN1Ym1pdCgpKSB7
Ci0gICAgICAgICAgICAgICAgbmVlZEJ1dHRvbkFjdGl2YXRpb24gPSBmYWxzZTsKLSAgICAgICAg
ICAgIH0gZWxzZSBpZiAoZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID09IDAgJiYgY3VycmVu
dC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkpIHsKLSAgICAgICAgICAgICAgICBmaXJzdFN1
Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9uICYmIGZpcnN0U3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24tPnNl
dEFjdGl2YXRlZFN1Ym1pdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fcG9zdCkKLSAgICAg
ICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICAKLSAgICBGb3JtRGF0YSBmb3JtX2RhdGE7Ci0g
ICAgaWYgKGZvcm1EYXRhKGZvcm1fZGF0YSkpIHsKLSAgICAgICAgaWYobV9wb3N0KSB7Ci0gICAg
ICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggInBvc3QiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1f
ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0
cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN0eXBlKCku
cXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFy
eSgpLnFzdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAg
ZnJhbWUtPnN1Ym1pdEZvcm0oICJnZXQiLCBtX3VybC5xc3RyaW5nKCksIGZvcm1fZGF0YSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90YXJnZXQucXN0cmluZygpICk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmly
c3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1p
dEJ1dHRvbi0+c2V0QWN0aXZhdGVkU3VibWl0KGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgbV9k
b2luZ3N1Ym1pdCA9IG1faW5zdWJtaXQgPSBmYWxzZTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1l
bnRJbXBsOjpyZXNldCggICkKLXsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVudCgpLT5m
cmFtZSgpOwotICAgIGlmKG1faW5yZXNldCB8fCAhZnJhbWUpIHJldHVybjsKLQotICAgIG1faW5y
ZXNldCA9IHRydWU7Ci0KLSAgICAvLyAjIyMgRE9NMiBsYWJlbHMgdGhpcyBldmVudCBhcyBub3Qg
Y2FuY2VsYWJsZSwgaG93ZXZlcgotICAgIC8vIGNvbW1vbiBicm93c2Vycyggc2ljayEgKSBhbGxv
dyBpdCBiZSBjYW5jZWxsZWQuCi0gICAgaWYgKCAhZGlzcGF0Y2hIVE1MRXZlbnQocmVzZXRFdmVu
dCx0cnVlLCB0cnVlKSApIHsKLSAgICAgICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRz
LmNvdW50KCk7ICsraSkKLSAgICAgICAgZm9ybUVsZW1lbnRzW2ldLT5yZXNldCgpOwotCi0gICAg
bV9pbnJlc2V0ID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0
ci0+bmFtZSgpID09IGFjdGlvbkF0dHIpIAotICAgIHsKLSAgICAgICAgYm9vbCBvbGRVUkxXYXNT
ZWN1cmUgPSBmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCk7Ci0gICAgICAgIG1f
dXJsID0ga2h0bWw6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBib29sIG5ld1VS
TElzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpOwotCi0gICAg
ICAgIGlmIChtX2F0dGFjaGVkICYmIChvbGRVUkxXYXNTZWN1cmUgIT0gbmV3VVJMSXNTZWN1cmUp
KQotICAgICAgICAgICAgaWYgKG5ld1VSTElzU2VjdXJlKQotICAgICAgICAgICAgICAgIGdldERv
Y3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIGdldERvY3VtZW50KCktPnNlY3VyZUZvcm1SZW1vdmVkKCk7Ci0gICAgfQotICAgIGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSB0YXJnZXRBdHRyKSB7Ci0gICAgICAgIG1fdGFyZ2V0ID0g
YXR0ci0+dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtZXRob2RBdHRy
KSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicG9zdCIp
KQotICAgICAgICAgICAgbV9wb3N0ID0gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25v
cmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImdldCIpKQotICAgICAgICAgICAgbV9wb3N0ID0gZmFs
c2U7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZW5jdHlwZUF0dHIpIHsKLSAgICAg
ICAgcGFyc2VFbmN0eXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGFjY2VwdF9jaGFyc2V0QXR0cikgewotICAgICAgICAvLyBzcGFjZSBzZXBhcmF0ZWQg
bGlzdCBvZiBjaGFyc2V0cyB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFjY2VwdHMgLSBzZWUgcmZj
MjA0NQotICAgICAgICBtX2FjY2VwdGNoYXJzZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2VwdEF0dHIpIHsKLSAgICAgICAgLy8gaWdub3JlIHRo
aXMgb25lIGZvciB0aGUgbW9tZW50Li4uCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YXV0b2NvbXBsZXRlQXR0cikgewotICAgICAgICBtX2F1dG9jb21wbGV0ZSA9ICFlcXVhbElnbm9y
aW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gb25zdWJtaXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHN1Ym1p
dEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnJlc2V0QXR0
cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihyZXNldEV2ZW50LCBhdHRyKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBET01TdHJp
bmcgbmV3TmFtZUF0dHIgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoaW5Eb2N1bWVudCgp
ICYmIGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxE
b2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAqPihn
ZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgIGRvY3VtZW50LT5yZW1vdmVOYW1lZEl0ZW0ob2xk
TmFtZUF0dHIpOwotICAgICAgICAgICAgZG9jdW1lbnQtPmFkZE5hbWVkSXRlbShuZXdOYW1lQXR0
cik7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1lQXR0cjsKLSAgICB9
IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRy
KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5zZXJ0SW50b1ZlY3RvcihR
UHRyVmVjdG9yPFQ+ICZ2ZWMsIHVuc2lnbmVkIHBvcywgVCogaXRlbSkKLXsKLSAgICB1bnNpZ25l
ZCBzaXplID0gdmVjLnNpemUoKTsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwot
ICAgIGFzc2VydChwb3MgPD0gY291bnQpOwotICAgIGlmIChzaXplID09IGNvdW50KQotICAgICAg
ICB2ZWMucmVzaXplKHNpemUgPT0gMCA/IDggOiBzaXplICogMyAvIDIpOwotICAgIGZvciAodW5z
aWduZWQgaSA9IGNvdW50OyBpID4gcG9zOyAtLWkpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwgdmVj
W2kgLSAxXSk7ICAgIAotICAgIHZlYy5pbnNlcnQocG9zLCBpdGVtKTsKLX0KLQotdGVtcGxhdGU8
Y2xhc3MgVD4gc3RhdGljIHZvaWQgYXBwZW5kVG9WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCBU
ICppdGVtKQotewotICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAgIHVuc2lnbmVk
IGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAgICAgIHZl
Yy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7Ci0gICAgdmVjLmluc2VydChj
b3VudCwgaXRlbSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJlbW92ZUZy
b21WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCBUICppdGVtKQotewotICAgIGludCBwb3MgPSB2
ZWMuZmluZFJlZihpdGVtKTsKLSAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgcmV0dXJuOwotICAg
IHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gcG9z
OyBpIDwgY291bnQgLSAxOyArK2kpCi0gICAgICAgIHZlYy5pbnNlcnQoaSwgdmVjW2kgKyAxXSk7
Ci0gICAgdmVjLnJlbW92ZShjb3VudCAtIDEpOwotfQotCi11bnNpZ25lZCBIVE1MRm9ybUVsZW1l
bnRJbXBsOjpmb3JtRWxlbWVudEluZGV4KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICplKQot
ewotICAgIC8vIENoZWNrIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIHRoaXMgZWxlbWVudCBp
cyB0aGUgdmVyeSBsYXN0IHRoaW5nIGluCi0gICAgLy8gdGhlIGZvcm0ncyB0cmVlIG9mIGNoaWxk
cmVuOyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhlIGVudGlyZSB0cmVlIGluIHRoYXQKLSAgICAv
LyBjb21tb24gY2FzZSB0aGF0IG9jY3VycyBkdXJpbmcgcGFyc2luZzsgaW5zdGVhZCB3ZSdsbCBq
dXN0IHJldHVybiBhIHZhbHVlCi0gICAgLy8gdGhhdCBzYXlzICJhZGQgdGhpcyBmb3JtIGVsZW1l
bnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkiLgotICAgIGlmIChlLT50cmF2ZXJzZU5leHROb2Rl
KHRoaXMpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAgICBmb3IgKE5vZGVJbXBs
ICpub2RlID0gdGhpczsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhpcykp
IHsKLSAgICAgICAgICAgIGlmIChub2RlID09IGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7
Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpCi0gICAgICAgICAgICAgICAg
ICAgICYmIHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKS0+aXNHZW5lcmljRm9y
bUVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbCAqPihub2RlKS0+Zm9ybSgpID09IHRoaXMpCi0gICAgICAgICAgICAg
ICAgKytpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtRWxlbWVudHMuY291bnQo
KTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZWdpc3RlckZvcm1FbGVtZW50KEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICplKQotewotICAgIERvY3VtZW50SW1wbCAqZG9jID0g
Z2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jICYmIGUtPmlzUmFkaW9CdXR0b24oKSAmJiAhZS0+
bmFtZSgpLmlzRW1wdHkoKSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCog
Y3VycmVudENoZWNrZWRSYWRpbyA9IGRvYy0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoZS0+
bmFtZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAgaWYgKGN1
cnJlbnRDaGVja2VkUmFkaW8gPT0gZSkKLSAgICAgICAgICAgIGRvYy0+cmVtb3ZlUmFkaW9CdXR0
b25Hcm91cChlLT5uYW1lKCkuaW1wbCgpLCAoSFRNTEZvcm1FbGVtZW50SW1wbCopIDApOwotICAg
ICAgICBpZiAoZS0+aXNDaGVja2VkKCkpCi0gICAgICAgICAgICBkb2MtPnJhZGlvQnV0dG9uQ2hl
Y2tlZCgoSFRNTElucHV0RWxlbWVudEltcGwqKSBlLCB0aGlzKTsKLSAgICB9Ci0gICAgaW5zZXJ0
SW50b1ZlY3Rvcihmb3JtRWxlbWVudHMsIGZvcm1FbGVtZW50SW5kZXgoZSksIGUpOwotfQotCi12
b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlbW92ZUZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsICplKQotewotICAgIGlmICghZS0+bmFtZSgpLmlzRW1wdHkoKSAmJiBnZXRE
b2N1bWVudCgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50
Q2hlY2tlZFJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAo
ZS0+bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlv
ID09IGUpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3Vw
KGUtPm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAgIH0KLSAgICByZW1vdmVGcm9tVmVjdG9yKGZv
cm1FbGVtZW50cywgZSk7Ci19Ci0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6aXNVUkxBdHRy
aWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFt
ZSgpID09IGFjdGlvbkF0dHI7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVnaXN0
ZXJJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIGFwcGVuZFRvVmVj
dG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1v
dmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICplKQotewotICAgIHJlbW92ZUZyb21W
ZWN0b3IoaW1nRWxlbWVudHMsIGUpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBI
VE1MRm9ybUVsZW1lbnRJbXBsOjplbGVtZW50cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1M
Q29sbGVjdGlvbkltcGw+KG5ldyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsKHRoaXMpKTsKLX0KLQot
RE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6
OnNldE5hbWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobmFt
ZUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6OmFjY2Vw
dENoYXJzZXQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0X2NoYXJz
ZXRBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRBY2NlcHRDaGFyc2V0
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2VwdF9jaGFy
c2V0QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6YWN0
aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjdGlvbkF0dHIpOwotfQot
Ci12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY3Rpb25BdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQg
SFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0RW5jdHlwZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShlbmN0eXBlQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcg
SFRNTEZvcm1FbGVtZW50SW1wbDo6bWV0aG9kKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKG1ldGhvZEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldE1l
dGhvZChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShtZXRob2RB
dHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjp0YXJnZXQo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodGFyZ2V0QXR0cik7Ci19Ci0KLXZv
aWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHRhcmdldEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6SFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpk
b2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MRWxlbWVudEltcGwodGFnTmFt
ZSwgZG9jKQotewotICAgIG1fZGlzYWJsZWQgPSBtX3JlYWRPbmx5ID0gZmFsc2U7Ci0KLSAgICBp
ZiAoZikKLQltX2Zvcm0gPSBmOwotICAgIGVsc2UKLQltX2Zvcm0gPSBnZXRGb3JtKCk7Ci0gICAg
aWYgKG1fZm9ybSkKLSAgICAgICAgbV9mb3JtLT5yZWdpc3RlckZvcm1FbGVtZW50KHRoaXMpOwot
fQotCi1IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6fkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKCkKLXsKLSAgICBpZiAobV9mb3JtKQotICAgICAgICBtX2Zvcm0tPnJlbW92ZUZvcm1FbGVt
ZW50KHRoaXMpOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRy
LT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBkaXNhYmxlZEF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGRE
aXNhYmxlZCA9IG1fZGlzYWJsZWQ7Ci0gICAgICAgIG1fZGlzYWJsZWQgPSAhYXR0ci0+aXNOdWxs
KCk7Ci0gICAgICAgIGlmIChvbGREaXNhYmxlZCAhPSBtX2Rpc2FibGVkKSB7Ci0gICAgICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigp
LT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgICAgICAgICAgdGhlbWUoKS0+c3Rh
dGVDaGFuZ2VkKHJlbmRlcmVyKCksIEVuYWJsZWRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSByZWFkb25seUF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGRS
ZWFkT25seSA9IG1fcmVhZE9ubHk7Ci0gICAgICAgIG1fcmVhZE9ubHkgPSAhYXR0ci0+aXNOdWxs
KCk7Ci0gICAgICAgIGlmIChvbGRSZWFkT25seSAhPSBtX3JlYWRPbmx5KSBzZXRDaGFuZ2VkKCk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgp
Ci17Ci0gICAgYXNzZXJ0KCFhdHRhY2hlZCgpKTsKLQotICAgIEhUTUxFbGVtZW50SW1wbDo6YXR0
YWNoKCk7Ci0KLSAgICAvLyBUaGUgY2FsbCB0byB1cGRhdGVGcm9tRWxlbWVudCgpIG5lZWRzIHRv
IGdvIGFmdGVyIHRoZSBjYWxsIHRocm91Z2gKLSAgICAvLyB0byB0aGUgYmFzZSBjbGFzcydzIGF0
dGFjaCgpIGJlY2F1c2UgdGhhdCBjYW4gc29tZXRpbWVzIGRvIGEgY2xvc2UKLSAgICAvLyBvbiB0
aGUgcmVuZGVyZXIuCi0gICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAgICAgIG1fcmVuZGVyLT51cGRh
dGVGcm9tRWxlbWVudCgpOwotICAgIAotICAgICAgICAvLyBEZWxheWVkIGF0dGFjaG1lbnQgaW4g
b3JkZXIgdG8gcHJldmVudCBGT1VDIGNhbiByZXN1bHQgaW4gYW4gb2JqZWN0IGJlaW5nCi0gICAg
ICAgIC8vIHByb2dyYW1tYXRpY2FsbHkgZm9jdXNlZCBiZWZvcmUgaXQgaGFzIGEgcmVuZGVyIG9i
amVjdC4gIElmIHdlIGhhdmUgYmVlbiBmb2N1c2VkCi0gICAgICAgIC8vIChpLmUuLCBpZiB3ZSBh
cmUgdGhlIGZvY3VzTm9kZSkgdGhlbiBnbyBhaGVhZCBhbmQgZm9jdXMgb3VyIGNvcnJlc3BvbmRp
bmcgbmF0aXZlIHdpZGdldC4KLSAgICAgICAgLy8gKEF0dGFjaC9kZXRhY2ggY2FuIGFsc28gaGFw
cGVuIGFzIGEgcmVzdWx0IG9mIGRpc3BsYXkgdHlwZSBjaGFuZ2VzLCBlLmcuLCBtYWtpbmcgYSB3
aWRnZXQKLSAgICAgICAgLy8gYmxvY2sgaW5zdGVhZCBvZiBpbmxpbmUsIGFuZCBmb2N1cyBzaG91
bGQgYmUgcmVzdG9yZWQgaW4gdGhhdCBjYXNlIGFzIHdlbGwuKQotICAgICAgICBpZiAoZ2V0RG9j
dW1lbnQoKS0+Zm9jdXNOb2RlKCkgPT0gdGhpcyAmJiBtX3JlbmRlci0+aXNXaWRnZXQoKSAmJiAK
LSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRn
ZXQoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkp
LT53aWRnZXQoKS0+c2V0Rm9jdXMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQotewotICAgIGlmICghbV9m
b3JtKSB7Ci0gICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBmb3JtIGVs
ZW1lbnQgYmVpbmcgY3JlYXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBpbnNlcnRl
ZCBpbnNpZGUgYSBmb3JtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAgICAvLyBz
ZXR0aW5nIGEgZm9ybSwgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1ZSBmb3Ig
bV9mb3JtLCAKLSAgICAgICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcu
Ci0gICAgICAgIG1fZm9ybSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBtX2Zvcm0t
PnJlZ2lzdGVyRm9ybUVsZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAg
RG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRvYyAm
JiBpc1JhZGlvQnV0dG9uKCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2VkKCkpCi0g
ICAgICAgICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJ
bXBsKil0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnRJ
bXBsOjppbnNlcnRlZEludG9UcmVlKGRlZXApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpyZW1vdmVkRnJvbVRyZWUoYm9vbCBkZWVwKQotewotICAgIC8vIFdoZW4gYmVp
bmcgcmVtb3ZlZCB3ZSBoYXZlIHRvIHBvc3NpYmx5IG51bGwgb3V0IG91ciBmb3JtIGFuZCByZW1v
dmUgb3Vyc2VsdmVzIGZyb20KLSAgICAvLyB0aGUgZm9ybSdzIGxpc3Qgb2YgZWxlbWVudHMuCi0g
ICAgaWYgKG1fZm9ybSkgewotICAgICAgICAvLyBBdHRlbXB0IHRvIHJlLWFjcXVpcmUgdGhlIGZv
cm0uICBJZiB3ZSBjYW4ndCByZS1hY3F1aXJlLCB0aGVuCi0gICAgICAgIC8vIHJlbW92ZSBvdXJz
ZWx2ZXMgZnJvbSB0aGUgZm9ybS4KLSAgICAgICAgTm9kZUltcGwqIGZvcm0gPSBwYXJlbnROb2Rl
KCk7Ci0gICAgICAgIE5vZGVJbXBsKiByb290ID0gdGhpczsKLSAgICAgICAgd2hpbGUgKGZvcm0p
IHsKLSAgICAgICAgICAgIGlmIChmb3JtLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcm9vdCA9IGZvcm07Ci0gICAgICAgICAgICBmb3Jt
ID0gZm9ybS0+cGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJ
ZiB0aGUgZm9ybSBoYXMgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiwgdGhlbiB3ZSB3b24ndCBmaW5k
IGl0IGFzIGFuIGFuY2VzdG9yLgotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJvb3Qg
bm9kZSBvZiBvdXIgY3VycmVudCBmb3JtIGFuZCBvdXIgcm9vdCBub2RlCi0gICAgICAgIC8vIG1h
dGNoLiAgSWYgc28sIHByZXNlcnZlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBmb3JtLgotICAgICAg
ICBpZiAoIWZvcm0pIHsKLSAgICAgICAgICAgIE5vZGVJbXBsKiBmb3JtUm9vdCA9IG1fZm9ybTsK
LSAgICAgICAgICAgIHdoaWxlIChmb3JtUm9vdC0+cGFyZW50KCkpIGZvcm1Sb290ID0gZm9ybVJv
b3QtPnBhcmVudCgpOwotICAgICAgICAgICAgaWYgKGZvcm1Sb290ID09IHJvb3QpCi0gICAgICAg
ICAgICAgICAgZm9ybSA9IG1fZm9ybTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlm
ICghZm9ybSkgewotICAgICAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlzKTsK
LSAgICAgICAgICAgIG1fZm9ybSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYXNz
ZXJ0KGZvcm0gPT0gbV9mb3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVkIGZvcm0gc2hvdWxkIGJlIHRo
ZSBzYW1lLiBJZiBub3QsIHNvbWV0aGluZyByZWFsbHkgc3RyYW5nZSBoYXBwZW5lZC4KLSAgICB9
Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsKLX0KLQot
SFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmdldEZvcm0o
KSBjb25zdAotewotICAgIE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlKHAp
IHsKLSAgICAgICAgaWYgKHAtPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50SW1wbCAqPihwKTsKLSAgICAgICAgcCA9IHAt
PnBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURPTVN0cmluZyBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIG4g
PSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIHJldHVybiBuLmlzTnVsbCgpID8gIiIgOiBu
OwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXROYW1lKGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19
Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uU2VsZWN0KCkKLXsKLSAgICAv
LyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJlCi0g
ICAgZGlzcGF0Y2hIVE1MRXZlbnQoc2VsZWN0RXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLXZvaWQg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uQ2hhbmdlKCkKLXsKLSAgICAvLyAjIyMgbWFr
ZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJlCi0gICAgZGlzcGF0
Y2hIVE1MRXZlbnQoY2hhbmdlRXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLWJvb2wgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kaXNh
YmxlZDsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c2V0RGlzYWJsZWQo
Ym9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShkaXNhYmxlZEF0dHIsIGIgPyAiIiA6IDApOwot
fQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRSZWFkT25seShib29sIGIp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLXZv
aWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBj
aCApCi17Ci0gICAgLy9ib29sIGNoYW5nZWQgPSBjaGFuZ2VkKCk7Ci0gICAgSFRNTEVsZW1lbnRJ
bXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLQotICAgIGlmIChtX3JlbmRlciAvKiYmIGNoYW5nZWQq
LykKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLWJvb2wgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAo
ZGlzYWJsZWQoKSB8fCAhbV9yZW5kZXIgfHwgCi0gICAgICAgIChtX3JlbmRlci0+c3R5bGUoKSAm
JiBtX3JlbmRlci0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHx8IAotICAgICAg
ICBtX3JlbmRlci0+d2lkdGgoKSA9PSAwIHx8IG1fcmVuZGVyLT5oZWlnaHQoKSA9PSAwKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIGlm
IChpc0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlci0+aXNXaWRnZXQoKSkgewot
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+
d2lkZ2V0KCkgJiYKLSAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4o
bV9yZW5kZXIpLT53aWRnZXQoKS0+Zm9jdXNQb2xpY3koKSAmIFFXaWRnZXQ6OlRhYkZvY3VzKTsK
LSAgICAgICAgfQotCWlmIChnZXREb2N1bWVudCgpLT5mcmFtZSgpKQotCSAgICByZXR1cm4gZ2V0
RG9jdW1lbnQoKS0+ZnJhbWUoKS0+dGFic1RvQWxsQ29udHJvbHMoKTsKLSAgICB9Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc01vdXNl
Rm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAgICBp
ZiAobV9yZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAgICAg
KHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3VzUG9s
aWN5KCkgJiBRV2lkZ2V0OjpDbGlja0ZvY3VzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBGb3Ig
PGlucHV0IHR5cGU9aW1hZ2U+IGFuZCA8YnV0dG9uPiwgd2Ugd2lsbCBhc3N1bWUgbm8gbW91c2Ug
Zm9jdXNhYmlsaXR5LiAgVGhpcyBpcwotICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggT1MgWCBi
ZWhhdmlvciBmb3IgYnV0dG9ucy4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmlzRWRp
dGFibGUoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gU3BlY2lhbCBjaGFycyB1c2Vk
IHRvIGVuY29kZSBmb3JtIHN0YXRlIHN0cmluZ3MuCi0vLyBXZSBwaWNrIGNoYXJzIHRoYXQgYXJl
IHVubGlrZWx5IHRvIGJlIHVzZWQgaW4gYW4gSFRNTCBhdHRyLCBzbyB3ZSByYXJlbHkgaGF2ZSB0
byByZWFsbHkgZW5jb2RlLgotY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRvciA9ICcmJzsKLWNvbnN0
IGNoYXIgc3RhdGVFc2NhcGUgPSAnPCc7Ci1zdGF0aWMgY29uc3QgY2hhciBzdGF0ZVNlcGFyYXRv
ck1hcmtlcltdID0gIjxBIjsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlRXNjYXBlTWFya2VyW10g
PSAiPDwiOwotCi0vLyBFbmNvZGUgYW4gZWxlbWVudCBuYW1lIHNvIHdlIGNhbiBwdXQgaXQgaW4g
YSBzdGF0ZSBzdHJpbmcgd2l0aG91dCBjb2xsaWRpbmcKLS8vIHdpdGggb3VyIHNlcGFyYXRvciBj
aGFyLgotc3RhdGljIFFTdHJpbmcgZW5jb2RlZEVsZW1lbnROYW1lKFFTdHJpbmcgc3RyKQotewot
ICAgIGludCBzZXBMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaW50IGVzY0xv
YyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yKTsKLSAgICBpZiAoc2VwTG9jID49IDAgfHwgZXNj
TG9jID49IDApIHsKLSAgICAgICAgUVN0cmluZyBuZXdTdHIgPSBzdHI7Ci0gICAgICAgIC8vICAg
cmVwbGFjZSAiPCIgd2l0aCAiPDwiCi0gICAgICAgIHdoaWxlIChlc2NMb2MgPj0gMCkgewotICAg
ICAgICAgICAgbmV3U3RyLnJlcGxhY2UoZXNjTG9jLCAxLCBzdGF0ZUVzY2FwZU1hcmtlcik7Ci0g
ICAgICAgICAgICBlc2NMb2MgPSBzdHIuZmluZChzdGF0ZVNlcGFyYXRvciwgZXNjTG9jKzEpOwot
ICAgICAgICB9Ci0gICAgICAgIC8vICAgcmVwbGFjZSAiJiIgd2l0aCAiPEEiCi0gICAgICAgIHdo
aWxlIChzZXBMb2MgPj0gMCkgewotICAgICAgICAgICAgbmV3U3RyLnJlcGxhY2Uoc2VwTG9jLCAx
LCBzdGF0ZVNlcGFyYXRvck1hcmtlcik7Ci0gICAgICAgICAgICBzZXBMb2MgPSBzdHIuZmluZChz
dGF0ZVNlcGFyYXRvciwgc2VwTG9jKzEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdT
dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19Ci0KLVFTdHJp
bmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gQnVpbGQg
YSBzdHJpbmcgdGhhdCBjb250YWlucyBFbGVtZW50TmFtZSZFbGVtZW50VHlwZSYKLSAgICByZXR1
cm4gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpICsgc3RhdGVTZXBhcmF0b3Ig
KyB0eXBlKCkucXN0cmluZygpICsgc3RhdGVTZXBhcmF0b3I7Ci19Ci0KLVFTdHJpbmcgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0
ZXMpCi17Ci0gICAgUVN0cmluZyBlbmNOYW1lID0gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5x
c3RyaW5nKCkpOwotICAgIFFTdHJpbmcgdHlwZVN0ciA9IHR5cGUoKS5xc3RyaW5nKCk7Ci0gICAg
Zm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBzdGF0ZXMuYmVnaW4oKTsgaXQgIT0gc3Rh
dGVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgc3RhdGUgPSAqaXQ7Ci0gICAgICAg
IGludCBzZXAxID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgICAgIGludCBzZXAy
ID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwMSsxKTsKLSAgICAgICAgYXNzZXJ0KHNl
cDEgPj0gMCk7Ci0gICAgICAgIGFzc2VydChzZXAyID49IDApOwotCi0gICAgICAgIFFTdHJpbmcg
bmFtZUFuZFR5cGUgPSBzdGF0ZS5sZWZ0KHNlcDIpOwotICAgICAgICBpZiAoZW5jTmFtZS5sZW5n
dGgoKSArIHR5cGVTdHIubGVuZ3RoKCkgKyAxID09ICh1aW50KXNlcDIKLSAgICAgICAgICAgICYm
IG5hbWVBbmRUeXBlLnN0YXJ0c1dpdGgoZW5jTmFtZSkKLSAgICAgICAgICAgICYmIG5hbWVBbmRU
eXBlLmVuZHNXaXRoKHR5cGVTdHIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZXMucmVt
b3ZlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5taWQoc2VwMisxKTsKLSAgICAgICAg
fQotICAgIH0KLSAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKLX0KLQotaW50IEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjp0YWJJbmRleCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZSh0YWJpbmRleEF0dHIpLnRvSW50KCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnNldFRhYkluZGV4KGludCB2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodGFi
aW5kZXhBdHRyLCBRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1IVE1MQnV0dG9uRWxlbWVudEltcGw6OkhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsKGJ1dHRvblRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFNVQk1J
VDsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotfQot
Ci1IVE1MQnV0dG9uRWxlbWVudEltcGw6On5IVE1MQnV0dG9uRWxlbWVudEltcGwoKQotewotfQot
Ci1SZW5kZXJPYmplY3QqIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVu
ZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAo
YXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVt
ZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0eXBlQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0g
IHR5cGVBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgp
LCAic3VibWl0IikpCi0gICAgICAgICAgICBtX3R5cGUgPSBTVUJNSVQ7Ci0gICAgICAgIGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJyZXNldCIpKQotICAgICAgICAg
ICAgbV90eXBlID0gUkVTRVQ7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0
dHItPnZhbHVlKCksICJidXR0b24iKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IEJVVFRPTjsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKLSAgICAgICAgbV92YWx1
ZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIG1fY3VyclZhbHVlID0gbV92YWx1ZTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIERv
IG5vdGhpbmcuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsK
LSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZl
bnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZv
aWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAq
ZXZ0KQotewotICAgIGlmIChtX3R5cGUgIT0gQlVUVE9OICYmIChldnQtPnR5cGUoKSA9PSBET01B
Y3RpdmF0ZUV2ZW50KSkgewotCi0gICAgICAgIGlmKG1fZm9ybSAmJiBtX3R5cGUgPT0gU1VCTUlU
KSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAgICBtX2Zv
cm0tPnByZXBhcmVTdWJtaXQoKTsKLSAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7
IC8vIGluIGNhc2Ugd2Ugd2VyZSBjYW5jZWxlZAotICAgICAgICB9Ci0gICAgICAgIGlmKG1fZm9y
bSAmJiBtX3R5cGUgPT0gUkVTRVQpIG1fZm9ybS0+cmVzZXQoKTsKLSAgICB9Ci0gICAgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotYm9v
bCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0
Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25zIG11c3QgaGF2ZSBuYW1lcwot
ICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93ZXZlciwgb3RoZXIgYnJvd3Nl
cnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWludC4gVGhlcmVmb3JlLCB3ZSBi
ZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBkaWZmZXJlbnQgYnV0dG9ucyB0
aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAgIC8vIFJlbW92ZSB0aGUgbmFt
ZSBjb25zdHJhaW50IGZvciBub3cuCi0gICAgLy8gV2FzOiBtX3R5cGUgPT0gU1VCTUlUICYmICFt
X2Rpc2FibGVkICYmICFuYW1lKCkuaXNFbXB0eSgpCi0gICAgcmV0dXJuIG1fdHlwZSA9PSBTVUJN
SVQgJiYgIW1fZGlzYWJsZWQ7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjppc0Fj
dGl2YXRlZFN1Ym1pdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYWN0aXZlU3VibWl0OwotfQot
Ci12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxh
ZykKLXsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTEJ1dHRvbkVs
ZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29sIC8q
bXVsdGlwYXJ0Ki8pCi17Ci0gICAgaWYgKG1fdHlwZSAhPSBTVUJNSVQgfHwgbmFtZSgpLmlzRW1w
dHkoKSB8fCAhbV9hY3RpdmVTdWJtaXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNv
ZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgbV9jdXJyVmFsdWUpOwotICAgIHJldHVybiB0cnVlOwot
fQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2Vu
ZFRvQW55RWxlbWVudCkKLXsgICAKLSAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24gZXZlbnRz
IGlmZiB0aGUKLSAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRUb0FueUVsZW1lbnQKLSAgICBj
bGljayhzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50
SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0
dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dmFsdWUo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLUhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpIVE1MRmllbGRTZXRFbGVtZW50
SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgIDogSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwoZmllbGRzZXRUYWcsIGRvYywgZikKLXsKLX0KLQotSFRN
TEZpZWxkU2V0RWxlbWVudEltcGw6On5IVE1MRmllbGRTZXRFbGVtZW50SW1wbCgpCi17Ci19Ci0K
LWJvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBu
ZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSB8
fCBIVE1MRWxlbWVudEltcGw6OmNoZWNrRFREKG5ld0NoaWxkKTsKLX0KLQotYm9vbCBIVE1MRmll
bGRTZXRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gImZpZWxkc2V0IjsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MRmllbGRT
ZXRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJT
dHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpZWxkc2V0KHRo
aXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpI
VE1MSW5wdXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1w
bCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGlucHV0VGFnLCBkb2MsIGYp
Ci17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0RWxl
bWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCh0YWdOYW1lLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjppbml0KCkKLXsKLSAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICBtX3ZhbHVl
TWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX21heExl
biA9IC0xOwotICAgIG1fc2l6ZSA9IDIwOwotICAgIG1fY2hlY2tlZCA9IGZhbHNlOwotICAgIG1f
ZGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsK
LSAgICBtX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTsKLQotICAgIG1faGF2ZVR5cGUgPSBmYWxzZTsK
LSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsK
LSAgICBtX2luaXRlZCA9IGZhbHNlOwotCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7Ci0K
LSAgICBtX21heFJlc3VsdHMgPSAtMTsKLQotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fYXV0
b2NvbXBsZXRlID0gbV9mb3JtLT5hdXRvQ29tcGxldGUoKTsKLX0KLQotSFRNTElucHV0RWxlbWVu
dEltcGw6On5IVE1MSW5wdXRFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkp
IGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAgICBkZWxl
dGUgbV9pbWFnZUxvYWRlcjsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpu
YW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBtX25hbWU7
Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBj
b25zdAotewotICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3QgYmUgZm9jdXNl
ZCwgdGhlbiB3ZSBjYW4gc3RvcCBub3cuCi0gICAgaWYgKCFIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAobV90eXBlID09IFJBRElPKSB7Ci0gICAgICAgIC8vIFVubmFtZWQgcmFkaW8gYnV0dG9u
cyBhcmUgbmV2ZXIgZm9jdXNhYmxlIChtYXRjaGVzIFdpbklFKS4KLSAgICAgICAgaWYgKG5hbWUo
KS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gTmV2
ZXIgYWxsb3cga2V5Ym9hcmQgdGFiYmluZyB0byBsZWF2ZSB5b3UgaW4gdGhlIHNhbWUgcmFkaW8g
Z3JvdXAuICBBbHdheXMKLSAgICAgICAgLy8gc2tpcCBhbnkgb3RoZXIgZWxlbWVudHMgaW4gdGhl
IGdyb3VwLgotICAgICAgICBOb2RlSW1wbCogY3VycmVudEZvY3VzTm9kZSA9IGdldERvY3VtZW50
KCktPmZvY3VzTm9kZSgpOwotICAgICAgICBpZiAoY3VycmVudEZvY3VzTm9kZSAmJiBjdXJyZW50
Rm9jdXNOb2RlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0
RWxlbWVudEltcGwqIGZvY3VzZWRJbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJ
bXBsKj4oY3VycmVudEZvY3VzTm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNlZElucHV0LT5p
bnB1dFR5cGUoKSA9PSBSQURJTyAmJiBmb2N1c2VkSW5wdXQtPmZvcm0oKSA9PSBtX2Zvcm0gJiYK
LSAgICAgICAgICAgICAgICBmb2N1c2VkSW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBB
bGxvdyBrZXlib2FyZCBmb2N1cyBpZiB3ZSdyZSBjaGVja2VkIG9yIGlmIG5vdGhpbmcgaW4gdGhl
IGdyb3VwIGlzIGNoZWNrZWQuCi0gICAgICAgIHJldHVybiBjaGVja2VkKCkgfHwgIWdldERvY3Vt
ZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7
Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICBpZiAodC5pc0VtcHR5
KCkpIHsKLSAgICAgICAgaW50IGV4Y2NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh0eXBl
QXR0ciwgZXhjY29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc2V0QXR0cmlidXRlKHR5
cGVBdHRyLCB0KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5wdXRUeXBl
KGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICB0eXBlRW51bSBuZXdUeXBlOwotICAgIAotICAg
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicGFzc3dvcmQiKSkKLSAgICAgICAgbmV3VHlwZSA9
IFBBU1NXT1JEOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJjaGVja2JveCIp
KQotICAgICAgICBuZXdUeXBlID0gQ0hFQ0tCT1g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UodCwgInJhZGlvIikpCi0gICAgICAgIG5ld1R5cGUgPSBSQURJTzsKLSAgICBlbHNlIGlm
IChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic3VibWl0IikpCi0gICAgICAgIG5ld1R5cGUgPSBTVUJN
SVQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJlc2V0IikpCi0gICAgICAg
IG5ld1R5cGUgPSBSRVNFVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiZmls
ZSIpKQotICAgICAgICBuZXdUeXBlID0gRklMRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZSh0LCAiaGlkZGVuIikpCi0gICAgICAgIG5ld1R5cGUgPSBISURERU47Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImltYWdlIikpCi0gICAgICAgIG5ld1R5cGUgPSBJTUFH
RTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiYnV0dG9uIikpCi0gICAgICAg
IG5ld1R5cGUgPSBCVVRUT047Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImto
dG1sX2lzaW5kZXgiKSkKLSAgICAgICAgbmV3VHlwZSA9IElTSU5ERVg7Ci0gICAgZWxzZSBpZiAo
ZXF1YWxJZ25vcmluZ0Nhc2UodCwgInNlYXJjaCIpKQotICAgICAgICBuZXdUeXBlID0gU0VBUkNI
OwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYW5nZSIpKQotICAgICAgICBu
ZXdUeXBlID0gUkFOR0U7Ci0gICAgZWxzZQotICAgICAgICBuZXdUeXBlID0gVEVYVDsKLQotICAg
IC8vICMjIyBJTVBPUlRBTlQ6IERvbid0IGFsbG93IHRoZSB0eXBlIHRvIGJlIGNoYW5nZWQgdG8g
RklMRSBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyB0eXBlIGNoYW5nZSwgb3RoZXJ3aXNlIGEgSmF2
YVNjcmlwdCBwcm9ncmFtbWVyIHdvdWxkIGJlIGFibGUgdG8gc2V0IGEgdGV4dAotICAgIC8vIGZp
ZWxkJ3MgdmFsdWUgdG8gc29tZXRoaW5nIGxpa2UgL2V0Yy9wYXNzd2QgYW5kIHRoZW4gY2hhbmdl
IGl0IHRvIGEgZmlsZSBmaWVsZC4KLSAgICBpZiAobV90eXBlICE9IG5ld1R5cGUpIHsKLSAgICAg
ICAgaWYgKG5ld1R5cGUgPT0gRklMRSAmJiBtX2hhdmVUeXBlKSB7Ci0gICAgICAgICAgICAvLyBT
ZXQgdGhlIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAgICAvLyBV
c2VmdWwgaW4gY2FzZSB3ZSB3ZXJlIGNhbGxlZCBmcm9tIGluc2lkZSBwYXJzZU1hcHBlZEF0dHJp
YnV0ZS4KLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdHlwZSgpKTsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW5hbWUoKS5p
c0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJh
ZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKSA9PSB0aGlzKQotICAgICAg
ICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG5hbWUo
KS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdhc0F0
dGFjaGVkID0gbV9hdHRhY2hlZDsKLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkKLSAgICAg
ICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIGJvb2wgZGlkU3RvcmVWYWx1ZSA9IHN0
b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBtX3R5cGUgPSBu
ZXdUeXBlOwotICAgICAgICAgICAgYm9vbCB3aWxsU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVlU2Vw
YXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoZGlkU3RvcmVWYWx1ZSAmJiAh
d2lsbFN0b3JlVmFsdWUgJiYgIW1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBz
ZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBtX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBtX3ZhbHVl
ID0gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpZFN0b3Jl
VmFsdWUgJiYgd2lsbFN0b3JlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0gZ2V0
QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2Fz
QXR0YWNoZWQpCi0gICAgICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAvLyBJZiBvdXIgdHlwZSBtb3JwaHMgaW50byBhIHJhZGlvIGJ1dHRvbiBhbmQg
d2UgYXJlIGNoZWNrZWQsIHRoZW4gZ28gYWhlYWQKLSAgICAgICAgICAgIC8vIGFuZCBzaWduYWwg
dGhpcyB0byB0aGUgZm9ybS4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgY2hl
Y2tlZCgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tl
ZCh0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotICAgIG1faGF2ZVR5cGUgPSB0cnVl
OwotICAgIAotICAgIGlmIChtX3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikgewotICAg
ICAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLSAgICAgICAgbV9pbWFnZUxvYWRlciA9IDA7Ci0g
ICAgfQotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAot
ewotICAgIC8vIG5lZWRzIHRvIGJlIGxvd2VyY2FzZSBhY2NvcmRpbmcgdG8gRE9NIHNwZWMKLSAg
ICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgVEVYVDogcmV0dXJuICJ0ZXh0IjsKLSAgICBj
YXNlIFBBU1NXT1JEOiByZXR1cm4gInBhc3N3b3JkIjsKLSAgICBjYXNlIENIRUNLQk9YOiByZXR1
cm4gImNoZWNrYm94IjsKLSAgICBjYXNlIFJBRElPOiByZXR1cm4gInJhZGlvIjsKLSAgICBjYXNl
IFNVQk1JVDogcmV0dXJuICJzdWJtaXQiOwotICAgIGNhc2UgUkVTRVQ6IHJldHVybiAicmVzZXQi
OwotICAgIGNhc2UgRklMRTogcmV0dXJuICJmaWxlIjsKLSAgICBjYXNlIEhJRERFTjogcmV0dXJu
ICJoaWRkZW4iOwotICAgIGNhc2UgSU1BR0U6IHJldHVybiAiaW1hZ2UiOwotICAgIGNhc2UgQlVU
VE9OOiByZXR1cm4gImJ1dHRvbiI7Ci0gICAgY2FzZSBTRUFSQ0g6IHJldHVybiAic2VhcmNoIjsK
LSAgICBjYXNlIFJBTkdFOiByZXR1cm4gInJhbmdlIjsKLSAgICBjYXNlIElTSU5ERVg6IHJldHVy
biAiIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi1RU3RyaW5nIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjpzdGF0ZSggKQotewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJLy8g
c2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLQotICAgIFFTdHJpbmcg
c3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKTsKLSAgICBzd2l0Y2gg
KG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAgICAg
cmV0dXJuIHN0YXRlICsgKGNoZWNrZWQoKSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgZGVmYXVsdDoK
LSAgICAgICAgcmV0dXJuIHN0YXRlICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOyAvLyBNYWtlIHN1
cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBhc3Nl
cnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUgcGFz
c3dvcmQgZmllbGRzCi0gICAgCi0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051
bGwoKSkgcmV0dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNLQk9Y
OgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHNldENoZWNrZWQoKHN0YXRlID09ICJvbiIpKTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc2V0VmFsdWUoRE9NU3RyaW5n
KHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQot
fQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjYW5IYXZlU2VsZWN0aW9uKCkKLXsKLSAg
ICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2UgUEFT
U1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkKLXsK
LSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAg
Y2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0
ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZWxlY3Rpb25FbmQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybiAw
OwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0g
ICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQo
KTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1
cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3RhcnQo
aW50IHN0YXJ0KQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBzd2l0
Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJD
SDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGlu
ZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17
Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7
Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBj
YXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3Jl
bmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZighbV9yZW5kZXIpIHJldHVybjsKLQot
ICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24qPihtX3JlbmRlciktPnNlbGVjdCgpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNI
OgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5l
RWRpdCo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgSElEREVO
OgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNh
c2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAg
ICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEhU
TUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQp
Ci17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBl
KSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAg
ICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPiht
X3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzLCBib29s
IHNob3dQcmVzc2VkTG9vaykKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAgICAg
IGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVTRVQ6
Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIo
KSkgewotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24gKj4ocmVu
ZGVyZXIoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAg
IGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNTV09S
RDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNh
c2UgVEVYVDoKLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhz
ZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29s
IHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewotICAgICAg
ICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlwZQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNTV09S
RDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAg
ICAgIGZvY3VzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoK
LSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2Ug
UkVTRVQ6Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAg
ICBjYXNlIEZJTEU6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAvLyBmb2N1cwot
ICAgICAgICAgICAgZm9jdXMoKTsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgbW91c2UgYnV0
dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgICAgICAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNlbmRU
b0FueUVsZW1lbnQKLSAgICAgICAgICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjptYXBU
b0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRy
eSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAg
ICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2c3Bh
Y2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgcmVz
dWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0g
ICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlUmVwbGFj
ZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlvciBpcyB0
aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
SFRNTEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAg
ICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkgJiYgbV9mb3JtKSB7Ci0gICAg
ICAgICAgICAvLyBSZW1vdmUgdGhlIHJhZGlvIGZyb20gaXRzIG9sZCBncm91cC4KLSAgICAgICAg
ICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW1fbmFtZS5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChtX25hbWUuaW1wbCgp
LCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUgb3VyIGNh
Y2hlZCByZWZlcmVuY2UgdG8gdGhlIG5hbWUuCi0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVl
KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgaXQgdG8gaXRzIG5ldyBncm91cC4KLSAgICAg
ICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICBnZXREb2N1
bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBs
ZXRlID0gIWVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgc2V0SW5wdXRUeXBl
KGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0
cikgewotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9ybSBp
cyBsb29raW5nIGF0IHRoZSBkZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KLSAgICAgICAgaWYgKG1f
dmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG1fdmFs
dWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBjaGVja2VkQXR0cikgewotICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHItPmlzTnVs
bCgpOwotICAgICAgICBpZiAobV91c2VEZWZhdWx0Q2hlY2tlZCkgewotICAgICAgICAgICAgc2V0
Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICAgICAgICAgIG1fdXNlRGVmYXVsdENoZWNr
ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4
bGVuZ3RoQXR0cikgewotICAgICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHIt
PnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0gIWF0dHIt
PmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMjA7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYWx0QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90eXBl
ID09IElNQUdFKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3JlbmRl
ciktPnVwZGF0ZUFsdFRleHQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNB
dHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsKLSAgICAg
ICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgICAgICBtX2ltYWdlTG9hZGVy
ID0gbmV3IEhUTUxJbWFnZUxvYWRlcih0aGlzKTsKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIt
PnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSB1c2VtYXBBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gYWNj
ZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBhZGRD
U1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAg
ICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1
ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAg
ICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUo
KSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0
dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikg
ewotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdI
VCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1
c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBz
ZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25j
aGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50LCBh
dHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmlucHV0QXR0cikgewotICAg
ICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRyKTsKLSAgICB9Ci0gICAg
Ly8gU2VhcmNoIGZpZWxkIGFuZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwganVzdCBjYXVzZSB1cGRh
dGVGcm9tRWxlbWVudCB0byBiZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQotICAgIC8vIHJlY2FsY2lu
Zy4KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWFyY2hBdHRyKSB7Ci0gICAgICAg
IHNldEhUTUxFdmVudExpc3RlbmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSByZXN1bHRzQXR0cikgewotICAgICAgICBtX21heFJlc3VsdHMgPSAh
YXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAgICAgc2V0
Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0ciB8
fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAotICAg
ICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0ciB8fAotICAgICAgICAg
ICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5h
bWUoKSA9PSBtYXhBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lz
aW9uQXR0cikgewotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0K
LQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHls
ZSAqc3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBURVhUOgot
ICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBSQU5HRToKLSAg
ICBjYXNlIElTSU5ERVg6Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAg
IGNhc2UgU1VCTUlUOgotICAgIGNhc2UgSU1BR0U6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNl
IEZJTEU6Ci0gICAgY2FzZSBCVVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpyZW5kZXJlcklzTmVlZGVkKHN0eWxlKTsKLSAgICBjYXNlIEhJRERFTjogICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1SZW5kZXJPYmplY3QgKkhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5k
ZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90eXBl
KQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNlIFNF
QVJDSDoKLSAgICBjYXNlIElTSU5ERVg6ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyTGluZUVk
aXQodGhpcyk7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICBy
ZXR1cm4gUmVuZGVyT2JqZWN0OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotICAgIGNhc2Ug
U1VCTUlUOgotICAgIGNhc2UgUkVTRVQ6Ci0gICAgY2FzZSBCVVRUT046Ci0gICAgICAgIHJldHVy
biBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBJTUFHRTogICAgcmV0
dXJuIG5ldyAoYXJlbmEpIFJlbmRlckltYWdlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgRklMRTog
ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGaWxlQnV0dG9uKHRoaXMpOwotICAgIGNhc2Ug
UkFOR0U6ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTbGlkZXIodGhpcyk7Ci0gICAgY2Fz
ZSBISURERU46ICAgYnJlYWs7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgaWYg
KCFtX2luaXRlZCkgewotICAgICAgICBpZiAoIW1faGF2ZVR5cGUpCi0gICAgICAgICAgICBzZXRJ
bnB1dFR5cGUoZ2V0QXR0cmlidXRlKHR5cGVBdHRyKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFRo
aXMgbmVlZHMgdG8gYmUgZHluYW1pYywgZG9lc24ndCBpdCwgc2luY2Ugc29tZW9uZSBjb3VsZCBz
ZXQgdGhpcwotICAgICAgICAvLyBhZnRlciBhdHRhY2htZW50PwotICAgICAgICBET01TdHJpbmcg
dmFsID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgIGlmICgodWludCkgbV90eXBl
IDw9IElTSU5ERVggJiYgIXZhbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBu
ZXdsaW5lIHN0dWZmLi4KLSAgICAgICAgICAgIFFTdHJpbmcgbnZhbHVlOwotICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoKCk7ICsraSkKLSAgICAgICAg
ICAgICAgICBpZiAodmFsW2ldID49ICcgJykKLSAgICAgICAgICAgICAgICAgICAgbnZhbHVlICs9
IHZhbFtpXTsKLQotICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSBudmFsdWUubGVuZ3Ro
KCkpCi0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbnZhbHVlKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIG1faW5pdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBEaXNh
bGxvdyB0aGUgd2lkdGggYXR0cmlidXRlIG9uIGlucHV0cyBvdGhlciB0aGFuIEhJRERFTiBhbmQg
SU1BR0UuCi0gICAgLy8gRHVtYiBXZWIgc2l0ZXMgd2lsbCB0cnkgdG8gc2V0IHRoZSB3aWR0aCBh
cyBhbiBhdHRyaWJ1dGUgb24gZm9ybSBjb250cm9scyB0aGF0IGFyZW4ndAotICAgIC8vIGltYWdl
cyBvciBoaWRkZW4uCi0gICAgaWYgKGhhc01hcHBlZEF0dHJpYnV0ZXMoKSAmJiBtX3R5cGUgIT0g
SElEREVOICYmIG1fdHlwZSAhPSBJTUFHRSAmJiAhZ2V0QXR0cmlidXRlKHdpZHRoQXR0cikuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIGludCBleGNDb2RlOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUo
d2lkdGhBdHRyLCBleGNDb2RlKTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAobV90eXBlID09IElNQUdFKSB7Ci0gICAgICAgIGlm
ICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRNTElt
YWdlTG9hZGVyKHRoaXMpOwotICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9tRWxlbWVu
dCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAgUmVuZGVySW1hZ2Uq
IGltYWdlT2JqID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJlcigpKTsKLSAgICAg
ICAgICAgIGltYWdlT2JqLT5zZXRJbWFnZShtX2ltYWdlTG9hZGVyLT5pbWFnZSgpKTsgICAgCi0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxsaW5n
IHBhc3N3b3JkRmllbGRSZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcKLSAg
ICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAgIGlm
IChtX3R5cGUgPT0gUEFTU1dPUkQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnBhc3N3b3JkRmll
bGRBZGRlZCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZXRhY2goKQotewot
ICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3ZhbHVlTWF0
Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6YWx0VGV4dCgpIGNvbnN0Ci17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9S
RUMtaHRtbDQwLTE5OTgwNDI0L2FwcGVuZGl4L25vdGVzLmh0bWwjYWx0Z2VuCi0gICAgLy8gYWxz
byBoZWF2aWx5IGRpc2N1c3NlZCBieSBIaXhpZSBvbiBidWd6aWxsYQotICAgIC8vIG5vdGUgdGhp
cyBpcyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCB0byBIVE1MSW1hZ2VFbGVtZW50SW1wbDo6YWx0
VGV4dCgpCi0gICAgRE9NU3RyaW5nIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLSAgICAv
LyBmYWxsIGJhY2sgdG8gdGl0bGUgYXR0cmlidXRlCi0gICAgaWYgKGFsdC5pc051bGwoKSkKLSAg
ICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgaWYgKGFsdC5pc051bGwo
KSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgaWYgKGFsdC5p
c0VtcHR5KCkpCi0gICAgICAgIGFsdCA9IGlucHV0RWxlbWVudEFsdFRleHQoKTsKLQotICAgIHJl
dHVybiBhbHQ7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1bFN1
Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0b25z
IG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4gSG93
ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3RyYWlu
dC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVzZSBk
aWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAotICAg
IC8vIFdhczogKG1fdHlwZSA9PSBTVUJNSVQgJiYgIW5hbWUoKS5pc0VtcHR5KCkpCi0gICAgcmV0
dXJuICFtX2Rpc2FibGVkICYmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCk7
Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxl
bWVudEltcGw6OnNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9hY3RpdmVT
dWJtaXQgPSBmbGFnOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBlbmRGb3Jt
RGF0YShGb3JtRGF0YUxpc3QgJmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKLXsKLSAgICAvLyBp
bWFnZSBnZW5lcmF0ZXMgaXRzIG93biBuYW1lcwotICAgIGlmIChuYW1lKCkuaXNFbXB0eSgpICYm
IG1fdHlwZSAhPSBJTUFHRSkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsK
LSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBT
RUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAg
ICAgICAgICAvLyBhbHdheXMgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5k
RGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAg
ICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGlmIChj
aGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwg
dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBS
RVNFVDoKLSAgICAgICAgICAgIC8vIHRob3NlIGJ1dHRvbnMgYXJlIG5ldmVyIHN1Y2Nlc3NmdWwK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjYXNlIElNQUdFOgotICAgICAg
ICAgICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBw
ZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBjbGlja1go
KSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgp
ID8gInkiIDogKG5hbWUoKSArICIueSIpLCBjbGlja1koKSk7Ci0gICAgICAgICAgICAgICAgaWYg
KCFuYW1lKCkuaXNFbXB0eSgpICYmICF2YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAg
ICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAg
ICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAg
ICAgICAgICAgICAgICBET01TdHJpbmcgZW5jX3N0ciA9IHZhbHVlV2l0aERlZmF1bHQoKTsKLSAg
ICAgICAgICAgICAgICBpZiAoIWVuY19zdHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBlbmNfc3RyKTsKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICB7Ci0gICAgICAg
ICAgICAvLyBjYW4ndCBzdWJtaXQgZmlsZSBvbiBHRVQKLSAgICAgICAgICAgIC8vIGRvbid0IHN1
Ym1pdCBpZiBkaXNwbGF5OiBub25lIG9yIGRpc3BsYXk6IGhpZGRlbgotICAgICAgICAgICAgaWYo
IW11bHRpcGFydCB8fCAhcmVuZGVyZXIoKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmls
aXR5KCkgIT0ga2h0bWw6OlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgICAgICAvLyBpZiBubyBmaWxlbmFtZSBhdCBhbGwgaXMgZW50ZXJlZCwgcmV0dXJu
IHN1Y2Nlc3NmdWwsIGhvd2V2ZXIgZW1wdHkKLSAgICAgICAgICAgIC8vIG51bGwgd291bGQgYmUg
bW9yZSBsb2dpY2FsIGJ1dCBuZXRzY2FwZSBwb3N0cyBhbiBlbXB0eSBmaWxlLiBhcmdoLgotICAg
ICAgICAgICAgaWYgKHZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2Rp
bmcuYXBwZW5kRGF0YShuYW1lKCksIFFTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRmls
ZShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShu
YW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQoKQotewot
ICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKQotICAgICAgICBzZXRW
YWx1ZShET01TdHJpbmcoKSk7Ci0gICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAg
ICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6c2V0Q2hlY2tlZChib29sIF9jaGVja2VkKQotewotICAgIC8vIFdpbklFIGRvZXMgbm90
IGFsbG93IHVubmFtZWQgcmFkaW8gYnV0dG9ucyB0byBldmVuIGJlIGNoZWNrZWQuCi0gICAgaWYg
KGNoZWNrZWQoKSA9PSBfY2hlY2tlZCB8fCAobV90eXBlID09IFJBRElPICYmIG5hbWUoKS5pc0Vt
cHR5KCkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPICYmIF9j
aGVja2VkKQotICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywg
bV9mb3JtKTsKLQotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2NoZWNr
ZWQgPSBfY2hlY2tlZDsKLSAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYg
cmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgpLT5z
dGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLSAgICBvbkNoYW5nZSgpOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJvb2wgX2lu
ZGV0ZXJtaW5hdGUpCi17Ci0gICAgLy8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0ZXJtaW5h
dGUuCi0gICAgaWYgKG1fdHlwZSAhPSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkgPT0gX2lu
ZGV0ZXJtaW5hdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5kZXRlcm1pbmF0ZSA9IF9p
bmRldGVybWluYXRlOwotCi0gICAgc2V0Q2hhbmdlZCgpOwotCi0gICAgaWYgKHJlbmRlcmVyKCkg
JiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgp
LT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVu
dEltcGwgKnNvdXJjZSkKLXsKLSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAqc291cmNl
RWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KHNvdXJjZSk7
Ci0KLSAgICBtX3ZhbHVlID0gc291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQgPSBz
b3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0gc291cmNlRWxlbS0+
bV9pbmRldGVybWluYXRlOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnZh
bHVlKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdmFsdWUgPSBtX3ZhbHVlOwotCi0gICAgLy8g
SXQncyBpbXBvcnRhbnQgKm5vdCogdG8gZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1dGUg
Zm9yIGZpbGUgaW5wdXRzLAotICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBhIG1hbGlj
aW91cyB3ZWIgcGFnZSB0byB1cGxvYWQgZmlsZXMgYnkgc2V0dGluZyB0aGUKLSAgICAvLyB2YWx1
ZSBhdHRyaWJ1dGUgaW4gbWFya3VwLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiBtX3R5cGUg
IT0gRklMRSkKLSAgICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLQotICAg
IC8vIElmIG5vIGF0dHJpYnV0ZSBleGlzdHMsIHRoZW4ganVzdCB1c2UgIm9uIiBvciAiIiBiYXNl
ZCBvZmYgdGhlIGNoZWNrZWQoKSBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLSAgICBpZiAodmFsdWUu
aXNOdWxsKCkgJiYgKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pKQotICAg
ICAgICByZXR1cm4gRE9NU3RyaW5nKGNoZWNrZWQoKSA/ICJvbiIgOiAiIik7Ci0KLSAgICByZXR1
cm4gdmFsdWU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWVXaXRo
RGVmYXVsdCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHYgPSB2YWx1ZSgpOwotICAgIGlmICh2
LmlzRW1wdHkoKSkgewotICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAgY2Fz
ZSBSRVNFVDoKLSAgICAgICAgICAgICAgICB2ID0gcmVzZXRCdXR0b25EZWZhdWx0TGFiZWwoKTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAg
ICAgICAgICAgICAgdiA9IHN1Ym1pdEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgIGNhc2Ug
Q0hFQ0tCT1g6Ci0gICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBjYXNlIEhJRERF
TjoKLSAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBjYXNlIElTSU5ERVg6Ci0g
ICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAg
ICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gdjsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWUoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBpZiAobV90eXBlID09IEZJTEUpIHJldHVybjsK
LQotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBpZiAoc3RvcmVzVmFs
dWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0g
ICAgICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0
QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6c2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IHRy
dWU7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgZGlzcGF0
Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi1ib29sIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpIGNvbnN0Ci17
Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBISURERU46Ci0g
ICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFO
R0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2UgUEFT
U1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkKiBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpl
dnQpCi17Ci0gICAgLy8gcHJldmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJlIHVzZWQg
dG8gcmV2ZXJzZSB0aGUgYXV0b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJlLgot
ICAgIC8vIFRoaXMgcmVzdWx0IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhlICJ1
bmRvIiBpbiBwb3N0RGlzcGF0Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCi0gICAgdm9p
ZCogcmVzdWx0ID0gMDsgCi0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBlID09
IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNrRXZl
bnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0dG9u
KCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAgICAg
ICAvLyBBcyBhIHdheSB0byBzdG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdlIHdlcmUg
dW5jaGVja2VkLCAxIGlmIHdlIHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCi0gICAgICAgICAgICAv
LyBpbmRldGVybWluYXRlLgotICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkgewotICAg
ICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDI7Ci0gICAgICAgICAgICAgICAgc2V0SW5k
ZXRlcm1pbmF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IGlmIChjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDE7
Ci0gICAgICAgICAgICAgICAgc2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBzdG9y
ZSB0aGUgY3VycmVudCBzZWxlY3RlZCByYWRpbyBvYmplY3QuCi0gICAgICAgICAgICBpZiAobmFt
ZSgpLmlzRW1wdHkoKSB8fCBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8v
IFVubmFtZWQgcmFkaW8gYnV0dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1dHRvbnMg
anVzdCBzdGF5IGNoZWNrZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBO
ZWVkIHRvIGxlYXJuIHRvIHdvcmsgd2l0aG91dCBhIGZvcm0uCi0KLSAgICAgICAgICAgIC8vIFdl
IHJlYWxseSB3YW50IHJhZGlvIGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGkuZS4s
IHRvIGhhdmUgc29tZXRoaW5nIGNoZWNrZWQuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYg
bm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMgYWN0aW9u
IHRvIGJlICJ1bmRvbmUiLCBzaW5jZQotICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21lIG9iamVj
dCBpbiB0aGUgcmFkaW8gZ3JvdXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgotICAgICAgICAg
ICAgSFRNTElucHV0RWxlbWVudEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNr
ZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAg
ICBpZiAoY3VyclJhZGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlvIGJ1
dHRvbiBzZWxlY3RlZCB0aGF0IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1bHQgZmll
bGQgYW5kIHJlZiBpdCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUgZGVz
dHJveWVkLgotICAgICAgICAgICAgICAgIGN1cnJSYWRpby0+cmVmKCk7Ci0gICAgICAgICAgICAg
ICAgcmVzdWx0ID0gY3VyclJhZGlvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Q2hl
Y2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQsIHZvaWQqIGRhdGEpCi17Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwg
bV90eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09
IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0
KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0g
ICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBjaGVja2luZyB3ZSBkaWQgaW4gcHJlRGlzcGF0Y2gu
Ci0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZhdWx0
SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gKHZvaWQqKTB4MikKLSAg
ICAgICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWQoZGF0YSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxl
bWVudEltcGwqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihkYXRh
KTsKLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRlZmF1
bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBz
ZWxlY3RlZCByYWRpbyBidXR0b24gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgLy8gTWFr
ZSBzdXJlIGl0IGlzIHN0aWxsIGEgcmFkaW8gYnV0dG9uIGFuZCBvbmx5IGRvIHRoZSByZXN0b3Jh
dGlvbiBpZiBpdCBzdGlsbAotICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gb3VyIGdyb3Vw
LgotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+Zm9ybSgpID09IGZvcm0oKSAmJiBpbnB1dC0+
aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgLy8gT2ssIHRoZSBvbGQgcmFkaW8gYnV0dG9uIGlzIHN0aWxsIGluIG91
ciBmb3JtIGFuZCBpbiBvdXIgZ3JvdXAgYW5kIGlzIHN0aWxsIGEgCi0gICAgICAgICAgICAgICAg
ICAgIC8vIHJhZGlvIGJ1dHRvbiwgc28gaXQncyBzYWZlIHRvIHJlc3RvcmUgc2VsZWN0aW9uIHRv
IGl0LgotICAgICAgICAgICAgICAgICAgICBpbnB1dC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC0+ZGVyZWYoKTsK
LSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVs
dEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlID09IElNQUdF
ICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiBt
X3JlbmRlcikgewotICAgICAgICAvLyByZWNvcmQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB3aGVu
IHdlIGdldCB0aGUgRE9NQWN0aXZhdGUgZXZlbnQKLSAgICAgICAgTW91c2VFdmVudEltcGwgKm1l
ID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpOwotICAgICAgICBpbnQgb2Zmc2V0
WCwgb2Zmc2V0WTsKLSAgICAgICAgbV9yZW5kZXItPmFic29sdXRlUG9zaXRpb24ob2Zmc2V0WCxv
ZmZzZXRZKTsKLSAgICAgICAgeFBvcyA9IG1lLT5jbGllbnRYKCktb2Zmc2V0WDsKLSAgICAgICAg
eVBvcyA9IG1lLT5jbGllbnRZKCktb2Zmc2V0WTsKLQotCW1lLT5zZXREZWZhdWx0SGFuZGxlZCgp
OwotICAgIH0KLQotICAgIC8vIERPTUFjdGl2YXRlIGV2ZW50cyBjYXVzZSB0aGUgaW5wdXQgdG8g
YmUgImFjdGl2YXRlZCIgLSBpbiB0aGUgY2FzZSBvZiBpbWFnZSBhbmQgc3VibWl0IGlucHV0cywg
dGhpcyBtZWFucwotICAgIC8vIGFjdHVhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm0uIEZvciByZXNl
dCBpbnB1dHMsIHRoZSBmb3JtIGlzIHJlc2V0LiBUaGVzZSBldmVudHMgYXJlIHNlbnQgd2hlbiB0
aGUgdXNlciBjbGlja3MKLSAgICAvLyBvbiB0aGUgZWxlbWVudCwgb3IgcHJlc3NlcyBlbnRlciB3
aGlsZSBpdCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQuIEphdmFjc3JpcHQgY29kZSB3aXNoaW5nIHRv
IGFjdGl2YXRlIHRoZSBlbGVtZW50Ci0gICAgLy8gbXVzdCBkaXNwYXRjaCBhIERPTUFjdGl2YXRl
IGV2ZW50IC0gYSBjbGljayBldmVudCB3aWxsIG5vdCBkbyB0aGUgam9iLgotICAgIGlmIChldnQt
PnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gSU1B
R0UgfHwgbV90eXBlID09IFNVQk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQpIHsKLSAgICAgICAgICAg
IGlmICghbV9mb3JtKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmICht
X3R5cGUgPT0gUkVTRVQpCi0gICAgICAgICAgICAgICAgbV9mb3JtLT5yZXNldCgpOwotICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgIGlmICghbV9mb3JtLT5wcmVwYXJlU3VibWl0KCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgeFBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHlQb3MgPSAwOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAg
ICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0KLQotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZl
bnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBr
ZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQu
Ci0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXByZXNzRXZlbnQgJiYgZXZ0LT5pc0tleWJvYXJk
RXZlbnQoKSkgewotICAgICAgICBib29sIGNsaWNrRWxlbWVudCA9IGZhbHNlOwotICAgICAgICBi
b29sIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSBmYWxzZTsKLQotICAgICAgICBET01TdHJpbmcg
a2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRpZmll
cigpOwotCi0gICAgICAgIGlmIChrZXkgPT0gIlUrMDAwMDIwIikgewotICAgICAgICAgICAgc3dp
dGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAg
ICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAg
ICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1v
dXNlIGNsaWNrIGZvciBzcGFjZWJhciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0gICAg
ICAgICAgICAgICAgICAgIC8vIFRoZSBBcHBLaXQgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHNvbWUs
IGJ1dCBub3QgYWxsLCBvZiB0aGVtLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQg
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNl
IFJBRElPOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiB1bnNlbGVjdGVkIHJhZGlvIGlz
IHRhYmJlZCBpbnRvIChiZWNhdXNlIHRoZSBlbnRpcmUgZ3JvdXAgaGFzIG5vdGhpbmcKLSAgICAg
ICAgICAgICAgICAgICAgLy8gY2hlY2tlZCwgb3IgYmVjYXVzZSBvZiBzb21lIGV4cGxpY2l0IC5m
b2N1cygpIGNhbGwpLCB0aGVuIGFsbG93IHNwYWNlIHRvIGNoZWNrIGl0LgotICAgICAgICAgICAg
ICAgICAgICBpZiAoIWNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrRWxl
bWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg
IGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgICAg
ICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAg
ICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsKLSAg
ICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNLQk9Y
OgotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJ
TkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNh
c2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAg
Y2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGljayBv
biB0aGUgZGVmYXVsdCBmb3JtIGJ1dHRvbiBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVs
ZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxF
OgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNF
VDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8g
U2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50
cy4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7IC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBlbnRlciBvbiBhIHJhZGlv
IGJ1dHRvbi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3R5cGUg
PT0gUkFESU8gJiYgKGtleSA9PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09ICJMZWZ0
IiB8fCBrZXkgPT0gIlJpZ2h0IikpIHsKLSAgICAgICAgICAgIC8vIExlZnQgYW5kIHVwIG1lYW4g
InByZXZpb3VzIHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBSaWdodCBhbmQgZG93biBt
ZWFuICJuZXh0IHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBUZXN0ZWQgaW4gV2luSUUs
IGFuZCBldmVuIGZvciBSVEwsIGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0dG9u
IChhbmQgc28gbW92ZXMKLSAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVtcyBzdHJh
bmdlLCBidXQgd2UnbGwgbWF0Y2ggaXQuCi0gICAgICAgICAgICBib29sIGZvcndhcmQgPSAoa2V5
ID09ICJEb3duIiB8fCBrZXkgPT0gIlJpZ2h0Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IC8vIFdlIGNhbiBvbmx5IHN0YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhlIGZv
cm0gaGFzbid0IGJlZW4gZGVtb3RlZCB0byBhIGxlYWYgYmVjYXVzZQotICAgICAgICAgICAgLy8g
b2YgbWFsZm9ybWVkIEhUTUwuCi0gICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7Ci0gICAg
ICAgICAgICB3aGlsZSAoKG4gPSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6IG4t
PnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpKSkgewotICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2Ug
ZW5jb3VudGVyIGEgZm9ybSBlbGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCi0gICAgICAg
ICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBMb29rIGZv
ciBtb3JlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUo
aW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiBl
bHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoZWx0LT5mb3JtKCkgIT0gbV9mb3JtKQotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0VGFn
KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlucHV0
RWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChpbnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXRF
bHQtPm5hbWUoKSA9PSBuYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1
dEVsdC0+aXNGb2N1c2FibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0
RWx0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERv
Y3VtZW50KCktPnNldEZvY3VzTm9kZShpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW5wdXRFbHQtPmNsaWNrKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKGNsaWNrRWxlbWVudCkgewotICAgICAgICAgICAgY2xpY2soZmFsc2UpOwotICAg
ICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNs
aWNrRGVmYXVsdEZvcm1CdXR0b24gJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0tPnN1
Ym1pdENsaWNrKCk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2
ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0VkaXRh
YmxlKCkKLXsKLSAgICByZXR1cm4gKChtX3R5cGUgPT0gVEVYVCkgfHwgKG1fdHlwZSA9PSBQQVNT
V09SRCkgfHwKLSAgICAgICAgICAgIChtX3R5cGUgPT0gU0VBUkNIKSB8fCAobV90eXBlID09IElT
SU5ERVgpIHx8IChtX3R5cGUgPT0gRklMRSkpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAgIHJl
dHVybiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0
RWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXREZWZh
dWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFs
dWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1bHRD
aGVja2VkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShjaGVja2VkQXR0ciku
aXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRDaGVj
a2VkKGJvb2wgZGVmYXVsdENoZWNrZWQpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoZWNrZWRBdHRy
LCBkZWZhdWx0Q2hlY2tlZCA/ICIiIDogMCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6YWNjZXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vw
dEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0QXR0ciwgdmFsdWUp
OwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGln
bkF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHQo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci19Ci0KLXZvaWQg
SFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxl
bWVudEltcGw6OnNldE1heExlbmd0aChpbnQgX21heExlbmd0aCkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUobWF4bGVuZ3RoQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9tYXhMZW5ndGgpKTsKLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihfc2l6ZSkpOwotfQotCi1ET01T
dHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dERvY3VtZW50KCktPmNvbXBsZXRlVVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShzcmNBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6dXNlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKHVzZW1hcEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRVc2VN
YXAoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodXNlbWFwQXR0
ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMYWJlbEVsZW1lbnRJ
bXBsOjpIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhUTUxF
bGVtZW50SW1wbChsYWJlbFRhZywgZG9jKQotewotfQotCi1IVE1MTGFiZWxFbGVtZW50SW1wbDo6
fkhUTUxMYWJlbEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGFiZWxFbGVtZW50SW1w
bDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBI
VE1MTGFiZWxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50
TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1l
bnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRWxlbWVudEltcGwgKkhU
TUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgRE9NU3RyaW5nIGZvcm1F
bGVtZW50SWQgPSBnZXRBdHRyaWJ1dGUoZm9yQXR0cik7Ci0gICAgaWYgKGZvcm1FbGVtZW50SWQu
aXNOdWxsKCkpIHsKLSAgICAgICAgLy8gU2VhcmNoIGNoaWxkcmVuIG9mIHRoZSBsYWJlbCBlbGVt
ZW50IGZvciBhIGZvcm0gZWxlbWVudC4KLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSB0aGlzOwot
ICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSkgewot
ICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAg
IEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAq
Pihub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNHZW5lcmljRm9ybUVsZW1l
bnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3JtRWxlbWVu
dElkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdldERvY3VtZW50
KCktPmdldEVsZW1lbnRCeUlkKGZvcm1FbGVtZW50SWQpOwotfQotCi12b2lkIEhUTUxMYWJlbEVs
ZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9y
bUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MTGFi
ZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsK
LSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1l
bnQpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsK
LX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm0oKQot
ewotICAgIGZvciAoTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7IHAgIT0gMDsgcCA9IHAtPnBh
cmVudE5vZGUoKSkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwotICAg
IH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJ
bXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNz
a2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEFjY2Vzc0tleShj
b25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRy
LCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aHRtbEZvcigp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLX0KLQotdm9pZCBI
VE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShmb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpIVE1MTGVnZW5kRWxlbWVudEltcGwoRG9j
dW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi06IEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsKGxlZ2VuZFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MTGVnZW5kRWxlbWVu
dEltcGw6On5IVE1MTGVnZW5kRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotUmVuZGVyT2JqZWN0KiBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVybiBuZXcg
KGFyZW5hKSBSZW5kZXJMZWdlbmQodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5kRWxl
bWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAibGVnZW5kIjsKLX0KLQotRE9N
U3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxM
ZWdlbmRFbGVtZW50SW1wbDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNldEFsaWdu
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwg
dmFsdWUpOwotfQotCi1FbGVtZW50SW1wbCAqSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpmb3JtRWxl
bWVudCgpCi17Ci0gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGZpZWxkc2V0IGJlbG9uZ2luZyB0
byB0aGlzIGxlZ2VuZC4KLSAgICBOb2RlSW1wbCAqZmllbGRzZXQgPSBwYXJlbnROb2RlKCk7Ci0g
ICAgd2hpbGUgKGZpZWxkc2V0ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNldFRhZykp
Ci0gICAgICAgIGZpZWxkc2V0ID0gZmllbGRzZXQtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoIWZp
ZWxkc2V0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgZmlyc3QgZm9ybSBlbGVt
ZW50IGluc2lkZSB0aGUgZmllbGRzZXQuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBjYXJlIGFi
b3V0IHRhYmluZGV4PwotICAgIE5vZGVJbXBsICpub2RlID0gZmllbGRzZXQ7Ci0gICAgd2hpbGUg
KChub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShmaWVsZHNldCkpKSB7Ci0gICAgICAgIGlm
IChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAq
ZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAgICAg
ICAgIGlmICghZWxlbWVudC0+aGFzTG9jYWxOYW1lKGxlZ2VuZFRhZykgJiYgZWxlbWVudC0+aXNH
ZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVt
ZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1F
bGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExlZ2Vu
ZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewot
ICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAgIGVs
ZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsKHNlbGVjdFRhZywgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17
Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVt
ZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywg
SFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
KHRhZ05hbWUsIGRvYywgZiksIG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1fb3B0aW9ucyA9IDA7Ci0g
ICAgbV9tdWx0aXBsZSA9IGZhbHNlOwotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci0g
ICAgLy8gMCBtZWFucyBpbnZhbGlkIChpLmUuIG5vdCBzZXQpCi0gICAgbV9zaXplID0gMDsKLSAg
ICBtX21pbndpZHRoID0gMDsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp+SFRNTFNlbGVj
dEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+
ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotICAgIGlmIChtX29wdGlvbnMpIHsKLSAg
ICAgICAgbV9vcHRpb25zLT5kZXRhY2goKTsKLSAgICAgICAgbV9vcHRpb25zLT5kZXJlZigpOwot
ICAgIH0KLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5v
ZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8
fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1l
KG9wdGdyb3VwVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShoclRhZykgfHwKLSAgICAgICAg
ICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGhh
c0NoYW5nZWRDaGlsZCgpICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PGtodG1s
OjpSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAg
IH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsK
LX0KLQotCi1ET01TdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gKG1fbXVsdGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qtb25l
Iik7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNlbGVjdGVkSW5kZXgoKSBjb25z
dAotewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0
ZWQKLSAgICB1aW50IG8gPSAwOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVt
cyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXRlbXMu
c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9u
VGFnKSkgewotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1w
bCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAg
ICAgICAgICAgIG8rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBRX0FTU0VSVChtX211bHRpcGxl
KTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRT
ZWxlY3RlZEluZGV4KCBpbnQgIGluZGV4ICkKLXsKLSAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIg
b3B0aW9ucyBhbmQgc2VsZWN0IG9ubHkgdGhlIG5ldyBvbmUKLSAgICBRTWVtQXJyYXk8SFRNTEVs
ZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpbnQgbGlzdEluZGV4OwotICAg
IGZvciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4IDwgaW50KGl0ZW1zLnNpemUoKSk7IGxpc3RJ
bmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+
KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgfQotICAgIGxpc3RJ
bmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsKLSAgICBpZiAobGlzdEluZGV4ID49IDAp
Ci0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xpc3RJ
bmRleF0pLT5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0K
LWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50IGxl
biA9IDA7Ci0gICAgdWludCBpOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVt
cyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykg
ewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAg
ICAgICAgbGVuKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjphZGQoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJ
bXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgUmVmUHRyPEhUTUxFbGVt
ZW50SW1wbD4gcHJvdGVjdE5ld0NoaWxkKGVsZW1lbnQpOyAvLyBtYWtlIHN1cmUgdGhlIGVsZW1l
bnQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYgKCFl
bGVtZW50IHx8ICEoZWxlbWVudC0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+
aGFzTG9jYWxOYW1lKGhyVGFnKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGluc2VydEJlZm9y
ZShlbGVtZW50LCBiZWZvcmUsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXhjZXB0aW9uY29k
ZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnRJbXBsOjpyZW1vdmUoIGludCBpbmRleCApCi17Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUg
PSAwOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7Ci0KLSAg
ICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBp
ZihsaXN0SW5kZXggPCAwIHx8IGluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAgICAgICBy
ZXR1cm47IC8vICMjIyB3aGF0IHNob3VsZCB3ZSBkbyA/IHJlbW92ZSB0aGUgbGFzdCBpdGVtPwot
Ci0gICAgTm9kZUltcGwgKml0ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgIGl0ZW0tPnJlZigp
OwotICAgIHJlbW92ZUNoaWxkKGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOwotICAgIGl0ZW0tPmRlcmVm
KCk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1z
KCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAg
ICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0
ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAg
IGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+dmFs
dWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIERPTVN0cmluZygiIik7Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAg
IGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIGZpbmQgdGhlIG9w
dGlvbiB3aXRoIHZhbHVlKCkgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcgotICAgIC8vIGFu
ZCBtYWtlIGl0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1l
bnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1l
KG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNb
aV0pLT52YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjpzdGF0ZSgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0KLSAgICBRQ2hhciBzdGF0
ZUNoYXJzW2xdOwotICAgIAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspCi0gICAgICAg
IGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1M
T3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICBz
dGF0ZUNoYXJzW2ldID0gJ1gnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZUNoYXJz
W2ldID0gJy4nOwotICAgIFFTdHJpbmcgc3RhdGUoc3RhdGVDaGFycywgbCk7Ci0KLSAgICByZXR1
cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyBzdGF0ZTsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmX3N0YXRl
cykKLXsKLSAgICBRU3RyaW5nIF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpm
aW5kTWF0Y2hpbmdTdGF0ZShfc3RhdGVzKTsKLSAgICBpZiAoX3N0YXRlLmlzTnVsbCgpKSByZXR1
cm47Ci0KLSAgICByZWNhbGNMaXN0SXRlbXMoKTsKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBfc3Rh
dGU7Ci0gICAgaWYoIXN0YXRlLmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gnKSAmJiAh
bV9tdWx0aXBsZSkgewotICAgICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4gaW4gcmVz
dG9yZVN0YXRlISIpOwotICAgICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0IHRoaXMg
b3BlcmF0aW9uLiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgotICAgICAgICAvL3N0YXRl
WzBdID0gJ1gnOwotICAgIH0KLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVt
cyA9IGxpc3RJdGVtcygpOwotCi0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgIGZvcihp
bnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG9lID0g
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAgICAg
ICAgb2UtPnNldFNlbGVjdGVkKHN0YXRlW2ldID09ICdYJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2Vw
dGlvbmNvZGUgKTsKLSAgICBpZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJlY2FsY0xp
c3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwg
Km9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQg
PSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9sZENo
aWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBz
ZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAq
SFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwg
aW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsK
LSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsK
LSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkK
LXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFw
cGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNv
ZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICBzZXRDaGFuZ2VkKHRydWUp
OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRl
bXMoKTsKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxkKG5l
d0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSBrTWF4KGF0dHItPnZhbHVlKCkudG9J
bnQoKSwgMSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0g
ICAgICAgIG1fbWlud2lkdGggPSBrTWF4KCBhdHRyLT52YWx1ZSgpLnRvSW50KCksIDAgKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpIHsKLSAgICAgICAgbV9t
dWx0aXBsZSA9ICghYXR0ci0+aXNOdWxsKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3IgdGhlIG1v
bWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0gICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlz
dGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZlbnQs
IGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0
eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2VsZWN0KHRoaXMp
OwotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9ybURh
dGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICBib29sIHN1Y2Nlc3NmdWwgPSBm
YWxzZTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMo
KTsKLQotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKysp
IHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAg
ICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1M
T3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uLT5z
ZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShu
YW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRy
dWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAjIyMgdGhpcyBj
YXNlIHNob3VsZCBub3QgaGFwcGVuLiBtYWtlIHN1cmUgdGhhdCB3ZSBzZWxlY3QgdGhlIGZpcnN0
IG9wdGlvbgotICAgIC8vIGluIGFueSBjYXNlLiBvdGhlcndpc2Ugd2UgaGF2ZSBubyBjb25zaXN0
ZW5jeSB3aXRoIHRoZSBET00gaW50ZXJmYWNlLiBGSVhNRSEKLSAgICAvLyB3ZSByZXR1cm4gdGhl
IGZpcnN0IG9uZSBpZiBpdCB3YXMgYSBjb21ib2JveCBzZWxlY3QKLSAgICBpZiAoIXN1Y2Nlc3Nm
dWwgJiYgIW1fbXVsdGlwbGUgJiYgbV9zaXplIDw9IDEgJiYgaXRlbXMuc2l6ZSgpICYmCi0gICAg
ICAgIChpdGVtc1swXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpKSB7Ci0gICAgICAgIEhUTUxP
cHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKj4oaXRlbXNbMF0pOwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVsbCgpKQot
ICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dGV4
dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwot
ICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1
bDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5kZXgoaW50
IG9wdGlvbkluZGV4KSBjb25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5k
ZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGludCBs
aXN0SW5kZXggPSAwOwotICAgIGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAoOwotICAg
ICAgICAgb3B0aW9uSW5kZXgyIDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5kZXgyIDw9
IG9wdGlvbkluZGV4OwotICAgICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlwbyEKLSAg
ICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAg
ICAgICAgICAgb3B0aW9uSW5kZXgyKys7Ci0gICAgfQotICAgIGxpc3RJbmRleC0tOwotICAgIHJl
dHVybiBsaXN0SW5kZXg7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxpc3RUb09w
dGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAgfHwg
bGlzdEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0SW5k
ZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAg
aW50IG9wdGlvbkluZGV4ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291bnRp
bmcgT1BUR1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgaW50IGk7Ci0gICAg
Zm9yIChpID0gMDsgaSA8IGxpc3RJbmRleDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0tPmhh
c0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAgICBy
ZXR1cm4gb3B0aW9uSW5kZXg7Ci19Ci0KLS8vIEZJWE1FIDQxOTc5OTc6IHRoaXMgbWV0aG9kIGlz
IHVzZWQgYnkgdGhlIHB1YmxpYyBBUEkgLVtET01IVE1MU2VsZWN0RWxlbWVudCBvcHRpb25zXSwg
YnV0IGFsd2F5cyByZXR1cm5zCi0vLyBhbiBlbXB0eSBsaXN0LgotSFRNTE9wdGlvbnNDb2xsZWN0
aW9uSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zKCkKLXsKLSAgICBpZiAoIW1f
b3B0aW9ucykgewotICAgICAgICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xsZWN0aW9u
SW1wbCh0aGlzKTsKLSAgICAgICAgbV9vcHRpb25zLT5yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IG1fb3B0aW9uczsKLX0KLQotLy8gRklYTUU6IERlbGV0ZSBvbmNlIHRoZSBhYm92ZSBmdW5jdGlv
biBpcyB3b3JraW5nIHdlbGwgZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4KLVJlZlB0cjxIVE1MQ29s
bGVjdGlvbkltcGw+IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uc0hUTUxDb2xsZWN0aW9u
KCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xs
ZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OlNFTEVDVF9PUFRJT05TKSk7Ci19
Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNMaXN0SXRlbXMoKQotewotICAg
IE5vZGVJbXBsKiBjdXJyZW50ID0gZmlyc3RDaGlsZCgpOwotICAgIG1fbGlzdEl0ZW1zLnJlc2l6
ZSgwKTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIGZvdW5kU2VsZWN0ZWQgPSAwOwotICAg
IHdoaWxlKGN1cnJlbnQpIHsKLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0Z3Jv
dXBUYWcpICYmIGN1cnJlbnQtPmZpcnN0Q2hpbGQoKSkgewotICAgICAgICAgICAgLy8gIyMjIHdo
YXQgaWYgb3B0Z3JvdXAgY29udGFpbnMganVzdCBjb21tZW50cz8gZG9uJ3Qgd2FudCBvbmUgb2Yg
bm8gb3B0aW9ucyBpbiBpdC4uLgotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlz
dEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNp
emUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAg
ICAgICAgY3VycmVudCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBtX2xp
c3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0
SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBs
Kj4oY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlw
bGUgJiYgbV9zaXplIDw9IDEpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3Rh
dGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICAg
ICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBlbHNlIGlmIChmb3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIHN0YXRpY19j
YXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7Ci0gICAg
ICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAg
ICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwq
PihjdXJyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVu
dC0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZSht
X2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVt
cy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAg
ICAgICAgfQotICAgICAgICBOb2RlSW1wbCAqcGFyZW50ID0gY3VycmVudC0+cGFyZW50Tm9kZSgp
OwotICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgaWYg
KCFjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMpCi0gICAgICAgICAg
ICAgICAgY3VycmVudCA9IHBhcmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQotICAgIH0K
LSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsK
LQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKTsKLX0K
LQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygpCi17Ci0g
ICAgbV9yZWNhbGNMaXN0SXRlbXMgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAg
c3RhdGljX2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0No
YW5nZWQodHJ1ZSk7Ci0gICAgc2V0Q2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6cmVzZXQoKQotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVt
cyA9IGxpc3RJdGVtcygpOwotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMu
c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9u
VGFnKSkgewotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBi
b29sIHNlbGVjdGVkID0gKCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVs
bCgpKTsKLSAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotICAgICAg
ICB9Ci0gICAgfQotICAgIGlmICggbV9yZW5kZXIgKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJTZWxlY3QqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0gICAgc2V0
Q2hhbmdlZCggdHJ1ZSApOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bm90aWZ5
T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwgYm9v
bCBzZWxlY3RlZCkKLXsKLSAgICBpZiAoc2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUpIHsKLSAgICAg
ICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKLSAgICAgICAgUU1lbUFycmF5PEhUTUxF
bGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgICAgIHVpbnQgaTsKLSAgICAg
ICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAo
aXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9IChp
dGVtc1tpXSA9PSBzZWxlY3RlZE9wdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1f
cmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNl
dFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi12
b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwg
KmV2dCkKLXsKLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGluZyBz
aW11bGF0ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBwcm9w
ZXIgc2VuZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5cGUoKSA9
PSBrZXlwcmVzc0V2ZW50KSB7Ci0gICAgCi0gICAgICAgIGlmICghbV9mb3JtIHx8ICFtX3JlbmRl
ciB8fCAhZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgCi0gICAgICAgIERPTVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1w
bCAqPihldnQpLT5rZXlJZGVudGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoa2V5ID09
ICJFbnRlciIpIHsKLSAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAgICAg
ICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12
b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55
RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1w
bDo6c2V0TXVsdGlwbGUoYm9vbCBtdWx0aXBsZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobXVsdGlw
bGVBdHRyLCBtdWx0aXBsZSA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjpzZXRTaXplKGludCBzaXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0
cmluZzo6bnVtYmVyKHNpemUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MS2V5
Z2VuRWxlbWVudEltcGw6OkhUTUxLZXlnZW5FbGVtZW50SW1wbChEb2N1bWVudEltcGwqIGRvYywg
SFRNTEZvcm1FbGVtZW50SW1wbCogZikKLSAgICA6IEhUTUxTZWxlY3RFbGVtZW50SW1wbChrZXln
ZW5UYWcsIGRvYywgZikKLXsKLSAgICBRU3RyaW5nTGlzdCBrZXlzID0gS1NTTEtleUdlbjo6c3Vw
cG9ydGVkS2V5U2l6ZXMoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpID0ga2V5
cy5iZWdpbigpOyBpICE9IGtleXMuZW5kKCk7ICsraSkgewotICAgICAgICBIVE1MT3B0aW9uRWxl
bWVudEltcGwqIG8gPSBuZXcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKGRvYywgZm9ybSgpKTsKLSAg
ICAgICAgYWRkQ2hpbGQobyk7Ci0gICAgICAgIG8tPmFkZENoaWxkKG5ldyBUZXh0SW1wbChkb2Ms
IERPTVN0cmluZygqaSkpKTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MS2V5Z2VuRWxlbWVu
dEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAia2V5Z2VuIjsKLX0KLQotdm9pZCBI
VE1MS2V5Z2VuRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGFsbGVuZ2VBdHRyKQot
ICAgICAgICBtX2NoYWxsZW5nZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGtleXR5cGVBdHRyKQotICAgICAgICBtX2tleVR5cGUgPSBhdHRyLT52YWx1ZSgp
OwotICAgIGVsc2UKLSAgICAgICAgLy8gc2tpcCBIVE1MU2VsZWN0RWxlbWVudEltcGwgcGFyc2lu
ZyEKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmli
dXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6YXBwZW5kRm9ybURh
dGEoRm9ybURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICAvLyBPbmx5IFJT
QSBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgotICAgIGlmICghbV9rZXlUeXBlLmlzTnVsbCgp
ICYmICFlcXVhbElnbm9yaW5nQ2FzZShtX2tleVR5cGUsICJyc2EiKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIFFTdHJpbmcgdmFsdWUgPSBLU1NMS2V5R2VuOjpzaWduZWRQdWJsaWNLZXlB
bmRDaGFsbGVuZ2VTdHJpbmcoc2VsZWN0ZWRJbmRleCgpLCBtX2NoYWxsZW5nZS5xc3RyaW5nKCks
IGdldERvY3VtZW50KCktPmZyYW1lKCktPmJhc2VVUkwoKSk7Ci0gICAgaWYgKHZhbHVlLmlzTnVs
bCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0
YShuYW1lKCksIHZhbHVlLnV0ZjgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OkhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDog
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0Z3JvdXBUYWcsIGRvYywgZikKLXsKLX0KLQot
SFRNTE9wdEdyb3VwRWxlbWVudEltcGw6On5IVE1MT3B0R3JvdXBFbGVtZW50SW1wbCgpCi17Ci19
Ci0KLWJvb2wgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3JvdXBFbGVtZW50SW1w
bDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJvcHRncm91cCI7Ci19Ci0KLU5vZGVJbXBs
ICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0No
aWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9k
ZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUo
bmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICggIWV4Y2VwdGlvbmNv
ZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQgKCBO
b2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYo
IWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1
cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlbW92
ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3ZlQ2hp
bGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0g
ICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1O
b2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUltcGwg
Km5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQg
PSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2Vw
dGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1NlbGVj
dE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCogSFRNTE9wdEdy
b3VwRWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZWNh
bGNTZWxlY3RPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAg
ICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7
Ci0gICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsOjpyZWNhbGNTZWxlY3RPcHRpb25zKCkKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0ID0g
cGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFtZShz
ZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAgICBp
ZiAoc2VsZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihz
ZWxlY3QpLT5zZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRHcm91
cEVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShs
YWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpzZXRMYWJlbChj
b25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsYWJlbEF0dHIsIHZh
bHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0aW9uRWxlbWVudEltcGw6
OkhUTUxPcHRpb25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGlvblRhZywgZG9j
LCBmKQotewotICAgIG1fc2VsZWN0ZWQgPSBmYWxzZTsKLX0KLQotYm9vbCBIVE1MT3B0aW9uRWxl
bWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJl
dHVybiAib3B0aW9uIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dGV4
dCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHRleHQ7Ci0KLSAgICAvLyBXaW5JRSBkb2VzIG5v
dCB1c2UgdGhlIGxhYmVsIGF0dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdub3JlIGl0Lgot
ICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSkg
ewotICAgICAgICBET01TdHJpbmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwotICAg
ICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAg
fQotCi0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzLT5maXJzdENoaWxkKCk7Ci0gICAgd2hp
bGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RFIHx8
IG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFKQotICAgICAgICAgICAg
dGV4dCArPSBuLT5ub2RlVmFsdWUoKTsKLSAgICAgICAgLy8gc2tpcCBzY3JpcHQgY29udGVudAot
ICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgpICYmIG4tPmhhc1RhZ05hbWUoSFRNTE5hbWVz
OjpzY3JpcHRUYWcpKQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dFNpYmxpbmcodGhp
cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKHRo
aXMpOwotICAgIH0KLQotICAgIHJldHVybiB0ZXh0OwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVt
ZW50SW1wbDo6c2V0VGV4dChjb25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhjZXB0aW9uKQot
ewotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVyZSdzIGV4
YWN0bHkgMSBjaGlsZCBub2RlLCBhbmQgaXQncyBhIHRleHQgbm9kZS4KLSAgICBOb2RlSW1wbCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1RleHROb2Rl
KCkgJiYgIWNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFRleHRJ
bXBsICo+KGNoaWxkKS0+c2V0RGF0YSh0ZXh0LCBleGNlcHRpb24pOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGlsZChuZXcgVGV4
dEltcGwoZ2V0RG9jdW1lbnQoKSwgdGV4dCksIGV4Y2VwdGlvbik7Ci19Ci0KLWludCBIVE1MT3B0
aW9uRWxlbWVudEltcGw6OmluZGV4KCkgY29uc3QKLXsKLSAgICAvLyBMZXQncyBkbyB0aGlzIGR5
bmFtaWNhbGx5LiBNaWdodCBiZSBhIGJpdCBzbG93LCBidXQgd2UncmUgc3VyZQotICAgIC8vIHdl
IHdvbid0IGZvcmdldCB0byB1cGRhdGUgYSBtZW1iZXIgdmFyaWFibGUgaW4gc29tZSBjYXNlcy4u
LgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICAg
aWYgKHNlbGVjdCkgewotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMg
PSBzZWxlY3QtPmxpc3RJdGVtcygpOwotICAgICAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0g
ICAgICAgIGludCBvcHRpb25JbmRleCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBs
OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRh
ZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJ
bXBsKj4oaXRlbXNbaV0pID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRp
b25JbmRleDsKLSAgICAgICAgICAgICAgICBvcHRpb25JbmRleCsrOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVt
ZW50SW1wbDo6c2V0SW5kZXgoaW50LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAgICBleGNlcHRpb24g
PSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAvLyAjIyMK
LX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzZWxl
Y3RlZEF0dHIpCi0gICAgICAgIG1fc2VsZWN0ZWQgPSAoIWF0dHItPmlzTnVsbCgpKTsKLSAgICBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKQotICAgICAgICBtX3ZhbHVlID0gYXR0
ci0+dmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIGlmICggIW1fdmFsdWUuaXNOdWxsKCkg
KQotICAgICAgICByZXR1cm4gbV92YWx1ZTsKLSAgICAvLyBVc2UgdGhlIHRleHQgaWYgdGhlIHZh
bHVlIHdhc24ndCBzZXQuCi0gICAgcmV0dXJuIHRleHQoKS5xc3RyaW5nKCkuc3RyaXBXaGl0ZVNw
YWNlKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBE
T01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVlKTsK
LX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFNlbGVjdGVkKGJvb2wgX3NlbGVj
dGVkKQotewotICAgIGlmKG1fc2VsZWN0ZWQgPT0gX3NlbGVjdGVkKQotICAgICAgICByZXR1cm47
Ci0gICAgbV9zZWxlY3RlZCA9IF9zZWxlY3RlZDsKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwg
KnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgIGlmIChzZWxlY3QpCi0gICAgICAgIHNlbGVjdC0+
bm90aWZ5T3B0aW9uU2VsZWN0ZWQodGhpcyxfc2VsZWN0ZWQpOwotfQotCi12b2lkIEhUTUxPcHRp
b25FbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgIEhUTUxTZWxlY3RFbGVtZW50
SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICBpZiAoc2VsZWN0KQotICAgICAgIHNlbGVj
dC0+Y2hpbGRyZW5DaGFuZ2VkKCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbCAqSFRNTE9w
dGlvbkVsZW1lbnRJbXBsOjpnZXRTZWxlY3QoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpzZWxl
Y3QgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNUYWdO
YW1lKHNlbGVjdFRhZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgpOwot
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3QpOwot
fQotCi1ib29sIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6ZGVmYXVsdFNlbGVjdGVkKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVsbCgpOwotfQor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsLmgi
CisjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9mb3JtLmgiCisjaW5jbHVkZSAiZG9tX3RleHRp
bXBsLmgiCisjaW5jbHVkZSAiRm9ybURhdGFMaXN0LmgiCiAKLXZvaWQgSFRNTE9wdGlvbkVsZW1l
bnRJbXBsOjpzZXREZWZhdWx0U2VsZWN0ZWQoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShz
ZWxlY3RlZEF0dHIsIGIgPyAiIiA6IDApOwotfQorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKIAot
RE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUobGFiZWxBdHRyKTsKLX0KK3VzaW5nIG5hbWVzcGFjZSBraHRtbDsK
IAotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldExhYmVsKGNvbnN0IERPTVN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxhYmVsQXR0ciwgdmFsdWUpOwotfQorbmFtZXNw
YWNlIERPTSB7CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3VzaW5nIG5hbWVzcGFjZSBFdmVudE5h
bWVzOwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAogSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmKQogICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwodGV4dGFyZWFU
YWcsIGRvYywgZiksIG1fdmFsdWVJc1ZhbGlkKGZhbHNlKSwgbV92YWx1ZU1hdGNoZXNSZW5kZXJl
cihmYWxzZSkKQEAgLTM0ODYsODMgKzI4NSw0IEBAIHZvaWQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnNldFJvd3MoaW4KICAgICBzZXRBdHRyaWJ1dGUocm93c0F0dHIsIFFTdHJpbmc6Om51bWJl
cihyb3dzKSk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElzSW5kZXhFbGVtZW50
SW1wbDo6SFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1F
bGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxJbnB1dEVsZW1lbnRJbXBsKGlzaW5kZXhUYWcsIGRv
YywgZikKLXsKLSAgICBtX3R5cGUgPSBURVhUOwotICAgIG1fbmFtZSA9ICJpc2luZGV4IjsKLX0K
LQotdm9pZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBw
ZWRBdHRyaWJ1dGVJbXBsKiBhdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcHJvbXB0
QXR0cikKLQlzZXRWYWx1ZShhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNlCi0gICAgICAgIC8vIGRv
bid0IGNhbGwgSFRNTElucHV0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUgaGVyZSwgYXMg
aXQgd291bGQKLSAgICAgICAgLy8gYWNjZXB0IGF0dHJpYnV0ZXMgdGhpcyBlbGVtZW50IGRvZXMg
bm90IHN1cHBvcnQKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElzSW5kZXhFbGVtZW50SW1w
bDo6cHJvbXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHByb21wdEF0dHIp
OwotfQotCi12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnNldFByb21wdChjb25zdCBET01T
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShwcm9tcHRBdHRyLCB2YWx1ZSk7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdW5zaWduZWQgSFRNTE9wdGlvbnNDb2xsZWN0aW9u
SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAg
IHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6OnNldExlbmd0
aCh1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLX0KLQot
Tm9kZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Oml0ZW0odW5zaWduZWQgaW5kZXgp
IGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICByZXR1cm4gMDsKLX0K
LQotTm9kZUltcGwgKkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw6Om5hbWVkSXRlbShjb25zdCBE
T01TdHJpbmcgJm5hbWUpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAg
ICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Gb3JtRGF0YUxpc3Q6OkZv
cm1EYXRhTGlzdChRVGV4dENvZGVjICpjKQotICAgIDogbV9jb2RlYyhjKQotewotfQotCi12b2lk
IEZvcm1EYXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0IFFDU3RyaW5nICZzKQotewotICAgIG1f
bGlzdC5hcHBlbmQocyk7Ci19Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJpbmcoY29u
c3QgUVN0cmluZyAmcykKLXsKLSAgICBRQ1N0cmluZyBjc3RyID0gZml4TGluZUJyZWFrcyhtX2Nv
ZGVjLT5mcm9tVW5pY29kZShzLCB0cnVlKSk7Ci0gICAgY3N0ci50cnVuY2F0ZShjc3RyLmxlbmd0
aCgpKTsKLSAgICBtX2xpc3QuYXBwZW5kKGNzdHIpOwotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6
YXBwZW5kRmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZmaWxlbmFt
ZSkKLXsKLSAgICBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7Ci0gICAgbV9saXN0LmFwcGVu
ZChmaWxlbmFtZS5xc3RyaW5nKCkpOwotfQotCiB9IC8vIG5hbWVzcGFjZQpJbmRleDoga2h0bWwv
aHRtbC9IVE1MU2VsZWN0RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwv
SFRNTFNlbGVjdEVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTE5NzYpCisrKyBraHRtbC9odG1s
L0hUTUxTZWxlY3RFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQsNyArNCw3IEBA
CiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAg
ICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAg
ICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHly
aWdodCAoQykgMjAwNCwgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChD
KSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKiAgICAgICAgICAgKEMp
IDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAbnlwb3AuY29tKQogICoKICAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAg
LTIzLDQwICsyMywyMSBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICov
Ci0KLSN1bmRlZiBGT1JNU19ERUJVRwotLy8jZGVmaW5lIEZPUk1TX0RFQlVHCi0KKyAKICNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZm9ybWltcGwuaCIKKyNpbmNsdWRl
ICJIVE1MU2VsZWN0RWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MT3B0aW9uc0NvbGxlY3Rp
b25JbXBsLmgiCisjaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAi
SFRNTEZvcm1FbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgImh0bWxfbWlzY2ltcGwuaCIgLy8gZm9y
IEhUTUxDb2xsZWN0aW9uSW1wbAorI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgorI2luY2x1
ZGUgIkZvcm1EYXRhTGlzdC5oIgogCi0jaW5jbHVkZSAia2h0bWx2aWV3LmgiCi0jaW5jbHVkZSAi
TWFjRnJhbWUuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVk
ZSAiaHRtbF9pbWFnZWltcGwuaCIKLSNpbmNsdWRlICJraHRtbF9zZXR0aW5ncy5oIgotI2luY2x1
ZGUgIm1pc2MvZm9ybWRhdGEuaCIKLQotI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCiAj
aW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKICNpbmNsdWRlICJjc3Nwcm9wZXJ0aWVz
LmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5o
IgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKICNpbmNsdWRlICJ4bWwvRXZlbnRO
YW1lcy5oIgotI2luY2x1ZGUgImtodG1sX2V4dC5oIgogCiAjaW5jbHVkZSAicmVuZGVyaW5nL3Jl
bmRlcl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgotI2luY2x1ZGUgInJlbmRl
cl90aGVtZS5oIgotCi0jaW5jbHVkZSA8a2xvY2FsZS5oPgotI2luY2x1ZGUgPHFmaWxlLmg+Ci0j
aW5jbHVkZSA8cXRleHRjb2RlYy5oPgotCi0vLyBmb3Iga2V5Z2VuCi0jaW5jbHVkZSA8cXN0cmlu
Zy5oPgotI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogCkBA
IC02NywzNTAyICs0OCw0NjQgQEAgbmFtZXNwYWNlIERPTSB7CiB1c2luZyBuYW1lc3BhY2UgRXZl
bnROYW1lczsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLXN0cnVjdCBGb3JtRGF0YUxp
c3RJdGVtIHsKLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFDU3RyaW5nICZkYXRhKSA6IG1f
ZGF0YShkYXRhKSB7IH0KLSAgICBGb3JtRGF0YUxpc3RJdGVtKGNvbnN0IFFTdHJpbmcgJnBhdGgp
IDogbV9wYXRoKHBhdGgpIHsgfQotCi0gICAgUVN0cmluZyBtX3BhdGg7Ci0gICAgUUNTdHJpbmcg
bV9kYXRhOwotfTsKLQotY2xhc3MgRm9ybURhdGFMaXN0IHsKLXB1YmxpYzoKLSAgICBGb3JtRGF0
YUxpc3QoUVRleHRDb2RlYyAqKTsKLQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJp
bmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmco
a2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1ZS5xc3RyaW5nKCkpOyB9Ci0gICAgdm9p
ZCBhcHBlbmREYXRhKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBRU3RyaW5nICZ2YWx1ZSkK
LSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFwcGVuZFN0cmluZyh2YWx1
ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IFFD
U3RyaW5nICZ2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7IGFw
cGVuZFN0cmluZyh2YWx1ZSk7IH0KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5n
ICZrZXksIGludCB2YWx1ZSkKLSAgICAgICAgeyBhcHBlbmRTdHJpbmcoa2V5LnFzdHJpbmcoKSk7
IGFwcGVuZFN0cmluZyhRU3RyaW5nOjpudW1iZXIodmFsdWUpKTsgfQotICAgIHZvaWQgYXBwZW5k
RmlsZShjb25zdCBET01TdHJpbmcgJmtleSwgY29uc3QgRE9NU3RyaW5nICZmaWxlbmFtZSk7Ci0K
LSAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBiZWdpbigpIGNv
bnN0Ci0gICAgICAgIHsgcmV0dXJuIG1fbGlzdC5iZWdpbigpOyB9Ci0gICAgUVZhbHVlTGlzdENv
bnN0SXRlcmF0b3I8Rm9ybURhdGFMaXN0SXRlbT4gZW5kKCkgY29uc3QKLSAgICAgICAgeyByZXR1
cm4gbV9saXN0LmVuZCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmRTdHJpbmcoY29u
c3QgUUNTdHJpbmcgJnMpOwotICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0IFFTdHJpbmcgJnMp
OwotCi0gICAgUVRleHRDb2RlYyAqbV9jb2RlYzsKLSAgICBRVmFsdWVMaXN0PEZvcm1EYXRhTGlz
dEl0ZW0+IG1fbGlzdDsKLX07Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6OkhUTUxGb3JtRWxlbWVu
dEltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudEltcGwoZm9ybVRhZywg
ZG9jKQotewotICAgIGNvbGxlY3Rpb25JbmZvID0gMDsKLSAgICBtX3Bvc3QgPSBmYWxzZTsKLSAg
ICBtX211bHRpcGFydCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1ZTsKLSAgICBt
X2luc3VibWl0ID0gZmFsc2U7Ci0gICAgbV9kb2luZ3N1Ym1pdCA9IGZhbHNlOwotICAgIG1faW5y
ZXNldCA9IGZhbHNlOwotICAgIG1fZW5jdHlwZSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVy
bGVuY29kZWQiOwotICAgIG1fYm91bmRhcnkgPSAiLS0tLS0tLS0tLTB4S2hUbUxiT3VOZEFyWSI7
Ci0gICAgbV9hY2NlcHRjaGFyc2V0ID0gIlVOS05PV04iOwotICAgIG1fbWFsZm9ybWVkID0gZmFs
c2U7Ci19Ci0KLUhUTUxGb3JtRWxlbWVudEltcGw6On5IVE1MRm9ybUVsZW1lbnRJbXBsKCkKLXsK
LSAgICBkZWxldGUgY29sbGVjdGlvbkluZm87Ci0gICAgCi0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZvcm1FbGVtZW50c1tp
XS0+bV9mb3JtID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW1nRWxlbWVudHMu
Y291bnQoKTsgKytpKQotICAgICAgICBpbWdFbGVtZW50c1tpXS0+bV9mb3JtID0gMDsKLX0KLQot
Ci1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6OmZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9u
KGNvbnN0IERPTVN0cmluZyAmdXJsKQorSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpIVE1MU2VsZWN0
RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCisg
ICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChzZWxlY3RUYWcsIGRvYywgZiksIG1fb3B0
aW9ucygwKQogewotICAgIGlmICh1cmwuaXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsLnFzdHJp
bmcoKSkuc3RhcnRzV2l0aCgiaHR0cHM6IiwgZmFsc2UpOworICAgIGluaXQoKTsKIH0KIAotCi12
b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCitIVE1MU2VsZWN0RWxlbWVudEltcGw6
OkhUTUxTZWxlY3RFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKKyAgICA6IEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYywgZiksIG1fb3B0aW9ucygwKQogewotICAgIEhU
TUxFbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0
aCBjYWxsaW5nIHNlY3VyZUZvcm1SZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1p
bmcKLSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQot
ICAgIGlmIChmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCkpCi0gICAgICAgIGdl
dERvY3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOworICAgIGluaXQoKTsKIH0KIAotdm9pZCBI
VE1MRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpCit2b2lkIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6aW5pdCgpCiB7Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmlzSFRNTERv
Y3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19jYXN0PEhU
TUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1lbnQtPmFkZE5hbWVkSXRl
bShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnRJbXBsOjppbnNlcnRlZElu
dG9Eb2N1bWVudCgpOworICAgIG1fb3B0aW9ucyA9IDA7CisgICAgbV9tdWx0aXBsZSA9IGZhbHNl
OworICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7CisgICAgLy8gMCBtZWFucyBpbnZhbGlk
IChpLmUuIG5vdCBzZXQpCisgICAgbV9zaXplID0gMDsKKyAgICBtX21pbndpZHRoID0gMDsKIH0K
IAotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCkKK0hUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6fkhUTUxTZWxlY3RFbGVtZW50SW1wbCgpCiB7Ci0gICAgaWYgKGdl
dERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1
bWVudCA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0J
ZG9jdW1lbnQtPnJlbW92ZU5hbWVkSXRlbShvbGROYW1lQXR0cik7CisgICAgaWYgKGdldERvY3Vt
ZW50KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKKyAg
ICBpZiAobV9vcHRpb25zKSB7CisgICAgICAgIG1fb3B0aW9ucy0+ZGV0YWNoKCk7CisgICAgICAg
IG1fb3B0aW9ucy0+ZGVyZWYoKTsKICAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJl
bW92ZWRGcm9tRG9jdW1lbnQoKTsKIH0KIAotaW50IEhUTUxGb3JtRWxlbWVudEltcGw6Omxlbmd0
aCgpIGNvbnN0Citib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3QgTm9k
ZUltcGwqIG5ld0NoaWxkKQogewotICAgIGludCBsZW4gPSAwOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291bnQoKTsgKytpKQotCWlmIChmb3JtRWxlbWVudHNb
aV0tPmlzRW51bWVyYXRhYmxlKCkpCi0JICAgICsrbGVuOwotCi0gICAgcmV0dXJuIGxlbjsKKyAg
ICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShv
cHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSB8fCBuZXdDaGls
ZC0+aGFzVGFnTmFtZShoclRhZykgfHwKKyAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
c2NyaXB0VGFnKTsKIH0KIAotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnN1Ym1pdENsaWNr
KCkKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2Ug
Y2ggKQogewotICAgIGJvb2wgc3VibWl0Rm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkgewotICAgICAgICBpZiAoZm9y
bUVsZW1lbnRzW2ldLT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBIVE1M
SW5wdXRFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJ
bXBsICo+KGZvcm1FbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNTdWNj
ZXNzZnVsU3VibWl0QnV0dG9uKCkgJiYgZWxlbWVudC0+cmVuZGVyZXIoKSkgewotICAgICAgICAg
ICAgICAgIHN1Ym1pdEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LT5jbGlj
ayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KKyAgICBpZiAoaGFzQ2hhbmdlZENoaWxkKCkgJiYgbV9yZW5kZXIpIHsKKyAgICAgICAgc3Rh
dGljX2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5n
ZWQodHJ1ZSk7CiAgICAgfQotICAgIGlmICghc3VibWl0Rm91bmQpIC8vIHN1Ym1pdCB0aGUgZm9y
bSB3aXRob3V0IGEgc3VibWl0IG9yIGltYWdlIGlucHV0Ci0gICAgICAgIHByZXBhcmVTdWJtaXQo
KTsKKworICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsK
IH0KIAogCi1zdGF0aWMgUUNTdHJpbmcgZW5jb2RlQ1N0cmluZyhjb25zdCBRQ1N0cmluZyYgZSkK
K0RPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAogewotICAgIC8v
IGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40
LjEKLSAgICAvLyBzYWZlIGNoYXJhY3RlcnMgbGlrZSBOUyBoYW5kbGVzIHRoZW0gZm9yIGNvbXBh
dGliaWxpdHkKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqc2FmZSA9ICItLl8qIjsKLSAgICBpbnQg
ZWxlbiA9IGUubGVuZ3RoKCk7Ci0gICAgUUNTdHJpbmcgZW5jb2RlZCgoIGVsZW4rZS5jb250YWlu
cyggJ1xuJyApICkqMysxKTsKLSAgICBpbnQgZW5jbGVuID0gMDsKLQotICAgIC8vUUNTdHJpbmcg
b3JpZyhlLmRhdGEoKSwgZS5zaXplKCkpOwotCi0gICAgZm9yKGludCBwb3MgPSAwOyBwb3MgPCBl
bGVuOyBwb3MrKykgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBlW3Bvc107Ci0KLSAgICAg
ICAgaWYgKCAoKCBjID49ICdBJykgJiYgKCBjIDw9ICdaJykpIHx8Ci0gICAgICAgICAgICAgKCgg
YyA+PSAnYScpICYmICggYyA8PSAneicpKSB8fAotICAgICAgICAgICAgICgoIGMgPj0gJzAnKSAm
JiAoIGMgPD0gJzknKSkgfHwKLSAgICAgICAgICAgICAoc3RyY2hyKHNhZmUsIGMpKQotICAgICAg
ICAgICAgKQotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSBjOwotICAgICAgICBlbHNl
IGlmICggYyA9PSAnICcgKQotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnKyc7Ci0g
ICAgICAgIGVsc2UgaWYgKCBjID09ICdcbicgfHwgKCBjID09ICdccicgJiYgZVtwb3MrMV0gIT0g
J1xuJyApICkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7
Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcwJzsKLSAgICAgICAgICAgIGVuY29k
ZWRbZW5jbGVuKytdID0gJ0QnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7
Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICcwJzsKLSAgICAgICAgICAgIGVuY29k
ZWRbZW5jbGVuKytdID0gJ0EnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBjICE9ICdc
cicgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICclJzsKLSAg
ICAgICAgICAgIHVuc2lnbmVkIGludCBoID0gYyAvIDE2OwotICAgICAgICAgICAgaCArPSAoaCA+
IDkpID8gKCdBJyAtIDEwKSA6ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0g
aDsKLQotICAgICAgICAgICAgdW5zaWduZWQgaW50IGwgPSBjICUgMTY7Ci0gICAgICAgICAgICBs
ICs9IChsID4gOSkgPyAoJ0EnIC0gMTApIDogJzAnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNs
ZW4rK10gPSBsOwotICAgICAgICB9Ci0gICAgfQotICAgIGVuY29kZWRbZW5jbGVuKytdID0gJ1ww
JzsKLSAgICBlbmNvZGVkLnRydW5jYXRlKGVuY2xlbik7Ci0KLSAgICByZXR1cm4gZW5jb2RlZDsK
KyAgICByZXR1cm4gKG1fbXVsdGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qtb25l
Iik7CiB9CiAKLS8vIENoYW5nZSBwbGFpbiBDUiBhbmQgcGxhaW4gTEYgdG8gQ1JMRiBwYWlycy4K
LXN0YXRpYyBRQ1N0cmluZyBmaXhMaW5lQnJlYWtzKGNvbnN0IFFDU3RyaW5nICZzKQoraW50IEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0CiB7Ci0gICAgLy8gQ29t
cHV0ZSB0aGUgbGVuZ3RoLgotICAgIHVuc2lnbmVkIG5ld0xlbiA9IDA7Ci0gICAgY29uc3QgY2hh
ciAqcCA9IHMuZGF0YSgpOwotICAgIHdoaWxlIChjaGFyIGMgPSAqcCsrKSB7Ci0gICAgICAgIGlm
IChjID09ICdccicpIHsKLSAgICAgICAgICAgIC8vIFNhZmUgdG8gbG9vayBhaGVhZCBiZWNhdXNl
IG9mIHRyYWlsaW5nICdcMCcuCi0gICAgICAgICAgICBpZiAoKnAgIT0gJ1xuJykgewotICAgICAg
ICAgICAgICAgIC8vIFR1cm4gQ1IgaW50byBDUkxGLgotICAgICAgICAgICAgICAgIG5ld0xlbiAr
PSAyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgewotICAg
ICAgICAgICAgLy8gVHVybiBMRiBpbnRvIENSTEYuCi0gICAgICAgICAgICBuZXdMZW4gKz0gMjsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExlYXZlIG90aGVyIGNoYXJhY3RlcnMg
YWxvbmUuCi0gICAgICAgICAgICBuZXdMZW4gKz0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBp
ZiAobmV3TGVuID09IHMubGVuZ3RoKCkpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAg
IAotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcuCi0gICAgcCA9IHMuZGF0YSgpOwot
ICAgIFFDU3RyaW5nIHJlc3VsdChuZXdMZW4gKyAxKTsKLSAgICBjaGFyICpxID0gcmVzdWx0LmRh
dGEoKTsKLSAgICB3aGlsZSAoY2hhciBjID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHIn
KSB7Ci0gICAgICAgICAgICAvLyBTYWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGlu
ZyAnXDAnLgotICAgICAgICAgICAgaWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAv
LyBUdXJuIENSIGludG8gQ1JMRi4KLSAgICAgICAgICAgICAgICAqcSsrID0gJ1xyJzsKLSAgICAg
ICAgICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlm
IChjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8vIFR1cm4gTEYgaW50byBDUkxGLgotICAgICAg
ICAgICAgKnErKyA9ICdccic7Ci0gICAgICAgICAgICAqcSsrID0gJ1xuJzsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIC8vIExlYXZlIG90aGVyIGNoYXJhY3RlcnMgYWxvbmUuCi0gICAg
ICAgICAgICAqcSsrID0gYzsKKyAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgZmlyc3Qg
b3B0aW9uIHNlbGVjdGVkCisgICAgdWludCBvID0gMDsKKyAgICBRTWVtQXJyYXk8SFRNTEVsZW1l
bnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0g
MDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9j
YWxOYW1lKG9wdGlvblRhZykpIHsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIG87CisgICAgICAgICAgICBvKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJu
IHJlc3VsdDsKKyAgICBRX0FTU0VSVChtX211bHRpcGxlKTsKKyAgICByZXR1cm4gLTE7CiB9CiAK
LQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtRGF0YShGb3JtRGF0YSAmZm9ybV9kYXRh
KSBjb25zdAordm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFNlbGVjdGVkSW5kZXgoIGlu
dCAgaW5kZXggKQogewotICAgIFFDU3RyaW5nIGVuY19zdHJpbmcgPSAiIjsgLy8gdXNlZCBmb3Ig
bm9uLW11bHRpcGFydCBkYXRhCi0KLSAgICAvLyBmaW5kIG91dCB0aGUgUVRleHRjb2RlYyB0byB1
c2UKLSAgICBRU3RyaW5nIHN0ciA9IG1fYWNjZXB0Y2hhcnNldC5xc3RyaW5nKCk7Ci0gICAgc3Ry
LnJlcGxhY2UoJywnLCAnICcpOwotICAgIFFTdHJpbmdMaXN0IGNoYXJzZXRzID0gUVN0cmluZ0xp
c3Q6OnNwbGl0KCcgJywgc3RyKTsKLSAgICBRVGV4dENvZGVjKiBjb2RlYyA9IDA7Ci0gICAgRnJh
bWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0
OjpJdGVyYXRvciBpdCA9IGNoYXJzZXRzLmJlZ2luKCk7IGl0ICE9IGNoYXJzZXRzLmVuZCgpOyAr
K2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgZW5jID0gKCppdCk7Ci0gICAgICAgIGlmIChlbmMuY29u
dGFpbnMoIlVOS05PV04iKSkgewotICAgICAgICAgICAgLy8gdXNlIHN0YW5kYXJkIGRvY3VtZW50
IGVuY29kaW5nCi0gICAgICAgICAgICBlbmMgPSAiSVNPLTg4NTktMSI7Ci0gICAgICAgICAgICBp
ZiAoZnJhbWUpCi0gICAgICAgICAgICAgICAgZW5jID0gZnJhbWUtPmVuY29kaW5nKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKChjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShlbmMu
bGF0aW4xKCkpKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghY29kZWMp
Ci0gICAgICAgIGNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JMb2NhbGUoKTsKLQotCi0gICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAg
ICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNb
aV07Ci0gICAgICAgIEZvcm1EYXRhTGlzdCBsc3QoY29kZWMpOwotCi0gICAgICAgIGlmICghY3Vy
cmVudC0+ZGlzYWJsZWQoKSAmJiBjdXJyZW50LT5hcHBlbmRGb3JtRGF0YShsc3QsIG1fbXVsdGlw
YXJ0KSkgewotICAgICAgICAgICAgZm9yIChRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0
YUxpc3RJdGVtPiBpdCA9IGxzdC5iZWdpbigpOyBpdCAhPSBsc3QuZW5kKCk7ICsraXQpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoIW1fbXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IGhhbmRsZSBJU0lOREVYIC8gPGlucHV0IG5hbWU9aXNpbmRleD4gc3BlY2lhbAotICAgICAgICAg
ICAgICAgICAgICAvLyBidXQgb25seSBpZiBpdHMgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAg
ICAgICAgICAgIGlmICggZW5jX3N0cmluZy5pc0VtcHR5KCkgJiYgKCppdCkubV9kYXRhID09ICJp
c2luZGV4IiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoICgqaXQpLm1fZGF0YSApOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYoIWVuY19zdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gJyYnOwotCi0gICAgICAgICAgICAgICAgICAg
ICAgICBlbmNfc3RyaW5nICs9IGVuY29kZUNTdHJpbmcoKCppdCkubV9kYXRhKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gIj0iOwotICAgICAgICAgICAgICAgICAgICAg
ICAgKytpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5jb2RlQ1N0
cmluZygoKml0KS5tX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAg
ICAgICAgICAgIFFDU3RyaW5nIGhzdHIoIi0tIik7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIg
Kz0gbV9ib3VuZGFyeS5xc3RyaW5nKCkubGF0aW4xKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhz
dHIgKz0gIlxyXG4iOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJDb250ZW50LURpc3Bv
c2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiOwotICAgICAgICAgICAgICAgICAgICBoc3RyICs9
ICgqaXQpLm1fZGF0YS5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlwiIjsK
LQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCB0eXBlIGlzIEZJTEUsIHRo
ZW4gd2UgYWxzbyBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGZp
bGVuYW1lCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5oYXNMb2NhbE5hbWUoaW5w
dXRUYWcpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50SW1wbCo+KGN1cnJlbnQpLT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6RklMRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAg
UVN0cmluZyBwYXRoID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50
KS0+dmFsdWUoKS5xc3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiBUaGlzIHdvbid0IHdvcmsgaWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgIiBtYXJrLAotICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gb3IgY29udHJvbCBjaGFyYWN0ZXJzIGxpa2UgQ1Igb3Ig
TEYuIFRoaXMgYWxzbyBkb2VzIHN0cmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRo
aW5ncyBpZiB0aGUgZmlsZW5hbWUgaW5jbHVkZXMgY2hhcmFjdGVycyB5b3UgY2FuJ3QgZW5jb2Rl
Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgd2Vic2l0ZSdzIGNoYXJhY3RlciBz
ZXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICI7IGZpbGVuYW1lPVwiIjsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gY29kZWMtPmZyb21Vbmljb2RlKHBhdGgubWlk
KHBhdGguZmluZFJldignLycpICsgMSksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAg
aHN0ciArPSAiXCIiOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudEltcGwqPihjdXJyZW50KS0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmlu
ZyBtaW1lVHlwZSA9IGZyYW1lID8gTWFjKGZyYW1lKS0+bWltZVR5cGVGb3JGaWxlTmFtZShwYXRo
KSA6IFFTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUeXBl
LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJc
clxuQ29udGVudC1UeXBlOiAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3Ry
ICs9IG1pbWVUeXBlLmFzY2lpKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgaHN0ciArPSAiXHJcblxyXG4iOwotICAgICAgICAgICAgICAgICAgICArK2l0
OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBib2R5Ci0gICAgICAgICAgICAgICAg
ICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGhzdHIuZGF0YSgpLCBoc3RyLmxlbmd0aCgpKTsKLSAg
ICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybURhdGFMaXN0SXRlbSAmaXRlbSA9ICppdDsKLSAg
ICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFTaXplID0gaXRlbS5tX2RhdGEuc2l6ZSgpOwot
ICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNpemUgIT0gMCkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGZvcm1fZGF0YS5hcHBlbmREYXRhKGl0ZW0ubV9kYXRhLCBkYXRhU2l6ZSAtIDEpOwot
ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXRlbS5tX3BhdGguaXNFbXB0eSgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZEZpbGUoaXRlbS5tX3BhdGgpOwot
ICAgICAgICAgICAgICAgICAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YSgiXHJcbiIsIDIpOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8vIGRlc2VsZWN0
IGFsbCBvdGhlciBvcHRpb25zIGFuZCBzZWxlY3Qgb25seSB0aGUgbmV3IG9uZQorICAgIFFNZW1B
cnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOworICAgIGludCBsaXN0
SW5kZXg7CisgICAgZm9yIChsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBpbnQoaXRlbXMuc2l6
ZSgpKTsgbGlzdEluZGV4KyspIHsKKyAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVs
ZW1lbnRJbXBsKj4oaXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKGZhbHNlKTsKICAgICB9
CisgICAgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoaW5kZXgpOworICAgIGlmIChsaXN0
SW5kZXggPj0gMCkKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4o
aXRlbXNbbGlzdEluZGV4XSktPnNldFNlbGVjdGVkKHRydWUpOwogCi0KLSAgICBpZiAobV9tdWx0
aXBhcnQpCi0gICAgICAgIGVuY19zdHJpbmcgPSAoIi0tIiArIG1fYm91bmRhcnkucXN0cmluZygp
ICsgIi0tXHJcbiIpLmFzY2lpKCk7Ci0KLSAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShlbmNfc3Ry
aW5nLmRhdGEoKSwgZW5jX3N0cmluZy5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAg
c2V0Q2hhbmdlZCh0cnVlKTsKIH0KIAotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpwYXJzZUVu
Y3R5cGUoY29uc3QgRE9NU3RyaW5nJiB0eXBlKQoraW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6
bGVuZ3RoKCkgY29uc3QKIHsKLSAgICBpZih0eXBlLmNvbnRhaW5zKCJtdWx0aXBhcnQiLCBmYWxz
ZSkgfHwgdHlwZS5jb250YWlucygiZm9ybS1kYXRhIiwgZmFsc2UpKSB7Ci0gICAgICAgIG1fZW5j
dHlwZSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSB0cnVl
OwotICAgIH0gZWxzZSBpZiAodHlwZS5jb250YWlucygidGV4dCIsIGZhbHNlKSB8fCB0eXBlLmNv
bnRhaW5zKCJwbGFpbiIsIGZhbHNlKSkgewotICAgICAgICBtX2VuY3R5cGUgPSAidGV4dC9wbGFp
biI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
bV9lbmN0eXBlID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgICAg
IG1fbXVsdGlwYXJ0ID0gZmFsc2U7CisgICAgaW50IGxlbiA9IDA7CisgICAgdWludCBpOworICAg
IFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOworICAgIGZv
ciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbXNbaV0t
Pmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQorICAgICAgICAgICAgbGVuKys7CiAgICAgfQorICAg
IHJldHVybiBsZW47CiB9CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0Qm91bmRhcnko
IGNvbnN0IERPTVN0cmluZyYgYm91bmQgKQotewotICAgIG1fYm91bmRhcnkgPSBib3VuZDsKLX0K
LQotYm9vbCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpwcmVwYXJlU3VibWl0KCkKK3ZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjphZGQoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1l
bnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApCiB7Ci0gICAgRnJhbWUgKmZyYW1l
ID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2luc3VibWl0IHx8ICFmcmFtZSB8
fCBmcmFtZS0+b25seUxvY2FsUmVmZXJlbmNlcygpKQotICAgICAgICByZXR1cm4gbV9pbnN1Ym1p
dDsKKyAgICBSZWZQdHI8SFRNTEVsZW1lbnRJbXBsPiBwcm90ZWN0TmV3Q2hpbGQoZWxlbWVudCk7
IC8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24n
dCBsZWFrIGl0CiAKLSAgICBtX2luc3VibWl0ID0gdHJ1ZTsKLSAgICBtX2RvaW5nc3VibWl0ID0g
ZmFsc2U7CisgICAgaWYgKCFlbGVtZW50IHx8ICEoZWxlbWVudC0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykgfHwgZWxlbWVudC0+aGFzTG9jYWxOYW1lKGhyVGFnKSkpCisgICAgICAgIHJldHVybjsK
IAotICAgIGlmICggZGlzcGF0Y2hIVE1MRXZlbnQoc3VibWl0RXZlbnQsZmFsc2UsdHJ1ZSkgJiYg
IW1fZG9pbmdzdWJtaXQgKQotICAgICAgICBtX2RvaW5nc3VibWl0ID0gdHJ1ZTsKKyAgICBpbnNl
cnRCZWZvcmUoZWxlbWVudCwgYmVmb3JlLCBleGNlcHRpb25jb2RlKTsKKyAgICBpZiAoIWV4Y2Vw
dGlvbmNvZGUpCisgICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOworfQogCi0gICAgbV9pbnN1
Ym1pdCA9IGZhbHNlOwordm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlbW92ZSggaW50IGlu
ZGV4ICkKK3sKKyAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7CisgICAgaW50IGxpc3RJbmRleCA9
IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsKIAotICAgIGlmICggbV9kb2luZ3N1Ym1pdCApCi0g
ICAgICAgIHN1Ym1pdCh0cnVlKTsKKyAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBsaXN0SXRlbXMoKTsKKyAgICBpZihsaXN0SW5kZXggPCAwIHx8IGluZGV4ID49IGludChp
dGVtcy5zaXplKCkpKQorICAgICAgICByZXR1cm47IC8vICMjIyB3aGF0IHNob3VsZCB3ZSBkbyA/
IHJlbW92ZSB0aGUgbGFzdCBpdGVtPwogCi0gICAgcmV0dXJuIG1fZG9pbmdzdWJtaXQ7CisgICAg
Tm9kZUltcGwgKml0ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOworICAgIGl0ZW0tPnJlZigpOworICAg
IHJlbW92ZUNoaWxkKGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOworICAgIGl0ZW0tPmRlcmVmKCk7Cisg
ICAgaWYoICFleGNlcHRpb25jb2RlICkKKyAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7CiB9
CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c3VibWl0KCBib29sIGFjdGl2YXRlU3VibWl0
QnV0dG9uICkKK0RPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkKIHsKLSAg
ICBLSFRNTFZpZXcgKnZpZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgRnJhbWUgKmZy
YW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWZyYW1lKSB7
Ci0gICAgICAgIHJldHVybjsKKyAgICB1aW50IGk7CisgICAgUU1lbUFycmF5PEhUTUxFbGVtZW50
SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7CisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNp
emUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRh
ZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxl
Y3RlZCgpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zW2ldKS0+dmFsdWUoKTsKICAgICB9CisgICAgcmV0dXJuIERPTVN0cmluZygi
Iik7Cit9CiAKLSAgICBpZiAoIG1faW5zdWJtaXQgKSB7Ci0gICAgICAgIG1fZG9pbmdzdWJtaXQg
PSB0cnVlOwordm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0
cmluZyAmdmFsdWUpCit7CisgICAgaWYgKHZhbHVlLmlzTnVsbCgpKQogICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgbV9pbnN1Ym1pdCA9IHRydWU7Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbCogZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gMDsKLSAgICBib29sIG5l
ZWRCdXR0b25BY3RpdmF0aW9uID0gYWN0aXZhdGVTdWJtaXRCdXR0b247CS8vIGRvIHdlIG5lZWQg
dG8gYWN0aXZhdGUgYSBzdWJtaXQgYnV0dG9uPwotICAgIAotICAgIE1hYyhmcmFtZSktPmNsZWFy
UmVjb3JkZWRGb3JtVmFsdWVzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1F
bGVtZW50cy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwqIGN1cnJlbnQgPSBmb3JtRWxlbWVudHNbaV07Ci0gICAgICAgIC8vIE91ciBhcHAgbmVlZHMg
dG8gZ2V0IGZvcm0gdmFsdWVzIGZvciBwYXNzd29yZCBmaWVsZHMgZm9yIGRvaW5nIHBhc3N3b3Jk
IGF1dG9jb21wbGV0ZSwKLSAgICAgICAgLy8gc28gd2UgYXJlIG1vcmUgbGVuaWVudCBpbiBwdXNo
aW5nIHZhbHVlcywgYW5kIGxldCB0aGUgYXBwIGRlY2lkZSB3aGF0IHRvIHNhdmUgd2hlbi4KLSAg
ICAgICAgaWYgKGN1cnJlbnQtPmhhc0xvY2FsTmFtZShpbnB1dFRhZykpIHsKLSAgICAgICAgICAg
IEhUTUxJbnB1dEVsZW1lbnRJbXBsICppbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQtPmlucHV0VHlwZSgpID09
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpURVhUCi0gICAgICAgICAgICAgICAgfHwgaW5wdXQtPmlu
cHV0VHlwZSgpID09ICBIVE1MSW5wdXRFbGVtZW50SW1wbDo6UEFTU1dPUkQKLSAgICAgICAgICAg
ICAgICB8fCBpbnB1dC0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJD
SCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYWMoZnJhbWUpLT5yZWNvcmRGb3Jt
VmFsdWUoaW5wdXQtPm5hbWUoKS5xc3RyaW5nKCksIGlucHV0LT52YWx1ZSgpLnFzdHJpbmcoKSwg
dGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0LT5yZW5kZXJlcigpICYmIGlucHV0LT5p
bnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRFbGVtZW50SW1wbDo6U0VBUkNIKQotICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCo+KGlucHV0LT5yZW5kZXJlcigpKS0+
YWRkU2VhcmNoUmVzdWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24pIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5pc0Fj
dGl2YXRlZFN1Ym1pdCgpKSB7Ci0gICAgICAgICAgICAgICAgbmVlZEJ1dHRvbkFjdGl2YXRpb24g
PSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0
dG9uID09IDAgJiYgY3VycmVudC0+aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkpIHsKLSAgICAg
ICAgICAgICAgICBmaXJzdFN1Y2Nlc3NmdWxTdWJtaXRCdXR0b24gPSBjdXJyZW50OwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9u
ICYmIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBmaXJzdFN1Y2Nlc3Nm
dWxTdWJtaXRCdXR0b24tPnNldEFjdGl2YXRlZFN1Ym1pdCh0cnVlKTsKLSAgICB9Ci0KLSAgICBp
ZiAoIW1fcG9zdCkKLSAgICAgICAgbV9tdWx0aXBhcnQgPSBmYWxzZTsKLSAgICAKLSAgICBGb3Jt
RGF0YSBmb3JtX2RhdGE7Ci0gICAgaWYgKGZvcm1EYXRhKGZvcm1fZGF0YSkpIHsKLSAgICAgICAg
aWYobV9wb3N0KSB7Ci0gICAgICAgICAgICBmcmFtZS0+c3VibWl0Rm9ybSggInBvc3QiLCBtX3Vy
bC5xc3RyaW5nKCksIGZvcm1fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV90YXJnZXQucXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBlbmN0eXBlKCkucXN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBib3VuZGFyeSgpLnFzdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVs
c2UgewotICAgICAgICAgICAgZnJhbWUtPnN1Ym1pdEZvcm0oICJnZXQiLCBtX3VybC5xc3RyaW5n
KCksIGZvcm1fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90
YXJnZXQucXN0cmluZygpICk7CisgICAgLy8gZmluZCB0aGUgb3B0aW9uIHdpdGggdmFsdWUoKSBt
YXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVyCisgICAgLy8gYW5kIG1ha2UgaXQgdGhlIGN1cnJl
bnQgc2VsZWN0aW9uLgorICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxp
c3RJdGVtcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkr
KykKKyAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnZhbHVlKCkgPT0gdmFs
dWUpIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0
ZW1zW2ldKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAg
IH0KLSAgICB9Ci0KLSAgICBpZiAobmVlZEJ1dHRvbkFjdGl2YXRpb24gJiYgZmlyc3RTdWNjZXNz
ZnVsU3VibWl0QnV0dG9uKSB7Ci0gICAgICAgIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbi0+
c2V0QWN0aXZhdGVkU3VibWl0KGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgbV9kb2luZ3N1Ym1p
dCA9IG1faW5zdWJtaXQgPSBmYWxzZTsKIH0KIAotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpy
ZXNldCggICkKK1FTdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzdGF0ZSgpCiB7Ci0gICAg
RnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2lucmVzZXQg
fHwgIWZyYW1lKSByZXR1cm47Ci0KLSAgICBtX2lucmVzZXQgPSB0cnVlOworICAgIFFNZW1BcnJh
eTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwogCi0gICAgLy8gIyMjIERP
TTIgbGFiZWxzIHRoaXMgZXZlbnQgYXMgbm90IGNhbmNlbGFibGUsIGhvd2V2ZXIKLSAgICAvLyBj
b21tb24gYnJvd3NlcnMoIHNpY2shICkgYWxsb3cgaXQgYmUgY2FuY2VsbGVkLgotICAgIGlmICgg
IWRpc3BhdGNoSFRNTEV2ZW50KHJlc2V0RXZlbnQsdHJ1ZSwgdHJ1ZSkgKSB7Ci0gICAgICAgIG1f
aW5yZXNldCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIGludCBsID0gaXRl
bXMuY291bnQoKTsKIAotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMu
Y291bnQoKTsgKytpKQotICAgICAgICBmb3JtRWxlbWVudHNbaV0tPnJlc2V0KCk7CisgICAgUUNo
YXIgc3RhdGVDaGFyc1tsXTsKKyAgICAKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgbDsgaSsrKQor
ICAgICAgICBpZihpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nh
c3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQorICAgICAg
ICAgICAgc3RhdGVDaGFyc1tpXSA9ICdYJzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3Rh
dGVDaGFyc1tpXSA9ICcuJzsKKyAgICBRU3RyaW5nIHN0YXRlKHN0YXRlQ2hhcnMsIGwpOwogCi0g
ICAgbV9pbnJlc2V0ID0gZmFsc2U7CisgICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpzdGF0ZSgpICsgc3RhdGU7CiB9CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKK3ZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJl9zdGF0ZXMpCiB7Ci0g
ICAgaWYgKGF0dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyKSAKLSAgICB7Ci0gICAgICAgIGJvb2wg
b2xkVVJMV2FzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpOwot
ICAgICAgICBtX3VybCA9IGtodG1sOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAg
Ym9vbCBuZXdVUkxJc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJs
KTsKKyAgICBRU3RyaW5nIF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5k
TWF0Y2hpbmdTdGF0ZShfc3RhdGVzKTsKKyAgICBpZiAoX3N0YXRlLmlzTnVsbCgpKSByZXR1cm47
CiAKLSAgICAgICAgaWYgKG1fYXR0YWNoZWQgJiYgKG9sZFVSTFdhc1NlY3VyZSAhPSBuZXdVUkxJ
c1NlY3VyZSkpCi0gICAgICAgICAgICBpZiAobmV3VVJMSXNTZWN1cmUpCi0gICAgICAgICAgICAg
ICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybUFkZGVkKCk7Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2VjdXJlRm9ybVJlbW92ZWQoKTsKLSAgICB9
Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHRhcmdldEF0dHIpIHsKLSAgICAgICAgbV90
YXJnZXQgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1l
dGhvZEF0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCks
ICJwb3N0IikpCi0gICAgICAgICAgICBtX3Bvc3QgPSB0cnVlOwotICAgICAgICBlbHNlIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiZ2V0IikpCi0gICAgICAgICAgICBtX3Bv
c3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBlbmN0eXBlQXR0cikg
ewotICAgICAgICBwYXJzZUVuY3R5cGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYWNjZXB0X2NoYXJzZXRBdHRyKSB7Ci0gICAgICAgIC8vIHNwYWNlIHNl
cGFyYXRlZCBsaXN0IG9mIGNoYXJzZXRzIHRoZSBzZXJ2ZXIKLSAgICAgICAgLy8gYWNjZXB0cyAt
IHNlZSByZmMyMDQ1Ci0gICAgICAgIG1fYWNjZXB0Y2hhcnNldCA9IGF0dHItPnZhbHVlKCk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXB0QXR0cikgewotICAgICAgICAvLyBp
Z25vcmUgdGhpcyBvbmUgZm9yIHRoZSBtb21lbnQuLi4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2NvbXBsZXRlID0gIWVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbnN1Ym1pdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVu
ZXIoc3VibWl0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
cmVzZXRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHJlc2V0RXZlbnQsIGF0
dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAg
IERPTVN0cmluZyBuZXdOYW1lQXR0ciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChpbkRv
Y3VtZW50KCkgJiYgZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICAg
ICAgSFRNTERvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJ
bXBsICo+KGdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgZG9jdW1lbnQtPnJlbW92ZU5hbWVk
SXRlbShvbGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2N1bWVudC0+YWRkTmFtZWRJdGVtKG5l
d05hbWVBdHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lQXR0ciA9IG5ld05hbWVBdHRy
OwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmli
dXRlKGF0dHIpOwotfQorICAgIHJlY2FsY0xpc3RJdGVtcygpOwogCi10ZW1wbGF0ZTxjbGFzcyBU
PiBzdGF0aWMgdm9pZCBpbnNlcnRJbnRvVmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgdW5zaWdu
ZWQgcG9zLCBUKiBpdGVtKQotewotICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6ZSgpOwotICAg
IHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgYXNzZXJ0KHBvcyA8PSBjb3VudCk7
Ci0gICAgaWYgKHNpemUgPT0gY291bnQpCi0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8g
OCA6IHNpemUgKiAzIC8gMik7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gY291bnQ7IGkgPiBwb3M7
IC0taSkKLSAgICAgICAgdmVjLmluc2VydChpLCB2ZWNbaSAtIDFdKTsgICAgCi0gICAgdmVjLmlu
c2VydChwb3MsIGl0ZW0pOwotfQorICAgIFFTdHJpbmcgc3RhdGUgPSBfc3RhdGU7CisgICAgaWYo
IXN0YXRlLmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gnKSAmJiAhbV9tdWx0aXBsZSkg
eworICAgICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4gaW4gcmVzdG9yZVN0YXRlISIp
OworICAgICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLiBT
aG91bGQgbmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgorICAgICAgICAvL3N0YXRlWzBdID0gJ1gnOwor
ICAgIH0KIAotdGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIHZvaWQgYXBwZW5kVG9WZWN0b3IoUVB0
clZlY3RvcjxUPiAmdmVjLCBUICppdGVtKQotewotICAgIHVuc2lnbmVkIHNpemUgPSB2ZWMuc2l6
ZSgpOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgaWYgKHNpemUgPT0g
Y291bnQpCi0gICAgICAgIHZlYy5yZXNpemUoc2l6ZSA9PSAwID8gOCA6IHNpemUgKiAzIC8gMik7
Ci0gICAgdmVjLmluc2VydChjb3VudCwgaXRlbSk7Ci19CisgICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7CiAKLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRp
YyB2b2lkIHJlbW92ZUZyb21WZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCBUICppdGVtKQotewot
ICAgIGludCBwb3MgPSB2ZWMuZmluZFJlZihpdGVtKTsKLSAgICBpZiAocG9zIDwgMCkKLSAgICAg
ICAgcmV0dXJuOwotICAgIHVuc2lnbmVkIGNvdW50ID0gdmVjLmNvdW50KCk7Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gcG9zOyBpIDwgY291bnQgLSAxOyArK2kpCi0gICAgICAgIHZlYy5pbnNlcnQo
aSwgdmVjW2kgKyAxXSk7Ci0gICAgdmVjLnJlbW92ZShjb3VudCAtIDEpOwotfQotCi11bnNpZ25l
ZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudEluZGV4KEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsICplKQotewotICAgIC8vIENoZWNrIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZXJl
IHRoaXMgZWxlbWVudCBpcyB0aGUgdmVyeSBsYXN0IHRoaW5nIGluCi0gICAgLy8gdGhlIGZvcm0n
cyB0cmVlIG9mIGNoaWxkcmVuOyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhlIGVudGlyZSB0cmVl
IGluIHRoYXQKLSAgICAvLyBjb21tb24gY2FzZSB0aGF0IG9jY3VycyBkdXJpbmcgcGFyc2luZzsg
aW5zdGVhZCB3ZSdsbCBqdXN0IHJldHVybiBhIHZhbHVlCi0gICAgLy8gdGhhdCBzYXlzICJhZGQg
dGhpcyBmb3JtIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkiLgotICAgIGlmIChlLT50
cmF2ZXJzZU5leHROb2RlKHRoaXMpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAg
ICBmb3IgKE5vZGVJbXBsICpub2RlID0gdGhpczsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNl
TmV4dE5vZGUodGhpcykpIHsKLSAgICAgICAgICAgIGlmIChub2RlID09IGUpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpCi0g
ICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2Rl
KS0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0aWNf
Y2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqPihub2RlKS0+Zm9ybSgpID09IHRoaXMp
Ci0gICAgICAgICAgICAgICAgKytpOworICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKKyAgICBm
b3IoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2Nh
bE5hbWUob3B0aW9uVGFnKSkgeworICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBv
ZSA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKKyAgICAg
ICAgICAgIG9lLT5zZXRTZWxlY3RlZChzdGF0ZVtpXSA9PSAnWCcpOwogICAgICAgICB9CiAgICAg
fQotICAgIHJldHVybiBmb3JtRWxlbWVudHMuY291bnQoKTsKKyAgICBzZXRDaGFuZ2VkKHRydWUp
OwogfQogCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlZ2lzdGVyRm9ybUVsZW1lbnQoSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKmUpCitOb2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICkKIHsKLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERv
Y3VtZW50KCk7Ci0gICAgaWYgKGRvYyAmJiBlLT5pc1JhZGlvQnV0dG9uKCkgJiYgIWUtPm5hbWUo
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwqIGN1cnJl
bnRDaGVja2VkUmFkaW8gPSBkb2MtPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKGUtPm5hbWUo
KS5pbXBsKCksIChIVE1MRm9ybUVsZW1lbnRJbXBsKikgMCk7Ci0gICAgICAgIGlmIChjdXJyZW50
Q2hlY2tlZFJhZGlvID09IGUpCi0gICAgICAgICAgICBkb2MtPnJlbW92ZVJhZGlvQnV0dG9uR3Jv
dXAoZS0+bmFtZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxlbWVudEltcGwqKSAwKTsKLSAgICAgICAg
aWYgKGUtPmlzQ2hlY2tlZCgpKQotICAgICAgICAgICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQo
KEhUTUxJbnB1dEVsZW1lbnRJbXBsKikgZSwgdGhpcyk7Ci0gICAgfQotICAgIGluc2VydEludG9W
ZWN0b3IoZm9ybUVsZW1lbnRzLCBmb3JtRWxlbWVudEluZGV4KGUpLCBlKTsKKyAgICBOb2RlSW1w
bCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdD
aGlsZCxyZWZDaGlsZCwgZXhjZXB0aW9uY29kZSApOworICAgIGlmICghZXhjZXB0aW9uY29kZSkK
KyAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAot
dm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbCAqZSkKK05vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlcGxh
Y2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKQogewotICAgIGlmICghZS0+bmFtZSgpLmlzRW1wdHkoKSAmJiBnZXREb2N1
bWVudCgpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50Q2hl
Y2tlZFJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoZS0+
bmFtZSgpLmltcGwoKSwgdGhpcyk7Ci0gICAgICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvID09
IGUpCi0gICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKGUt
Pm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAgIH0KLSAgICByZW1vdmVGcm9tVmVjdG9yKGZvcm1F
bGVtZW50cywgZSk7CisgICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpyZXBsYWNlQ2hpbGQobmV3Q2hpbGQsb2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwor
ICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCisgICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwor
ICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6aXNVUkxB
dHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3QKK05vZGVJbXBsICpIVE1MU2VsZWN0
RWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKQogewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gYWN0aW9uQXR0cjsKKyAg
ICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNo
aWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKKyAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQor
ICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi12
b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VFbGVt
ZW50SW1wbCAqZSkKK05vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFwcGVuZENoaWxk
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQogewotICAgIGFwcGVu
ZFRvVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKKyAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2Rl
KTsKKyAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQorICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMo
KTsKKyAgICBzZXRDaGFuZ2VkKHRydWUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXZvaWQg
SFRNTEZvcm1FbGVtZW50SW1wbDo6cmVtb3ZlSW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1w
bCAqZSkKK05vZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBs
KiBuZXdDaGlsZCkKIHsKLSAgICByZW1vdmVGcm9tVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKKyAg
ICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKKyAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKIH0KIAotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1w
bD4gSFRNTEZvcm1FbGVtZW50SW1wbDo6ZWxlbWVudHMoKQordm9pZCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCiB7
Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MRm9ybUNvbGxl
Y3Rpb25JbXBsKHRoaXMpKTsKKyAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNpemVBdHRyKSB7Cisg
ICAgICAgIG1fc2l6ZSA9IGtNYXgoYXR0ci0+dmFsdWUoKS50b0ludCgpLCAxKTsKKyAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKKyAgICAgICAgbV9taW53aWR0aCA9
IGtNYXgoIGF0dHItPnZhbHVlKCkudG9JbnQoKSwgMCApOworICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG11bHRpcGxlQXR0cikgeworICAgICAgICBtX211bHRpcGxlID0gKCFhdHRyLT5p
c051bGwoKSk7CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikg
eworICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50CisgICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKKyAgICAgICAgc2V0SFRNTEV2ZW50TGlz
dGVuZXIoZm9jdXNFdmVudCwgYXR0cik7CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25ibHVyQXR0cikgeworICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0
dHIpOworICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uY2hhbmdlQXR0cikgeworICAg
ICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwgYXR0cik7CisgICAgfSBlbHNl
CisgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShhdHRyKTsKIH0KIAotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om5hbWUoKSBjb25z
dAorUmVuZGVyT2JqZWN0ICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQogewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUobmFtZUF0dHIpOworICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTZWxlY3Qo
dGhpcyk7CiB9CiAKLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0TmFtZShjb25zdCBET01T
dHJpbmcgJnZhbHVlKQorYm9vbCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRh
KEZvcm1EYXRhTGlzdCYgZW5jb2RlZF92YWx1ZXMsIGJvb2wpCiB7Ci0gICAgc2V0QXR0cmlidXRl
KG5hbWVBdHRyLCB2YWx1ZSk7Ci19CisgICAgYm9vbCBzdWNjZXNzZnVsID0gZmFsc2U7CisgICAg
UU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7CiAKLURPTVN0
cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjphY2NlcHRDaGFyc2V0KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2VwdF9jaGFyc2V0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6c2V0QWNjZXB0Q2hhcnNldChjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShhY2NlcHRfY2hhcnNldEF0dHIsIHZhbHVlKTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6OmFjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhY3Rpb25BdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpzZXRBY3Rpb24oY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
YWN0aW9uQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEVu
Y3R5cGUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZW5jdHlw
ZUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om1ldGhv
ZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShtZXRob2RBdHRyKTsKLX0KLQot
dm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobWV0aG9kQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJp
bmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6dGFyZ2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHRhcmdldEF0dHIpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNl
dFRhcmdldChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh0YXJn
ZXRBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGw6OkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
KQotICAgIDogSFRNTEVsZW1lbnRJbXBsKHRhZ05hbWUsIGRvYykKLXsKLSAgICBtX2Rpc2FibGVk
ID0gbV9yZWFkT25seSA9IGZhbHNlOwotCi0gICAgaWYgKGYpCi0JbV9mb3JtID0gZjsKLSAgICBl
bHNlCi0JbV9mb3JtID0gZ2V0Rm9ybSgpOwotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1fZm9y
bS0+cmVnaXN0ZXJGb3JtRWxlbWVudCh0aGlzKTsKLX0KLQotSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6On5IVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKG1fZm9ybSkK
LSAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxlbWVudCh0aGlzKTsKLX0KLQotdm9pZCBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0g
ICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZGlz
YWJsZWRBdHRyKSB7Ci0gICAgICAgIGJvb2wgb2xkRGlzYWJsZWQgPSBtX2Rpc2FibGVkOwotICAg
ICAgICBtX2Rpc2FibGVkID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICBpZiAob2xkRGlzYWJs
ZWQgIT0gbV9kaXNhYmxlZCkgewotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICAg
ICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgp
KQotICAgICAgICAgICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBFbmFi
bGVkU3RhdGUpOworICAgIHVpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgp
OyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkg
eworICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7CisgICAgICAgICAgICBpZiAob3B0
aW9uLT5zZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5k
RGF0YShuYW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7CisgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1
bCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSByZWFkb25seUF0dHIpIHsKLSAgICAgICAgYm9vbCBvbGRSZWFkT25seSA9IG1f
cmVhZE9ubHk7Ci0gICAgICAgIG1fcmVhZE9ubHkgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAg
IGlmIChvbGRSZWFkT25seSAhPSBtX3JlYWRPbmx5KSBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19
Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgYXNz
ZXJ0KCFhdHRhY2hlZCgpKTsKLQotICAgIEhUTUxFbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAg
ICAvLyBUaGUgY2FsbCB0byB1cGRhdGVGcm9tRWxlbWVudCgpIG5lZWRzIHRvIGdvIGFmdGVyIHRo
ZSBjYWxsIHRocm91Z2gKLSAgICAvLyB0byB0aGUgYmFzZSBjbGFzcydzIGF0dGFjaCgpIGJlY2F1
c2UgdGhhdCBjYW4gc29tZXRpbWVzIGRvIGEgY2xvc2UKLSAgICAvLyBvbiB0aGUgcmVuZGVyZXIu
Ci0gICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxlbWVu
dCgpOwotICAgIAotICAgICAgICAvLyBEZWxheWVkIGF0dGFjaG1lbnQgaW4gb3JkZXIgdG8gcHJl
dmVudCBGT1VDIGNhbiByZXN1bHQgaW4gYW4gb2JqZWN0IGJlaW5nCi0gICAgICAgIC8vIHByb2dy
YW1tYXRpY2FsbHkgZm9jdXNlZCBiZWZvcmUgaXQgaGFzIGEgcmVuZGVyIG9iamVjdC4gIElmIHdl
IGhhdmUgYmVlbiBmb2N1c2VkCi0gICAgICAgIC8vIChpLmUuLCBpZiB3ZSBhcmUgdGhlIGZvY3Vz
Tm9kZSkgdGhlbiBnbyBhaGVhZCBhbmQgZm9jdXMgb3VyIGNvcnJlc3BvbmRpbmcgbmF0aXZlIHdp
ZGdldC4KLSAgICAgICAgLy8gKEF0dGFjaC9kZXRhY2ggY2FuIGFsc28gaGFwcGVuIGFzIGEgcmVz
dWx0IG9mIGRpc3BsYXkgdHlwZSBjaGFuZ2VzLCBlLmcuLCBtYWtpbmcgYSB3aWRnZXQKLSAgICAg
ICAgLy8gYmxvY2sgaW5zdGVhZCBvZiBpbmxpbmUsIGFuZCBmb2N1cyBzaG91bGQgYmUgcmVzdG9y
ZWQgaW4gdGhhdCBjYXNlIGFzIHdlbGwuKQotICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Zm9j
dXNOb2RlKCkgPT0gdGhpcyAmJiBtX3JlbmRlci0+aXNXaWRnZXQoKSAmJiAKLSAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRnZXQoKSkKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKCkpLT53aWRnZXQoKS0+
c2V0Rm9jdXMoKTsKICAgICB9Ci19CiAKLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQotewotICAgIGlmICghbV9mb3JtKSB7Ci0gICAg
ICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBhIG5ldyBmb3JtIGVsZW1lbnQgYmVpbmcg
Y3JlYXRlZCBieQotICAgICAgICAvLyBKYXZhU2NyaXB0IGFuZCBpbnNlcnRlZCBpbnNpZGUgYSBm
b3JtLiAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhcnNlcgotICAgICAgICAvLyBzZXR0aW5nIGEgZm9y
bSwgd2Ugd2lsbCBhbHJlYWR5IGhhdmUgYSBub24tbnVsbCB2YWx1ZSBmb3IgbV9mb3JtLCAKLSAg
ICAgICAgLy8gYW5kIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gICAgICAgIG1f
Zm9ybSA9IGdldEZvcm0oKTsKLQlpZiAobV9mb3JtKQotCSAgICBtX2Zvcm0tPnJlZ2lzdGVyRm9y
bUVsZW1lbnQodGhpcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgRG9jdW1lbnRJbXBs
ICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgICAgICAgICAgaWYgKGRvYyAmJiBpc1JhZGlvQnV0
dG9uKCkgJiYgIW5hbWUoKS5pc0VtcHR5KCkgJiYgaXNDaGVja2VkKCkpCi0gICAgICAgICAgICAg
ICAgZG9jLT5yYWRpb0J1dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJbXBsKil0aGlzLCBt
X2Zvcm0pOwotICAgICAgICB9CisgICAgLy8gIyMjIHRoaXMgY2FzZSBzaG91bGQgbm90IGhhcHBl
bi4gbWFrZSBzdXJlIHRoYXQgd2Ugc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24KKyAgICAvLyBpbiBh
bnkgY2FzZS4gb3RoZXJ3aXNlIHdlIGhhdmUgbm8gY29uc2lzdGVuY3kgd2l0aCB0aGUgRE9NIGlu
dGVyZmFjZS4gRklYTUUhCisgICAgLy8gd2UgcmV0dXJuIHRoZSBmaXJzdCBvbmUgaWYgaXQgd2Fz
IGEgY29tYm9ib3ggc2VsZWN0CisgICAgaWYgKCFzdWNjZXNzZnVsICYmICFtX211bHRpcGxlICYm
IG1fc2l6ZSA8PSAxICYmIGl0ZW1zLnNpemUoKSAmJgorICAgICAgICAoaXRlbXNbMF0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKSkgeworICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9w
dGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zWzBdKTsKKyAg
ICAgICAgaWYgKG9wdGlvbi0+dmFsdWUoKS5pc051bGwoKSkKKyAgICAgICAgICAgIGVuY29kZWRf
dmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnRleHQoKS5xc3RyaW5nKCkuc3RyaXBX
aGl0ZVNwYWNlKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5h
cHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKKyAgICAgICAgc3VjY2Vzc2Z1bCA9
IHRydWU7CiAgICAgfQogCi0gICAgSFRNTEVsZW1lbnRJbXBsOjppbnNlcnRlZEludG9UcmVlKGRl
ZXApOworICAgIHJldHVybiBzdWNjZXNzZnVsOwogfQogCi12b2lkIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsOjpyZW1vdmVkRnJvbVRyZWUoYm9vbCBkZWVwKQoraW50IEhUTUxTZWxlY3RFbGVt
ZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5kZXgoaW50IG9wdGlvbkluZGV4KSBjb25zdAogewotICAg
IC8vIFdoZW4gYmVpbmcgcmVtb3ZlZCB3ZSBoYXZlIHRvIHBvc3NpYmx5IG51bGwgb3V0IG91ciBm
b3JtIGFuZCByZW1vdmUgb3Vyc2VsdmVzIGZyb20KLSAgICAvLyB0aGUgZm9ybSdzIGxpc3Qgb2Yg
ZWxlbWVudHMuCi0gICAgaWYgKG1fZm9ybSkgewotICAgICAgICAvLyBBdHRlbXB0IHRvIHJlLWFj
cXVpcmUgdGhlIGZvcm0uICBJZiB3ZSBjYW4ndCByZS1hY3F1aXJlLCB0aGVuCi0gICAgICAgIC8v
IHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgZm9ybS4KLSAgICAgICAgTm9kZUltcGwqIGZvcm0g
PSBwYXJlbnROb2RlKCk7Ci0gICAgICAgIE5vZGVJbXBsKiByb290ID0gdGhpczsKLSAgICAgICAg
d2hpbGUgKGZvcm0pIHsKLSAgICAgICAgICAgIGlmIChmb3JtLT5oYXNUYWdOYW1lKGZvcm1UYWcp
KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcm9vdCA9IGZvcm07Ci0gICAg
ICAgICAgICBmb3JtID0gZm9ybS0+cGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICAvLyBJZiB0aGUgZm9ybSBoYXMgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiwgdGhlbiB3
ZSB3b24ndCBmaW5kIGl0IGFzIGFuIGFuY2VzdG9yLgotICAgICAgICAvLyBDaGVjayB0byBzZWUg
aWYgdGhlIHJvb3Qgbm9kZSBvZiBvdXIgY3VycmVudCBmb3JtIGFuZCBvdXIgcm9vdCBub2RlCi0g
ICAgICAgIC8vIG1hdGNoLiAgSWYgc28sIHByZXNlcnZlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBm
b3JtLgotICAgICAgICBpZiAoIWZvcm0pIHsKLSAgICAgICAgICAgIE5vZGVJbXBsKiBmb3JtUm9v
dCA9IG1fZm9ybTsKLSAgICAgICAgICAgIHdoaWxlIChmb3JtUm9vdC0+cGFyZW50KCkpIGZvcm1S
b290ID0gZm9ybVJvb3QtPnBhcmVudCgpOwotICAgICAgICAgICAgaWYgKGZvcm1Sb290ID09IHJv
b3QpCi0gICAgICAgICAgICAgICAgZm9ybSA9IG1fZm9ybTsKLSAgICAgICAgfSAKLSAgICAgICAg
Ci0gICAgICAgIGlmICghZm9ybSkgewotICAgICAgICAgICAgbV9mb3JtLT5yZW1vdmVGb3JtRWxl
bWVudCh0aGlzKTsKLSAgICAgICAgICAgIG1fZm9ybSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAg
ICAgICAgICAgYXNzZXJ0KGZvcm0gPT0gbV9mb3JtKTsgLy8gVGhlIHJlLWFjcXVpcmVkIGZvcm0g
c2hvdWxkIGJlIHRoZSBzYW1lLiBJZiBub3QsIHNvbWV0aGluZyByZWFsbHkgc3RyYW5nZSBoYXBw
ZW5lZC4KLSAgICB9Ci0gICAKLSAgICBIVE1MRWxlbWVudEltcGw6OnJlbW92ZWRGcm9tVHJlZShk
ZWVwKTsKLX0KKyAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRl
bXMoKTsKKyAgICBpZiAob3B0aW9uSW5kZXggPCAwIHx8IG9wdGlvbkluZGV4ID49IGludChpdGVt
cy5zaXplKCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLUhUTUxGb3JtRWxlbWVudEltcGwgKkhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpnZXRGb3JtKCkgY29uc3QKLXsKLSAgICBOb2RlSW1w
bCAqcCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZShwKSB7Ci0gICAgICAgIGlmIChwLT5oYXNU
YWdOYW1lKGZvcm1UYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3Jt
RWxlbWVudEltcGwgKj4ocCk7Ci0gICAgICAgIHAgPSBwLT5wYXJlbnROb2RlKCk7CisgICAgaW50
IGxpc3RJbmRleCA9IDA7CisgICAgaW50IG9wdGlvbkluZGV4MiA9IDA7CisgICAgZm9yICg7Cisg
ICAgICAgICBvcHRpb25JbmRleDIgPCBpbnQoaXRlbXMuc2l6ZSgpKSAmJiBvcHRpb25JbmRleDIg
PD0gb3B0aW9uSW5kZXg7CisgICAgICAgICBsaXN0SW5kZXgrKykgeyAvLyBub3QgYSB0eXBvIQor
ICAgICAgICBpZiAoaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCisg
ICAgICAgICAgICBvcHRpb25JbmRleDIrKzsKICAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURP
TVN0cmluZyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAg
RE9NU3RyaW5nIG4gPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIHJldHVybiBuLmlzTnVs
bCgpID8gIiIgOiBuOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRO
YW1lKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5hbWVBdHRy
LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uU2VsZWN0
KCkKLXsKLSAgICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJj
aGl0ZWN0dXJlCi0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoc2VsZWN0RXZlbnQsdHJ1ZSxmYWxzZSk7
Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Om9uQ2hhbmdlKCkKLXsKLSAg
ICAvLyAjIyMgbWFrZSB0aGlzIHdvcmsgd2l0aCBuZXcgZm9ybSBldmVudHMgYXJjaGl0ZWN0dXJl
Ci0gICAgZGlzcGF0Y2hIVE1MRXZlbnQoY2hhbmdlRXZlbnQsdHJ1ZSxmYWxzZSk7Ci19Ci0KLWJv
b2wgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV9kaXNhYmxlZDsKLX0KLQotdm9pZCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
c2V0RGlzYWJsZWQoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShkaXNhYmxlZEF0dHIsIGIg
PyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzZXRSZWFk
T25seShib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0ciwgYiA/ICIiIDog
MCk7Ci19Ci0KLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBT
dHlsZUNoYW5nZSBjaCApCi17Ci0gICAgLy9ib29sIGNoYW5nZWQgPSBjaGFuZ2VkKCk7Ci0gICAg
SFRNTEVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2ggKTsKLQotICAgIGlmIChtX3JlbmRlciAv
KiYmIGNoYW5nZWQqLykKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Cisg
ICAgbGlzdEluZGV4LS07CisgICAgcmV0dXJuIGxpc3RJbmRleDsKIH0KIAotYm9vbCBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAoraW50IEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6bGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3QKIHsKLSAg
ICBpZiAoZGlzYWJsZWQoKSB8fCAhbV9yZW5kZXIgfHwgCi0gICAgICAgIChtX3JlbmRlci0+c3R5
bGUoKSAmJiBtX3JlbmRlci0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpIHx8IAot
ICAgICAgICBtX3JlbmRlci0+d2lkdGgoKSA9PSAwIHx8IG1fcmVuZGVyLT5oZWlnaHQoKSA9PSAw
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19CisgICAgUU1lbUFy
cmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7CisgICAgaWYgKGxpc3RJ
bmRleCA8IDAgfHwgbGlzdEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8CisgICAgICAgICFp
dGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKKyAgICAgICAgcmV0dXJu
IC0xOwogCi1ib29sIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppc0tleWJvYXJkRm9jdXNh
YmxlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAgICBpZiAobV9y
ZW5kZXItPmlzV2lkZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5k
ZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpICYmCi0gICAgICAgICAgICAgICAgKHN0YXRp
Y19jYXN0PFJlbmRlcldpZGdldCo+KG1fcmVuZGVyKS0+d2lkZ2V0KCktPmZvY3VzUG9saWN5KCkg
JiBRV2lkZ2V0OjpUYWJGb2N1cyk7Ci0gICAgICAgIH0KLQlpZiAoZ2V0RG9jdW1lbnQoKS0+ZnJh
bWUoKSkKLQkgICAgcmV0dXJuIGdldERvY3VtZW50KCktPmZyYW1lKCktPnRhYnNUb0FsbENvbnRy
b2xzKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICBpbnQgb3B0aW9uSW5kZXggPSAw
OyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9uIG5vdCBjb3VudGluZyBPUFRHUk9VUCBlbnRyaWVz
IHRoYXQgbWF5IGJlIGluIGxpc3QKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGlz
dEluZGV4OyBpKyspCisgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRh
ZykpCisgICAgICAgICAgICBvcHRpb25JbmRleCsrOworICAgIHJldHVybiBvcHRpb25JbmRleDsK
IH0KIAotYm9vbCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6aXNNb3VzZUZvY3VzYWJsZSgp
IGNvbnN0CisvLyBGSVhNRSA0MTk3OTk3OiB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBwdWJs
aWMgQVBJIC1bRE9NSFRNTFNlbGVjdEVsZW1lbnQgb3B0aW9uc10sIGJ1dCBhbHdheXMgcmV0dXJu
cworLy8gYW4gZW1wdHkgbGlzdC4KK0hUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgKkhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6b3B0aW9ucygpCiB7Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAg
ICAgICAgaWYgKG1fcmVuZGVyLT5pc1dpZGdldCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obV9yZW5kZXIpLT53aWRnZXQoKSAmJgotICAgICAgICAg
ICAgICAgIChzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPihtX3JlbmRlciktPndpZGdldCgpLT5m
b2N1c1BvbGljeSgpICYgUVdpZGdldDo6Q2xpY2tGb2N1cyk7Ci0gICAgICAgIH0KLSAgICAgICAg
Ly8gRm9yIDxpbnB1dCB0eXBlPWltYWdlPiBhbmQgPGJ1dHRvbj4sIHdlIHdpbGwgYXNzdW1lIG5v
IG1vdXNlIGZvY3VzYWJpbGl0eS4gIFRoaXMgaXMKLSAgICAgICAgLy8gY29uc2lzdGVudCB3aXRo
IE9TIFggYmVoYXZpb3IgZm9yIGJ1dHRvbnMuCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoIW1fb3B0aW9ucykgeworICAgICAgICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbCh0aGlzKTsKKyAgICAgICAgbV9vcHRpb25zLT5yZWYoKTsKICAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtX29wdGlvbnM7CiB9CiAKLWJvb2wgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQorLy8gRklYTUU6IERlbGV0ZSBvbmNlIHRo
ZSBhYm92ZSBmdW5jdGlvbiBpcyB3b3JraW5nIHdlbGwgZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4K
K1JlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9u
c0hUTUxDb2xsZWN0aW9uKCkKIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIFJlZlB0
cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENv
bGxlY3Rpb25JbXBsOjpTRUxFQ1RfT1BUSU9OUykpOwogfQogCi0vLyBTcGVjaWFsIGNoYXJzIHVz
ZWQgdG8gZW5jb2RlIGZvcm0gc3RhdGUgc3RyaW5ncy4KLS8vIFdlIHBpY2sgY2hhcnMgdGhhdCBh
cmUgdW5saWtlbHkgdG8gYmUgdXNlZCBpbiBhbiBIVE1MIGF0dHIsIHNvIHdlIHJhcmVseSBoYXZl
IHRvIHJlYWxseSBlbmNvZGUuCi1jb25zdCBjaGFyIHN0YXRlU2VwYXJhdG9yID0gJyYnOwotY29u
c3QgY2hhciBzdGF0ZUVzY2FwZSA9ICc8JzsKLXN0YXRpYyBjb25zdCBjaGFyIHN0YXRlU2VwYXJh
dG9yTWFya2VyW10gPSAiPEEiOwotc3RhdGljIGNvbnN0IGNoYXIgc3RhdGVFc2NhcGVNYXJrZXJb
XSA9ICI8PCI7Ci0KLS8vIEVuY29kZSBhbiBlbGVtZW50IG5hbWUgc28gd2UgY2FuIHB1dCBpdCBp
biBhIHN0YXRlIHN0cmluZyB3aXRob3V0IGNvbGxpZGluZwotLy8gd2l0aCBvdXIgc2VwYXJhdG9y
IGNoYXIuCi1zdGF0aWMgUVN0cmluZyBlbmNvZGVkRWxlbWVudE5hbWUoUVN0cmluZyBzdHIpCit2
b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVjYWxjTGlzdEl0ZW1zKCkKIHsKLSAgICBpbnQg
c2VwTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IpOwotICAgIGludCBlc2NMb2MgPSBzdHIu
ZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAgaWYgKHNlcExvYyA+PSAwIHx8IGVzY0xvYyA+PSAw
KSB7Ci0gICAgICAgIFFTdHJpbmcgbmV3U3RyID0gc3RyOwotICAgICAgICAvLyAgIHJlcGxhY2Ug
IjwiIHdpdGggIjw8IgotICAgICAgICB3aGlsZSAoZXNjTG9jID49IDApIHsKLSAgICAgICAgICAg
IG5ld1N0ci5yZXBsYWNlKGVzY0xvYywgMSwgc3RhdGVFc2NhcGVNYXJrZXIpOwotICAgICAgICAg
ICAgZXNjTG9jID0gc3RyLmZpbmQoc3RhdGVTZXBhcmF0b3IsIGVzY0xvYysxKTsKKyAgICBOb2Rl
SW1wbCogY3VycmVudCA9IGZpcnN0Q2hpbGQoKTsKKyAgICBtX2xpc3RJdGVtcy5yZXNpemUoMCk7
CisgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKiBmb3VuZFNlbGVjdGVkID0gMDsKKyAgICB3aGls
ZShjdXJyZW50KSB7CisgICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFn
KSAmJiBjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKKyAgICAgICAgICAgIC8vICMjIyB3aGF0IGlm
IG9wdGdyb3VwIGNvbnRhaW5zIGp1c3QgY29tbWVudHM/IGRvbid0IHdhbnQgb25lIG9mIG5vIG9w
dGlvbnMgaW4gaXQuLi4KKyAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVt
cy5zaXplKCkrMSk7CisgICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCkt
MV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsKKyAgICAgICAgICAg
IGN1cnJlbnQgPSBjdXJyZW50LT5maXJzdENoaWxkKCk7CiAgICAgICAgIH0KLSAgICAgICAgLy8g
ICByZXBsYWNlICImIiB3aXRoICI8QSIKLSAgICAgICAgd2hpbGUgKHNlcExvYyA+PSAwKSB7Ci0g
ICAgICAgICAgICBuZXdTdHIucmVwbGFjZShzZXBMb2MsIDEsIHN0YXRlU2VwYXJhdG9yTWFya2Vy
KTsKLSAgICAgICAgICAgIHNlcExvYyA9IHN0ci5maW5kKHN0YXRlU2VwYXJhdG9yLCBzZXBMb2Mr
MSk7CisgICAgICAgIGlmIChjdXJyZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKKyAgICAg
ICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7CisgICAgICAg
ICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1M
RWxlbWVudEltcGwqPihjdXJyZW50KTsKKyAgICAgICAgICAgIGlmICghZm91bmRTZWxlY3RlZCAm
JiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSkgeworICAgICAgICAgICAgICAgIGZvdW5kU2Vs
ZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKKyAg
ICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUg
JiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCktPnNlbGVjdGVk
KCkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGN1cnJlbnQpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAg
IHJldHVybiBuZXdTdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9
Ci19Ci0KLVFTdHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0g
ICAgLy8gQnVpbGQgYSBzdHJpbmcgdGhhdCBjb250YWlucyBFbGVtZW50TmFtZSZFbGVtZW50VHlw
ZSYKLSAgICByZXR1cm4gZW5jb2RlZEVsZW1lbnROYW1lKG5hbWUoKS5xc3RyaW5nKCkpICsgc3Rh
dGVTZXBhcmF0b3IgKyB0eXBlKCkucXN0cmluZygpICsgc3RhdGVTZXBhcmF0b3I7Ci19Ci0KLVFT
dHJpbmcgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRjaGluZ1N0YXRlKFFTdHJp
bmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgUVN0cmluZyBlbmNOYW1lID0gZW5jb2RlZEVsZW1lbnRO
YW1lKG5hbWUoKS5xc3RyaW5nKCkpOwotICAgIFFTdHJpbmcgdHlwZVN0ciA9IHR5cGUoKS5xc3Ry
aW5nKCk7Ci0gICAgZm9yIChRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQgPSBzdGF0ZXMuYmVnaW4o
KTsgaXQgIT0gc3RhdGVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFFTdHJpbmcgc3RhdGUgPSAq
aXQ7Ci0gICAgICAgIGludCBzZXAxID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvcik7Ci0gICAg
ICAgIGludCBzZXAyID0gc3RhdGUuZmluZChzdGF0ZVNlcGFyYXRvciwgc2VwMSsxKTsKLSAgICAg
ICAgYXNzZXJ0KHNlcDEgPj0gMCk7Ci0gICAgICAgIGFzc2VydChzZXAyID49IDApOwotCi0gICAg
ICAgIFFTdHJpbmcgbmFtZUFuZFR5cGUgPSBzdGF0ZS5sZWZ0KHNlcDIpOwotICAgICAgICBpZiAo
ZW5jTmFtZS5sZW5ndGgoKSArIHR5cGVTdHIubGVuZ3RoKCkgKyAxID09ICh1aW50KXNlcDIKLSAg
ICAgICAgICAgICYmIG5hbWVBbmRUeXBlLnN0YXJ0c1dpdGgoZW5jTmFtZSkKLSAgICAgICAgICAg
ICYmIG5hbWVBbmRUeXBlLmVuZHNXaXRoKHR5cGVTdHIpKQotICAgICAgICB7Ci0gICAgICAgICAg
ICBzdGF0ZXMucmVtb3ZlKGl0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5taWQoc2VwMisx
KTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUoaHJUYWcpKSB7CisgICAgICAgICAg
ICBtX2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOworICAgICAgICAgICAg
bV9saXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1l
bnRJbXBsKj4oY3VycmVudCk7CisgICAgICAgIH0KKyAgICAgICAgTm9kZUltcGwgKnBhcmVudCA9
IGN1cnJlbnQtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHRT
aWJsaW5nKCk7CisgICAgICAgIGlmICghY3VycmVudCkgeworICAgICAgICAgICAgaWYgKHBhcmVu
dCAhPSB0aGlzKQorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQtPm5leHRTaWJsaW5n
KCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFFTdHJpbmc6Om51bGw7Ci19Ci0KLWlu
dCBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6dGFiSW5kZXgoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUodGFiaW5kZXhBdHRyKS50b0ludCgpOworICAgIG1fcmVjYWxjTGlz
dEl0ZW1zID0gZmFsc2U7CiB9CiAKLXZvaWQgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnNl
dFRhYkluZGV4KGludCB2YWx1ZSkKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpjaGlsZHJl
bkNoYW5nZWQoKQogewotICAgIHNldEF0dHJpYnV0ZSh0YWJpbmRleEF0dHIsIFFTdHJpbmc6Om51
bWJlcih2YWx1ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc2V0UmVjYWxjTGlz
dEl0ZW1zKCk7CiAKLUhUTUxCdXR0b25FbGVtZW50SW1wbDo6SFRNTEJ1dHRvbkVsZW1lbnRJbXBs
KERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwoYnV0dG9uVGFnLCBkb2MsIGYpCi17Ci0gICAgbV90eXBlID0g
U1VCTUlUOwotICAgIG1fZGlydHkgPSB0cnVlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7
CisgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpOwogfQog
Ci1IVE1MQnV0dG9uRWxlbWVudEltcGw6On5IVE1MQnV0dG9uRWxlbWVudEltcGwoKQordm9pZCBI
VE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygpCiB7CisgICAgbV9yZWNh
bGNMaXN0SXRlbXMgPSB0cnVlOworICAgIGlmIChtX3JlbmRlcikKKyAgICAgICAgc3RhdGljX2Nh
c3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1
ZSk7CisgICAgc2V0Q2hhbmdlZCgpOwogfQogCi1SZW5kZXJPYmplY3QqIEhUTUxCdXR0b25FbGVt
ZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5kZXJTdHlsZSog
c3R5bGUpCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cmVzZXQoKQogewotICAgIHJldHVy
biBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhpcyk7CisgICAgUU1lbUFycmF5PEhUTUxFbGVt
ZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7CisgICAgdWludCBpOworICAgIGZvciAoaSA9
IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xv
Y2FsTmFtZShvcHRpb25UYWcpKSB7CisgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwg
Km9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsK
KyAgICAgICAgICAgIGJvb2wgc2VsZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0QXR0cmlidXRlKHNlbGVj
dGVkQXR0cikuaXNOdWxsKCkpOworICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZChzZWxl
Y3RlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBtX3JlbmRlciApCisgICAgICAgIHN0
YXRpY19jYXN0PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0
cnVlKTsKKyAgICBzZXRDaGFuZ2VkKCB0cnVlICk7CiB9CiAKLURPTVN0cmluZyBIVE1MQnV0dG9u
RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAordm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Om5v
dGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRpb24s
IGJvb2wgc2VsZWN0ZWQpCiB7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0eXBlQXR0cik7Ci19
CisgICAgaWYgKHNlbGVjdGVkICYmICFtX211bHRpcGxlKSB7CisgICAgICAgIC8vIGRlc2VsZWN0
IGFsbCBvdGhlciBvcHRpb25zCisgICAgICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOworICAgICAgICB1aW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7
IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNM
b2NhbE5hbWUob3B0aW9uVGFnKSkKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPm1fc2VsZWN0ZWQgPSAoaXRlbXNbaV0gPT0gc2Vs
ZWN0ZWRPcHRpb24pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtX3JlbmRlcikKKyAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25DaGFu
Z2VkKHRydWUpOwogCi12b2lkIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgp
ID09ICB0eXBlQXR0cikgewotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFs
dWUoKSwgInN1Ym1pdCIpKQotICAgICAgICAgICAgbV90eXBlID0gU1VCTUlUOwotICAgICAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicmVzZXQiKSkKLSAgICAg
ICAgICAgIG1fdHlwZSA9IFJFU0VUOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZShhdHRyLT52YWx1ZSgpLCAiYnV0dG9uIikpCi0gICAgICAgICAgICBtX3R5cGUgPSBCVVRUT047
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKSB7Ci0gICAgICAgIG1f
dmFsdWUgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBtX2N1cnJWYWx1ZSA9IG1fdmFsdWU7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAgICAgICAv
LyBEbyBub3RoaW5nLgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRy
KSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRN
TEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOworICAg
IHNldENoYW5nZWQodHJ1ZSk7CiB9CiAKLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpkZWZh
dWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQordm9pZCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCiB7Ci0gICAgaWYgKG1fdHlw
ZSAhPSBCVVRUT04gJiYgKGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRlRXZlbnQpKSB7Ci0KLSAg
ICAgICAgaWYobV9mb3JtICYmIG1fdHlwZSA9PSBTVUJNSVQpIHsKLSAgICAgICAgICAgIG1fYWN0
aXZlU3VibWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fZm9ybS0+cHJlcGFyZVN1Ym1pdCgpOwot
ICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsgLy8gaW4gY2FzZSB3ZSB3ZXJlIGNh
bmNlbGVkCisgICAgLy8gVXNlIGtleSBwcmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2lt
dWxhdGVkIG1vdXNlIGV2ZW50cworICAgIC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVy
IHNlbmRpbmcgb2YgdGhlIGtleSBwcmVzcyBldmVudC4KKyAgICBpZiAoZXZ0LT50eXBlKCkgPT0g
a2V5cHJlc3NFdmVudCkgeworICAgIAorICAgICAgICBpZiAoIW1fZm9ybSB8fCAhbV9yZW5kZXIg
fHwgIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IAorICAgICAgICBET01TdHJpbmcga2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudEltcGwg
Kj4oZXZ0KS0+a2V5SWRlbnRpZmllcigpOworICAgICAgICAKKyAgICAgICAgaWYgKGtleSA9PSAi
RW50ZXIiKSB7CisgICAgICAgICAgICBtX2Zvcm0tPnN1Ym1pdENsaWNrKCk7CisgICAgICAgICAg
ICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYobV9mb3Jt
ICYmIG1fdHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgpOwogICAgIH0KICAgICBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwogfQogCi1ib29s
IEhUTUxCdXR0b25FbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QK
LXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0g
ICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2Vy
cwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJl
aGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRo
YW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gUmVtb3ZlIHRoZSBuYW1l
IGNvbnN0cmFpbnQgZm9yIG5vdy4KLSAgICAvLyBXYXM6IG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1f
ZGlzYWJsZWQgJiYgIW5hbWUoKS5pc0VtcHR5KCkKLSAgICByZXR1cm4gbV90eXBlID09IFNVQk1J
VCAmJiAhbV9kaXNhYmxlZDsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzQWN0
aXZhdGVkU3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0K
LXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFn
KQotewotICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxl
bWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RpbmcsIGJvb2wgLypt
dWx0aXBhcnQqLykKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24o
Ym9vbCBzZW5kVG9BbnlFbGVtZW50KQogewotICAgIGlmIChtX3R5cGUgIT0gU1VCTUlUIHx8IG5h
bWUoKS5pc0VtcHR5KCkgfHwgIW1fYWN0aXZlU3VibWl0KQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIG1fY3VyclZhbHVlKTsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlv
bihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17ICAgCi0gICAgLy8gc2VuZCB0aGUgbW91c2UgYnV0
dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgLy8gY2FsbGVyIHNwZWNpZmllZCBzZW5kVG9BbnlFbGVt
ZW50Ci0gICAgY2xpY2soc2VuZFRvQW55RWxlbWVudCk7CisgICAgZm9jdXMoKTsKIH0KIAotRE9N
U3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKK3ZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRNdWx0aXBsZShib29sIG11bHRpcGxlKQogewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7CisgICAgc2V0QXR0cmlidXRlKG11bHRp
cGxlQXR0ciwgbXVsdGlwbGUgPyAiIiA6IDApOwogfQogCi12b2lkIEhUTUxCdXR0b25FbGVtZW50
SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCit2b2lkIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbDo6c2V0U2l6ZShpbnQgc2l6ZSkKIHsKLSAgICBzZXRBdHRyaWJ1dGUoYWNj
ZXNza2V5QXR0ciwgdmFsdWUpOworICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwgUVN0cmluZzo6
bnVtYmVyKHNpemUpKTsKIH0KLQotRE9NU3RyaW5nIEhUTUxCdXR0b25FbGVtZW50SW1wbDo6dmFs
dWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLX0KLQot
dm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjpIVE1MRmllbGRTZXRFbGVt
ZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgIDog
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoZmllbGRzZXRUYWcsIGRvYywgZikKLXsKLX0KLQot
SFRNTEZpZWxkU2V0RWxlbWVudEltcGw6On5IVE1MRmllbGRTZXRFbGVtZW50SW1wbCgpCi17Ci19
Ci0KLWJvb2wgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0IE5vZGVJbXBs
KiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUobGVnZW5kVGFn
KSB8fCBIVE1MRWxlbWVudEltcGw6OmNoZWNrRFREKG5ld0NoaWxkKTsKLX0KLQotYm9vbCBIVE1M
RmllbGRTZXRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsOjp0eXBlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gImZpZWxkc2V0IjsKLX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MRmll
bGRTZXRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5k
ZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpZWxkc2V0
KHRoaXMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpIVE1MSW5wdXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGlucHV0VGFnLCBkb2Ms
IGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6SFRNTElucHV0
RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpk
b2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
SW1wbCh0YWdOYW1lLCBkb2MsIGYpCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjppbml0KCkKLXsKLSAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICBtX3Zh
bHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX21h
eExlbiA9IC0xOwotICAgIG1fc2l6ZSA9IDIwOwotICAgIG1fY2hlY2tlZCA9IGZhbHNlOwotICAg
IG1fZGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1
ZTsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTsKLQotICAgIG1faGF2ZVR5cGUgPSBmYWxz
ZTsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwotICAgIG1fYXV0b2NvbXBsZXRlID0gdHJ1
ZTsKLSAgICBtX2luaXRlZCA9IGZhbHNlOwotCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7
Ci0KLSAgICBtX21heFJlc3VsdHMgPSAtMTsKLQotICAgIGlmIChtX2Zvcm0pCi0gICAgICAgIG1f
YXV0b2NvbXBsZXRlID0gbV9mb3JtLT5hdXRvQ29tcGxldGUoKTsKLX0KLQotSFRNTElucHV0RWxl
bWVudEltcGw6On5IVE1MSW5wdXRFbGVtZW50SW1wbCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50
KCkpIGdldERvY3VtZW50KCktPmRlcmVnaXN0ZXJNYWludGFpbnNTdGF0ZSh0aGlzKTsKLSAgICBk
ZWxldGUgbV9pbWFnZUxvYWRlcjsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpuYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9uYW1lLmlzTnVsbCgpID8gIiIgOiBtX25h
bWU7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUo
KSBjb25zdAotewotICAgIC8vIElmIHRoZSBiYXNlIGNsYXNzIHNheXMgd2UgY2FuJ3QgYmUgZm9j
dXNlZCwgdGhlbiB3ZSBjYW4gc3RvcCBub3cuCi0gICAgaWYgKCFIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAobV90eXBlID09IFJBRElPKSB7Ci0gICAgICAgIC8vIFVubmFtZWQgcmFkaW8gYnV0
dG9ucyBhcmUgbmV2ZXIgZm9jdXNhYmxlIChtYXRjaGVzIFdpbklFKS4KLSAgICAgICAgaWYgKG5h
bWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8g
TmV2ZXIgYWxsb3cga2V5Ym9hcmQgdGFiYmluZyB0byBsZWF2ZSB5b3UgaW4gdGhlIHNhbWUgcmFk
aW8gZ3JvdXAuICBBbHdheXMKLSAgICAgICAgLy8gc2tpcCBhbnkgb3RoZXIgZWxlbWVudHMgaW4g
dGhlIGdyb3VwLgotICAgICAgICBOb2RlSW1wbCogY3VycmVudEZvY3VzTm9kZSA9IGdldERvY3Vt
ZW50KCktPmZvY3VzTm9kZSgpOwotICAgICAgICBpZiAoY3VycmVudEZvY3VzTm9kZSAmJiBjdXJy
ZW50Rm9jdXNOb2RlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSkgewotICAgICAgICAgICAgSFRNTElu
cHV0RWxlbWVudEltcGwqIGZvY3VzZWRJbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnRJbXBsKj4oY3VycmVudEZvY3VzTm9kZSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNlZElucHV0
LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBmb2N1c2VkSW5wdXQtPmZvcm0oKSA9PSBtX2Zvcm0g
JiYKLSAgICAgICAgICAgICAgICBmb2N1c2VkSW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAv
LyBBbGxvdyBrZXlib2FyZCBmb2N1cyBpZiB3ZSdyZSBjaGVja2VkIG9yIGlmIG5vdGhpbmcgaW4g
dGhlIGdyb3VwIGlzIGNoZWNrZWQuCi0gICAgICAgIHJldHVybiBjaGVja2VkKCkgfHwgIWdldERv
Y3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9y
bSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICBpZiAodC5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgaW50IGV4Y2NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh0
eXBlQXR0ciwgZXhjY29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc2V0QXR0cmlidXRl
KHR5cGVBdHRyLCB0KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0SW5wdXRU
eXBlKGNvbnN0IERPTVN0cmluZyYgdCkKLXsKLSAgICB0eXBlRW51bSBuZXdUeXBlOwotICAgIAot
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicGFzc3dvcmQiKSkKLSAgICAgICAgbmV3VHlw
ZSA9IFBBU1NXT1JEOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJjaGVja2Jv
eCIpKQotICAgICAgICBuZXdUeXBlID0gQ0hFQ0tCT1g7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25v
cmluZ0Nhc2UodCwgInJhZGlvIikpCi0gICAgICAgIG5ld1R5cGUgPSBSQURJTzsKLSAgICBlbHNl
IGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAic3VibWl0IikpCi0gICAgICAgIG5ld1R5cGUgPSBT
VUJNSVQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJlc2V0IikpCi0gICAg
ICAgIG5ld1R5cGUgPSBSRVNFVDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAi
ZmlsZSIpKQotICAgICAgICBuZXdUeXBlID0gRklMRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9y
aW5nQ2FzZSh0LCAiaGlkZGVuIikpCi0gICAgICAgIG5ld1R5cGUgPSBISURERU47Ci0gICAgZWxz
ZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImltYWdlIikpCi0gICAgICAgIG5ld1R5cGUgPSBJ
TUFHRTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAiYnV0dG9uIikpCi0gICAg
ICAgIG5ld1R5cGUgPSBCVVRUT047Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwg
ImtodG1sX2lzaW5kZXgiKSkKLSAgICAgICAgbmV3VHlwZSA9IElTSU5ERVg7Ci0gICAgZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInNlYXJjaCIpKQotICAgICAgICBuZXdUeXBlID0gU0VB
UkNIOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJyYW5nZSIpKQotICAgICAg
ICBuZXdUeXBlID0gUkFOR0U7Ci0gICAgZWxzZQotICAgICAgICBuZXdUeXBlID0gVEVYVDsKLQot
ICAgIC8vICMjIyBJTVBPUlRBTlQ6IERvbid0IGFsbG93IHRoZSB0eXBlIHRvIGJlIGNoYW5nZWQg
dG8gRklMRSBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyB0eXBlIGNoYW5nZSwgb3RoZXJ3aXNlIGEg
SmF2YVNjcmlwdCBwcm9ncmFtbWVyIHdvdWxkIGJlIGFibGUgdG8gc2V0IGEgdGV4dAotICAgIC8v
IGZpZWxkJ3MgdmFsdWUgdG8gc29tZXRoaW5nIGxpa2UgL2V0Yy9wYXNzd2QgYW5kIHRoZW4gY2hh
bmdlIGl0IHRvIGEgZmlsZSBmaWVsZC4KLSAgICBpZiAobV90eXBlICE9IG5ld1R5cGUpIHsKLSAg
ICAgICAgaWYgKG5ld1R5cGUgPT0gRklMRSAmJiBtX2hhdmVUeXBlKSB7Ci0gICAgICAgICAgICAv
LyBTZXQgdGhlIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBvbGQgdmFsdWUuCi0gICAgICAgICAgICAv
LyBVc2VmdWwgaW4gY2FzZSB3ZSB3ZXJlIGNhbGxlZCBmcm9tIGluc2lkZSBwYXJzZU1hcHBlZEF0
dHJpYnV0ZS4KLSAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh0eXBlQXR0ciwgdHlwZSgpKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW5hbWUo
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+Y2hlY2tl
ZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKSA9PSB0aGlzKQotICAg
ICAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG5h
bWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdh
c0F0dGFjaGVkID0gbV9hdHRhY2hlZDsKLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hlZCkKLSAg
ICAgICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIGJvb2wgZGlkU3RvcmVWYWx1ZSA9
IHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBtX3R5cGUg
PSBuZXdUeXBlOwotICAgICAgICAgICAgYm9vbCB3aWxsU3RvcmVWYWx1ZSA9IHN0b3Jlc1ZhbHVl
U2VwYXJhdGVGcm9tQXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoZGlkU3RvcmVWYWx1ZSAm
JiAhd2lsbFN0b3JlVmFsdWUgJiYgIW1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAg
ICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBtX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBtX3Zh
bHVlID0gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpZFN0
b3JlVmFsdWUgJiYgd2lsbFN0b3JlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICBtX3ZhbHVlID0g
Z2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAo
d2FzQXR0YWNoZWQpCi0gICAgICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAvLyBJZiBvdXIgdHlwZSBtb3JwaHMgaW50byBhIHJhZGlvIGJ1dHRvbiBh
bmQgd2UgYXJlIGNoZWNrZWQsIHRoZW4gZ28gYWhlYWQKLSAgICAgICAgICAgIC8vIGFuZCBzaWdu
YWwgdGhpcyB0byB0aGUgZm9ybS4KLSAgICAgICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYg
Y2hlY2tlZCgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hl
Y2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgfQotICAgIG1faGF2ZVR5cGUgPSB0
cnVlOwotICAgIAotICAgIGlmIChtX3R5cGUgIT0gSU1BR0UgJiYgbV9pbWFnZUxvYWRlcikgewot
ICAgICAgICBkZWxldGUgbV9pbWFnZUxvYWRlcjsKLSAgICAgICAgbV9pbWFnZUxvYWRlciA9IDA7
Ci0gICAgfQotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnR5cGUoKSBjb25z
dAotewotICAgIC8vIG5lZWRzIHRvIGJlIGxvd2VyY2FzZSBhY2NvcmRpbmcgdG8gRE9NIHNwZWMK
LSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgVEVYVDogcmV0dXJuICJ0ZXh0IjsKLSAg
ICBjYXNlIFBBU1NXT1JEOiByZXR1cm4gInBhc3N3b3JkIjsKLSAgICBjYXNlIENIRUNLQk9YOiBy
ZXR1cm4gImNoZWNrYm94IjsKLSAgICBjYXNlIFJBRElPOiByZXR1cm4gInJhZGlvIjsKLSAgICBj
YXNlIFNVQk1JVDogcmV0dXJuICJzdWJtaXQiOwotICAgIGNhc2UgUkVTRVQ6IHJldHVybiAicmVz
ZXQiOwotICAgIGNhc2UgRklMRTogcmV0dXJuICJmaWxlIjsKLSAgICBjYXNlIEhJRERFTjogcmV0
dXJuICJoaWRkZW4iOwotICAgIGNhc2UgSU1BR0U6IHJldHVybiAiaW1hZ2UiOwotICAgIGNhc2Ug
QlVUVE9OOiByZXR1cm4gImJ1dHRvbiI7Ci0gICAgY2FzZSBTRUFSQ0g6IHJldHVybiAic2VhcmNo
IjsKLSAgICBjYXNlIFJBTkdFOiByZXR1cm4gInJhbmdlIjsKLSAgICBjYXNlIElTSU5ERVg6IHJl
dHVybiAiIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi1RU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIGFzc2VydChtX3R5cGUgIT0gUEFTU1dPUkQpOwkJ
Ly8gc2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNzd29yZCBmaWVsZHMKLQotICAgIFFTdHJp
bmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKTsKLSAgICBzd2l0
Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgY2FzZSBSQURJTzoKLSAgICAg
ICAgcmV0dXJuIHN0YXRlICsgKGNoZWNrZWQoKSA/ICJvbiIgOiAib2ZmIik7Ci0gICAgZGVmYXVs
dDoKLSAgICAgICAgcmV0dXJuIHN0YXRlICsgdmFsdWUoKS5xc3RyaW5nKCkrJy4nOyAvLyBNYWtl
IHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHkhCi0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcykKLXsKLSAgICBh
c3NlcnQobV90eXBlICE9IFBBU1NXT1JEKTsJCS8vIHNob3VsZCBuZXZlciBzYXZlL3Jlc3RvcmUg
cGFzc3dvcmQgZmllbGRzCi0gICAgCi0gICAgUVN0cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5p
c051bGwoKSkgcmV0dXJuOwotCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIENIRUNL
Qk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHNldENoZWNrZWQoKHN0YXRlID09ICJvbiIp
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc2V0VmFsdWUoRE9NU3Ry
aW5nKHN0YXRlLmxlZnQoc3RhdGUubGVuZ3RoKCktMSkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjYW5IYXZlU2VsZWN0aW9uKCkKLXsK
LSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVudEltcGw6OnNlbGVjdGlvblN0YXJ0KCkK
LXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBzd2l0Y2ggKG1fdHlw
ZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlckxpbmVF
ZGl0ICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZWxlY3Rpb25FbmQoKQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVy
biAwOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6
Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25F
bmQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3Rh
cnQoaW50IHN0YXJ0KQotewotICAgIGlmICghbV9yZW5kZXIpIHJldHVybjsKLSAgICAKLSAgICBz
d2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICBjYXNlIFNF
QVJDSDoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
TGluZUVkaXQgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0K
LX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQp
Ci17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90eXBl
KSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAg
ICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPiht
X3JlbmRlciktPnNldFNlbGVjdGlvbkVuZChlbmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZighbV9yZW5kZXIpIHJldHVybjsK
LQotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24qPihtX3JlbmRlciktPnNlbGVjdCgpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VB
UkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJM
aW5lRWRpdCo+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgSElE
REVOOgotICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAg
IGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0g
ICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBl
bmQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90
eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAq
PihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzLCBi
b29sIHNob3dQcmVzc2VkTG9vaykKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAg
ICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNhc2UgUkVT
RVQ6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OmNsaWNrKHNlbmRNb3VzZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBpZiAocmVuZGVy
ZXIoKSkgewotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckZpbGVCdXR0b24gKj4o
cmVuZGVyZXIoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAg
ICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNT
V09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAg
IGNhc2UgVEVYVDoKLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGlj
ayhzZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihi
b29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgc3dpdGNoIChpbnB1dFR5cGUoKSkgewotICAg
ICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAgICAgIC8vIGEgbm8tb3AgZm9yIHRoaXMgdHlwZQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNT
V09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAg
ICAgICAgIGZvY3VzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS0JP
WDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgIGNh
c2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgQlVUVE9OOgotICAg
ICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAvLyBmb2N1
cwotICAgICAgICAgICAgZm9jdXMoKTsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgbW91c2Ug
YnV0dG9uIGV2ZW50cyBpZmYgdGhlCi0gICAgICAgICAgICAvLyBjYWxsZXIgc3BlY2lmaWVkIHNl
bmRUb0FueUVsZW1lbnQKLSAgICAgICAgICAgIGNsaWNrKHNlbmRUb0FueUVsZW1lbnQpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwK
LSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2
c3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAg
cmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAg
Ci0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlUmVw
bGFjZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlvciBp
cyB0aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4gSFRNTEVsZW1lbnRJbXBsOjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12
b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsK
LSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkgJiYgbV9mb3JtKSB7Ci0g
ICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJhZGlvIGZyb20gaXRzIG9sZCBncm91cC4KLSAgICAg
ICAgICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgIW1fbmFtZS5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChtX25hbWUuaW1w
bCgpLCBtX2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBVcGRhdGUgb3Vy
IGNhY2hlZCByZWZlcmVuY2UgdG8gdGhlIG5hbWUuCi0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZh
bHVlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgaXQgdG8gaXRzIG5ldyBncm91cC4KLSAg
ICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkpCi0gICAgICAgICAgICBnZXRE
b2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhpcywgbV9mb3JtKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7Ci0gICAgICAgIG1fYXV0b2Nv
bXBsZXRlID0gIWVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJvZmYiKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0dHIpIHsKLSAgICAgICAgc2V0SW5wdXRU
eXBlKGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVl
QXR0cikgewotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gc2V0Q2hhbmdlZCBpZiB0aGUgZm9y
bSBpcyBsb29raW5nIGF0IHRoZSBkZWZhdWx0IHZhbHVlIHJpZ2h0IG5vdy4KLSAgICAgICAgaWYg
KG1fdmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIG1f
dmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBjaGVja2VkQXR0cikgewotICAgICAgICBtX2RlZmF1bHRDaGVja2VkID0gIWF0dHItPmlz
TnVsbCgpOwotICAgICAgICBpZiAobV91c2VEZWZhdWx0Q2hlY2tlZCkgewotICAgICAgICAgICAg
c2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKLSAgICAgICAgICAgIG1fdXNlRGVmYXVsdENo
ZWNrZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
bWF4bGVuZ3RoQXR0cikgewotICAgICAgICBtX21heExlbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0
dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9zaXplID0gIWF0
dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMjA7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYWx0QXR0cikgewotICAgICAgICBpZiAobV9yZW5kZXIgJiYgbV90
eXBlID09IElNQUdFKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihtX3Jl
bmRlciktPnVwZGF0ZUFsdFRleHQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBz
cmNBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1BR0UpIHsKLSAg
ICAgICAgICAgIGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgICAgICBtX2ltYWdlTG9h
ZGVyID0gbmV3IEhUTUxJbWFnZUxvYWRlcih0aGlzKTsKLSAgICAgICAgICAgIG1faW1hZ2VMb2Fk
ZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSB1c2VtYXBBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0g
YWNjZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBh
ZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52
YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0g
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFs
dWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQs
IGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0
cikgewotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hF
SUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25m
b2N1c0F0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0
cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAg
ICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG9uc2VsZWN0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0
ZW5lcihzZWxlY3RFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25jaGFuZ2VBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGNoYW5nZUV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmlucHV0QXR0cikgewot
ICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihpbnB1dEV2ZW50LCBhdHRyKTsKLSAgICB9Ci0g
ICAgLy8gU2VhcmNoIGZpZWxkIGFuZCBzbGlkZXIgYXR0cmlidXRlcyBhbGwganVzdCBjYXVzZSB1
cGRhdGVGcm9tRWxlbWVudCB0byBiZSBjYWxsZWQgdGhyb3VnaCBzdHlsZQotICAgIC8vIHJlY2Fs
Y2luZy4KLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWFyY2hBdHRyKSB7Ci0gICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlYXJjaEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSByZXN1bHRzQXR0cikgewotICAgICAgICBtX21heFJlc3VsdHMg
PSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAtMTsKLSAgICAgICAg
c2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0
ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAot
ICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IHBsYWNlaG9sZGVyQXR0ciB8fAotICAgICAg
ICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHIt
Pm5hbWUoKSA9PSBtYXhBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJl
Y2lzaW9uQXR0cikgewotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsK
LX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJT
dHlsZSAqc3R5bGUpCi17Ci0gICAgc3dpdGNoKG1fdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBURVhU
OgotICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgY2FzZSBTRUFSQ0g6Ci0gICAgY2FzZSBSQU5HRToK
LSAgICBjYXNlIElTSU5ERVg6Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgot
ICAgIGNhc2UgU1VCTUlUOgotICAgIGNhc2UgSU1BR0U6Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBj
YXNlIEZJTEU6Ci0gICAgY2FzZSBCVVRUT046ICAgcmV0dXJuIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKHN0eWxlKTsKLSAgICBjYXNlIEhJRERFTjogICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1SZW5kZXJPYmplY3QgKkhUTUxJbnB1dEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihS
ZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBzd2l0Y2gobV90
eXBlKQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAgY2FzZSBQQVNTV09SRDoKLSAgICBjYXNl
IFNFQVJDSDoKLSAgICBjYXNlIElTSU5ERVg6ICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyTGlu
ZUVkaXQodGhpcyk7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAg
ICByZXR1cm4gUmVuZGVyT2JqZWN0OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotICAgIGNh
c2UgU1VCTUlUOgotICAgIGNhc2UgUkVTRVQ6Ci0gICAgY2FzZSBCVVRUT046Ci0gICAgICAgIHJl
dHVybiBuZXcgKGFyZW5hKSBSZW5kZXJCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBJTUFHRTogICAg
cmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckltYWdlQnV0dG9uKHRoaXMpOwotICAgIGNhc2UgRklM
RTogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGaWxlQnV0dG9uKHRoaXMpOwotICAgIGNh
c2UgUkFOR0U6ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTbGlkZXIodGhpcyk7Ci0gICAg
Y2FzZSBISURERU46ICAgYnJlYWs7Ci0gICAgfQotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAg
aWYgKCFtX2luaXRlZCkgewotICAgICAgICBpZiAoIW1faGF2ZVR5cGUpCi0gICAgICAgICAgICBz
ZXRJbnB1dFR5cGUoZ2V0QXR0cmlidXRlKHR5cGVBdHRyKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6
IFRoaXMgbmVlZHMgdG8gYmUgZHluYW1pYywgZG9lc24ndCBpdCwgc2luY2Ugc29tZW9uZSBjb3Vs
ZCBzZXQgdGhpcwotICAgICAgICAvLyBhZnRlciBhdHRhY2htZW50PwotICAgICAgICBET01TdHJp
bmcgdmFsID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgICAgIGlmICgodWludCkgbV90
eXBlIDw9IElTSU5ERVggJiYgIXZhbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJlbW92
ZSBuZXdsaW5lIHN0dWZmLi4KLSAgICAgICAgICAgIFFTdHJpbmcgbnZhbHVlOwotICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoKCk7ICsraSkKLSAgICAg
ICAgICAgICAgICBpZiAodmFsW2ldID49ICcgJykKLSAgICAgICAgICAgICAgICAgICAgbnZhbHVl
ICs9IHZhbFtpXTsKLQotICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSBudmFsdWUubGVu
Z3RoKCkpCi0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbnZhbHVlKTsK
LSAgICAgICAgfQotCi0gICAgICAgIG1faW5pdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBE
aXNhbGxvdyB0aGUgd2lkdGggYXR0cmlidXRlIG9uIGlucHV0cyBvdGhlciB0aGFuIEhJRERFTiBh
bmQgSU1BR0UuCi0gICAgLy8gRHVtYiBXZWIgc2l0ZXMgd2lsbCB0cnkgdG8gc2V0IHRoZSB3aWR0
aCBhcyBhbiBhdHRyaWJ1dGUgb24gZm9ybSBjb250cm9scyB0aGF0IGFyZW4ndAotICAgIC8vIGlt
YWdlcyBvciBoaWRkZW4uCi0gICAgaWYgKGhhc01hcHBlZEF0dHJpYnV0ZXMoKSAmJiBtX3R5cGUg
IT0gSElEREVOICYmIG1fdHlwZSAhPSBJTUFHRSAmJiAhZ2V0QXR0cmlidXRlKHdpZHRoQXR0ciku
aXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBleGNDb2RlOwotICAgICAgICByZW1vdmVBdHRyaWJ1
dGUod2lkdGhBdHRyLCBleGNDb2RlKTsKLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAobV90eXBlID09IElNQUdFKSB7Ci0gICAgICAg
IGlmICghbV9pbWFnZUxvYWRlcikKLSAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcgSFRN
TEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICBtX2ltYWdlTG9hZGVyLT51cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICAgICAgUmVuZGVySW1h
Z2UqIGltYWdlT2JqID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihyZW5kZXJlcigpKTsKLSAg
ICAgICAgICAgIGltYWdlT2JqLT5zZXRJbWFnZShtX2ltYWdlTG9hZGVyLT5pbWFnZSgpKTsgICAg
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBjYWxs
aW5nIHBhc3N3b3JkRmllbGRSZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcK
LSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAg
IGlmIChtX3R5cGUgPT0gUEFTU1dPUkQpCi0gICAgICAgIGdldERvY3VtZW50KCktPnBhc3N3b3Jk
RmllbGRBZGRlZCgpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZXRhY2goKQot
ewotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZXRhY2goKTsKLSAgICBtX3ZhbHVl
TWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6YWx0VGV4dCgpIGNvbnN0Ci17Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMTk5
OC9SRUMtaHRtbDQwLTE5OTgwNDI0L2FwcGVuZGl4L25vdGVzLmh0bWwjYWx0Z2VuCi0gICAgLy8g
YWxzbyBoZWF2aWx5IGRpc2N1c3NlZCBieSBIaXhpZSBvbiBidWd6aWxsYQotICAgIC8vIG5vdGUg
dGhpcyBpcyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCB0byBIVE1MSW1hZ2VFbGVtZW50SW1wbDo6
YWx0VGV4dCgpCi0gICAgRE9NU3RyaW5nIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLSAg
ICAvLyBmYWxsIGJhY2sgdG8gdGl0bGUgYXR0cmlidXRlCi0gICAgaWYgKGFsdC5pc051bGwoKSkK
LSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgaWYgKGFsdC5pc051
bGwoKSkKLSAgICAgICAgYWx0ID0gZ2V0QXR0cmlidXRlKHZhbHVlQXR0cik7Ci0gICAgaWYgKGFs
dC5pc0VtcHR5KCkpCi0gICAgICAgIGFsdCA9IGlucHV0RWxlbWVudEFsdFRleHQoKTsKLQotICAg
IHJldHVybiBhbHQ7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzU3VjY2Vzc2Z1
bFN1Ym1pdEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgLy8gSFRNTCBzcGVjIHNheXMgdGhhdCBidXR0
b25zIG11c3QgaGF2ZSBuYW1lcwotICAgIC8vIHRvIGJlIGNvbnNpZGVyZWQgc3VjY2Vzc2Z1bC4g
SG93ZXZlciwgb3RoZXIgYnJvd3NlcnMKLSAgICAvLyBkbyBub3QgaW1wb3NlIHRoaXMgY29uc3Ry
YWludC4gVGhlcmVmb3JlLCB3ZSBiZWhhdmUKLSAgICAvLyBkaWZmZXJlbnRseSBhbmQgY2FuIHVz
ZSBkaWZmZXJlbnQgYnV0dG9ucyB0aGFuIHRoZSAKLSAgICAvLyBhdXRob3IgaW50ZW5kZWQuIAot
ICAgIC8vIFdhczogKG1fdHlwZSA9PSBTVUJNSVQgJiYgIW5hbWUoKS5pc0VtcHR5KCkpCi0gICAg
cmV0dXJuICFtX2Rpc2FibGVkICYmIChtX3R5cGUgPT0gSU1BR0UgfHwgbV90eXBlID09IFNVQk1J
VCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzQWN0aXZhdGVkU3VibWl0KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpCi17Ci0gICAgbV9hY3Rp
dmVTdWJtaXQgPSBmbGFnOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphcHBlbmRG
b3JtRGF0YShGb3JtRGF0YUxpc3QgJmVuY29kaW5nLCBib29sIG11bHRpcGFydCkKLXsKLSAgICAv
LyBpbWFnZSBnZW5lcmF0ZXMgaXRzIG93biBuYW1lcwotICAgIGlmIChuYW1lKCkuaXNFbXB0eSgp
ICYmIG1fdHlwZSAhPSBJTUFHRSkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoIChtX3R5cGUp
IHsKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2Fz
ZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0g
ICAgICAgICAgICAvLyBhbHdheXMgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZW5jb2RpbmcuYXBw
ZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgICAgIGlm
IChjaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUo
KSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2Fz
ZSBSRVNFVDoKLSAgICAgICAgICAgIC8vIHRob3NlIGJ1dHRvbnMgYXJlIG5ldmVyIHN1Y2Nlc3Nm
dWwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBjYXNlIElNQUdFOgotICAg
ICAgICAgICAgaWYgKG1fYWN0aXZlU3VibWl0KSB7Ci0gICAgICAgICAgICAgICAgZW5jb2Rpbmcu
YXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBjbGlj
a1goKSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0
eSgpID8gInkiIDogKG5hbWUoKSArICIueSIpLCBjbGlja1koKSk7Ci0gICAgICAgICAgICAgICAg
aWYgKCFuYW1lKCkuaXNFbXB0eSgpICYmICF2YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsK
LSAgICAgICAgICAgICAgICBET01TdHJpbmcgZW5jX3N0ciA9IHZhbHVlV2l0aERlZmF1bHQoKTsK
LSAgICAgICAgICAgICAgICBpZiAoIWVuY19zdHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCBlbmNfc3RyKTsKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICB7Ci0gICAg
ICAgICAgICAvLyBjYW4ndCBzdWJtaXQgZmlsZSBvbiBHRVQKLSAgICAgICAgICAgIC8vIGRvbid0
IHN1Ym1pdCBpZiBkaXNwbGF5OiBub25lIG9yIGRpc3BsYXk6IGhpZGRlbgotICAgICAgICAgICAg
aWYoIW11bHRpcGFydCB8fCAhcmVuZGVyZXIoKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNp
YmlsaXR5KCkgIT0ga2h0bWw6OlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgICAgICAgICAvLyBpZiBubyBmaWxlbmFtZSBhdCBhbGwgaXMgZW50ZXJlZCwgcmV0
dXJuIHN1Y2Nlc3NmdWwsIGhvd2V2ZXIgZW1wdHkKLSAgICAgICAgICAgIC8vIG51bGwgd291bGQg
YmUgbW9yZSBsb2dpY2FsIGJ1dCBuZXRzY2FwZSBwb3N0cyBhbiBlbXB0eSBmaWxlLiBhcmdoLgot
ICAgICAgICAgICAgaWYgKHZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZW5j
b2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIFFTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5k
RmlsZShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0
YShuYW1lKCksIHZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cmVzZXQoKQot
ewotICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpKQotICAgICAgICBz
ZXRWYWx1ZShET01TdHJpbmcoKSk7Ci0gICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsK
LSAgICBtX3VzZURlZmF1bHRDaGVja2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVt
ZW50SW1wbDo6c2V0Q2hlY2tlZChib29sIF9jaGVja2VkKQotewotICAgIC8vIFdpbklFIGRvZXMg
bm90IGFsbG93IHVubmFtZWQgcmFkaW8gYnV0dG9ucyB0byBldmVuIGJlIGNoZWNrZWQuCi0gICAg
aWYgKGNoZWNrZWQoKSA9PSBfY2hlY2tlZCB8fCAobV90eXBlID09IFJBRElPICYmIG5hbWUoKS5p
c0VtcHR5KCkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV90eXBlID09IFJBRElPICYm
IF9jaGVja2VkKQotICAgICAgICBnZXREb2N1bWVudCgpLT5yYWRpb0J1dHRvbkNoZWNrZWQodGhp
cywgbV9mb3JtKTsKLQotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2No
ZWNrZWQgPSBfY2hlY2tlZDsKLSAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkg
JiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVtZSgp
LT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLSAgICBvbkNoYW5nZSgp
OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbmRldGVybWluYXRlKGJvb2wg
X2luZGV0ZXJtaW5hdGUpCi17Ci0gICAgLy8gT25seSBjaGVja2JveGVzIGhvbm9yIGluZGV0ZXJt
aW5hdGUuCi0gICAgaWYgKG1fdHlwZSAhPSBDSEVDS0JPWCB8fCBpbmRldGVybWluYXRlKCkgPT0g
X2luZGV0ZXJtaW5hdGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5kZXRlcm1pbmF0ZSA9
IF9pbmRldGVybWluYXRlOwotCi0gICAgc2V0Q2hhbmdlZCgpOwotCi0gICAgaWYgKHJlbmRlcmVy
KCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICB0aGVt
ZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgQ2hlY2tlZFN0YXRlKTsKLX0KLQotdm9pZCBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxl
bWVudEltcGwgKnNvdXJjZSkKLXsKLSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50SW1wbCAqc291
cmNlRWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICo+KHNvdXJj
ZSk7Ci0KLSAgICBtX3ZhbHVlID0gc291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQg
PSBzb3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0gc291cmNlRWxl
bS0+bV9pbmRldGVybWluYXRlOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6
OnZhbHVlKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdmFsdWUgPSBtX3ZhbHVlOwotCi0gICAg
Ly8gSXQncyBpbXBvcnRhbnQgKm5vdCogdG8gZmFsbCBiYWNrIHRvIHRoZSB2YWx1ZSBhdHRyaWJ1
dGUgZm9yIGZpbGUgaW5wdXRzLAotICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBhIG1h
bGljaW91cyB3ZWIgcGFnZSB0byB1cGxvYWQgZmlsZXMgYnkgc2V0dGluZyB0aGUKLSAgICAvLyB2
YWx1ZSBhdHRyaWJ1dGUgaW4gbWFya3VwLgotICAgIGlmICh2YWx1ZS5pc051bGwoKSAmJiBtX3R5
cGUgIT0gRklMRSkKLSAgICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLQot
ICAgIC8vIElmIG5vIGF0dHJpYnV0ZSBleGlzdHMsIHRoZW4ganVzdCB1c2UgIm9uIiBvciAiIiBi
YXNlZCBvZmYgdGhlIGNoZWNrZWQoKSBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLSAgICBpZiAodmFs
dWUuaXNOdWxsKCkgJiYgKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8pKQot
ICAgICAgICByZXR1cm4gRE9NU3RyaW5nKGNoZWNrZWQoKSA/ICJvbiIgOiAiIik7Ci0KLSAgICBy
ZXR1cm4gdmFsdWU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWVX
aXRoRGVmYXVsdCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHYgPSB2YWx1ZSgpOwotICAgIGlm
ICh2LmlzRW1wdHkoKSkgewotICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAgICAg
Y2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAgICB2ID0gcmVzZXRCdXR0b25EZWZhdWx0TGFiZWwo
KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0g
ICAgICAgICAgICAgICAgdiA9IHN1Ym1pdEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgICAgICBjYXNlIEhJ
RERFTjoKLSAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBjYXNlIElTSU5ERVg6
Ci0gICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAg
ICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAg
ICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0K
LSAgICByZXR1cm4gdjsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0VmFsdWUo
Y29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBpZiAobV90eXBlID09IEZJTEUpIHJldHVy
bjsKLQotICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICBpZiAoc3RvcmVz
VmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7
Ci0gICAgICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9t
RWxlbWVudCgpOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
c2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgRE9NU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9
IHRydWU7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgZGlz
cGF0Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi1ib29sIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzdG9yZXNWYWx1ZVNlcGFyYXRlRnJvbUF0dHJpYnV0ZSgpIGNvbnN0
Ci17Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAg
IGNhc2UgQ0hFQ0tCT1g6Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgY2FzZSBISURERU46
Ci0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgUkFESU86Ci0gICAgICAgIGNhc2Ug
UkFOR0U6Ci0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIElTSU5ERVg6Ci0gICAgICAgIGNhc2Ug
UEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRFWFQ6Ci0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lk
KiBIVE1MSW5wdXRFbGVtZW50SW1wbDo6cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBs
ICpldnQpCi17Ci0gICAgLy8gcHJldmVudERlZmF1bHQgb3IgInJldHVybiBmYWxzZSIgYXJlIHVz
ZWQgdG8gcmV2ZXJzZSB0aGUgYXV0b21hdGljIGNoZWNraW5nL3NlbGVjdGlvbiB3ZSBkbyBoZXJl
LgotICAgIC8vIFRoaXMgcmVzdWx0IGdpdmVzIHVzIGVub3VnaCBpbmZvIHRvIHBlcmZvcm0gdGhl
ICJ1bmRvIiBpbiBwb3N0RGlzcGF0Y2ggb2YgdGhlIGFjdGlvbiB3ZSB0YWtlIGhlcmUuCi0gICAg
dm9pZCogcmVzdWx0ID0gMDsgCi0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1ggfHwgbV90eXBl
ID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgpID09IGNsaWNr
RXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4oZXZ0KS0+YnV0
dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7Ci0gICAgICAg
ICAgICAvLyBBcyBhIHdheSB0byBzdG9yZSB0aGUgc3RhdGUsIHdlIHJldHVybiAwIGlmIHdlIHdl
cmUgdW5jaGVja2VkLCAxIGlmIHdlIHdlcmUgY2hlY2tlZCwgYW5kIDIgZm9yCi0gICAgICAgICAg
ICAvLyBpbmRldGVybWluYXRlLgotICAgICAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUoKSkgewot
ICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikweDI7Ci0gICAgICAgICAgICAgICAgc2V0
SW5kZXRlcm1pbmF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIGlmIChjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2b2lkKikw
eDE7Ci0gICAgICAgICAgICAgICAgc2V0Q2hlY2tlZCghY2hlY2tlZCgpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBz
dG9yZSB0aGUgY3VycmVudCBzZWxlY3RlZCByYWRpbyBvYmplY3QuCi0gICAgICAgICAgICBpZiAo
bmFtZSgpLmlzRW1wdHkoKSB8fCBjaGVja2VkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7
IC8vIFVubmFtZWQgcmFkaW8gYnV0dG9ucyBkb250IGdldCBjaGVja2VkLiBDaGVja2VkIGJ1dHRv
bnMganVzdCBzdGF5IGNoZWNrZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGxlYXJuIHRvIHdvcmsgd2l0aG91dCBhIGZvcm0uCi0KLSAgICAgICAgICAgIC8v
IFdlIHJlYWxseSB3YW50IHJhZGlvIGdyb3VwcyB0byBlbmQgdXAgaW4gc2FuZSBzdGF0ZXMsIGku
ZS4sIHRvIGhhdmUgc29tZXRoaW5nIGNoZWNrZWQuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUg
aWYgbm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIHdlIHdvbid0IGFsbG93IHRoaXMgYWN0
aW9uIHRvIGJlICJ1bmRvbmUiLCBzaW5jZQotICAgICAgICAgICAgLy8gd2Ugd2FudCBzb21lIG9i
amVjdCBpbiB0aGUgcmFkaW8gZ3JvdXAgdG8gYWN0dWFsbHkgZ2V0IHNlbGVjdGVkLgotICAgICAg
ICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGN1cnJSYWRpbyA9IGdldERvY3VtZW50KCktPmNo
ZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKG5hbWUoKS5pbXBsKCksIG1fZm9ybSk7Ci0gICAgICAg
ICAgICBpZiAoY3VyclJhZGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJhZGlv
IGJ1dHRvbiBzZWxlY3RlZCB0aGF0IGlzIG5vdCB1cy4gIENhY2hlIGl0IGluIG91ciByZXN1bHQg
ZmllbGQgYW5kIHJlZiBpdCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgY2FuJ3QgYmUg
ZGVzdHJveWVkLgotICAgICAgICAgICAgICAgIGN1cnJSYWRpby0+cmVmKCk7Ci0gICAgICAgICAg
ICAgICAgcmVzdWx0ID0gY3VyclJhZGlvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0
Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZl
bnRJbXBsICpldnQsIHZvaWQqIGRhdGEpCi17Ci0gICAgaWYgKChtX3R5cGUgPT0gQ0hFQ0tCT1gg
fHwgbV90eXBlID09IFJBRElPKSAmJiBldnQtPmlzTW91c2VFdmVudCgpICYmIGV2dC0+dHlwZSgp
ID09IGNsaWNrRXZlbnQgJiYgCi0gICAgICAgIHN0YXRpY19jYXN0PE1vdXNlRXZlbnRJbXBsKj4o
ZXZ0KS0+YnV0dG9uKCkgPT0gMCkgewotICAgICAgICBpZiAobV90eXBlID09IENIRUNLQk9YKSB7
Ci0gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBjaGVja2luZyB3ZSBkaWQgaW4gcHJlRGlzcGF0
Y2guCi0gICAgICAgICAgICBpZiAoZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgfHwgZXZ0LT5kZWZh
dWx0SGFuZGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gKHZvaWQqKTB4MikK
LSAgICAgICAgICAgICAgICAgICAgc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICAgICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWQoZGF0YSk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkgewotICAgICAgICAgICAgSFRNTElucHV0
RWxlbWVudEltcGwqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihk
YXRhKTsKLSAgICAgICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRl
ZmF1bHRIYW5kbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5h
bCBzZWxlY3RlZCByYWRpbyBidXR0b24gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgLy8g
TWFrZSBzdXJlIGl0IGlzIHN0aWxsIGEgcmFkaW8gYnV0dG9uIGFuZCBvbmx5IGRvIHRoZSByZXN0
b3JhdGlvbiBpZiBpdCBzdGlsbAotICAgICAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gb3VyIGdy
b3VwLgotICAgICAgICAgICAgICAgIGlmIChpbnB1dC0+Zm9ybSgpID09IGZvcm0oKSAmJiBpbnB1
dC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5wdXQtPm5hbWUoKSA9PSBuYW1lKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gT2ssIHRoZSBvbGQgcmFkaW8gYnV0dG9uIGlzIHN0aWxsIGlu
IG91ciBmb3JtIGFuZCBpbiBvdXIgZ3JvdXAgYW5kIGlzIHN0aWxsIGEgCi0gICAgICAgICAgICAg
ICAgICAgIC8vIHJhZGlvIGJ1dHRvbiwgc28gaXQncyBzYWZlIHRvIHJlc3RvcmUgc2VsZWN0aW9u
IHRvIGl0LgotICAgICAgICAgICAgICAgICAgICBpbnB1dC0+c2V0Q2hlY2tlZCh0cnVlKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC0+ZGVyZWYo
KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVm
YXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLSAgICBpZiAobV90eXBlID09IElN
QUdFICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAm
JiBtX3JlbmRlcikgewotICAgICAgICAvLyByZWNvcmQgdGhlIG1vdXNlIHBvc2l0aW9uIGZvciB3
aGVuIHdlIGdldCB0aGUgRE9NQWN0aXZhdGUgZXZlbnQKLSAgICAgICAgTW91c2VFdmVudEltcGwg
Km1lID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpOwotICAgICAgICBpbnQgb2Zm
c2V0WCwgb2Zmc2V0WTsKLSAgICAgICAgbV9yZW5kZXItPmFic29sdXRlUG9zaXRpb24ob2Zmc2V0
WCxvZmZzZXRZKTsKLSAgICAgICAgeFBvcyA9IG1lLT5jbGllbnRYKCktb2Zmc2V0WDsKLSAgICAg
ICAgeVBvcyA9IG1lLT5jbGllbnRZKCktb2Zmc2V0WTsKLQotCW1lLT5zZXREZWZhdWx0SGFuZGxl
ZCgpOwotICAgIH0KLQotICAgIC8vIERPTUFjdGl2YXRlIGV2ZW50cyBjYXVzZSB0aGUgaW5wdXQg
dG8gYmUgImFjdGl2YXRlZCIgLSBpbiB0aGUgY2FzZSBvZiBpbWFnZSBhbmQgc3VibWl0IGlucHV0
cywgdGhpcyBtZWFucwotICAgIC8vIGFjdHVhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm0uIEZvciBy
ZXNldCBpbnB1dHMsIHRoZSBmb3JtIGlzIHJlc2V0LiBUaGVzZSBldmVudHMgYXJlIHNlbnQgd2hl
biB0aGUgdXNlciBjbGlja3MKLSAgICAvLyBvbiB0aGUgZWxlbWVudCwgb3IgcHJlc3NlcyBlbnRl
ciB3aGlsZSBpdCBpcyB0aGUgYWN0aXZlIGVsZW1lbnQuIEphdmFjc3JpcHQgY29kZSB3aXNoaW5n
IHRvIGFjdGl2YXRlIHRoZSBlbGVtZW50Ci0gICAgLy8gbXVzdCBkaXNwYXRjaCBhIERPTUFjdGl2
YXRlIGV2ZW50IC0gYSBjbGljayBldmVudCB3aWxsIG5vdCBkbyB0aGUgam9iLgotICAgIGlmIChl
dnQtPnR5cGUoKSA9PSBET01BY3RpdmF0ZUV2ZW50KSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0g
SU1BR0UgfHwgbV90eXBlID09IFNVQk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQpIHsKLSAgICAgICAg
ICAgIGlmICghbV9mb3JtKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlm
IChtX3R5cGUgPT0gUkVTRVQpCi0gICAgICAgICAgICAgICAgbV9mb3JtLT5yZXNldCgpOwotICAg
ICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIGlmICghbV9mb3JtLT5wcmVwYXJlU3VibWl0KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgeFBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHlQb3MgPSAwOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IGZhbHNlOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgIH0KLQotICAgIC8vIFVzZSBrZXkgcHJlc3Mg
ZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBv
biBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZl
bnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXByZXNzRXZlbnQgJiYgZXZ0LT5pc0tleWJv
YXJkRXZlbnQoKSkgewotICAgICAgICBib29sIGNsaWNrRWxlbWVudCA9IGZhbHNlOwotICAgICAg
ICBib29sIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSBmYWxzZTsKLQotICAgICAgICBET01TdHJp
bmcga2V5ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudEltcGwgKj4oZXZ0KS0+a2V5SWRlbnRp
ZmllcigpOwotCi0gICAgICAgIGlmIChrZXkgPT0gIlUrMDAwMDIwIikgewotICAgICAgICAgICAg
c3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAg
ICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAg
ICAgICAgICAgICBjYXNlIElNQUdFOgotICAgICAgICAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRl
IG1vdXNlIGNsaWNrIGZvciBzcGFjZWJhciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMuCi0g
ICAgICAgICAgICAgICAgICAgIC8vIFRoZSBBcHBLaXQgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHNv
bWUsIGJ1dCBub3QgYWxsLCBvZiB0aGVtLgotICAgICAgICAgICAgICAgICAgICBjbGlja0VsZW1l
bnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIFJBRElPOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiB1bnNlbGVjdGVkIHJhZGlv
IGlzIHRhYmJlZCBpbnRvIChiZWNhdXNlIHRoZSBlbnRpcmUgZ3JvdXAgaGFzIG5vdGhpbmcKLSAg
ICAgICAgICAgICAgICAgICAgLy8gY2hlY2tlZCwgb3IgYmVjYXVzZSBvZiBzb21lIGV4cGxpY2l0
IC5mb2N1cygpIGNhbGwpLCB0aGVuIGFsbG93IHNwYWNlIHRvIGNoZWNrIGl0LgotICAgICAgICAg
ICAgICAgICAgICBpZiAoIWNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNr
RWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAg
ICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAgIGNhc2UgUkFOR0U6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAgICAgY2FzZSBURVhUOgotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIGlmIChrZXkgPT0gIkVudGVyIikgewotICAgICAgICAgICAgc3dpdGNoIChtX3R5cGUpIHsK
LSAgICAgICAgICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgICAgICAgICBjYXNlIENIRUNL
Qk9YOgotICAgICAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAgICAgICAgICAgICAgIGNhc2Ug
SVNJTkRFWDoKLSAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAgICAgICAgICAgICAg
IGNhc2UgUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICAg
ICAgY2FzZSBURVhUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBtb3VzZSBjbGlj
ayBvbiB0aGUgZGVmYXVsdCBmb3JtIGJ1dHRvbiBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9m
IGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBjbGlja0RlZmF1bHRGb3JtQnV0dG9uID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBG
SUxFOgotICAgICAgICAgICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBS
RVNFVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAg
Ly8gU2ltdWxhdGUgbW91c2UgY2xpY2sgZm9yIGVudGVyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVt
ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7IC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBlbnRlciBvbiBhIHJh
ZGlvIGJ1dHRvbi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3R5
cGUgPT0gUkFESU8gJiYgKGtleSA9PSAiVXAiIHx8IGtleSA9PSAiRG93biIgfHwga2V5ID09ICJM
ZWZ0IiB8fCBrZXkgPT0gIlJpZ2h0IikpIHsKLSAgICAgICAgICAgIC8vIExlZnQgYW5kIHVwIG1l
YW4gInByZXZpb3VzIHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBSaWdodCBhbmQgZG93
biBtZWFuICJuZXh0IHJhZGlvIGJ1dHRvbiIuCi0gICAgICAgICAgICAvLyBUZXN0ZWQgaW4gV2lu
SUUsIGFuZCBldmVuIGZvciBSVEwsIGxlZnQgc3RpbGwgbWVhbnMgcHJldmlvdXMgcmFkaW8gYnV0
dG9uIChhbmQgc28gbW92ZXMKLSAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCkuICBTZWVtcyBz
dHJhbmdlLCBidXQgd2UnbGwgbWF0Y2ggaXQuCi0gICAgICAgICAgICBib29sIGZvcndhcmQgPSAo
a2V5ID09ICJEb3duIiB8fCBrZXkgPT0gIlJpZ2h0Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIC8vIFdlIGNhbiBvbmx5IHN0YXkgd2l0aGluIHRoZSBmb3JtJ3MgY2hpbGRyZW4gaWYgdGhl
IGZvcm0gaGFzbid0IGJlZW4gZGVtb3RlZCB0byBhIGxlYWYgYmVjYXVzZQotICAgICAgICAgICAg
Ly8gb2YgbWFsZm9ybWVkIEhUTUwuCi0gICAgICAgICAgICBOb2RlSW1wbCogbiA9IHRoaXM7Ci0g
ICAgICAgICAgICB3aGlsZSAoKG4gPSAoZm9yd2FyZCA/IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSA6
IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpKSkgewotICAgICAgICAgICAgICAgIC8vIE9uY2Ug
d2UgZW5jb3VudGVyIGEgZm9ybSBlbGVtZW50LCB3ZSBrbm93IHdlJ3JlIHRocm91Z2guCi0gICAg
ICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBMb29r
IGZvciBtb3JlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05h
bWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBs
KiBlbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAg
ICAgICAgICAgICBpZiAoZWx0LT5mb3JtKCkgIT0gbV9mb3JtKQotICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGlucHV0
VGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGlu
cHV0RWx0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihuKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsdC0+aW5wdXRUeXBlKCkgPT0gUkFESU8gJiYgaW5w
dXRFbHQtPm5hbWUoKSA9PSBuYW1lKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnB1dEVsdC0+aXNGb2N1c2FibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
cHV0RWx0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdl
dERvY3VtZW50KCktPnNldEZvY3VzTm9kZShpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW5wdXRFbHQtPmNsaWNrKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGNsaWNrRWxlbWVudCkgewotICAgICAgICAgICAgY2xpY2soZmFsc2UpOwot
ICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2UgaWYg
KGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gJiYgbV9mb3JtKSB7Ci0gICAgICAgICAgICBtX2Zvcm0t
PnN1Ym1pdENsaWNrKCk7Ci0gICAgICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVs
dEV2ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjppc0Vk
aXRhYmxlKCkKLXsKLSAgICByZXR1cm4gKChtX3R5cGUgPT0gVEVYVCkgfHwgKG1fdHlwZSA9PSBQ
QVNTV09SRCkgfHwKLSAgICAgICAgICAgIChtX3R5cGUgPT0gU0VBUkNIKSB8fCAobV90eXBlID09
IElTSU5ERVgpIHx8IChtX3R5cGUgPT0gRklMRSkpOwotfQotCi1ib29sIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOjppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGVJbXBsICphdHRyKSBjb25zdAotewotICAg
IHJldHVybiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTElu
cHV0RWxlbWVudEltcGw6OmRlZmF1bHRWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRE
ZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
dmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmRlZmF1
bHRDaGVja2VkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShjaGVja2VkQXR0
cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRD
aGVja2VkKGJvb2wgZGVmYXVsdENoZWNrZWQpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoZWNrZWRB
dHRyLCBkZWZhdWx0Q2hlY2tlZCA/ICIiIDogMCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6YWNjZXB0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFj
Y2VwdEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRBY2NlcHQoY29u
c3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXB0QXR0ciwgdmFs
dWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFjY2Vzc0tleSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjpzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShh
bGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjph
bHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWx0QXR0cik7Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsdChjb25zdCBET01TdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldE1heExlbmd0aChpbnQgX21heExlbmd0aCkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUobWF4bGVuZ3RoQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9tYXhMZW5ndGgpKTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0U2l6ZSh1bnNpZ25lZCBfc2l6ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoc2l6ZUF0dHIsIFFTdHJpbmc6Om51bWJlcihfc2l6ZSkpOwotfQotCi1E
T01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldERvY3VtZW50KCktPmNvbXBsZXRlVVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0K
LXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFNyYyhjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShzcmNBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6dXNlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKHVzZW1hcEF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRV
c2VNYXAoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodXNlbWFw
QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxMYWJlbEVsZW1l
bnRJbXBsOjpIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhU
TUxFbGVtZW50SW1wbChsYWJlbFRhZywgZG9jKQotewotfQotCi1IVE1MTGFiZWxFbGVtZW50SW1w
bDo6fkhUTUxMYWJlbEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBIVE1MTGFiZWxFbGVtZW50
SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9p
ZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2
ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVs
ZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRWxlbWVudEltcGwg
KkhUTUxMYWJlbEVsZW1lbnRJbXBsOjpmb3JtRWxlbWVudCgpCi17Ci0gICAgRE9NU3RyaW5nIGZv
cm1FbGVtZW50SWQgPSBnZXRBdHRyaWJ1dGUoZm9yQXR0cik7Ci0gICAgaWYgKGZvcm1FbGVtZW50
SWQuaXNOdWxsKCkpIHsKLSAgICAgICAgLy8gU2VhcmNoIGNoaWxkcmVuIG9mIHRoZSBsYWJlbCBl
bGVtZW50IGZvciBhIGZvcm0gZWxlbWVudC4KLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSB0aGlz
OwotICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHRoaXMpKSkg
ewotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAg
ICAgIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1w
bCAqPihub2RlKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC0+aXNHZW5lcmljRm9ybUVs
ZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3JtRWxl
bWVudElkLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdldERvY3Vt
ZW50KCktPmdldEVsZW1lbnRCeUlkKGZvcm1FbGVtZW50SWQpOwotfQotCi12b2lkIEhUTUxMYWJl
bEVsZW1lbnRJbXBsOjpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0g
Zm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1M
TGFiZWxFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkK
LXsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCk7Ci0gICAgaWYgKGVs
ZW1lbnQpCi0gICAgICAgIGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50
KTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbCAqSFRNTExhYmVsRWxlbWVudEltcGw6OmZvcm0o
KQotewotICAgIGZvciAoTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7IHAgIT0gMDsgcCA9IHAt
PnBhcmVudE5vZGUoKSkgewotICAgICAgICBpZiAocC0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAg
ICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnRJbXBsICo+KHApOwot
ICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1l
bnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNj
ZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudEltcGw6OnNldEFjY2Vzc0tl
eShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nlc3NrZXlB
dHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGFiZWxFbGVtZW50SW1wbDo6aHRtbEZv
cigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShmb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpIVE1MTGVnZW5kRWxlbWVudEltcGwo
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi06IEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsKGxlZ2VuZFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MTGVnZW5kRWxl
bWVudEltcGw6On5IVE1MTGVnZW5kRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotUmVuZGVyT2JqZWN0KiBIVE1MTGVnZW5kRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIHJldHVybiBu
ZXcgKGFyZW5hKSBSZW5kZXJMZWdlbmQodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MTGVnZW5k
RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAibGVnZW5kIjsKLX0KLQot
RE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdl
bmRFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhU
TUxMZWdlbmRFbGVtZW50SW1wbDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVudEltcGw6OnNldEFs
aWduKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0
ciwgdmFsdWUpOwotfQotCi1FbGVtZW50SW1wbCAqSFRNTExlZ2VuZEVsZW1lbnRJbXBsOjpmb3Jt
RWxlbWVudCgpCi17Ci0gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGZpZWxkc2V0IGJlbG9uZ2lu
ZyB0byB0aGlzIGxlZ2VuZC4KLSAgICBOb2RlSW1wbCAqZmllbGRzZXQgPSBwYXJlbnROb2RlKCk7
Ci0gICAgd2hpbGUgKGZpZWxkc2V0ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNldFRh
ZykpCi0gICAgICAgIGZpZWxkc2V0ID0gZmllbGRzZXQtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAo
IWZpZWxkc2V0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgZmlyc3QgZm9ybSBl
bGVtZW50IGluc2lkZSB0aGUgZmllbGRzZXQuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBjYXJl
IGFib3V0IHRhYmluZGV4PwotICAgIE5vZGVJbXBsICpub2RlID0gZmllbGRzZXQ7Ci0gICAgd2hp
bGUgKChub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShmaWVsZHNldCkpKSB7Ci0gICAgICAg
IGlmIChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50SW1w
bCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihub2RlKTsKLSAgICAg
ICAgICAgIGlmICghZWxlbWVudC0+aGFzTG9jYWxOYW1lKGxlZ2VuZFRhZykgJiYgZWxlbWVudC0+
aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxMZWdlbmRF
bGVtZW50SW1wbDo6Zm9jdXMoKQotewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZv
cm1FbGVtZW50KCkpCi0gICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTExl
Z2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQot
ewotICAgIGlmIChFbGVtZW50SW1wbCAqZWxlbWVudCA9IGZvcm1FbGVtZW50KCkpCi0gICAgICAg
IGVsZW1lbnQtPmFjY2Vzc0tleUFjdGlvbihzZW5kVG9BbnlFbGVtZW50KTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RFbGVtZW50
SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHNlbGVjdFRhZywgZG9jLCBmKSwgbV9vcHRpb25zKDAp
Ci17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6OkhUTUxTZWxlY3RF
bGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKHRhZ05hbWUsIGRvYywgZiksIG1fb3B0aW9ucygwKQotewotICAgIGluaXQoKTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmluaXQoKQotewotICAgIG1fb3B0aW9ucyA9IDA7
Ci0gICAgbV9tdWx0aXBsZSA9IGZhbHNlOwotICAgIG1fcmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7
Ci0gICAgLy8gMCBtZWFucyBpbnZhbGlkIChpLmUuIG5vdCBzZXQpCi0gICAgbV9zaXplID0gMDsK
LSAgICBtX21pbndpZHRoID0gMDsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp+SFRNTFNl
bGVjdEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQo
KS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotICAgIGlmIChtX29wdGlvbnMpIHsK
LSAgICAgICAgbV9vcHRpb25zLT5kZXRhY2goKTsKLSAgICAgICAgbV9vcHRpb25zLT5kZXJlZigp
OwotICAgIH0KLX0KLQotYm9vbCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OmNoZWNrRFREKGNvbnN0
IE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUo
KSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdO
YW1lKG9wdGdyb3VwVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShoclRhZykgfHwKLSAgICAg
ICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotdm9pZCBIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYg
KGhhc0NoYW5nZWRDaGlsZCgpICYmIG1fcmVuZGVyKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PGto
dG1sOjpSZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwot
ICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggY2gg
KTsKLX0KLQotCi1ET01TdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjp0eXBlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gKG1fbXVsdGlwbGUgPyAic2VsZWN0LW11bHRpcGxlIiA6ICJzZWxlY3Qt
b25lIik7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNlbGVjdGVkSW5kZXgoKSBj
b25zdAotewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2Vs
ZWN0ZWQKLSAgICB1aW50IG8gPSAwOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaXRl
bXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbzsK
LSAgICAgICAgICAgIG8rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBRX0FTU0VSVChtX211bHRp
cGxlKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpz
ZXRTZWxlY3RlZEluZGV4KCBpbnQgIGluZGV4ICkKLXsKLSAgICAvLyBkZXNlbGVjdCBhbGwgb3Ro
ZXIgb3B0aW9ucyBhbmQgc2VsZWN0IG9ubHkgdGhlIG5ldyBvbmUKLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpbnQgbGlzdEluZGV4Owot
ICAgIGZvciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4IDwgaW50KGl0ZW1zLnNpemUoKSk7IGxp
c3RJbmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1w
bCo+KGl0ZW1zW2xpc3RJbmRleF0pLT5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgfQotICAgIGxp
c3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsKLSAgICBpZiAobGlzdEluZGV4ID49
IDApCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2xp
c3RJbmRleF0pLT5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19
Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaW50
IGxlbiA9IDA7Ci0gICAgdWludCBpOwotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkr
KykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAg
ICAgICAgICAgbGVuKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47Ci19Ci0KLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjphZGQoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRNTEVsZW1l
bnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgUmVmUHRyPEhUTUxF
bGVtZW50SW1wbD4gcHJvdGVjdE5ld0NoaWxkKGVsZW1lbnQpOyAvLyBtYWtlIHN1cmUgdGhlIGVs
ZW1lbnQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYg
KCFlbGVtZW50IHx8ICEoZWxlbWVudC0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVu
dC0+aGFzTG9jYWxOYW1lKGhyVGFnKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGluc2VydEJl
Zm9yZShlbGVtZW50LCBiZWZvcmUsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXhjZXB0aW9u
Y29kZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsOjpyZW1vdmUoIGludCBpbmRleCApCi17Ci0gICAgaW50IGV4Y2VwdGlvbmNv
ZGUgPSAwOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChpbmRleCk7Ci0K
LSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAg
ICBpZihsaXN0SW5kZXggPCAwIHx8IGluZGV4ID49IGludChpdGVtcy5zaXplKCkpKQotICAgICAg
ICByZXR1cm47IC8vICMjIyB3aGF0IHNob3VsZCB3ZSBkbyA/IHJlbW92ZSB0aGUgbGFzdCBpdGVt
PwotCi0gICAgTm9kZUltcGwgKml0ZW0gPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgIGl0ZW0tPnJl
ZigpOwotICAgIHJlbW92ZUNoaWxkKGl0ZW0sIGV4Y2VwdGlvbmNvZGUpOwotICAgIGl0ZW0tPmRl
cmVmKCk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0
ZW1zKCk7Ci19Ci0KLURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnZhbHVlKCkKLXsK
LSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAg
ICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8
SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+
dmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIERPTVN0cmluZygiIik7Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewot
ICAgIGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIGZpbmQgdGhl
IG9wdGlvbiB3aXRoIHZhbHVlKCkgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcgotICAgIC8v
IGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICBRTWVtQXJyYXk8SFRNTEVs
ZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxO
YW1lKG9wdGlvblRhZykgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRl
bXNbaV0pLT52YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
T3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNldFNlbGVjdGVkKHRydWUpOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLVFTdHJpbmcgSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjpzdGF0ZSgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0g
bGlzdEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0KLSAgICBRQ2hhciBz
dGF0ZUNoYXJzW2xdOwotICAgIAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyBpKyspCi0gICAg
ICAgIGlmKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxI
VE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAg
ICBzdGF0ZUNoYXJzW2ldID0gJ1gnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZUNo
YXJzW2ldID0gJy4nOwotICAgIFFTdHJpbmcgc3RhdGUoc3RhdGVDaGFycywgbCk7Ci0KLSAgICBy
ZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnN0YXRlKCkgKyBzdGF0ZTsKLX0KLQot
dm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmX3N0
YXRlcykKLXsKLSAgICBRU3RyaW5nIF9zdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OjpmaW5kTWF0Y2hpbmdTdGF0ZShfc3RhdGVzKTsKLSAgICBpZiAoX3N0YXRlLmlzTnVsbCgpKSBy
ZXR1cm47Ci0KLSAgICByZWNhbGNMaXN0SXRlbXMoKTsKLQotICAgIFFTdHJpbmcgc3RhdGUgPSBf
c3RhdGU7Ci0gICAgaWYoIXN0YXRlLmlzRW1wdHkoKSAmJiAhc3RhdGUuY29udGFpbnMoJ1gnKSAm
JiAhbV9tdWx0aXBsZSkgewotICAgICAgICBxV2FybmluZygic2hvdWxkIG5vdCBoYXBwZW4gaW4g
cmVzdG9yZVN0YXRlISIpOwotICAgICAgICAvLyBLV1FTdHJpbmcgZG9lc24ndCBzdXBwb3J0IHRo
aXMgb3BlcmF0aW9uLiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYW55d2F5LgotICAgICAgICAvL3N0
YXRlWzBdID0gJ1gnOwotICAgIH0KLQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotCi0gICAgaW50IGwgPSBpdGVtcy5jb3VudCgpOwotICAgIGZv
cihpbnQgaSA9IDA7IGkgPCBsOyBpKyspIHsKLSAgICAgICAgaWYoaXRlbXNbaV0tPmhhc0xvY2Fs
TmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIG9l
ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pOwotICAgICAg
ICAgICAgb2UtPnNldFNlbGVjdGVkKHN0YXRlW2ldID09ICdYJyk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4
Y2VwdGlvbmNvZGUgKTsKLSAgICBpZiAoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHNldFJlY2Fs
Y0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUlt
cGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1
bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVwbGFjZUNoaWxkKG5ld0NoaWxkLG9s
ZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAg
ICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1w
bCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGw6OnJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2Rl
KTsKLSAgICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMo
KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJ
bXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6
OmFwcGVuZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiggIWV4Y2VwdGlv
bmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLSAgICBzZXRDaGFuZ2VkKHRy
dWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0
SXRlbXMoKTsKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmFkZENoaWxk
KG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSBrTWF4KGF0dHItPnZhbHVlKCku
dG9JbnQoKSwgMSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7
Ci0gICAgICAgIG1fbWlud2lkdGggPSBrTWF4KCBhdHRyLT52YWx1ZSgpLnRvSW50KCksIDAgKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpIHsKLSAgICAgICAg
bV9tdWx0aXBsZSA9ICghYXR0ci0+aXNOdWxsKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IGlnbm9yZSBmb3IgdGhl
IG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9jdXNBdHRyKSB7Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50
TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZl
bnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTFNl
bGVjdEVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRl
clN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyU2VsZWN0KHRo
aXMpOwotfQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YXBwZW5kRm9ybURhdGEoRm9y
bURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICBib29sIHN1Y2Nlc3NmdWwg
PSBmYWxzZTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRl
bXMoKTsKLQotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBp
KyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewot
ICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxI
VE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBpZiAob3B0aW9u
LT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0
YShuYW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9
IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAjIyMgdGhp
cyBjYXNlIHNob3VsZCBub3QgaGFwcGVuLiBtYWtlIHN1cmUgdGhhdCB3ZSBzZWxlY3QgdGhlIGZp
cnN0IG9wdGlvbgotICAgIC8vIGluIGFueSBjYXNlLiBvdGhlcndpc2Ugd2UgaGF2ZSBubyBjb25z
aXN0ZW5jeSB3aXRoIHRoZSBET00gaW50ZXJmYWNlLiBGSVhNRSEKLSAgICAvLyB3ZSByZXR1cm4g
dGhlIGZpcnN0IG9uZSBpZiBpdCB3YXMgYSBjb21ib2JveCBzZWxlY3QKLSAgICBpZiAoIXN1Y2Nl
c3NmdWwgJiYgIW1fbXVsdGlwbGUgJiYgbV9zaXplIDw9IDEgJiYgaXRlbXMuc2l6ZSgpICYmCi0g
ICAgICAgIChpdGVtc1swXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpKSB7Ci0gICAgICAgIEhU
TUxPcHRpb25FbGVtZW50SW1wbCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnRJbXBsKj4oaXRlbXNbMF0pOwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVsbCgp
KQotICAgICAgICAgICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+
dGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIGVuY29kZWRfdmFsdWVzLmFwcGVuZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkp
OwotICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vz
c2Z1bDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uVG9MaXN0SW5kZXgo
aW50IG9wdGlvbkluZGV4KSBjb25zdAotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9u
SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlu
dCBsaXN0SW5kZXggPSAwOwotICAgIGludCBvcHRpb25JbmRleDIgPSAwOwotICAgIGZvciAoOwot
ICAgICAgICAgb3B0aW9uSW5kZXgyIDwgaW50KGl0ZW1zLnNpemUoKSkgJiYgb3B0aW9uSW5kZXgy
IDw9IG9wdGlvbkluZGV4OwotICAgICAgICAgbGlzdEluZGV4KyspIHsgLy8gbm90IGEgdHlwbyEK
LSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQot
ICAgICAgICAgICAgb3B0aW9uSW5kZXgyKys7Ci0gICAgfQotICAgIGxpc3RJbmRleC0tOwotICAg
IHJldHVybiBsaXN0SW5kZXg7Ci19Ci0KLWludCBIVE1MU2VsZWN0RWxlbWVudEltcGw6Omxpc3RU
b09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxF
bGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAg
fHwgbGlzdEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0
SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0g
ICAgaW50IG9wdGlvbkluZGV4ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291
bnRpbmcgT1BUR1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgaW50IGk7Ci0g
ICAgZm9yIChpID0gMDsgaSA8IGxpc3RJbmRleDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0t
Pmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgb3B0aW9uSW5kZXgrKzsKLSAg
ICByZXR1cm4gb3B0aW9uSW5kZXg7Ci19Ci0KLS8vIEZJWE1FIDQxOTc5OTc6IHRoaXMgbWV0aG9k
IGlzIHVzZWQgYnkgdGhlIHB1YmxpYyBBUEkgLVtET01IVE1MU2VsZWN0RWxlbWVudCBvcHRpb25z
XSwgYnV0IGFsd2F5cyByZXR1cm5zCi0vLyBhbiBlbXB0eSBsaXN0LgotSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zKCkKLXsKLSAgICBpZiAo
IW1fb3B0aW9ucykgewotICAgICAgICBtX29wdGlvbnMgPSBuZXcgSFRNTE9wdGlvbnNDb2xsZWN0
aW9uSW1wbCh0aGlzKTsKLSAgICAgICAgbV9vcHRpb25zLT5yZWYoKTsKLSAgICB9Ci0gICAgcmV0
dXJuIG1fb3B0aW9uczsKLX0KLQotLy8gRklYTUU6IERlbGV0ZSBvbmNlIHRoZSBhYm92ZSBmdW5j
dGlvbiBpcyB3b3JraW5nIHdlbGwgZW5vdWdoIHRvIHVzZSBmb3IgcmVhbC4KLVJlZlB0cjxIVE1M
Q29sbGVjdGlvbkltcGw+IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6b3B0aW9uc0hUTUxDb2xsZWN0
aW9uKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxD
b2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OlNFTEVDVF9PUFRJT05TKSk7
Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpyZWNhbGNMaXN0SXRlbXMoKQotewot
ICAgIE5vZGVJbXBsKiBjdXJyZW50ID0gZmlyc3RDaGlsZCgpOwotICAgIG1fbGlzdEl0ZW1zLnJl
c2l6ZSgwKTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwqIGZvdW5kU2VsZWN0ZWQgPSAwOwot
ICAgIHdoaWxlKGN1cnJlbnQpIHsKLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUob3B0
Z3JvdXBUYWcpICYmIGN1cnJlbnQtPmZpcnN0Q2hpbGQoKSkgewotICAgICAgICAgICAgLy8gIyMj
IHdoYXQgaWYgb3B0Z3JvdXAgY29udGFpbnMganVzdCBjb21tZW50cz8gZG9uJ3Qgd2FudCBvbmUg
b2Ygbm8gb3B0aW9ucyBpbiBpdC4uLgotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1f
bGlzdEl0ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1z
LnNpemUoKS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAg
ICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBt
X2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMuc2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9s
aXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFdID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJ
bXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVs
dGlwbGUgJiYgbV9zaXplIDw9IDEpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0g
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAg
ICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBlbHNlIGlmIChmb3VuZFNlbGVjdGVkICYmICFtX211bHRpcGxlICYmIHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAgICAg
ICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudElt
cGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3Vy
cmVudC0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zLnJlc2l6
ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1ttX2xpc3RJ
dGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJyZW50KTsK
LSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCAqcGFyZW50ID0gY3VycmVudC0+cGFyZW50Tm9k
ZSgpOwotICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAg
aWYgKCFjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMpCi0gICAgICAg
ICAgICAgICAgY3VycmVudCA9IHBhcmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQotICAg
IH0KLSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBzZXRSZWNhbGNMaXN0SXRlbXMo
KTsKLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKTsK
LX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFJlY2FsY0xpc3RJdGVtcygpCi17
Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSB0cnVlOwotICAgIGlmIChtX3JlbmRlcikKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8a2h0bWw6OlJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9u
c0NoYW5nZWQodHJ1ZSk7Ci0gICAgc2V0Q2hhbmdlZCgpOwotfQotCi12b2lkIEhUTUxTZWxlY3RF
bGVtZW50SW1wbDo6cmVzZXQoKQotewotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIHVpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRl
bXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpvcHRpb24gPSBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAg
ICBib29sIHNlbGVjdGVkID0gKCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlz
TnVsbCgpKTsKLSAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwotICAg
ICAgICB9Ci0gICAgfQotICAgIGlmICggbV9yZW5kZXIgKQotICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJTZWxlY3QqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0gICAg
c2V0Q2hhbmdlZCggdHJ1ZSApOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bm90
aWZ5T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwg
Ym9vbCBzZWxlY3RlZCkKLXsKLSAgICBpZiAoc2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUpIHsKLSAg
ICAgICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKLSAgICAgICAgUU1lbUFycmF5PEhU
TUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgICAgIHVpbnQgaTsKLSAg
ICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBp
ZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9
IChpdGVtc1tpXSA9PSBzZWxlY3RlZE9wdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYg
KG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJTZWxlY3QqPihtX3JlbmRlcikt
PnNldFNlbGVjdGlvbkNoYW5nZWQodHJ1ZSk7Ci0KLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudElt
cGwgKmV2dCkKLXsKLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGlu
ZyBzaW11bGF0ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBw
cm9wZXIgc2VuZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldnQtPnR5cGUo
KSA9PSBrZXlwcmVzc0V2ZW50KSB7Ci0gICAgCi0gICAgICAgIGlmICghbV9mb3JtIHx8ICFtX3Jl
bmRlciB8fCAhZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgICAgIERPTVN0cmluZyBrZXkgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50
SW1wbCAqPihldnQpLT5rZXlJZGVudGlmaWVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoa2V5
ID09ICJFbnRlciIpIHsKLSAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xpY2soKTsKLSAgICAg
ICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQot
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRv
QW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6c2V0TXVsdGlwbGUoYm9vbCBtdWx0aXBsZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobXVs
dGlwbGVBdHRyLCBtdWx0aXBsZSA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1l
bnRJbXBsOjpzZXRTaXplKGludCBzaXplKQotewotICAgIHNldEF0dHJpYnV0ZShzaXplQXR0ciwg
UVN0cmluZzo6bnVtYmVyKHNpemUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1M
S2V5Z2VuRWxlbWVudEltcGw6OkhUTUxLZXlnZW5FbGVtZW50SW1wbChEb2N1bWVudEltcGwqIGRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCogZikKLSAgICA6IEhUTUxTZWxlY3RFbGVtZW50SW1wbChr
ZXlnZW5UYWcsIGRvYywgZikKLXsKLSAgICBRU3RyaW5nTGlzdCBrZXlzID0gS1NTTEtleUdlbjo6
c3VwcG9ydGVkS2V5U2l6ZXMoKTsKLSAgICBmb3IgKFFTdHJpbmdMaXN0OjpJdGVyYXRvciBpID0g
a2V5cy5iZWdpbigpOyBpICE9IGtleXMuZW5kKCk7ICsraSkgewotICAgICAgICBIVE1MT3B0aW9u
RWxlbWVudEltcGwqIG8gPSBuZXcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKGRvYywgZm9ybSgpKTsK
LSAgICAgICAgYWRkQ2hpbGQobyk7Ci0gICAgICAgIG8tPmFkZENoaWxkKG5ldyBUZXh0SW1wbChk
b2MsIERPTVN0cmluZygqaSkpKTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBIVE1MS2V5Z2VuRWxl
bWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAia2V5Z2VuIjsKLX0KLQotdm9p
ZCBIVE1MS2V5Z2VuRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGFsbGVuZ2VBdHRy
KQotICAgICAgICBtX2NoYWxsZW5nZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGtleXR5cGVBdHRyKQotICAgICAgICBtX2tleVR5cGUgPSBhdHRyLT52YWx1
ZSgpOwotICAgIGVsc2UKLSAgICAgICAgLy8gc2tpcCBIVE1MU2VsZWN0RWxlbWVudEltcGwgcGFy
c2luZyEKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6YXBwZW5kRm9y
bURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGVkX3ZhbHVlcywgYm9vbCkKLXsKLSAgICAvLyBPbmx5
IFJTQSBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgotICAgIGlmICghbV9rZXlUeXBlLmlzTnVs
bCgpICYmICFlcXVhbElnbm9yaW5nQ2FzZShtX2tleVR5cGUsICJyc2EiKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIFFTdHJpbmcgdmFsdWUgPSBLU1NMS2V5R2VuOjpzaWduZWRQdWJsaWNL
ZXlBbmRDaGFsbGVuZ2VTdHJpbmcoc2VsZWN0ZWRJbmRleCgpLCBtX2NoYWxsZW5nZS5xc3RyaW5n
KCksIGdldERvY3VtZW50KCktPmZyYW1lKCktPmJhc2VVUkwoKSk7Ci0gICAgaWYgKHZhbHVlLmlz
TnVsbCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RlZF92YWx1ZXMuYXBwZW5k
RGF0YShuYW1lKCksIHZhbHVlLnV0ZjgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OkhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAg
IDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0Z3JvdXBUYWcsIGRvYywgZikKLXsKLX0K
LQotSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6On5IVE1MT3B0R3JvdXBFbGVtZW50SW1wbCgpCi17
Ci19Ci0KLWJvb2wgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTVN0cmluZyBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJvcHRncm91cCI7Ci19Ci0KLU5vZGVJ
bXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5l
d0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAg
Tm9kZUltcGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjppbnNlcnRCZWZv
cmUobmV3Q2hpbGQscmVmQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICggIWV4Y2VwdGlv
bmNvZGUgKQotICAgICAgICByZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0gICAgcmV0dXJuIHJlc3Vs
dDsKLX0KLQotTm9kZUltcGwgKkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQg
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OnJlcGxhY2VDaGlsZChuZXdDaGlsZCxvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAg
aWYoIWV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICBy
ZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJl
bW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewot
ICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVtb3Zl
Q2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSAp
Ci0gICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1Ob2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OmFwcGVuZENoaWxkICggTm9kZUlt
cGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1
bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4
Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHJlY2FsY1Nl
bGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1Ob2RlSW1wbCogSFRNTE9w
dEdyb3VwRWxlbWVudEltcGw6OmFkZENoaWxkKE5vZGVJbXBsKiBuZXdDaGlsZCkKLXsKLSAgICBy
ZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGw6OmFkZENoaWxkKG5ld0NoaWxkKTsKLX0KLQotdm9pZCBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsK
LSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0
cik7Ci0gICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVs
ZW1lbnRJbXBsOjpyZWNhbGNTZWxlY3RPcHRpb25zKCkKLXsKLSAgICBOb2RlSW1wbCAqc2VsZWN0
ID0gcGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChzZWxlY3QgJiYgIXNlbGVjdC0+aGFzVGFnTmFt
ZShzZWxlY3RUYWcpKQotICAgICAgICBzZWxlY3QgPSBzZWxlY3QtPnBhcmVudE5vZGUoKTsKLSAg
ICBpZiAoc2VsZWN0KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwq
PihzZWxlY3QpLT5zZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRH
cm91cEVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShsYWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpzZXRMYWJl
bChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsYWJlbEF0dHIs
IHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MT3B0aW9uRWxlbWVudElt
cGw6OkhUTUxPcHRpb25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVt
ZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKG9wdGlvblRhZywg
ZG9jLCBmKQotewotICAgIG1fc2VsZWN0ZWQgPSBmYWxzZTsKLX0KLQotYm9vbCBIVE1MT3B0aW9u
RWxlbWVudEltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLURPTVN0cmluZyBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAg
IHJldHVybiAib3B0aW9uIjsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6
dGV4dCgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHRleHQ7Ci0KLSAgICAvLyBXaW5JRSBkb2Vz
IG5vdCB1c2UgdGhlIGxhYmVsIGF0dHJpYnV0ZSwgc28gYXMgYSBxdWlyaywgd2UgaWdub3JlIGl0
LgotICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUo
KSkgewotICAgICAgICBET01TdHJpbmcgdGV4dCA9IGdldEF0dHJpYnV0ZShsYWJlbEF0dHIpOwot
ICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0g
ICAgfQotCi0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzLT5maXJzdENoaWxkKCk7Ci0gICAg
d2hpbGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RF
IHx8IG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFKQotICAgICAgICAg
ICAgdGV4dCArPSBuLT5ub2RlVmFsdWUoKTsKLSAgICAgICAgLy8gc2tpcCBzY3JpcHQgY29udGVu
dAotICAgICAgICBpZiAobi0+aXNFbGVtZW50Tm9kZSgpICYmIG4tPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjpzY3JpcHRUYWcpKQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dFNpYmxpbmco
dGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2Rl
KHRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB0ZXh0OwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0VGV4dChjb25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhjZXB0aW9u
KQotewotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVyZSdz
IGV4YWN0bHkgMSBjaGlsZCBub2RlLCBhbmQgaXQncyBhIHRleHQgbm9kZS4KLSAgICBOb2RlSW1w
bCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1RleHRO
b2RlKCkgJiYgIWNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFRl
eHRJbXBsICo+KGNoaWxkKS0+c2V0RGF0YSh0ZXh0LCBleGNlcHRpb24pOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGlsZChuZXcg
VGV4dEltcGwoZ2V0RG9jdW1lbnQoKSwgdGV4dCksIGV4Y2VwdGlvbik7Ci19Ci0KLWludCBIVE1M
T3B0aW9uRWxlbWVudEltcGw6OmluZGV4KCkgY29uc3QKLXsKLSAgICAvLyBMZXQncyBkbyB0aGlz
IGR5bmFtaWNhbGx5LiBNaWdodCBiZSBhIGJpdCBzbG93LCBidXQgd2UncmUgc3VyZQotICAgIC8v
IHdlIHdvbid0IGZvcmdldCB0byB1cGRhdGUgYSBtZW1iZXIgdmFyaWFibGUgaW4gc29tZSBjYXNl
cy4uLgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0g
ICAgaWYgKHNlbGVjdCkgewotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRl
bXMgPSBzZWxlY3QtPmxpc3RJdGVtcygpOwotICAgICAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7
Ci0gICAgICAgIGludCBvcHRpb25JbmRleCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkg
PCBsOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnRJbXBsKj4oaXRlbXNbaV0pID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBv
cHRpb25JbmRleDsKLSAgICAgICAgICAgICAgICBvcHRpb25JbmRleCsrOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEhUTUxPcHRpb25F
bGVtZW50SW1wbDo6c2V0SW5kZXgoaW50LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAgICBleGNlcHRp
b24gPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAvLyAj
IyMKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBz
ZWxlY3RlZEF0dHIpCi0gICAgICAgIG1fc2VsZWN0ZWQgPSAoIWF0dHItPmlzTnVsbCgpKTsKLSAg
ICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKQotICAgICAgICBtX3ZhbHVlID0g
YXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRp
b25FbGVtZW50SW1wbDo6dmFsdWUoKSBjb25zdAotewotICAgIGlmICggIW1fdmFsdWUuaXNOdWxs
KCkgKQotICAgICAgICByZXR1cm4gbV92YWx1ZTsKLSAgICAvLyBVc2UgdGhlIHRleHQgaWYgdGhl
IHZhbHVlIHdhc24ndCBzZXQuCi0gICAgcmV0dXJuIHRleHQoKS5xc3RyaW5nKCkuc3RyaXBXaGl0
ZVNwYWNlKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIHZhbHVl
KTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFNlbGVjdGVkKGJvb2wgX3Nl
bGVjdGVkKQotewotICAgIGlmKG1fc2VsZWN0ZWQgPT0gX3NlbGVjdGVkKQotICAgICAgICByZXR1
cm47Ci0gICAgbV9zZWxlY3RlZCA9IF9zZWxlY3RlZDsKLSAgICBIVE1MU2VsZWN0RWxlbWVudElt
cGwgKnNlbGVjdCA9IGdldFNlbGVjdCgpOwotICAgIGlmIChzZWxlY3QpCi0gICAgICAgIHNlbGVj
dC0+bm90aWZ5T3B0aW9uU2VsZWN0ZWQodGhpcyxfc2VsZWN0ZWQpOwotfQotCi12b2lkIEhUTUxP
cHRpb25FbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbCAqc2VsZWN0ID0gZ2V0U2VsZWN0KCk7Ci0gICBpZiAoc2VsZWN0KQotICAgICAgIHNl
bGVjdC0+Y2hpbGRyZW5DaGFuZ2VkKCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbCAqSFRN
TE9wdGlvbkVsZW1lbnRJbXBsOjpnZXRTZWxlY3QoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpz
ZWxlY3QgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNU
YWdOYW1lKHNlbGVjdFRhZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgp
OwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPihzZWxlY3Qp
OwotfQotCi1ib29sIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6ZGVmYXVsdFNlbGVjdGVkKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIpLmlzTnVsbCgpOwot
fQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0RGVmYXVsdFNlbGVjdGVkKGJvb2wg
YikKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2VsZWN0ZWRBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQot
RE9NU3RyaW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6bGFiZWwoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUobGFiZWxBdHRyKTsKLX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVu
dEltcGw6OnNldExhYmVsKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKGxhYmVsQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpIVE1MVGV4dEFyZWFFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKHRleHRhcmVhVGFnLCBkb2MsIGYpLCBtX3ZhbHVlSXNWYWxpZChmYWxzZSksIG1fdmFs
dWVNYXRjaGVzUmVuZGVyZXIoZmFsc2UpCi17Ci0gICAgLy8gRFREIHJlcXVpcmVzIHJvd3MgJiBj
b2xzIGJlIHNwZWNpZmllZCwgYnV0IHdlIHdpbGwgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHRz
Ci0gICAgbV9yb3dzID0gMjsKLSAgICBtX2NvbHMgPSAyMDsKLSAgICBtX3dyYXAgPSB0YV9WaXJ0
dWFsOwotfQotCi1IVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6fkhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9jdW1lbnQoKS0+ZGVyZWdpc3Rl
ck1haW50YWluc1N0YXRlKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJldHVybiAidGV4dGFyZWEiOwotfQotCi1RU3Ry
aW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzdGF0ZSggKQotewotICAgIC8vIE1ha2Ugc3Vy
ZSB0aGUgc3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGw6OnN0YXRlKCkgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7Ci19Ci0KLXZvaWQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQot
ewotICAgIFFTdHJpbmcgc3RhdGUgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZmluZE1h
dGNoaW5nU3RhdGUoc3RhdGVzKTsKLSAgICBpZiAoc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLSAg
ICBzZXREZWZhdWx0VmFsdWUoc3RhdGUubGVmdChzdGF0ZS5sZW5ndGgoKS0xKSk7Ci0gICAgLy8g
dGhlIGNsb3NlKCkgaW4gdGhlIHJlbmRlcnRyZWUgd2lsbCB0YWtlIGNhcmUgb2YgdHJhbnNmZXJy
aW5nIGRlZmF1bHR2YWx1ZSB0byAndmFsdWUnCi19Ci0KLWludCBIVE1MVGV4dEFyZWFFbGVtZW50
SW1wbDo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uU3Rh
cnQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpz
ZWxlY3Rpb25FbmQoKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2VsZWN0aW9uRW5kKCk7Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlv
blN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlclRleHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQp
OwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQoaW50
IGVuZCkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRl
eHRBcmVhICo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZvaWQgSFRN
TFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdCggICkKLXsKLSAgICBpZiAobV9yZW5kZXIpCi0g
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4obV9yZW5kZXIpLT5zZWxlY3QoKTsK
LX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50
IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nh
c3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwg
ZW5kKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6Y2hpbGRyZW5DaGFuZ2Vk
KCkKLXsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUoKSk7Ci19Ci0gICAgCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJ
bXBsICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcm93c0F0dHIpIHsKLSAgICAg
ICAgbV9yb3dzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMzsK
LSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVk
c0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGNvbHNBdHRyKSB7Ci0gICAgICAgIG1fY29scyA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZh
bHVlKCkudG9JbnQoKSA6IDYwOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAg
IHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gd3JhcEF0dHIpIHsKLSAgICAgICAgLy8gdmlydHVhbCAvIHBo
eXNpY2FsIGlzIE5ldHNjYXBlIGV4dGVuc2lvbiBvZiBIVE1MIDMuMCwgbm93IGRlcHJlY2F0ZWQK
LSAgICAgICAgLy8gc29mdC8gaGFyZCAvIG9mZiBpcyByZWNvbW1lbmRhdGlvbiBmb3IgSFRNTCA0
IGV4dGVuc2lvbiBieSBJRSBhbmQgTlMgNAotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
YXR0ci0+dmFsdWUoKSwgInZpcnR1YWwiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1
ZSgpLCAic29mdCIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFfVmlydHVhbDsKLSAgICAgICAg
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInBoeXNpY2FsIikgfHwg
ZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImhhcmQiKSkKLSAgICAgICAgICAgIG1f
d3JhcCA9IHRhX1BoeXNpY2FsOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShh
dHRyLT52YWx1ZSgpLCAib24iICkpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9QaHlzaWNhbDsK
LSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIp
KQotICAgICAgICAgICAgbV93cmFwID0gdGFfTm9XcmFwOwotICAgICAgICBpZiAocmVuZGVyZXIo
KSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxj
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewotICAg
ICAgICAvLyBpZ25vcmUgZm9yIHRoZSBtb21lbnQKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbmZvY3VzQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxF
dmVudExpc3RlbmVyKHNlbGVjdEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBvbmNoYW5nZUF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hh
bmdlRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVJlbmRlck9iamVjdCAq
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVu
YSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJU
ZXh0QXJlYSh0aGlzKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXBwZW5k
Rm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCkKLXsKLSAgICBpZiAobmFtZSgp
LmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgp
LCB2YWx1ZSgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVt
ZW50SW1wbDo6cmVzZXQoKQotewotICAgIHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KLQot
dm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dXBkYXRlVmFsdWUoKQotewotICAgIGlmICgg
IW1fdmFsdWVJc1ZhbGlkICkgewotICAgICAgICBpZiAoIG1fcmVuZGVyICkgewotICAgICAgICAg
ICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRBcmVhKj4oIG1fcmVuZGVyICktPnRl
eHQoKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1
ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBkZWZhdWx0VmFsdWUo
KS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICAgICAgbV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAgIH0KLX0KLQot
RE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp2YWx1ZSgpCi17Ci0gICAgdXBkYXRl
VmFsdWUoKTsKLSAgICByZXR1cm4gbV92YWx1ZS5pc051bGwoKSA/IERPTVN0cmluZygiIikgOiBt
X3ZhbHVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIG1fdmFsdWUgPSB2YWx1ZS5xc3RyaW5nKCk7Ci0g
ICAgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIG1fdmFsdWVJc1ZhbGlkID0g
dHJ1ZTsKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIG1fcmVuZGVyLT51cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgIC8vIEZJWE1FOiBGb3JjZSByZWxvYWQgZnJvbSByZW5kZXJlciwgYXMgcmVu
ZGVyZXIgbWF5IGhhdmUgbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MuCi0gICAgbV92YWx1ZUlzVmFs
aWQgPSBmYWxzZTsKLSAgICBzZXRDaGFuZ2VkKHRydWUpOwotfQotCi0KLURPTVN0cmluZyBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDo6ZGVmYXVsdFZhbHVlKCkKLXsKLSAgICBET01TdHJpbmcgdmFs
ID0gIiI7Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNvbW1lbnRzIC0ganVzdCBncmFiIHRoZSB0ZXh0
IG5vZGVzCi0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gZmlyc3RDaGlsZCgpOyBuOyBu
ID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAg
ICAgICAgIHZhbCArPSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KG4pLT5kYXRhKCk7CiAgICAgCi0g
ICAgaWYgKHZhbFswXSA9PSAnXHInICYmIHZhbFsxXSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9
IHZhbC5jb3B5KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwyKTsKLSAgICB9IGVsc2UgaWYgKHZh
bFswXSA9PSAnXHInIHx8IHZhbFswXSA9PSAnXG4nKSB7Ci0gICAgICAgIHZhbCA9IHZhbC5jb3B5
KCk7Ci0gICAgICAgIHZhbC5yZW1vdmUoMCwxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOwot
fQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXREZWZhdWx0VmFsdWUoY29uc3Qg
RE9NU3RyaW5nICZkZWZhdWx0VmFsdWUpCi17Ci0gICAgLy8gdGhlcmUgbWF5IGJlIGNvbW1lbnRz
IC0gcmVtb3ZlIGFsbCB0aGUgdGV4dCBub2RlcyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggb25lCi0g
ICAgUVB0ckxpc3Q8Tm9kZUltcGw+IHRvUmVtb3ZlOwotICAgIE5vZGVJbXBsICpuOwotICAgIGZv
ciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlm
IChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQobik7Ci0gICAg
UVB0ckxpc3RJdGVyYXRvcjxOb2RlSW1wbD4gaXQodG9SZW1vdmUpOwotICAgIGludCBleGNlcHRp
b25jb2RlID0gMDsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KSB7Ci0gICAgICAgIE5v
ZGVJbXBsICpuID0gaXQuY3VycmVudCgpOwotICAgICAgICBuLT5yZWYoKTsKLSAgICAgICAgcmVt
b3ZlQ2hpbGQobiwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgIG4tPmRlcmVmKCk7Ci0gICAgfQot
ICAgIGluc2VydEJlZm9yZShnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZShkZWZhdWx0VmFs
dWUpLGZpcnN0Q2hpbGQoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZh
bHVlKTsKLX0KLQotYm9vbCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6aXNFZGl0YWJsZSgpCi17
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OmFj
Y2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgZm9jdXMoKTsKLX0K
LQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBtX3ZhbHVl
SXNWYWxpZCA9IHRydWU7Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmF0dGFjaCgp
OwotICAgIHVwZGF0ZVZhbHVlKCk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6
OmRldGFjaCgpCi17Ci0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwot
ICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudElt
cGw6OnNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShhY2Nlc3NrZXlBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVu
dEltcGw6OnNldENvbHMoaW50IGNvbHMpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNBdHRyLCBR
U3RyaW5nOjpudW1iZXIoY29scykpOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBs
OjpzZXRSb3dzKGludCByb3dzKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgUVN0cmlu
Zzo6bnVtYmVyKHJvd3MpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSXNJbmRl
eEVsZW1lbnRJbXBsOjpIVE1MSXNJbmRleEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBI
VE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTElucHV0RWxlbWVudEltcGwoaXNpbmRl
eFRhZywgZG9jLCBmKQotewotICAgIG1fdHlwZSA9IFRFWFQ7Ci0gICAgbV9uYW1lID0gImlzaW5k
ZXgiOwotfQotCi12b2lkIEhUTUxJc0luZGV4RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmli
dXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9
PSBwcm9tcHRBdHRyKQotCXNldFZhbHVlKGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UKLSAgICAg
ICAgLy8gZG9uJ3QgY2FsbCBIVE1MSW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZSBo
ZXJlLCBhcyBpdCB3b3VsZAotICAgICAgICAvLyBhY2NlcHQgYXR0cmlidXRlcyB0aGlzIGVsZW1l
bnQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MSXNJbmRleEVs
ZW1lbnRJbXBsOjpwcm9tcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUocHJv
bXB0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6c2V0UHJvbXB0KGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHByb21wdEF0dHIsIHZh
bHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11bnNpZ25lZCBIVE1MT3B0aW9uc0Nv
bGxlY3Rpb25JbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50
ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6
c2V0TGVuZ3RoKHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVk
LgotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6aXRlbSh1bnNpZ25l
ZCBpbmRleCkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVudGVkLgotICAgIHJldHVy
biAwOwotfQotCi1Ob2RlSW1wbCAqSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbDo6bmFtZWRJdGVt
KGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3QKLXsKLSAgICAvLyBOb3QgeWV0IGltcGxlbWVu
dGVkLgotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZvcm1EYXRh
TGlzdDo6Rm9ybURhdGFMaXN0KFFUZXh0Q29kZWMgKmMpCi0gICAgOiBtX2NvZGVjKGMpCi17Ci19
Ci0KLXZvaWQgRm9ybURhdGFMaXN0OjphcHBlbmRTdHJpbmcoY29uc3QgUUNTdHJpbmcgJnMpCi17
Ci0gICAgbV9saXN0LmFwcGVuZChzKTsKLX0KLQotdm9pZCBGb3JtRGF0YUxpc3Q6OmFwcGVuZFN0
cmluZyhjb25zdCBRU3RyaW5nICZzKQotewotICAgIFFDU3RyaW5nIGNzdHIgPSBmaXhMaW5lQnJl
YWtzKG1fY29kZWMtPmZyb21Vbmljb2RlKHMsIHRydWUpKTsKLSAgICBjc3RyLnRydW5jYXRlKGNz
dHIubGVuZ3RoKCkpOwotICAgIG1fbGlzdC5hcHBlbmQoY3N0cik7Ci19Ci0KLXZvaWQgRm9ybURh
dGFMaXN0OjphcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01TdHJpbmcg
JmZpbGVuYW1lKQotewotICAgIGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsKLSAgICBtX2xp
c3QuYXBwZW5kKGZpbGVuYW1lLnFzdHJpbmcoKSk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlCkluZGV4
OiBraHRtbC9odG1sL0hUTUxMYWJlbEVsZW1lbnRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
aHRtbC9IVE1MTGFiZWxFbGVtZW50SW1wbC5oCShyZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0
bWwvSFRNTExhYmVsRWxlbWVudEltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAK
ICAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQogICogICAg
ICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQogICogICAg
ICAgICAgIChDKSAyMDAwIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJp
Z2h0IChDKSAyMDA0IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQs
IDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAt
MjIsNDQ2ICsyMiwxNSBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICov
Ci0jaWZuZGVmIEhUTUxfRk9STUlNUExfSAotI2RlZmluZSBIVE1MX0ZPUk1JTVBMX0gKKyNpZm5k
ZWYgSFRNTF9IVE1MTGFiZWxFbGVtZW50SW1wbF9oCisjZGVmaW5lIEhUTUxfSFRNTExhYmVsRWxl
bWVudEltcGxfaAogCiAjaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVk
ZSAiaHRtbC9odG1sX21pc2NpbXBsLmgiCi0KLSNpbmNsdWRlIDxxcHRydmVjdG9yLmg+Ci0jaW5j
bHVkZSA8cW1lbWFycmF5Lmg+Ci0jaW5jbHVkZSA8a3htbGNvcmUvSGFzaE1hcC5oPgotCi1jbGFz
cyBLSFRNTFZpZXc7Ci1jbGFzcyBRVGV4dENvZGVjOwotCi1uYW1lc3BhY2Uga2h0bWwKLXsKLSAg
ICBjbGFzcyBGb3JtRGF0YTsKLSAgICBjbGFzcyBSZW5kZXJGb3JtRWxlbWVudDsKLSAgICBjbGFz
cyBSZW5kZXJUZXh0QXJlYTsKLSAgICBjbGFzcyBSZW5kZXJTZWxlY3Q7Ci0gICAgY2xhc3MgUmVu
ZGVyTGluZUVkaXQ7Ci0gICAgY2xhc3MgUmVuZGVyRmlsZUJ1dHRvbjsKLSAgICBjbGFzcyBSZW5k
ZXJTbGlkZXI7Ci19CiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7Ci1jbGFz
cyBGb3JtRGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3MgSFRN
TEltYWdlRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1MT3B0
aW9uRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRN
TEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0gICAg
dmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4g
VGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0
IHsgcmV0dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFs
IHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZy
b21Eb2N1bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1lbnRz
KCk7Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUoKSBj
b25zdCB7IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3QgRE9N
U3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4gbV9i
b3VuZGFyeTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0g
ICAgYm9vbCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsgfQot
Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUlt
cGwgKmF0dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdl
RWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1l
bnRJbXBsICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJtaXQo
Ym9vbCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0K
LSAgICB2b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9IG1h
bGZvcm1lZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1fbWFs
Zm9ybWVkOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0
ZUltcGwgKmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAgICBi
b29sIGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKTsK
LQotICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERP
TVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmlu
ZyBhY3Rpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJik7
Ci0KLSAgICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2QoY29u
c3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkxOG5E
YXRhKCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVuZCBj
bGFzcyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBsOjpD
b2xsZWN0aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1MSW1h
Z2VFbGVtZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAgIERP
TVN0cmluZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0cmlu
ZyBtX2JvdW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9vbCBt
X3Bvc3QgOiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRvY29t
cGxldGUgOiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5nc3Vi
bWl0IDogMTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1lZCA6
IDE7Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmlu
ZyAmKTsKLSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQotICAg
IHVuc2lnbmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7
Ci0KLSAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50
SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZyaWVu
ZCBjbGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhU
TUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMg
ZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAg
SFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAgdmly
dHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0Nv
bnRyb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5hYmxl
ZCgpIGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVh
bCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wg
ZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0g
ICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAgICB2
b2lkIG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXREaXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2Fi
bGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0
OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGJv
b2wgcmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBzZXRS
ZWFkT25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUo
IFN0eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmly
dHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAg
LyoKLSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNvZGVk
IG5hbWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJuIHRy
dWUgZm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAgKi8K
LSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkgeyBy
ZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAgICB2
aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRlKFFT
dHJpbmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1p
dEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQWN0
aXZhdGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgoKSBj
b25zdDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJ
bXBsICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVhZE9u
bHk6IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhU
TUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAgIFNV
Qk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBET01T
dHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJP
YmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxlKik7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
SW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3Qm
LCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9u
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdmly
dHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAg
RE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERPTVN0
cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51bSAg
bV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAgIG1f
YWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRN
TEZpZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwK
LXsKLXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRv
YywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVsZFNl
dEVsZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25z
dCB7IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBs
KiBuZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAg
ICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRl
ckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5n
IHR5cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElu
cHV0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAg
ICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFzcyBr
aHRtbDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0RWxl
bWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1Ymxp
YzoKLSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVtIHsK
LSAgICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0gICAg
ICAgIENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAgICBS
RVNFVCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwKLSAg
ICAgICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsKLQot
ICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVk
TmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYg
PSAwKTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5p
dCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29u
c3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2Fy
ZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNv
bnN0IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0
cmluZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29u
c3QgeyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0
ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHRC
dXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNF
VCB8fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24o
KSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29sKTsK
LSAgICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5hdGU7
IH0KLSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0aCgp
IGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVy
biBtX3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VHlw
ZShjb25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdmFs
dWVXaXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihj
b25zdCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0
Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAg
dmlydHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NXT1JE
OyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3Rv
cmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigpOwot
Ci0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAg
IHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChp
bnQpOwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGlu
dCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVu
dHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZv
aWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0
cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lk
IGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpOwot
Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklz
TmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJP
YmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAq
KTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZv
cm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vz
c2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRlZFN1
Ym1pdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBm
bGFnKTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsg
fQotICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0gICAg
dmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlwZT1p
bWFnZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBvczsg
fQotICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0dWFs
IHZvaWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0
dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBk
YXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2
dCk7Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBhbHRU
ZXh0KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7IHJl
dHVybiBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBjb25z
dDsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAgCi0g
ICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENoZWNr
ZWQoYm9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRB
Y2NlcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNv
bnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERP
TVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBET01T
dHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAoKSBj
b25zdDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7Ci0K
LSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGlu
dCAgICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAgbV9z
aXplOwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0czsK
LQotICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVtIG1f
dHlwZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0Q2hl
Y2tlZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1f
aW5kZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29sIG1f
YWN0aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBib29s
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor
Y2xhc3MgSFRNTEZvcm1FbGVtZW50SW1wbDsKK2NsYXNzIE1hcHBlZEF0dHJpYnV0ZUltcGw7CiAK
IGNsYXNzIEhUTUxMYWJlbEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1wbAogewpA
QCAtNDk2LDMzOCArNjUsNiBAQCBwdWJsaWM6CiAgICAgRE9NU3RyaW5nIG1fZm9ybUVsZW1lbnRJ
RDsKIH07CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTExlZ2VuZEVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAg
SFRNTExlZ2VuZEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTExlZ2VuZEVsZW1lbnRJbXBsKCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGto
dG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpS
ZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsK
LQotICAgIC8qKgotICAgICAqIFRoZSBmaXJzdCBmb3JtIGVsZW1lbnQgaW4gdGhlIGxlZ2VuZCdz
IGZpZWxkc2V0IAotICAgICAqLwotICAgIEVsZW1lbnRJbXBsICpmb3JtRWxlbWVudCgpOwotCi0g
ICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZv
aWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotICAgIHZvaWQgZm9jdXMoKTsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
IDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNz
IGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0KLXB1YmxpYzoKLSAgICBIVE1MU2VsZWN0RWxlbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICBI
VE1MU2VsZWN0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFNlbGVj
dEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICBp
bnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0OwotICAgIHZvaWQgc2V0U2VsZWN0ZWRJbmRleCggaW50
IGluZGV4ICk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLSAgICBpbnQgbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICBpbnQgbWluV2lk
dGgoKSBjb25zdCB7IHJldHVybiBtX21pbndpZHRoOyB9Ci0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgYm9vbCBtdWx0aXBsZSgpIGNvbnN0IHsgcmV0dXJu
IG1fbXVsdGlwbGU7IH0KLQotICAgIHZvaWQgYWRkICggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50
LCBIVE1MRWxlbWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdm9p
ZCByZW1vdmUgKCBpbnQgaW5kZXggKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpOwotICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotICAgIEhUTUxPcHRpb25zQ29s
bGVjdGlvbkltcGwgKm9wdGlvbnMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBv
cHRpb25zSFRNTENvbGxlY3Rpb24oKTsgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGFuZCBtaWdyYXRl
IHRvIG9wdGlvbnMoKS4KLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0
dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZv
aWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAq
aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGlu
dCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAo
IE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5k
Q2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZp
cnR1YWwgTm9kZUltcGwgKmFkZENoaWxkKCBOb2RlSW1wbCogbmV3Q2hpbGQgKTsKLQotICAgIHZp
cnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwg
a2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6
OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0
YUxpc3QmLCBib29sKTsKLQotICAgIC8vIGdldCB0aGUgYWN0dWFsIGxpc3Rib3ggaW5kZXggb2Yg
dGhlIG9wdGlvbkluZGV4dGggb3B0aW9uCi0gICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBv
cHRpb25JbmRleCkgY29uc3Q7Ci0gICAgLy8gcmV2ZXJzZSBvZiBvcHRpb25Ub0xpc3RJbmRleCAt
IGdldCBvcHRpb25JbmRleCBmcm9tIGxpc3Rib3hJbmRleAotICAgIGludCBsaXN0VG9PcHRpb25J
bmRleChpbnQgbGlzdEluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgc2V0UmVjYWxjTGlzdEl0ZW1z
KCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gbGlzdEl0ZW1zKCkgY29uc3QK
LSAgICAgewotICAgICAgICAgaWYgKG1fcmVjYWxjTGlzdEl0ZW1zKSBjb25zdF9jYXN0PEhUTUxT
ZWxlY3RFbGVtZW50SW1wbCo+KHRoaXMpLT5yZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgIHJl
dHVybiBtX2xpc3RJdGVtczsKLSAgICAgfQotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotICAg
IHZvaWQgbm90aWZ5T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3Rl
ZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50
SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlv
bihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgdm9pZCBzZXRNdWx0aXBsZShib29sKTsK
LQotICAgIHZvaWQgc2V0U2l6ZShpbnQpOwotCi1wcml2YXRlOgotICAgIHZvaWQgcmVjYWxjTGlz
dEl0ZW1zKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBtdXRhYmxlIFFNZW1BcnJheTxIVE1MRWxlbWVu
dEltcGwqPiBtX2xpc3RJdGVtczsKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICptX29w
dGlvbnM7Ci0gICAgc2hvcnQgbV9taW53aWR0aDsKLSAgICBzaG9ydCBtX3NpemU7Ci0gICAgYm9v
bCBtX211bHRpcGxlOwotICAgIGJvb2wgbV9yZWNhbGNMaXN0SXRlbXM7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxLZXlnZW5FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1M
U2VsZWN0RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVudEltcGwo
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgRE9NU3Ry
aW5nIHR5cGUoKSBjb25zdDsKLQotICAgIC8vICMjIyB0aGlzIGlzIGp1c3QgYSByb3VnaCBndWVz
cwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNl
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRh
TGlzdCYsIGJvb2wpOwotcHJvdGVjdGVkOgotICAgIEF0b21pY1N0cmluZyBtX2NoYWxsZW5nZTsK
LSAgICBBdG9taWNTdHJpbmcgbV9rZXlUeXBlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+
SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChj
b25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhU
TUxOYW1lczo6b3B0aW9uVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Omhy
VGFnKTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9v
bCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2Vy
dEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxk
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFs
IE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCB2
b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAg
IHZvaWQgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJik7Ci19OwotCi0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJl
bmRlclNlbGVjdDsKLSAgICBmcmllbmQgY2xhc3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVudEltcGw7
Ci0KLXB1YmxpYzoKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1
cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9
Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAyOyB9Ci0gICAg
dmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyByZXR1cm4g
bmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6
OnNjcmlwdFRhZyk7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0Owot
Ci0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIERPTVN0cmluZyB0ZXh0KCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmLCBpbnQgJmV4Y2VwdGlvbik7
Ci0KLSAgICBpbnQgaW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldEluZGV4KGludCwgaW50ICZl
eGNlcHRpb24pOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAg
IHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBzZWxlY3RlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWQ7IH0KLSAgICB2b2lkIHNldFNlbGVjdGVkKGJvb2wg
X3NlbGVjdGVkKTsKLQotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0KCkgY29u
c3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBib29sIGRl
ZmF1bHRTZWxlY3RlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKCBib29s
ICk7Ci0KLSAgICBET01TdHJpbmcgbGFiZWwoKSBjb25zdDsKLSAgICB2b2lkIHNldExhYmVsKCBj
b25zdCBET01TdHJpbmcgJiApOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7
Ci0gICAgYm9vbCBtX3NlbGVjdGVkOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJUZXh0QXJlYTsKLQotcHVi
bGljOgotICAgIGVudW0gV3JhcE1ldGhvZCB7Ci0gICAgICAgIHRhX05vV3JhcCwKLSAgICAgICAg
dGFfVmlydHVhbCwKLSAgICAgICAgdGFfUGh5c2ljYWwKLSAgICB9OwotCi0gICAgSFRNTFRleHRB
cmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYg
PSAwKTsKLSAgICB+SFRNTFRleHRBcmVhRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9v
bCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5p
c1RleHROb2RlKCk7IH0KLQotICAgIGludCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9
Ci0gICAgaW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KLQotICAgIFdyYXBNZXRo
b2Qgd3JhcCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JhcDsgfQotCi0gICAgdmlydHVhbCBib29sIGlz
RW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3RyaW5nIHR5
cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJu
IHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQg
cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7
Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotCi0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChp
bnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCAo
ICApOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi0gICAgdmlydHVh
bCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpS
ZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJT
dHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRl
dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBi
b29sKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICBET01TdHJpbmcgdmFsdWUoKTsK
LSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIERPTVN0cmlu
ZyBkZWZhdWx0VmFsdWUoKTsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJp
bmcgJnZhbHVlKTsKLQotICAgIHZvaWQgaW52YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVlSXNWYWxp
ZCA9IGZhbHNlOyB9Ci0gICAgdm9pZCB1cGRhdGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2YWx1ZU1h
dGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0K
LSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRl
cmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLSAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0g
ICAgCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0Q29scyhpbnQpOwotCi0gICAg
dm9pZCBzZXRSb3dzKGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQgbV9yb3dzOwotICAgIGlu
dCBtX2NvbHM7Ci0gICAgV3JhcE1ldGhvZCBtX3dyYXA7Ci0gICAgUVN0cmluZyBtX3ZhbHVlOwot
ICAgIGJvb2wgbV92YWx1ZUlzVmFsaWQ7Ci0gICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSXNJbmRleEVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxJbnB1dEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTElz
SW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAq
ZiA9IDApOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFn
UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJp
bmcgcHJvbXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICYp
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fcHJvbXB0OwotfTsKLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsIDogcHVibGljIGto
dG1sOjpTaGFyZWQ8SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsKEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqaW1wbCkgOiBt
X3NlbGVjdChpbXBsKSB7IH0KLQotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0TGVuZ3RoKHVuc2lnbmVkKTsKLSAgICBOb2RlSW1wbCAqaXRlbSh1bnNpZ25lZCBpbmRl
eCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKm5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUp
IGNvbnN0OwotCi0gICAgdm9pZCBkZXRhY2goKSB7IG1fc2VsZWN0ID0gMDsgfQotCi1wcml2YXRl
OgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqbV9zZWxlY3Q7Ci19OwotCiB9IC8vbmFtZXNw
YWNlCiAKICNlbmRpZgpJbmRleDoga2h0bWwvaHRtbC9IVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuaAkocmV2
aXNpb24gMTE5NzYpCisrKyBraHRtbC9odG1sL0hUTUxPcHRHcm91cEVsZW1lbnRJbXBsLmgJKHdv
cmtpbmcgY29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBL
bm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0
byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIg
KG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCBBcHBsZSBDb21wdXRlciwg
SW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDYyNSArMjIsMTMgQEAKICAqIEJvc3Rvbiwg
TUEgMDIxMTEtMTMwNywgVVNBLgogICoKICAqLwotI2lmbmRlZiBIVE1MX0ZPUk1JTVBMX0gKLSNk
ZWZpbmUgSFRNTF9GT1JNSU1QTF9ICisjaWZuZGVmIEhUTUxfSFRNTE9wdEdyb3VwRWxlbWVudElt
cGxfSAorI2RlZmluZSBIVE1MX0hUTUxPcHRHcm91cEVsZW1lbnRJbXBsX0gKIAotI2luY2x1ZGUg
Imh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9taXNjaW1wbC5o
IgotCi0jaW5jbHVkZSA8cXB0cnZlY3Rvci5oPgotI2luY2x1ZGUgPHFtZW1hcnJheS5oPgotI2lu
Y2x1ZGUgPGt4bWxjb3JlL0hhc2hNYXAuaD4KLQotY2xhc3MgS0hUTUxWaWV3OwotY2xhc3MgUVRl
eHRDb2RlYzsKLQotbmFtZXNwYWNlIGtodG1sCi17Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAg
Y2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQ7Ci0gICAgY2xhc3MgUmVuZGVyVGV4dEFyZWE7Ci0gICAg
Y2xhc3MgUmVuZGVyU2VsZWN0OwotICAgIGNsYXNzIFJlbmRlckxpbmVFZGl0OwotICAgIGNsYXNz
IFJlbmRlckZpbGVCdXR0b247Ci0gICAgY2xhc3MgUmVuZGVyU2xpZGVyOwotfQorI2luY2x1ZGUg
IkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmgiCiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFz
cyBET01TdHJpbmc7Ci1jbGFzcyBGb3JtRGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7
Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1l
bnRJbXBsOwotY2xhc3MgSFRNTEltYWdlRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2Fk
ZXI7Ci1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MT3B0aW9uc0NvbGxl
Y3Rpb25JbXBsOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVu
dEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1F
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVt
ZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50
KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0
YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRh
Y2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVj
dGlvbkltcGw+IGVsZW1lbnRzKCk7Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9N
U3RyaW5nIGVuY3R5cGUoKSBjb25zdCB7IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNl
dEVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkg
Y29uc3QgeyByZXR1cm4gbV9ib3VuZGFyeTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBt
X2F1dG9jb21wbGV0ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVt
ZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVs
ZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3Rlcklt
Z0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVt
ZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7
Ci0gICAgdm9pZCBzdWJtaXQoYm9vbCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAg
ICB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkg
eyBtX21hbGZvcm1lZCA9IG1hbGZvcm1lZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1l
ZCgpIHsgcmV0dXJuIG1fbWFsZm9ybWVkOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJM
QXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3Vi
bWl0Q2xpY2soKTsKLSAgICBib29sIGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0
IERPTVN0cmluZyAmdXJsKTsKLQotICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFy
c2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAm
KTsKLQotICAgIERPTVN0cmluZyBhY3Rpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdl
dCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IHN0YXRpYyB2b2lkIGkxOG5EYXRhKCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVt
ZW50OwotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRN
TENvbGxlY3Rpb25JbXBsOjpDb2xsZWN0aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBR
UHRyVmVjdG9yPEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAg
UVB0clZlY3RvcjxIVE1MSW1hZ2VFbGVtZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3Ry
aW5nIG1fdXJsOwotICAgIERPTVN0cmluZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0
eXBlOwotICAgIERPTVN0cmluZyBtX2JvdW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNo
YXJzZXQ7Ci0gICAgYm9vbCBtX3Bvc3QgOiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwot
ICAgIGJvb2wgbV9hdXRvY29tcGxldGUgOiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0g
ICAgYm9vbCBtX2RvaW5nc3VibWl0IDogMTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAg
Ym9vbCBtX21hbGZvcm1lZCA6IDE7Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0
eXBlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0
YSAmKSBjb25zdDsKLQotICAgIHVuc2lnbmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwgKik7Ci0KLSAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDog
cHVibGljIEhUTUxFbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1l
bnRJbXBsOwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1
YmxpYzoKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDAp
OwotICAgIHZpcnR1YWwgfkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0
dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdT
dGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyBy
ZXR1cm4gMTsgfQotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1f
Zm9ybTsgfQotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAg
IHZpcnR1YWwgYm9vbCBpc0NvbnRyb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmly
dHVhbCBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAq
YXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNl
cnRlZEludG9UcmVlKGJvb2wgZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJl
ZShib29sIGRlZXApOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQg
b25TZWxlY3QoKTsKLSAgICB2b2lkIG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXREaXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2Fy
ZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KLQotICAgIGJvb2wgcmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5
OyB9Ci0gICAgdm9pZCBzZXRSZWFkT25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmlu
ZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotCi0gICAgLyoKLSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMg
dG8gZ2V0IHRoZSBlbmNvZGVkIG5hbWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5n
Ci0gICAgICogcmV0dXJuIHRydWUgZm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQt
MTcuMTMuMikKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURh
dGFMaXN0JiwgYm9vbCkgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0Vk
aXRhYmxlKCk7Ci0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZp
bmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29s
IGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAg
ICBpbnQgdGFiSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXBy
b3RlY3RlZDoKLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAg
ICBIVE1MRm9ybUVsZW1lbnRJbXBsICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsK
LSAgICBib29sIG1fcmVhZE9ubHk6IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1Ymxp
YyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25F
bGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDAp
OwotICAgIHZpcnR1YWwgfkhUTUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBl
RW51bSB7Ci0gICAgICAgIFNVQk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgot
ICAgIH07Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0
dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0
bWw6OlJlbmRlclN0eWxlKik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRF
dmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3Jt
RGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0
YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNj
ZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVk
U3VibWl0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29s
IGZsYWcpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0Fu
eUVsZW1lbnQpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJv
dGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1
ZTsKLSAgICB0eXBlRW51bSAgbV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7
Ci0gICAgYm9vbCAgICAgIG1fYWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotY2xhc3MgSFRNTEZpZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1w
bChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZp
cnR1YWwgfkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQg
dGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNr
RFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNy
ZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAg
IHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0Owot
ICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBj
bGFzcyBIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5k
ZXJTbGlkZXI7Ci0KLXB1YmxpYzoKLSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAg
ICBlbnVtIHR5cGVFbnVtIHsKLSAgICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAg
ICAgIElTSU5ERVgsCi0gICAgICAgIENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAg
U1VCTUlULAotICAgICAgICBSRVNFVCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAot
ICAgICAgICBJTUFHRSwKLSAgICAgICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAg
IFJBTkdFCi0gICAgfTsKLQotICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAq
ZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudElt
cGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1w
bCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRh
Z1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBp
c0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0K
LSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21w
bGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBi
b29sIGlzSW5kZXRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQot
Ci0gICAgYm9vbCBpc1RleHRCdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlU
IHx8IG1fdHlwZSA9PSBSRVNFVCB8fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBi
b29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQot
ICAgIGJvb2wgY2hlY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQg
c2V0Q2hlY2tlZChib29sKTsKLSAgICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVy
biBtX2luZGV0ZXJtaW5hdGU7IH0KLSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0g
ICAgaW50IG1heExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNp
emUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0
OwotICAgIHZvaWQgc2V0VHlwZShjb25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5n
IHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0K
LSAgICBET01TdHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRW
YWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNo
ZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAg
ICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
ID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4g
bV90eXBlICE9IFBBU1NXT1JEOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAg
dmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2Fu
SGF2ZVNlbGVjdGlvbigpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNl
bGVjdGlvbkVuZCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lk
IHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNl
dFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2so
Ym9vbCBzZW5kTW91c2VFdmVudHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVl
KTsKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVu
dCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBh
dHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVh
bCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwot
Ci0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1l
bnRJbXBsICpzb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1
YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0
dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGto
dG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmly
dHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmly
dHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwg
Ym9vbCBpc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3Rp
dmF0ZWRTdWJtaXQoYm9vbCBmbGFnKTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZTsgfQotICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmlu
ZyYgdmFsdWUpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGlu
IGNhc2UgaW5wdXQgdHlwZT1pbWFnZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29u
c3QgeyByZXR1cm4geFBvczsgfQotICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9z
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1w
bCAqZXZ0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFu
ZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQot
ICAgIERPTVN0cmluZyBhbHRUZXh0KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlz
VVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJl
c3VsdHMoKSBjb25zdCB7IHJldHVybiBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBk
ZWZhdWx0VmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01T
dHJpbmcgJik7Ci0gICAgCi0gICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3Ry
aW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0
cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxp
Z24oY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0QWx0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNp
Z25lZCk7Ci0KLSAgICBET01TdHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29u
c3QgRE9NU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERP
TVN0cmluZyB1c2VNYXAoKSBjb25zdDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJp
bmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0
cmlidXRlKCkgY29uc3Q7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmlu
ZyBtX3ZhbHVlOwotICAgIGludCAgICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsK
LSAgICBzaG9ydCAgICAgbV9zaXplOwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQg
ICAgIG1fbWF4UmVzdWx0czsKLQotICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsK
LQotICAgIHR5cGVFbnVtIG1fdHlwZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAg
IGJvb2wgbV9kZWZhdWx0Q2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2Vk
IDogMTsKLSAgICBib29sIG1faW5kZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBl
IDogMTsKLSAgICBib29sIG1fYWN0aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBs
ZXRlIDogMTsKLSAgICBib29sIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBI
VE1MRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAg
dmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAv
KioKLSAgICAgKiB0aGUgZm9ybSBlbGVtZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4K
LSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmZvcm0oKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsK
LSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJp
bmcgaHRtbEZvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICB2b2lkIGZvY3VzKCk7Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zv
cm1FbGVtZW50SUQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdl
bmRFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVi
bGljOgotICAgIEhUTUxMZWdlbmRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1w
bCgpOwotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAg
dmlydHVhbCBraHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAq
LCBraHRtbDo6UmVuZGVyU3R5bGUgKik7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55
RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRo
ZSBsZWdlbmQncyBmaWVsZHNldCAKLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1l
bnQoKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFj
Y2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25z
dDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lk
IGZvY3VzKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxTZWxlY3RF
bGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZy
aWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyU2VsZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0g
MCk7Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05h
bWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAg
fkhUTUxTZWxlY3RFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVh
bCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA2OyB9Ci0gICAgdmlydHVhbCBib29s
IGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICBET01TdHJpbmcgdHlw
ZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSAp
OwotCi0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFNlbGVjdGVk
SW5kZXgoIGludCBpbmRleCApOwotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkg
Y29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAg
aW50IG1pbldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9taW53aWR0aDsgfQotCi0gICAgaW50IHNp
emUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLQotICAgIGJvb2wgbXVsdGlwbGUoKSBjb25z
dCB7IHJldHVybiBtX211bHRpcGxlOyB9Ci0KLSAgICB2b2lkIGFkZCAoIEhUTUxFbGVtZW50SW1w
bCAqZWxlbWVudCwgSFRNTEVsZW1lbnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSAp
OwotICAgIHZvaWQgcmVtb3ZlICggaW50IGluZGV4ICk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUo
KTsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBIVE1M
T3B0aW9uc0NvbGxlY3Rpb25JbXBsICpvcHRpb25zKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0
aW9uSW1wbD4gb3B0aW9uc0hUTUxDb2xsZWN0aW9uKCk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBh
bmQgbWlncmF0ZSB0byBvcHRpb25zKCkuCi0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3Rh
dGUoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAg
dmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJl
ZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBs
YWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZl
eGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2Rl
SW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUlt
cGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAg
ICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
ICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURh
dGEoRm9ybURhdGFMaXN0JiwgYm9vbCk7Ci0KLSAgICAvLyBnZXQgdGhlIGFjdHVhbCBsaXN0Ym94
IGluZGV4IG9mIHRoZSBvcHRpb25JbmRleHRoIG9wdGlvbgotICAgIGludCBvcHRpb25Ub0xpc3RJ
bmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0OwotICAgIC8vIHJldmVyc2Ugb2Ygb3B0aW9uVG9M
aXN0SW5kZXggLSBnZXQgb3B0aW9uSW5kZXggZnJvbSBsaXN0Ym94SW5kZXgKLSAgICBpbnQgbGlz
dFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFJlY2Fs
Y0xpc3RJdGVtcygpOwotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGxpc3RJdGVt
cygpIGNvbnN0Ci0gICAgIHsKLSAgICAgICAgIGlmIChtX3JlY2FsY0xpc3RJdGVtcykgY29uc3Rf
Y2FzdDxIVE1MU2VsZWN0RWxlbWVudEltcGwqPih0aGlzKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0g
ICAgICAgICByZXR1cm4gbV9saXN0SXRlbXM7Ci0gICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVz
ZXQoKTsKLSAgICB2b2lkIG5vdGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1w
bCAqc2VsZWN0ZWRPcHRpb24sIGJvb2wgc2VsZWN0ZWQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRl
ZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nl
c3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIHZvaWQgc2V0TXVsdGlw
bGUoYm9vbCk7Ci0KLSAgICB2b2lkIHNldFNpemUoaW50KTsKLQotcHJpdmF0ZToKLSAgICB2b2lk
IHJlY2FsY0xpc3RJdGVtcygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgbXV0YWJsZSBRTWVtQXJyYXk8
SFRNTEVsZW1lbnRJbXBsKj4gbV9saXN0SXRlbXM7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9u
SW1wbCAqbV9vcHRpb25zOwotICAgIHNob3J0IG1fbWlud2lkdGg7Ci0gICAgc2hvcnQgbV9zaXpl
OwotICAgIGJvb2wgbV9tdWx0aXBsZTsKLSAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOwotfTsK
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MS2V5Z2VuRWxlbWVudEltcGwgOiBw
dWJsaWMgSFRNTFNlbGVjdEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEtleWdlbkVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7
Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQot
ICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICAvLyAjIyMgdGhpcyBpcyBqdXN0IGEg
cm91Z2ggZ3Vlc3MKLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0
YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLXByb3RlY3RlZDoKLSAgICBBdG9taWNTdHJpbmcgbV9j
aGFsbGVuZ2U7Ci0gICAgQXRvbWljU3RyaW5nIG1fa2V5VHlwZTsKLX07Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQogY2xhc3MgSFRNTE9wdEdyb3VwRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwKIHsKIHB1YmxpYzoKQEAgLTY2NSwxNjkgKzUzLDYgQEAgcHVi
bGljOgogICAgIHZvaWQgc2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICYpOwogfTsKIAotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJbXBsIDogcHVibGlj
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpS
ZW5kZXJTZWxlY3Q7Ci0gICAgZnJpZW5kIGNsYXNzIERPTTo6SFRNTFNlbGVjdEVsZW1lbnRJbXBs
OwotCi1wdWJsaWM6Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9j
LCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0
dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMjsgfQotICAg
IHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJu
IG5ld0NoaWxkLT5pc1RleHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVz
OjpzY3JpcHRUYWcpOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsK
LQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgdGV4dCgpIGNv
bnN0OwotICAgIHZvaWQgc2V0VGV4dChjb25zdCBET01TdHJpbmcgJiwgaW50ICZleGNlcHRpb24p
OwotCi0gICAgaW50IGluZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRJbmRleChpbnQsIGludCAm
ZXhjZXB0aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIGJvb2wgc2VsZWN0ZWQo
KSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3RlZChib29s
IF9zZWxlY3RlZCk7Ci0KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKmdldFNlbGVjdCgpIGNv
bnN0OwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgYm9vbCBk
ZWZhdWx0U2VsZWN0ZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRTZWxlY3RlZCggYm9v
bCApOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbCgg
Y29uc3QgRE9NU3RyaW5nICYgKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVl
OwotICAgIGJvb2wgbV9zZWxlY3RlZDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4dEFyZWE7Ci0KLXB1
YmxpYzoKLSAgICBlbnVtIFdyYXBNZXRob2QgewotICAgICAgICB0YV9Ob1dyYXAsCi0gICAgICAg
IHRhX1ZpcnR1YWwsCi0gICAgICAgIHRhX1BoeXNpY2FsCi0gICAgfTsKLQotICAgIEhUTUxUZXh0
QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
ID0gMCk7Ci0gICAgfkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+
aXNUZXh0Tm9kZSgpOyB9Ci0KLSAgICBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsg
fQotICAgIGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICBXcmFwTWV0
aG9kIHdyYXAoKSBjb25zdCB7IHJldHVybiBtX3dyYXA7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBp
c0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIERPTVN0cmluZyB0
eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVy
biB0cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lk
IHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgp
OwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLQotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQo
aW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3Qg
KCAgKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLQotICAgIHZpcnR1
YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBraHRtbDo6
UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVy
U3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBk
ZXRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0Jiwg
Ym9vbCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0gICAgRE9NU3RyaW5nIHZhbHVlKCk7
Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLSAgICBET01TdHJp
bmcgZGVmYXVsdFZhbHVlKCk7Ci0gICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSk7Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsgbV92YWx1ZUlzVmFs
aWQgPSBmYWxzZTsgfQotICAgIHZvaWQgdXBkYXRlVmFsdWUoKTsKLQotICAgIGJvb2wgdmFsdWVN
YXRjaGVzUmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOyB9
Ci0gICAgdm9pZCBzZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpIHsgbV92YWx1ZU1hdGNoZXNSZW5k
ZXJlciA9IHRydWU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0gICAgCi0g
ICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwot
ICAgIAotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vz
c0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldENvbHMoaW50KTsKLQotICAg
IHZvaWQgc2V0Um93cyhpbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1fcm93czsKLSAgICBp
bnQgbV9jb2xzOwotICAgIFdyYXBNZXRob2QgbV93cmFwOwotICAgIFFTdHJpbmcgbV92YWx1ZTsK
LSAgICBib29sIG1fdmFsdWVJc1ZhbGlkOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5kZXJl
cjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElzSW5kZXhFbGVtZW50
SW1wbCA6IHB1YmxpYyBIVE1MSW5wdXRFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxJ
c0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwg
KmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50IHRh
Z1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgRE9NU3Ry
aW5nIHByb21wdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJvbXB0KGNvbnN0IERPTVN0cmluZyAm
KTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3Byb21wdDsKLX07Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCA6IHB1YmxpYyBr
aHRtbDo6U2hhcmVkPEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw+Ci17Ci1wdWJsaWM6Ci0gICAg
SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbChIVE1MU2VsZWN0RWxlbWVudEltcGwgKmltcGwpIDog
bV9zZWxlY3QoaW1wbCkgeyB9Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAgICB2
b2lkIHNldExlbmd0aCh1bnNpZ25lZCk7Ci0gICAgTm9kZUltcGwgKml0ZW0odW5zaWduZWQgaW5k
ZXgpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1l
KSBjb25zdDsKLQotICAgIHZvaWQgZGV0YWNoKCkgeyBtX3NlbGVjdCA9IDA7IH0KLQotcHJpdmF0
ZToKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKm1fc2VsZWN0OwotfTsKLQogfSAvL25hbWVz
cGFjZQogCiAjZW5kaWYKSW5kZXg6IGtodG1sL2h0bWwvSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwuY3BwCShyZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0bWwvSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0
IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDE5
OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAgKiAgICAgICAgICAgKEMpIDIw
MDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQs
IDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwg
MjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgogICogICAgICAgICAgIChDKSAyMDA2IEFsZXhleSBQ
cm9za3VyeWFrb3YgKGFwQG55cG9wLmNvbSkKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNCw0MSArMjQsMTQg
QEAKICAqCiAgKi8KIAotI3VuZGVmIEZPUk1TX0RFQlVHCi0vLyNkZWZpbmUgRk9STVNfREVCVUcK
LQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9mb3JtaW1wbC5oIgot
Ci0jaW5jbHVkZSAia2h0bWx2aWV3LmgiCi0jaW5jbHVkZSAiTWFjRnJhbWUuaCIKLSNpbmNsdWRl
ICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbF9pbWFnZWltcGwuaCIK
LSNpbmNsdWRlICJraHRtbF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgIm1pc2MvZm9ybWRhdGEuaCIK
LQotI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc3N0eWxl
c2VsZWN0b3IuaCIKLSNpbmNsdWRlICJjc3Nwcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiY3NzaGVs
cGVyLmgiCi0jaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20y
X2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgImto
dG1sX2V4dC5oIgorI2luY2x1ZGUgIkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmgiCisjaW5j
bHVkZSAiSFRNTEZvcm1FbGVtZW50SW1wbC5oIgogCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRl
cl9mb3JtLmgiCi0jaW5jbHVkZSAicmVuZGVyX2J1dHRvbi5oIgogI2luY2x1ZGUgInJlbmRlcl90
aGVtZS5oIgotCi0jaW5jbHVkZSA8a2xvY2FsZS5oPgotI2luY2x1ZGUgPHFmaWxlLmg+Ci0jaW5j
bHVkZSA8cXRleHRjb2RlYy5oPgotCi0vLyBmb3Iga2V5Z2VuCi0jaW5jbHVkZSA8cXN0cmluZy5o
PgotI2luY2x1ZGUgPGtzc2xrZXlnZW4uaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1
ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgogCiB1c2luZyBuYW1lc3BhY2Ug
a2h0bWw7CiAKQEAgLTY3LDY3MyArNDAsNiBAQCBuYW1lc3BhY2UgRE9NIHsKIHVzaW5nIG5hbWVz
cGFjZSBFdmVudE5hbWVzOwogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotc3RydWN0IEZv
cm1EYXRhTGlzdEl0ZW0gewotICAgIEZvcm1EYXRhTGlzdEl0ZW0oY29uc3QgUUNTdHJpbmcgJmRh
dGEpIDogbV9kYXRhKGRhdGEpIHsgfQotICAgIEZvcm1EYXRhTGlzdEl0ZW0oY29uc3QgUVN0cmlu
ZyAmcGF0aCkgOiBtX3BhdGgocGF0aCkgeyB9Ci0KLSAgICBRU3RyaW5nIG1fcGF0aDsKLSAgICBR
Q1N0cmluZyBtX2RhdGE7Ci19OwotCi1jbGFzcyBGb3JtRGF0YUxpc3QgewotcHVibGljOgotICAg
IEZvcm1EYXRhTGlzdChRVGV4dENvZGVjICopOwotCi0gICAgdm9pZCBhcHBlbmREYXRhKGNvbnN0
IERPTVN0cmluZyAma2V5LCBjb25zdCBET01TdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVu
ZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlLnFzdHJpbmcoKSk7IH0K
LSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IFFTdHJpbmcg
JnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmluZygpKTsgYXBwZW5kU3Ry
aW5nKHZhbHVlKTsgfQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBET01TdHJpbmcgJmtleSwg
Y29uc3QgUUNTdHJpbmcgJnZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0cmlu
ZygpKTsgYXBwZW5kU3RyaW5nKHZhbHVlKTsgfQotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBE
T01TdHJpbmcgJmtleSwgaW50IHZhbHVlKQotICAgICAgICB7IGFwcGVuZFN0cmluZyhrZXkucXN0
cmluZygpKTsgYXBwZW5kU3RyaW5nKFFTdHJpbmc6Om51bWJlcih2YWx1ZSkpOyB9Ci0gICAgdm9p
ZCBhcHBlbmRGaWxlKGNvbnN0IERPTVN0cmluZyAma2V5LCBjb25zdCBET01TdHJpbmcgJmZpbGVu
YW1lKTsKLQotICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+IGJl
Z2luKCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gbV9saXN0LmJlZ2luKCk7IH0KLSAgICBRVmFs
dWVMaXN0Q29uc3RJdGVyYXRvcjxGb3JtRGF0YUxpc3RJdGVtPiBlbmQoKSBjb25zdAotICAgICAg
ICB7IHJldHVybiBtX2xpc3QuZW5kKCk7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGVuZFN0
cmluZyhjb25zdCBRQ1N0cmluZyAmcyk7Ci0gICAgdm9pZCBhcHBlbmRTdHJpbmcoY29uc3QgUVN0
cmluZyAmcyk7Ci0KLSAgICBRVGV4dENvZGVjICptX2NvZGVjOwotICAgIFFWYWx1ZUxpc3Q8Rm9y
bURhdGFMaXN0SXRlbT4gbV9saXN0OwotfTsKLQotSFRNTEZvcm1FbGVtZW50SW1wbDo6SFRNTEZv
cm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50SW1wbChm
b3JtVGFnLCBkb2MpCi17Ci0gICAgY29sbGVjdGlvbkluZm8gPSAwOwotICAgIG1fcG9zdCA9IGZh
bHNlOwotICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgbV9hdXRvY29tcGxldGUgPSB0cnVl
OwotICAgIG1faW5zdWJtaXQgPSBmYWxzZTsKLSAgICBtX2RvaW5nc3VibWl0ID0gZmFsc2U7Ci0g
ICAgbV9pbnJlc2V0ID0gZmFsc2U7Ci0gICAgbV9lbmN0eXBlID0gImFwcGxpY2F0aW9uL3gtd3d3
LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgbV9ib3VuZGFyeSA9ICItLS0tLS0tLS0tMHhLaFRtTGJP
dU5kQXJZIjsKLSAgICBtX2FjY2VwdGNoYXJzZXQgPSAiVU5LTk9XTiI7Ci0gICAgbV9tYWxmb3Jt
ZWQgPSBmYWxzZTsKLX0KLQotSFRNTEZvcm1FbGVtZW50SW1wbDo6fkhUTUxGb3JtRWxlbWVudElt
cGwoKQotewotICAgIGRlbGV0ZSBjb2xsZWN0aW9uSW5mbzsKLSAgICAKLSAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkKLSAgICAgICAgZm9ybUVs
ZW1lbnRzW2ldLT5tX2Zvcm0gPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpbWdF
bGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGltZ0VsZW1lbnRzW2ldLT5tX2Zvcm0gPSAw
OwotfQotCi0KLWJvb2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6Zm9ybVdvdWxkSGF2ZVNlY3VyZVN1
Ym1pc3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwpCi17Ci0gICAgaWYgKHVybC5pc051bGwoKSkg
ewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBnZXREb2N1bWVudCgp
LT5jb21wbGV0ZVVSTCh1cmwucXN0cmluZygpKS5zdGFydHNXaXRoKCJodHRwczoiLCBmYWxzZSk7
Ci19Ci0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjphdHRhY2goKQotewotICAgIEhUTUxF
bGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0KLSAgICAvLyBub3RlIHdlIGRvbid0IGRlYWwgd2l0aCBj
YWxsaW5nIHNlY3VyZUZvcm1SZW1vdmVkKCkgb24gZGV0YWNoLCBiZWNhdXNlIHRoZSB0aW1pbmcK
LSAgICAvLyB3YXMgc3VjaCB0aGF0IGl0IGNsZWFyZWQgb3VyIHN0YXRlIHRvbyBlYXJseQotICAg
IGlmIChmb3JtV291bGRIYXZlU2VjdXJlU3VibWlzc2lvbihtX3VybCkpCi0gICAgICAgIGdldERv
Y3VtZW50KCktPnNlY3VyZUZvcm1BZGRlZCgpOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudElt
cGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNI
VE1MRG9jdW1lbnQoKSkgewotCUhUTUxEb2N1bWVudEltcGwgKmRvY3VtZW50ID0gc3RhdGljX2Nh
c3Q8SFRNTERvY3VtZW50SW1wbCAqPihnZXREb2N1bWVudCgpKTsKLQlkb2N1bWVudC0+YWRkTmFt
ZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudEltcGw6Omluc2Vy
dGVkSW50b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVtb3Zl
ZEZyb21Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50
KCkpIHsKLQlIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19jYXN0PEhUTUxEb2N1
bWVudEltcGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0JZG9jdW1lbnQtPnJlbW92ZU5hbWVkSXRlbShv
bGROYW1lQXR0cik7Ci0gICAgfQotICAgCi0gICAgSFRNTEVsZW1lbnRJbXBsOjpyZW1vdmVkRnJv
bURvY3VtZW50KCk7Ci19Ci0KLWludCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpsZW5ndGgoKSBjb25z
dAotewotICAgIGludCBsZW4gPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3Jt
RWxlbWVudHMuY291bnQoKTsgKytpKQotCWlmIChmb3JtRWxlbWVudHNbaV0tPmlzRW51bWVyYXRh
YmxlKCkpCi0JICAgICsrbGVuOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotCi12b2lkIEhUTUxG
b3JtRWxlbWVudEltcGw6OnN1Ym1pdENsaWNrKCkKLXsKLSAgICBib29sIHN1Ym1pdEZvdW5kID0g
ZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1FbGVtZW50cy5jb3VudCgp
OyArK2kpIHsKLSAgICAgICAgaWYgKGZvcm1FbGVtZW50c1tpXS0+aGFzTG9jYWxOYW1lKGlucHV0
VGFnKSkgewotICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwgKmVsZW1lbnQgPSBzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCAqPihmb3JtRWxlbWVudHNbaV0pOwotICAgICAg
ICAgICAgaWYgKGVsZW1lbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpICYmIGVsZW1lbnQt
PnJlbmRlcmVyKCkpIHsKLSAgICAgICAgICAgICAgICBzdWJtaXRGb3VuZCA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgZWxlbWVudC0+Y2xpY2soZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghc3VibWl0Rm91bmQp
IC8vIHN1Ym1pdCB0aGUgZm9ybSB3aXRob3V0IGEgc3VibWl0IG9yIGltYWdlIGlucHV0Ci0gICAg
ICAgIHByZXBhcmVTdWJtaXQoKTsKLX0KLQotCi1zdGF0aWMgUUNTdHJpbmcgZW5jb2RlQ1N0cmlu
Zyhjb25zdCBRQ1N0cmluZyYgZSkKLXsKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1s
NC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNC4xCi0gICAgLy8gc2FmZSBjaGFyYWN0ZXJz
IGxpa2UgTlMgaGFuZGxlcyB0aGVtIGZvciBjb21wYXRpYmlsaXR5Ci0gICAgc3RhdGljIGNvbnN0
IGNoYXIgKnNhZmUgPSAiLS5fKiI7Ci0gICAgaW50IGVsZW4gPSBlLmxlbmd0aCgpOwotICAgIFFD
U3RyaW5nIGVuY29kZWQoKCBlbGVuK2UuY29udGFpbnMoICdcbicgKSApKjMrMSk7Ci0gICAgaW50
IGVuY2xlbiA9IDA7Ci0KLSAgICAvL1FDU3RyaW5nIG9yaWcoZS5kYXRhKCksIGUuc2l6ZSgpKTsK
LQotICAgIGZvcihpbnQgcG9zID0gMDsgcG9zIDwgZWxlbjsgcG9zKyspIHsKLSAgICAgICAgdW5z
aWduZWQgY2hhciBjID0gZVtwb3NdOwotCi0gICAgICAgIGlmICggKCggYyA+PSAnQScpICYmICgg
YyA8PSAnWicpKSB8fAotICAgICAgICAgICAgICgoIGMgPj0gJ2EnKSAmJiAoIGMgPD0gJ3onKSkg
fHwKLSAgICAgICAgICAgICAoKCBjID49ICcwJykgJiYgKCBjIDw9ICc5JykpIHx8Ci0gICAgICAg
ICAgICAgKHN0cmNocihzYWZlLCBjKSkKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIGVuY29k
ZWRbZW5jbGVuKytdID0gYzsKLSAgICAgICAgZWxzZSBpZiAoIGMgPT0gJyAnICkKLSAgICAgICAg
ICAgIGVuY29kZWRbZW5jbGVuKytdID0gJysnOwotICAgICAgICBlbHNlIGlmICggYyA9PSAnXG4n
IHx8ICggYyA9PSAnXHInICYmIGVbcG9zKzFdICE9ICdcbicgKSApCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNs
ZW4rK10gPSAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICdEJzsKLSAgICAg
ICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gJyUnOwotICAgICAgICAgICAgZW5jb2RlZFtlbmNs
ZW4rK10gPSAnMCc7Ci0gICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICdBJzsKLSAgICAg
ICAgfQotICAgICAgICBlbHNlIGlmICggYyAhPSAnXHInICkKLSAgICAgICAgewotICAgICAgICAg
ICAgZW5jb2RlZFtlbmNsZW4rK10gPSAnJSc7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgaCA9
IGMgLyAxNjsKLSAgICAgICAgICAgIGggKz0gKGggPiA5KSA/ICgnQScgLSAxMCkgOiAnMCc7Ci0g
ICAgICAgICAgICBlbmNvZGVkW2VuY2xlbisrXSA9IGg7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVk
IGludCBsID0gYyAlIDE2OwotICAgICAgICAgICAgbCArPSAobCA+IDkpID8gKCdBJyAtIDEwKSA6
ICcwJzsKLSAgICAgICAgICAgIGVuY29kZWRbZW5jbGVuKytdID0gbDsKLSAgICAgICAgfQotICAg
IH0KLSAgICBlbmNvZGVkW2VuY2xlbisrXSA9ICdcMCc7Ci0gICAgZW5jb2RlZC50cnVuY2F0ZShl
bmNsZW4pOwotCi0gICAgcmV0dXJuIGVuY29kZWQ7Ci19Ci0KLS8vIENoYW5nZSBwbGFpbiBDUiBh
bmQgcGxhaW4gTEYgdG8gQ1JMRiBwYWlycy4KLXN0YXRpYyBRQ1N0cmluZyBmaXhMaW5lQnJlYWtz
KGNvbnN0IFFDU3RyaW5nICZzKQotewotICAgIC8vIENvbXB1dGUgdGhlIGxlbmd0aC4KLSAgICB1
bnNpZ25lZCBuZXdMZW4gPSAwOwotICAgIGNvbnN0IGNoYXIgKnAgPSBzLmRhdGEoKTsKLSAgICB3
aGlsZSAoY2hhciBjID0gKnArKykgewotICAgICAgICBpZiAoYyA9PSAnXHInKSB7Ci0gICAgICAg
ICAgICAvLyBTYWZlIHRvIGxvb2sgYWhlYWQgYmVjYXVzZSBvZiB0cmFpbGluZyAnXDAnLgotICAg
ICAgICAgICAgaWYgKCpwICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICAvLyBUdXJuIENSIGlu
dG8gQ1JMRi4KLSAgICAgICAgICAgICAgICBuZXdMZW4gKz0gMjsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8vIFR1cm4gTEYgaW50
byBDUkxGLgotICAgICAgICAgICAgbmV3TGVuICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAvLyBMZWF2ZSBvdGhlciBjaGFyYWN0ZXJzIGFsb25lLgotICAgICAgICAgICAgbmV3
TGVuICs9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5ld0xlbiA9PSBzLmxlbmd0aCgp
KSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICAKLSAgICAvLyBNYWtlIGEgY29weSBv
ZiB0aGUgc3RyaW5nLgotICAgIHAgPSBzLmRhdGEoKTsKLSAgICBRQ1N0cmluZyByZXN1bHQobmV3
TGVuICsgMSk7Ci0gICAgY2hhciAqcSA9IHJlc3VsdC5kYXRhKCk7Ci0gICAgd2hpbGUgKGNoYXIg
YyA9ICpwKyspIHsKLSAgICAgICAgaWYgKGMgPT0gJ1xyJykgewotICAgICAgICAgICAgLy8gU2Fm
ZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2YgdHJhaWxpbmcgJ1wwJy4KLSAgICAgICAgICAgIGlm
ICgqcCAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHVybiBDUiBpbnRvIENSTEYuCi0g
ICAgICAgICAgICAgICAgKnErKyA9ICdccic7Ci0gICAgICAgICAgICAgICAgKnErKyA9ICdcbic7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAg
ICAgICAvLyBUdXJuIExGIGludG8gQ1JMRi4KLSAgICAgICAgICAgICpxKysgPSAnXHInOwotICAg
ICAgICAgICAgKnErKyA9ICdcbic7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBM
ZWF2ZSBvdGhlciBjaGFyYWN0ZXJzIGFsb25lLgotICAgICAgICAgICAgKnErKyA9IGM7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1ib29sIEhUTUxGb3JtRWxl
bWVudEltcGw6OmZvcm1EYXRhKEZvcm1EYXRhICZmb3JtX2RhdGEpIGNvbnN0Ci17Ci0gICAgUUNT
dHJpbmcgZW5jX3N0cmluZyA9ICIiOyAvLyB1c2VkIGZvciBub24tbXVsdGlwYXJ0IGRhdGEKLQot
ICAgIC8vIGZpbmQgb3V0IHRoZSBRVGV4dGNvZGVjIHRvIHVzZQotICAgIFFTdHJpbmcgc3RyID0g
bV9hY2NlcHRjaGFyc2V0LnFzdHJpbmcoKTsKLSAgICBzdHIucmVwbGFjZSgnLCcsICcgJyk7Ci0g
ICAgUVN0cmluZ0xpc3QgY2hhcnNldHMgPSBRU3RyaW5nTGlzdDo6c3BsaXQoJyAnLCBzdHIpOwot
ICAgIFFUZXh0Q29kZWMqIGNvZGVjID0gMDsKLSAgICBGcmFtZSAqZnJhbWUgPSBnZXREb2N1bWVu
dCgpLT5mcmFtZSgpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0ID0gY2hhcnNl
dHMuYmVnaW4oKTsgaXQgIT0gY2hhcnNldHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgUVN0cmlu
ZyBlbmMgPSAoKml0KTsKLSAgICAgICAgaWYgKGVuYy5jb250YWlucygiVU5LTk9XTiIpKSB7Ci0g
ICAgICAgICAgICAvLyB1c2Ugc3RhbmRhcmQgZG9jdW1lbnQgZW5jb2RpbmcKLSAgICAgICAgICAg
IGVuYyA9ICJJU08tODg1OS0xIjsKLSAgICAgICAgICAgIGlmIChmcmFtZSkKLSAgICAgICAgICAg
ICAgICBlbmMgPSBmcmFtZS0+ZW5jb2RpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGNv
ZGVjID0gUVRleHRDb2RlYzo6Y29kZWNGb3JOYW1lKGVuYy5sYXRpbjEoKSkpKQotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFjb2RlYykKLSAgICAgICAgY29kZWMgPSBRVGV4
dENvZGVjOjpjb2RlY0ZvckxvY2FsZSgpOwotCi0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgZm9ybUVsZW1lbnRzLmNvdW50KCk7ICsraSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbCogY3VycmVudCA9IGZvcm1FbGVtZW50c1tpXTsKLSAgICAgICAgRm9ybURhdGFM
aXN0IGxzdChjb2RlYyk7Ci0KLSAgICAgICAgaWYgKCFjdXJyZW50LT5kaXNhYmxlZCgpICYmIGN1
cnJlbnQtPmFwcGVuZEZvcm1EYXRhKGxzdCwgbV9tdWx0aXBhcnQpKSB7Ci0gICAgICAgICAgICBm
b3IgKFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPEZvcm1EYXRhTGlzdEl0ZW0+IGl0ID0gbHN0LmJl
Z2luKCk7IGl0ICE9IGxzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIGlmICghbV9t
dWx0aXBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIElTSU5ERVggLyA8aW5w
dXQgbmFtZT1pc2luZGV4PiBzcGVjaWFsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBvbmx5
IGlmIGl0cyB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBlbmNfc3Ry
aW5nLmlzRW1wdHkoKSAmJiAoKml0KS5tX2RhdGEgPT0gImlzaW5kZXgiICkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJpbmcg
Kz0gZW5jb2RlQ1N0cmluZyggKCppdCkubV9kYXRhICk7Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigh
ZW5jX3N0cmluZy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0
cmluZyArPSAnJic7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY19zdHJpbmcgKz0gZW5j
b2RlQ1N0cmluZygoKml0KS5tX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0
cmluZyArPSAiPSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2l0OwotICAgICAgICAgICAg
ICAgICAgICAgICAgZW5jX3N0cmluZyArPSBlbmNvZGVDU3RyaW5nKCgqaXQpLm1fZGF0YSk7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUUNTdHJpbmcgaHN0
cigiLS0iKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSBtX2JvdW5kYXJ5LnFzdHJpbmco
KS5sYXRpbjEoKTsKLSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXHJcbiI7Ci0gICAgICAg
ICAgICAgICAgICAgIGhzdHIgKz0gIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFt
ZT1cIiI7Ci0gICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gKCppdCkubV9kYXRhLmRhdGEoKTsK
LSAgICAgICAgICAgICAgICAgICAgaHN0ciArPSAiXCIiOwotCi0gICAgICAgICAgICAgICAgICAg
IC8vIGlmIHRoZSBjdXJyZW50IHR5cGUgaXMgRklMRSwgdGhlbiB3ZSBhbHNvIG5lZWQgdG8KLSAg
ICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgZmlsZW5hbWUKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGN1cnJlbnQtPmhhc0xvY2FsTmFtZShpbnB1dFRhZykgJiYKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4oY3VycmVudCkt
PmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpGSUxFKQotICAgICAgICAgICAg
ICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIHBhdGggPSBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1cnJlbnQpLT52YWx1ZSgpLnFzdHJpbmcoKTsK
LQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgd29uJ3Qgd29yayBpZiB0
aGUgZmlsZW5hbWUgaW5jbHVkZXMgYSAiIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBvciBjb250cm9sIGNoYXJhY3RlcnMgbGlrZSBDUiBvciBMRi4gVGhpcyBhbHNvIGRvZXMgc3Ry
YW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpbmdzIGlmIHRoZSBmaWxlbmFtZSBp
bmNsdWRlcyBjaGFyYWN0ZXJzIHlvdSBjYW4ndCBlbmNvZGUKLSAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGluIHRoZSB3ZWJzaXRlJ3MgY2hhcmFjdGVyIHNldC4KLSAgICAgICAgICAgICAgICAg
ICAgICAgIGhzdHIgKz0gIjsgZmlsZW5hbWU9XCIiOwotICAgICAgICAgICAgICAgICAgICAgICAg
aHN0ciArPSBjb2RlYy0+ZnJvbVVuaWNvZGUocGF0aC5taWQocGF0aC5maW5kUmV2KCcvJykgKyAx
KSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJcIiI7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmKCFzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+
KGN1cnJlbnQpLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIG1pbWVUeXBlID0gZnJhbWUgPyBN
YWMoZnJhbWUpLT5taW1lVHlwZUZvckZpbGVOYW1lKHBhdGgpIDogUVN0cmluZygpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICghbWltZVR5cGUuaXNFbXB0eSgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gIlxyXG5Db250ZW50LVR5cGU6ICI7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzdHIgKz0gbWltZVR5cGUuYXNjaWkoKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBoc3RyICs9ICJc
clxuXHJcbiI7Ci0gICAgICAgICAgICAgICAgICAgICsraXQ7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgLy8gYXBwZW5kIGJvZHkKLSAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVuZERh
dGEoaHN0ci5kYXRhKCksIGhzdHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBjb25z
dCBGb3JtRGF0YUxpc3RJdGVtICZpdGVtID0gKml0OwotICAgICAgICAgICAgICAgICAgICBzaXpl
X3QgZGF0YVNpemUgPSBpdGVtLm1fZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChkYXRhU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9kYXRhLmFwcGVu
ZERhdGEoaXRlbS5tX2RhdGEsIGRhdGFTaXplIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGVs
c2UgaWYgKCFpdGVtLm1fcGF0aC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBm
b3JtX2RhdGEuYXBwZW5kRmlsZShpdGVtLm1fcGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZv
cm1fZGF0YS5hcHBlbmREYXRhKCJcclxuIiwgMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpZiAobV9tdWx0aXBhcnQpCi0gICAg
ICAgIGVuY19zdHJpbmcgPSAoIi0tIiArIG1fYm91bmRhcnkucXN0cmluZygpICsgIi0tXHJcbiIp
LmFzY2lpKCk7Ci0KLSAgICBmb3JtX2RhdGEuYXBwZW5kRGF0YShlbmNfc3RyaW5nLmRhdGEoKSwg
ZW5jX3N0cmluZy5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6cGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmluZyYgdHlwZSkKLXsKLSAg
ICBpZih0eXBlLmNvbnRhaW5zKCJtdWx0aXBhcnQiLCBmYWxzZSkgfHwgdHlwZS5jb250YWlucygi
Zm9ybS1kYXRhIiwgZmFsc2UpKSB7Ci0gICAgICAgIG1fZW5jdHlwZSA9ICJtdWx0aXBhcnQvZm9y
bS1kYXRhIjsKLSAgICAgICAgbV9tdWx0aXBhcnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAodHlw
ZS5jb250YWlucygidGV4dCIsIGZhbHNlKSB8fCB0eXBlLmNvbnRhaW5zKCJwbGFpbiIsIGZhbHNl
KSkgewotICAgICAgICBtX2VuY3R5cGUgPSAidGV4dC9wbGFpbiI7Ci0gICAgICAgIG1fbXVsdGlw
YXJ0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9lbmN0eXBlID0gImFwcGxpY2F0
aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7
Ci0gICAgfQotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEJvdW5kYXJ5KCBjb25z
dCBET01TdHJpbmcmIGJvdW5kICkKLXsKLSAgICBtX2JvdW5kYXJ5ID0gYm91bmQ7Ci19Ci0KLWJv
b2wgSFRNTEZvcm1FbGVtZW50SW1wbDo6cHJlcGFyZVN1Ym1pdCgpCi17Ci0gICAgRnJhbWUgKmZy
YW1lID0gZ2V0RG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2luc3VibWl0IHx8ICFmcmFt
ZSB8fCBmcmFtZS0+b25seUxvY2FsUmVmZXJlbmNlcygpKQotICAgICAgICByZXR1cm4gbV9pbnN1
Ym1pdDsKLQotICAgIG1faW5zdWJtaXQgPSB0cnVlOwotICAgIG1fZG9pbmdzdWJtaXQgPSBmYWxz
ZTsKLQotICAgIGlmICggZGlzcGF0Y2hIVE1MRXZlbnQoc3VibWl0RXZlbnQsZmFsc2UsdHJ1ZSkg
JiYgIW1fZG9pbmdzdWJtaXQgKQotICAgICAgICBtX2RvaW5nc3VibWl0ID0gdHJ1ZTsKLQotICAg
IG1faW5zdWJtaXQgPSBmYWxzZTsKLQotICAgIGlmICggbV9kb2luZ3N1Ym1pdCApCi0gICAgICAg
IHN1Ym1pdCh0cnVlKTsKLQotICAgIHJldHVybiBtX2RvaW5nc3VibWl0OwotfQotCi12b2lkIEhU
TUxGb3JtRWxlbWVudEltcGw6OnN1Ym1pdCggYm9vbCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiApCi17
Ci0gICAgS0hUTUxWaWV3ICp2aWV3ID0gZ2V0RG9jdW1lbnQoKS0+dmlldygpOwotICAgIEZyYW1l
ICpmcmFtZSA9IGdldERvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYgKCF2aWV3IHx8ICFmcmFt
ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBtX2luc3VibWl0ICkgewot
ICAgICAgICBtX2RvaW5nc3VibWl0ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIG1faW5zdWJtaXQgPSB0cnVlOwotCi0gICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwq
IGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9IDA7Ci0gICAgYm9vbCBuZWVkQnV0dG9uQWN0
aXZhdGlvbiA9IGFjdGl2YXRlU3VibWl0QnV0dG9uOwkvLyBkbyB3ZSBuZWVkIHRvIGFjdGl2YXRl
IGEgc3VibWl0IGJ1dHRvbj8KLSAgICAKLSAgICBNYWMoZnJhbWUpLT5jbGVhclJlY29yZGVkRm9y
bVZhbHVlcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtRWxlbWVudHMuY291
bnQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKiBjdXJyZW50
ID0gZm9ybUVsZW1lbnRzW2ldOwotICAgICAgICAvLyBPdXIgYXBwIG5lZWRzIHRvIGdldCBmb3Jt
IHZhbHVlcyBmb3IgcGFzc3dvcmQgZmllbGRzIGZvciBkb2luZyBwYXNzd29yZCBhdXRvY29tcGxl
dGUsCi0gICAgICAgIC8vIHNvIHdlIGFyZSBtb3JlIGxlbmllbnQgaW4gcHVzaGluZyB2YWx1ZXMs
IGFuZCBsZXQgdGhlIGFwcCBkZWNpZGUgd2hhdCB0byBzYXZlIHdoZW4uCi0gICAgICAgIGlmIChj
dXJyZW50LT5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRF
bGVtZW50SW1wbCAqaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGN1
cnJlbnQpOwotICAgICAgICAgICAgaWYgKGlucHV0LT5pbnB1dFR5cGUoKSA9PSBIVE1MSW5wdXRF
bGVtZW50SW1wbDo6VEVYVAotICAgICAgICAgICAgICAgIHx8IGlucHV0LT5pbnB1dFR5cGUoKSA9
PSAgSFRNTElucHV0RWxlbWVudEltcGw6OlBBU1NXT1JECi0gICAgICAgICAgICAgICAgfHwgaW5w
dXQtPmlucHV0VHlwZSgpID09IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpTRUFSQ0gpCi0gICAgICAg
ICAgICB7Ci0gICAgICAgICAgICAgICAgTWFjKGZyYW1lKS0+cmVjb3JkRm9ybVZhbHVlKGlucHV0
LT5uYW1lKCkucXN0cmluZygpLCBpbnB1dC0+dmFsdWUoKS5xc3RyaW5nKCksIHRoaXMpOwotICAg
ICAgICAgICAgICAgIGlmIChpbnB1dC0+cmVuZGVyZXIoKSAmJiBpbnB1dC0+aW5wdXRUeXBlKCkg
PT0gSFRNTElucHV0RWxlbWVudEltcGw6OlNFQVJDSCkKLSAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQqPihpbnB1dC0+cmVuZGVyZXIoKSktPmFkZFNlYXJjaFJl
c3VsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRCdXR0
b25BY3RpdmF0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+aXNBY3RpdmF0ZWRTdWJt
aXQoKSkgewotICAgICAgICAgICAgICAgIG5lZWRCdXR0b25BY3RpdmF0aW9uID0gZmFsc2U7Ci0g
ICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbiA9PSAwICYm
IGN1cnJlbnQtPmlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpKSB7Ci0gICAgICAgICAgICAgICAg
Zmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0dG9uID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZWVkQnV0dG9uQWN0aXZhdGlvbiAmJiBmaXJzdFN1
Y2Nlc3NmdWxTdWJtaXRCdXR0b24pIHsKLSAgICAgICAgZmlyc3RTdWNjZXNzZnVsU3VibWl0QnV0
dG9uLT5zZXRBY3RpdmF0ZWRTdWJtaXQodHJ1ZSk7Ci0gICAgfQotCi0gICAgaWYgKCFtX3Bvc3Qp
Ci0gICAgICAgIG1fbXVsdGlwYXJ0ID0gZmFsc2U7Ci0gICAgCi0gICAgRm9ybURhdGEgZm9ybV9k
YXRhOwotICAgIGlmIChmb3JtRGF0YShmb3JtX2RhdGEpKSB7Ci0gICAgICAgIGlmKG1fcG9zdCkg
ewotICAgICAgICAgICAgZnJhbWUtPnN1Ym1pdEZvcm0oICJwb3N0IiwgbV91cmwucXN0cmluZygp
LCBmb3JtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdGFy
Z2V0LnFzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5j
dHlwZSgpLnFzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ym91bmRhcnkoKS5xc3RyaW5nKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgIGZyYW1lLT5zdWJtaXRGb3JtKCAiZ2V0IiwgbV91cmwucXN0cmluZygpLCBmb3JtX2Rh
dGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdGFyZ2V0LnFzdHJp
bmcoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZWRCdXR0b25BY3RpdmF0aW9u
ICYmIGZpcnN0U3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbikgewotICAgICAgICBmaXJzdFN1Y2Nlc3Nm
dWxTdWJtaXRCdXR0b24tPnNldEFjdGl2YXRlZFN1Ym1pdChmYWxzZSk7Ci0gICAgfQotICAgIAot
ICAgIG1fZG9pbmdzdWJtaXQgPSBtX2luc3VibWl0ID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6cmVzZXQoICApCi17Ci0gICAgRnJhbWUgKmZyYW1lID0gZ2V0RG9jdW1l
bnQoKS0+ZnJhbWUoKTsKLSAgICBpZihtX2lucmVzZXQgfHwgIWZyYW1lKSByZXR1cm47Ci0KLSAg
ICBtX2lucmVzZXQgPSB0cnVlOwotCi0gICAgLy8gIyMjIERPTTIgbGFiZWxzIHRoaXMgZXZlbnQg
YXMgbm90IGNhbmNlbGFibGUsIGhvd2V2ZXIKLSAgICAvLyBjb21tb24gYnJvd3NlcnMoIHNpY2sh
ICkgYWxsb3cgaXQgYmUgY2FuY2VsbGVkLgotICAgIGlmICggIWRpc3BhdGNoSFRNTEV2ZW50KHJl
c2V0RXZlbnQsdHJ1ZSwgdHJ1ZSkgKSB7Ci0gICAgICAgIG1faW5yZXNldCA9IGZhbHNlOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZvcm1F
bGVtZW50cy5jb3VudCgpOyArK2kpCi0gICAgICAgIGZvcm1FbGVtZW50c1tpXS0+cmVzZXQoKTsK
LQotICAgIG1faW5yZXNldCA9IGZhbHNlOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAg
aWYgKGF0dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyKSAKLSAgICB7Ci0gICAgICAgIGJvb2wgb2xk
VVJMV2FzU2VjdXJlID0gZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1pc3Npb24obV91cmwpOwotICAg
ICAgICBtX3VybCA9IGtodG1sOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYm9v
bCBuZXdVUkxJc1NlY3VyZSA9IGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKG1fdXJsKTsK
LQotICAgICAgICBpZiAobV9hdHRhY2hlZCAmJiAob2xkVVJMV2FzU2VjdXJlICE9IG5ld1VSTElz
U2VjdXJlKSkKLSAgICAgICAgICAgIGlmIChuZXdVUkxJc1NlY3VyZSkKLSAgICAgICAgICAgICAg
ICBnZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtQWRkZWQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT5zZWN1cmVGb3JtUmVtb3ZlZCgpOwotICAgIH0K
LSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdGFyZ2V0QXR0cikgewotICAgICAgICBtX3Rh
cmdldCA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWV0
aG9kQXR0cikgewotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwg
InBvc3QiKSkKLSAgICAgICAgICAgIG1fcG9zdCA9IHRydWU7Ci0gICAgICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJnZXQiKSkKLSAgICAgICAgICAgIG1fcG9z
dCA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGVuY3R5cGVBdHRyKSB7
Ci0gICAgICAgIHBhcnNlRW5jdHlwZShhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBhY2NlcHRfY2hhcnNldEF0dHIpIHsKLSAgICAgICAgLy8gc3BhY2Ugc2Vw
YXJhdGVkIGxpc3Qgb2YgY2hhcnNldHMgdGhlIHNlcnZlcgotICAgICAgICAvLyBhY2NlcHRzIC0g
c2VlIHJmYzIwNDUKLSAgICAgICAgbV9hY2NlcHRjaGFyc2V0ID0gYXR0ci0+dmFsdWUoKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2NlcHRBdHRyKSB7Ci0gICAgICAgIC8vIGln
bm9yZSB0aGlzIG9uZSBmb3IgdGhlIG1vbWVudC4uLgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAgbV9hdXRvY29tcGxldGUgPSAhZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IG9uc3VibWl0QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihzdWJtaXRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25y
ZXNldEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIocmVzZXRFdmVudCwgYXR0
cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAg
RE9NU3RyaW5nIG5ld05hbWVBdHRyID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgaWYgKGluRG9j
dW1lbnQoKSAmJiBnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0gICAgICAgICAg
ICBIVE1MRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudElt
cGwgKj4oZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBkb2N1bWVudC0+cmVtb3ZlTmFtZWRJ
dGVtKG9sZE5hbWVBdHRyKTsKLSAgICAgICAgICAgIGRvY3VtZW50LT5hZGROYW1lZEl0ZW0obmV3
TmFtZUF0dHIpOwotICAgICAgICB9Ci0gICAgICAgIG9sZE5hbWVBdHRyID0gbmV3TmFtZUF0dHI7
Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoYXR0cik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGluc2VydEludG9W
ZWN0b3IoUVB0clZlY3RvcjxUPiAmdmVjLCB1bnNpZ25lZCBwb3MsIFQqIGl0ZW0pCi17Ci0gICAg
dW5zaWduZWQgc2l6ZSA9IHZlYy5zaXplKCk7Ci0gICAgdW5zaWduZWQgY291bnQgPSB2ZWMuY291
bnQoKTsKLSAgICBhc3NlcnQocG9zIDw9IGNvdW50KTsKLSAgICBpZiAoc2l6ZSA9PSBjb3VudCkK
LSAgICAgICAgdmVjLnJlc2l6ZShzaXplID09IDAgPyA4IDogc2l6ZSAqIDMgLyAyKTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSBjb3VudDsgaSA+IHBvczsgLS1pKQotICAgICAgICB2ZWMuaW5zZXJ0
KGksIHZlY1tpIC0gMV0pOyAgICAKLSAgICB2ZWMuaW5zZXJ0KHBvcywgaXRlbSk7Ci19Ci0KLXRl
bXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGFwcGVuZFRvVmVjdG9yKFFQdHJWZWN0b3I8VD4g
JnZlYywgVCAqaXRlbSkKLXsKLSAgICB1bnNpZ25lZCBzaXplID0gdmVjLnNpemUoKTsKLSAgICB1
bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwotICAgIGlmIChzaXplID09IGNvdW50KQotICAg
ICAgICB2ZWMucmVzaXplKHNpemUgPT0gMCA/IDggOiBzaXplICogMyAvIDIpOwotICAgIHZlYy5p
bnNlcnQoY291bnQsIGl0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgdm9pZCBy
ZW1vdmVGcm9tVmVjdG9yKFFQdHJWZWN0b3I8VD4gJnZlYywgVCAqaXRlbSkKLXsKLSAgICBpbnQg
cG9zID0gdmVjLmZpbmRSZWYoaXRlbSk7Ci0gICAgaWYgKHBvcyA8IDApCi0gICAgICAgIHJldHVy
bjsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHZlYy5jb3VudCgpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IHBvczsgaSA8IGNvdW50IC0gMTsgKytpKQotICAgICAgICB2ZWMuaW5zZXJ0KGksIHZlY1tp
ICsgMV0pOwotICAgIHZlYy5yZW1vdmUoY291bnQgLSAxKTsKLX0KLQotdW5zaWduZWQgSFRNTEZv
cm1FbGVtZW50SW1wbDo6Zm9ybUVsZW1lbnRJbmRleChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bCAqZSkKLXsKLSAgICAvLyBDaGVjayBmb3IgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGlzIGVs
ZW1lbnQgaXMgdGhlIHZlcnkgbGFzdCB0aGluZyBpbgotICAgIC8vIHRoZSBmb3JtJ3MgdHJlZSBv
ZiBjaGlsZHJlbjsgd2UgZG9uJ3Qgd2FudCB0byB3YWxrIHRoZSBlbnRpcmUgdHJlZSBpbiB0aGF0
Ci0gICAgLy8gY29tbW9uIGNhc2UgdGhhdCBvY2N1cnMgZHVyaW5nIHBhcnNpbmc7IGluc3RlYWQg
d2UnbGwganVzdCByZXR1cm4gYSB2YWx1ZQotICAgIC8vIHRoYXQgc2F5cyAiYWRkIHRoaXMgZm9y
bSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5Ii4KLSAgICBpZiAoZS0+dHJhdmVyc2VO
ZXh0Tm9kZSh0aGlzKSkgewotICAgICAgICB1bnNpZ25lZCBpID0gMDsKLSAgICAgICAgZm9yIChO
b2RlSW1wbCAqbm9kZSA9IHRoaXM7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2Rl
KHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZSA9PSBlKQotICAgICAgICAgICAgICAgIHJl
dHVybiBpOwotICAgICAgICAgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKQotICAgICAgICAg
ICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwgKj4obm9kZSktPmlzR2Vu
ZXJpY0Zvcm1FbGVtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgc3RhdGljX2Nhc3Q8SFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKj4obm9kZSktPmZvcm0oKSA9PSB0aGlzKQotICAgICAg
ICAgICAgICAgICsraTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZm9ybUVsZW1lbnRz
LmNvdW50KCk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6cmVnaXN0ZXJGb3JtRWxl
bWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICBEb2N1bWVudEltcGwg
KmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvYyAmJiBlLT5pc1JhZGlvQnV0dG9uKCkg
JiYgIWUtPm5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwqIGN1cnJlbnRDaGVja2VkUmFkaW8gPSBkb2MtPmNoZWNrZWRSYWRpb0J1dHRvbkZvckdy
b3VwKGUtPm5hbWUoKS5pbXBsKCksIChIVE1MRm9ybUVsZW1lbnRJbXBsKikgMCk7Ci0gICAgICAg
IGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvID09IGUpCi0gICAgICAgICAgICBkb2MtPnJlbW92ZVJh
ZGlvQnV0dG9uR3JvdXAoZS0+bmFtZSgpLmltcGwoKSwgKEhUTUxGb3JtRWxlbWVudEltcGwqKSAw
KTsKLSAgICAgICAgaWYgKGUtPmlzQ2hlY2tlZCgpKQotICAgICAgICAgICAgZG9jLT5yYWRpb0J1
dHRvbkNoZWNrZWQoKEhUTUxJbnB1dEVsZW1lbnRJbXBsKikgZSwgdGhpcyk7Ci0gICAgfQotICAg
IGluc2VydEludG9WZWN0b3IoZm9ybUVsZW1lbnRzLCBmb3JtRWxlbWVudEluZGV4KGUpLCBlKTsK
LX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVGb3JtRWxlbWVudChIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbCAqZSkKLXsKLSAgICBpZiAoIWUtPm5hbWUoKS5pc0VtcHR5KCkg
JiYgZ2V0RG9jdW1lbnQoKSkgewotICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCog
Y3VycmVudENoZWNrZWRSYWRpbyA9IGdldERvY3VtZW50KCktPmNoZWNrZWRSYWRpb0J1dHRvbkZv
ckdyb3VwKGUtPm5hbWUoKS5pbXBsKCksIHRoaXMpOwotICAgICAgICBpZiAoY3VycmVudENoZWNr
ZWRSYWRpbyA9PSBlKQotICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVtb3ZlUmFkaW9CdXR0
b25Hcm91cChlLT5uYW1lKCkuaW1wbCgpLCB0aGlzKTsKLSAgICB9Ci0gICAgcmVtb3ZlRnJvbVZl
Y3Rvcihmb3JtRWxlbWVudHMsIGUpOwotfQotCi1ib29sIEhUTUxGb3JtRWxlbWVudEltcGw6Omlz
VVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0
dHItPm5hbWUoKSA9PSBhY3Rpb25BdHRyOwotfQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6
OnJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1wbCAqZSkKLXsKLSAgICBhcHBl
bmRUb1ZlY3RvcihpbWdFbGVtZW50cywgZSk7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1w
bDo6cmVtb3ZlSW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1wbCAqZSkKLXsKLSAgICByZW1v
dmVGcm9tVmVjdG9yKGltZ0VsZW1lbnRzLCBlKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9u
SW1wbD4gSFRNTEZvcm1FbGVtZW50SW1wbDo6ZWxlbWVudHMoKQotewotICAgIHJldHVybiBSZWZQ
dHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTEZvcm1Db2xsZWN0aW9uSW1wbCh0aGlzKSk7
Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBsOjpuYW1lKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1l
bnRJbXBsOjpzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLURPTVN0cmluZyBIVE1MRm9ybUVsZW1lbnRJbXBs
OjphY2NlcHRDaGFyc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vw
dF9jaGFyc2V0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZvcm1FbGVtZW50SW1wbDo6c2V0QWNjZXB0
Q2hhcnNldChjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2Nl
cHRfY2hhcnNldEF0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxGb3JtRWxlbWVudElt
cGw6OmFjdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY3Rpb25BdHRy
KTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBsOjpzZXRBY3Rpb24oY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWN0aW9uQXR0ciwgdmFsdWUpOwotfQot
Ci12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldEVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZW5jdHlwZUF0dHIsIHZhbHVlKTsKLX0KLQotRE9N
U3RyaW5nIEhUTUxGb3JtRWxlbWVudEltcGw6Om1ldGhvZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShtZXRob2RBdHRyKTsKLX0KLQotdm9pZCBIVE1MRm9ybUVsZW1lbnRJbXBs
OjpzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
bWV0aG9kQXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEZvcm1FbGVtZW50SW1wbDo6
dGFyZ2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHRhcmdldEF0dHIpOwot
fQotCi12b2lkIEhUTUxGb3JtRWxlbWVudEltcGw6OnNldFRhcmdldChjb25zdCBET01TdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh0YXJnZXRBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OkhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50
SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQogICAgIDogSFRNTEVsZW1lbnRJbXBs
KHRhZ05hbWUsIGRvYykKIHsKQEAgLTEwMjAsMjU0OSArMzI2LDUgQEAgdm9pZCBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbDo6c2V0VGFiSQogewogICAgIHNldEF0dHJpYnV0ZSh0YWJpbmRleEF0
dHIsIFFTdHJpbmc6Om51bWJlcih2YWx1ZSkpOwogfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LUhUTUxCdXR0b25FbGVtZW50SW1wbDo6SFRNTEJ1dHRvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwoYnV0dG9uVGFnLCBkb2MsIGYpCi17Ci0gICAgbV90eXBlID0gU1VCTUlUOwotICAg
IG1fZGlydHkgPSB0cnVlOwotICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci19Ci0KLUhUTUxC
dXR0b25FbGVtZW50SW1wbDo6fkhUTUxCdXR0b25FbGVtZW50SW1wbCgpCi17Ci19Ci0KLVJlbmRl
ck9iamVjdCogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVu
YSogYXJlbmEsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkg
UmVuZGVyQnV0dG9uKHRoaXMpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBs
Ojp0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHR5cGVBdHRyKTsKLX0K
LQotdm9pZCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBl
ZEF0dHJpYnV0ZUltcGwgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSAgdHlwZUF0
dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJzdWJt
aXQiKSkKLSAgICAgICAgICAgIG1fdHlwZSA9IFNVQk1JVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgInJlc2V0IikpCi0gICAgICAgICAgICBtX3R5
cGUgPSBSRVNFVDsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFs
dWUoKSwgImJ1dHRvbiIpKQotICAgICAgICAgICAgbV90eXBlID0gQlVUVE9OOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbHVlQXR0cikgewotICAgICAgICBtX3ZhbHVlID0gYXR0
ci0+dmFsdWUoKTsKLSAgICAgICAgbV9jdXJyVmFsdWUgPSBtX3ZhbHVlOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKLSAgICAgICAgLy8gRG8gbm90aGlu
Zy4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikgewotICAgICAg
ICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3Rl
bmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1M
QnV0dG9uRWxlbWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17
Ci0gICAgaWYgKG1fdHlwZSAhPSBCVVRUT04gJiYgKGV2dC0+dHlwZSgpID09IERPTUFjdGl2YXRl
RXZlbnQpKSB7Ci0KLSAgICAgICAgaWYobV9mb3JtICYmIG1fdHlwZSA9PSBTVUJNSVQpIHsKLSAg
ICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fZm9ybS0+cHJl
cGFyZVN1Ym1pdCgpOwotICAgICAgICAgICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsgLy8gaW4g
Y2FzZSB3ZSB3ZXJlIGNhbmNlbGVkCi0gICAgICAgIH0KLSAgICAgICAgaWYobV9mb3JtICYmIG1f
dHlwZSA9PSBSRVNFVCkgbV9mb3JtLT5yZXNldCgpOwotICAgIH0KLSAgICBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi1ib29sIEhUTUxC
dXR0b25FbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QKLXsKLSAg
ICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBoYXZlIG5hbWVzCi0gICAgLy8g
dG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdGhlciBicm93c2VycwotICAg
IC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVyZWZvcmUsIHdlIGJlaGF2ZQot
ICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVudCBidXR0b25zIHRoYW4gdGhl
IAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGNvbnN0
cmFpbnQgZm9yIG5vdy4KLSAgICAvLyBXYXM6IG1fdHlwZSA9PSBTVUJNSVQgJiYgIW1fZGlzYWJs
ZWQgJiYgIW5hbWUoKS5pc0VtcHR5KCkKLSAgICByZXR1cm4gbV90eXBlID09IFNVQk1JVCAmJiAh
bV9kaXNhYmxlZDsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudEltcGw6OmlzQWN0aXZhdGVk
U3VibWl0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY3RpdmVTdWJtaXQ7Ci19Ci0KLXZvaWQg
SFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKQotewot
ICAgIG1fYWN0aXZlU3VibWl0ID0gZmxhZzsKLX0KLQotYm9vbCBIVE1MQnV0dG9uRWxlbWVudElt
cGw6OmFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYgZW5jb2RpbmcsIGJvb2wgLyptdWx0aXBh
cnQqLykKLXsKLSAgICBpZiAobV90eXBlICE9IFNVQk1JVCB8fCBuYW1lKCkuaXNFbXB0eSgpIHx8
ICFtX2FjdGl2ZVN1Ym1pdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVuY29kaW5nLmFw
cGVuZERhdGEobmFtZSgpLCBtX2N1cnJWYWx1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZv
aWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlF
bGVtZW50KQoteyAgIAotICAgIC8vIHNlbmQgdGhlIG1vdXNlIGJ1dHRvbiBldmVudHMgaWZmIHRo
ZQotICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2VuZFRvQW55RWxlbWVudAotICAgIGNsaWNrKHNl
bmRUb0FueUVsZW1lbnQpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjph
Y2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFs
dWUpOwotfQotCi1ET01TdHJpbmcgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsOjp2YWx1ZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotfQotCi12b2lkIEhUTUxC
dXR0b25FbGVtZW50SW1wbDo6c2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgOiBIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50SW1wbChmaWVsZHNldFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MRmllbGRT
ZXRFbGVtZW50SW1wbDo6fkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9vbCBI
VE1MRmllbGRTZXRFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxk
KQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShsZWdlbmRUYWcpIHx8IEhUTUxF
bGVtZW50SW1wbDo6Y2hlY2tEVEQobmV3Q2hpbGQpOwotfQotCi1ib29sIEhUTUxGaWVsZFNldEVs
ZW1lbnRJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1ET01TdHJpbmcgSFRNTEZpZWxkU2V0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAg
IHJldHVybiAiZmllbGRzZXQiOwotfQotCi1SZW5kZXJPYmplY3QqIEhUTUxGaWVsZFNldEVsZW1l
bnRJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKiBz
dHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyRmllbGRzZXQodGhpcyk7Ci19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTElucHV0RWxlbWVudEltcGw6OkhUTUxJbnB1
dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQot
ICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoaW5wdXRUYWcsIGRvYywgZikKLXsKLSAg
ICBpbml0KCk7Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsOjpIVE1MSW5wdXRFbGVtZW50SW1w
bChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZikKLSAgICA6IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKHRhZ05h
bWUsIGRvYywgZikKLXsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OmluaXQoKQotewotICAgIG1faW1hZ2VMb2FkZXIgPSAwOwotICAgIG1fdmFsdWVNYXRjaGVz
UmVuZGVyZXIgPSBmYWxzZTsKLSAgICBtX3R5cGUgPSBURVhUOwotICAgIG1fbWF4TGVuID0gLTE7
Ci0gICAgbV9zaXplID0gMjA7Ci0gICAgbV9jaGVja2VkID0gZmFsc2U7Ci0gICAgbV9kZWZhdWx0
Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwotICAgIG1f
aW5kZXRlcm1pbmF0ZSA9IGZhbHNlOwotCi0gICAgbV9oYXZlVHlwZSA9IGZhbHNlOwotICAgIG1f
YWN0aXZlU3VibWl0ID0gZmFsc2U7Ci0gICAgbV9hdXRvY29tcGxldGUgPSB0cnVlOwotICAgIG1f
aW5pdGVkID0gZmFsc2U7Ci0KLSAgICB4UG9zID0gMDsKLSAgICB5UG9zID0gMDsKLQotICAgIG1f
bWF4UmVzdWx0cyA9IC0xOwotCi0gICAgaWYgKG1fZm9ybSkKLSAgICAgICAgbV9hdXRvY29tcGxl
dGUgPSBtX2Zvcm0tPmF1dG9Db21wbGV0ZSgpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbDo6
fkhUTUxJbnB1dEVsZW1lbnRJbXBsKCkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSkgZ2V0RG9j
dW1lbnQoKS0+ZGVyZWdpc3Rlck1haW50YWluc1N0YXRlKHRoaXMpOwotICAgIGRlbGV0ZSBtX2lt
YWdlTG9hZGVyOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6Om5hbWUoKSBj
b25zdAotewotICAgIHJldHVybiBtX25hbWUuaXNOdWxsKCkgPyAiIiA6IG1fbmFtZTsKLX0KLQot
Ym9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0Ci17
Ci0gICAgLy8gSWYgdGhlIGJhc2UgY2xhc3Mgc2F5cyB3ZSBjYW4ndCBiZSBmb2N1c2VkLCB0aGVu
IHdlIGNhbiBzdG9wIG5vdy4KLSAgICBpZiAoIUhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpp
c0tleWJvYXJkRm9jdXNhYmxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICht
X3R5cGUgPT0gUkFESU8pIHsKLSAgICAgICAgLy8gVW5uYW1lZCByYWRpbyBidXR0b25zIGFyZSBu
ZXZlciBmb2N1c2FibGUgKG1hdGNoZXMgV2luSUUpLgotICAgICAgICBpZiAobmFtZSgpLmlzRW1w
dHkoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBOZXZlciBhbGxv
dyBrZXlib2FyZCB0YWJiaW5nIHRvIGxlYXZlIHlvdSBpbiB0aGUgc2FtZSByYWRpbyBncm91cC4g
IEFsd2F5cwotICAgICAgICAvLyBza2lwIGFueSBvdGhlciBlbGVtZW50cyBpbiB0aGUgZ3JvdXAu
Ci0gICAgICAgIE5vZGVJbXBsKiBjdXJyZW50Rm9jdXNOb2RlID0gZ2V0RG9jdW1lbnQoKS0+Zm9j
dXNOb2RlKCk7Ci0gICAgICAgIGlmIChjdXJyZW50Rm9jdXNOb2RlICYmIGN1cnJlbnRGb2N1c05v
ZGUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50
SW1wbCogZm9jdXNlZElucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudEltcGwqPihj
dXJyZW50Rm9jdXNOb2RlKTsKLSAgICAgICAgICAgIGlmIChmb2N1c2VkSW5wdXQtPmlucHV0VHlw
ZSgpID09IFJBRElPICYmIGZvY3VzZWRJbnB1dC0+Zm9ybSgpID09IG1fZm9ybSAmJgotICAgICAg
ICAgICAgICAgIGZvY3VzZWRJbnB1dC0+bmFtZSgpID09IG5hbWUoKSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFsbG93IGtl
eWJvYXJkIGZvY3VzIGlmIHdlJ3JlIGNoZWNrZWQgb3IgaWYgbm90aGluZyBpbiB0aGUgZ3JvdXAg
aXMgY2hlY2tlZC4KLSAgICAgICAgcmV0dXJuIGNoZWNrZWQoKSB8fCAhZ2V0RG9jdW1lbnQoKS0+
Y2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICB9
Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6
OnNldFR5cGUoY29uc3QgRE9NU3RyaW5nJiB0KQotewotICAgIGlmICh0LmlzRW1wdHkoKSkgewot
ICAgICAgICBpbnQgZXhjY29kZTsKLSAgICAgICAgcmVtb3ZlQXR0cmlidXRlKHR5cGVBdHRyLCBl
eGNjb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzZXRBdHRyaWJ1dGUodHlwZUF0dHIs
IHQpOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRJbnB1dFR5cGUoY29uc3Qg
RE9NU3RyaW5nJiB0KQotewotICAgIHR5cGVFbnVtIG5ld1R5cGU7Ci0gICAgCi0gICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHQsICJwYXNzd29yZCIpKQotICAgICAgICBuZXdUeXBlID0gUEFTU1dP
UkQ7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgImNoZWNrYm94IikpCi0gICAg
ICAgIG5ld1R5cGUgPSBDSEVDS0JPWDsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0
LCAicmFkaW8iKSkKLSAgICAgICAgbmV3VHlwZSA9IFJBRElPOwotICAgIGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKHQsICJzdWJtaXQiKSkKLSAgICAgICAgbmV3VHlwZSA9IFNVQk1JVDsKLSAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAicmVzZXQiKSkKLSAgICAgICAgbmV3VHlw
ZSA9IFJFU0VUOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJmaWxlIikpCi0g
ICAgICAgIG5ld1R5cGUgPSBGSUxFOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQs
ICJoaWRkZW4iKSkKLSAgICAgICAgbmV3VHlwZSA9IEhJRERFTjsKLSAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZSh0LCAiaW1hZ2UiKSkKLSAgICAgICAgbmV3VHlwZSA9IElNQUdFOwotICAg
IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHQsICJidXR0b24iKSkKLSAgICAgICAgbmV3VHlw
ZSA9IEJVVFRPTjsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0LCAia2h0bWxfaXNp
bmRleCIpKQotICAgICAgICBuZXdUeXBlID0gSVNJTkRFWDsKLSAgICBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZSh0LCAic2VhcmNoIikpCi0gICAgICAgIG5ld1R5cGUgPSBTRUFSQ0g7Ci0gICAg
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodCwgInJhbmdlIikpCi0gICAgICAgIG5ld1R5cGUg
PSBSQU5HRTsKLSAgICBlbHNlCi0gICAgICAgIG5ld1R5cGUgPSBURVhUOwotCi0gICAgLy8gIyMj
IElNUE9SVEFOVDogRG9uJ3QgYWxsb3cgdGhlIHR5cGUgdG8gYmUgY2hhbmdlZCB0byBGSUxFIGFm
dGVyIHRoZSBmaXJzdAotICAgIC8vIHR5cGUgY2hhbmdlLCBvdGhlcndpc2UgYSBKYXZhU2NyaXB0
IHByb2dyYW1tZXIgd291bGQgYmUgYWJsZSB0byBzZXQgYSB0ZXh0Ci0gICAgLy8gZmllbGQncyB2
YWx1ZSB0byBzb21ldGhpbmcgbGlrZSAvZXRjL3Bhc3N3ZCBhbmQgdGhlbiBjaGFuZ2UgaXQgdG8g
YSBmaWxlIGZpZWxkLgotICAgIGlmIChtX3R5cGUgIT0gbmV3VHlwZSkgewotICAgICAgICBpZiAo
bmV3VHlwZSA9PSBGSUxFICYmIG1faGF2ZVR5cGUpIHsKLSAgICAgICAgICAgIC8vIFNldCB0aGUg
YXR0cmlidXRlIGJhY2sgdG8gdGhlIG9sZCB2YWx1ZS4KLSAgICAgICAgICAgIC8vIFVzZWZ1bCBp
biBjYXNlIHdlIHdlcmUgY2FsbGVkIGZyb20gaW5zaWRlIHBhcnNlTWFwcGVkQXR0cmlidXRlLgot
ICAgICAgICAgICAgc2V0QXR0cmlidXRlKHR5cGVBdHRyLCB0eXBlKCkpOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiAhbmFtZSgpLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5jaGVja2VkUmFkaW9CdXR0
b25Gb3JHcm91cChuYW1lKCkuaW1wbCgpLCBtX2Zvcm0pID09IHRoaXMpCi0gICAgICAgICAgICAg
ICAgICAgIGdldERvY3VtZW50KCktPnJlbW92ZVJhZGlvQnV0dG9uR3JvdXAobmFtZSgpLmltcGwo
KSwgbV9mb3JtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgd2FzQXR0YWNoZWQg
PSBtX2F0dGFjaGVkOwotICAgICAgICAgICAgaWYgKHdhc0F0dGFjaGVkKQotICAgICAgICAgICAg
ICAgIGRldGFjaCgpOwotICAgICAgICAgICAgYm9vbCBkaWRTdG9yZVZhbHVlID0gc3RvcmVzVmFs
dWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIG1fdHlwZSA9IG5ld1R5cGU7
Ci0gICAgICAgICAgICBib29sIHdpbGxTdG9yZVZhbHVlID0gc3RvcmVzVmFsdWVTZXBhcmF0ZUZy
b21BdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIGlmIChkaWRTdG9yZVZhbHVlICYmICF3aWxsU3Rv
cmVWYWx1ZSAmJiAhbV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICAgICAgICAgIHNldEF0dHJp
YnV0ZSh2YWx1ZUF0dHIsIG1fdmFsdWUpOwotICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBET01T
dHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGlkU3RvcmVWYWx1ZSAm
JiB3aWxsU3RvcmVWYWx1ZSkgewotICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBnZXRBdHRyaWJ1
dGUodmFsdWVBdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3YXNBdHRhY2hl
ZCkKLSAgICAgICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgIC8vIElmIG91ciB0eXBlIG1vcnBocyBpbnRvIGEgcmFkaW8gYnV0dG9uIGFuZCB3ZSBhcmUg
Y2hlY2tlZCwgdGhlbiBnbyBhaGVhZAotICAgICAgICAgICAgLy8gYW5kIHNpZ25hbCB0aGlzIHRv
IHRoZSBmb3JtLgotICAgICAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJTyAmJiBjaGVja2VkKCkp
Ci0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmFkaW9CdXR0b25DaGVja2VkKHRoaXMs
IG1fZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9oYXZlVHlwZSA9IHRydWU7Ci0gICAg
Ci0gICAgaWYgKG1fdHlwZSAhPSBJTUFHRSAmJiBtX2ltYWdlTG9hZGVyKSB7Ci0gICAgICAgIGRl
bGV0ZSBtX2ltYWdlTG9hZGVyOwotICAgICAgICBtX2ltYWdlTG9hZGVyID0gMDsKLSAgICB9Ci19
Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAg
Ly8gbmVlZHMgdG8gYmUgbG93ZXJjYXNlIGFjY29yZGluZyB0byBET00gc3BlYwotICAgIHN3aXRj
aCAobV90eXBlKSB7Ci0gICAgY2FzZSBURVhUOiByZXR1cm4gInRleHQiOwotICAgIGNhc2UgUEFT
U1dPUkQ6IHJldHVybiAicGFzc3dvcmQiOwotICAgIGNhc2UgQ0hFQ0tCT1g6IHJldHVybiAiY2hl
Y2tib3giOwotICAgIGNhc2UgUkFESU86IHJldHVybiAicmFkaW8iOwotICAgIGNhc2UgU1VCTUlU
OiByZXR1cm4gInN1Ym1pdCI7Ci0gICAgY2FzZSBSRVNFVDogcmV0dXJuICJyZXNldCI7Ci0gICAg
Y2FzZSBGSUxFOiByZXR1cm4gImZpbGUiOwotICAgIGNhc2UgSElEREVOOiByZXR1cm4gImhpZGRl
biI7Ci0gICAgY2FzZSBJTUFHRTogcmV0dXJuICJpbWFnZSI7Ci0gICAgY2FzZSBCVVRUT046IHJl
dHVybiAiYnV0dG9uIjsKLSAgICBjYXNlIFNFQVJDSDogcmV0dXJuICJzZWFyY2giOwotICAgIGNh
c2UgUkFOR0U6IHJldHVybiAicmFuZ2UiOwotICAgIGNhc2UgSVNJTkRFWDogcmV0dXJuICIiOwot
ICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLVFTdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6
OnN0YXRlKCApCi17Ci0gICAgYXNzZXJ0KG1fdHlwZSAhPSBQQVNTV09SRCk7CQkvLyBzaG91bGQg
bmV2ZXIgc2F2ZS9yZXN0b3JlIHBhc3N3b3JkIGZpZWxkcwotCi0gICAgUVN0cmluZyBzdGF0ZSA9
IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpzdGF0ZSgpOwotICAgIHN3aXRjaCAobV90eXBl
KSB7Ci0gICAgY2FzZSBDSEVDS0JPWDoKLSAgICBjYXNlIFJBRElPOgotICAgICAgICByZXR1cm4g
c3RhdGUgKyAoY2hlY2tlZCgpID8gIm9uIiA6ICJvZmYiKTsKLSAgICBkZWZhdWx0OgotICAgICAg
ICByZXR1cm4gc3RhdGUgKyB2YWx1ZSgpLnFzdHJpbmcoKSsnLic7IC8vIE1ha2Ugc3VyZSB0aGUg
c3RyaW5nIGlzIG5vdCBlbXB0eSEKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudElt
cGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmc3RhdGVzKQotewotICAgIGFzc2VydChtX3R5
cGUgIT0gUEFTU1dPUkQpOwkJLy8gc2hvdWxkIG5ldmVyIHNhdmUvcmVzdG9yZSBwYXNzd29yZCBm
aWVsZHMKLSAgICAKLSAgICBRU3RyaW5nIHN0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw6OmZpbmRNYXRjaGluZ1N0YXRlKHN0YXRlcyk7Ci0gICAgaWYgKHN0YXRlLmlzTnVsbCgpKSBy
ZXR1cm47Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAg
Y2FzZSBSQURJTzoKLSAgICAgICAgc2V0Q2hlY2tlZCgoc3RhdGUgPT0gIm9uIikpOwotICAgICAg
ICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBzZXRWYWx1ZShET01TdHJpbmcoc3RhdGUu
bGVmdChzdGF0ZS5sZW5ndGgoKS0xKSkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJv
b2wgSFRNTElucHV0RWxlbWVudEltcGw6OmNhbkhhdmVTZWxlY3Rpb24oKQotewotICAgIHN3aXRj
aCAobV90eXBlKSB7Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoK
LSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLWludCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIGlm
ICghbV9yZW5kZXIpIHJldHVybiAwOwotICAgIAotICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAg
ICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICBjYXNlIFRF
WFQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyTGluZUVkaXQgKj4obV9y
ZW5kZXIpLT5zZWxlY3Rpb25TdGFydCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgSFRNTElucHV0RWxlbWVudElt
cGw6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuIDA7Ci0gICAg
Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAg
Y2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAqPihtX3JlbmRlciktPnNlbGVjdGlvbkVuZCgpOwotICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwot
fQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25TdGFydChpbnQgc3Rh
cnQpCi17Ci0gICAgaWYgKCFtX3JlbmRlcikgcmV0dXJuOwotICAgIAotICAgIHN3aXRjaCAobV90
eXBlKSB7Ci0gICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgIGNhc2UgU0VBUkNIOgotICAg
ICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaW5lRWRpdCAq
PihtX3JlbmRlciktPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lk
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBp
ZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICAg
ICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVY
VDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVyKS0+
c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmKCFtX3JlbmRlcikgcmV0dXJuOwotCi0gICAgc3dp
dGNoIChtX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UmVuZGVyRmlsZUJ1dHRvbio+KG1fcmVuZGVyKS0+c2VsZWN0KCk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAg
ICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0Kj4o
bV9yZW5kZXIpLT5zZWxlY3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJV
VFRPTjoKLSAgICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBISURERU46Ci0gICAg
ICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBSQURJ
TzoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2Fz
ZSBTVUJNSVQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElucHV0
RWxlbWVudEltcGw6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAg
ICBpZiAoIW1fcmVuZGVyKSByZXR1cm47Ci0gICAgCi0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAg
ICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2Ug
VEVYVDoKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpbmVFZGl0ICo+KG1fcmVuZGVy
KS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6Y2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMsIGJvb2wgc2hvd1By
ZXNzZWRMb29rKQotewotICAgIHN3aXRjaCAoaW5wdXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBI
SURERU46Ci0gICAgICAgICAgICAvLyBhIG5vLW9wIGZvciB0aGlzIHR5cGUKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAg
ICAgY2FzZSBCVVRUT046Ci0gICAgICAgICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
Y2xpY2soc2VuZE1vdXNlRXZlbnRzLCBzaG93UHJlc3NlZExvb2spOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGlmIChyZW5kZXJlcigpKSB7Ci0g
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRmlsZUJ1dHRvbiAqPihyZW5kZXJlcigp
KS0+Y2xpY2soc2VuZE1vdXNlRXZlbnRzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpjbGljayhz
ZW5kTW91c2VFdmVudHMsIHNob3dQcmVzc2VkTG9vayk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBDSEVDS0JPWDoKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBJ
TUFHRToKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAg
ICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBURVhU
OgotICAgICAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNsaWNrKHNlbmRNb3Vz
ZUV2ZW50cywgc2hvd1ByZXNzZWRMb29rKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRv
QW55RWxlbWVudCkKLXsKLSAgICBzd2l0Y2ggKGlucHV0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2Ug
SElEREVOOgotICAgICAgICAgICAgLy8gYSBuby1vcCBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBjYXNlIFBBU1NXT1JEOgotICAg
ICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgZm9j
dXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIRUNLQk9YOgotICAgICAg
ICBjYXNlIFJBRElPOgotICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgY2FzZSBSRVNFVDoK
LSAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBCVVRUT046Ci0gICAgICAgIGNhc2Ug
RklMRToKLSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgIC8vIGZvY3VzCi0gICAgICAg
ICAgICBmb2N1cygpOwotCi0gICAgICAgICAgICAvLyBzZW5kIHRoZSBtb3VzZSBidXR0b24gZXZl
bnRzIGlmZiB0aGUKLSAgICAgICAgICAgIC8vIGNhbGxlciBzcGVjaWZpZWQgc2VuZFRvQW55RWxl
bWVudAotICAgICAgICAgICAgY2xpY2soc2VuZFRvQW55RWxlbWVudCk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6Om1hcFRvRW50cnko
Y29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1
bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0ciB8fAotICAgICAgICBh
dHRyTmFtZSA9PSBoZWlnaHRBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZzcGFjZUF0dHIg
fHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaHNwYWNlQXR0cikgewotICAgICAgICByZXN1bHQgPSBl
VW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAKLSAgICAKLSAgICBpZiAo
YXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVSZXBsYWNlZDsgLy8g
U2hhcmUgd2l0aCA8aW1nPiBzaW5jZSB0aGUgYWxpZ25tZW50IGJlaGF2aW9yIGlzIHRoZSBzYW1l
LgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBIVE1MRWxl
bWVudEltcGw6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRNTElu
cHV0RWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwg
KmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBp
ZiAobV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSAmJiBtX2Zvcm0pIHsKLSAgICAgICAgICAg
IC8vIFJlbW92ZSB0aGUgcmFkaW8gZnJvbSBpdHMgb2xkIGdyb3VwLgotICAgICAgICAgICAgaWYg
KG1fdHlwZSA9PSBSQURJTyAmJiAhbV9uYW1lLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBn
ZXREb2N1bWVudCgpLT5yZW1vdmVSYWRpb0J1dHRvbkdyb3VwKG1fbmFtZS5pbXBsKCksIG1fZm9y
bSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFVwZGF0ZSBvdXIgY2FjaGVkIHJl
ZmVyZW5jZSB0byB0aGUgbmFtZS4KLSAgICAgICAgbV9uYW1lID0gYXR0ci0+dmFsdWUoKTsKLSAg
ICAgICAgCi0gICAgICAgIC8vIEFkZCBpdCB0byBpdHMgbmV3IGdyb3VwLgotICAgICAgICBpZiAo
bV90eXBlID09IFJBRElPICYmIGNoZWNrZWQoKSkKLSAgICAgICAgICAgIGdldERvY3VtZW50KCkt
PnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0pOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGF1dG9jb21wbGV0ZUF0dHIpIHsKLSAgICAgICAgbV9hdXRvY29tcGxldGUgPSAh
ZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgIm9mZiIpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09ICB0eXBlQXR0cikgewotICAgICAgICBzZXRJbnB1dFR5cGUoYXR0ci0+
dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsdWVBdHRyKSB7Ci0g
ICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBzZXRDaGFuZ2VkIGlmIHRoZSBmb3JtIGlzIGxvb2tp
bmcgYXQgdGhlIGRlZmF1bHQgdmFsdWUgcmlnaHQgbm93LgotICAgICAgICBpZiAobV92YWx1ZS5p
c051bGwoKSkKLSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgbV92YWx1ZU1hdGNo
ZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNoZWNr
ZWRBdHRyKSB7Ci0gICAgICAgIG1fZGVmYXVsdENoZWNrZWQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0g
ICAgICAgIGlmIChtX3VzZURlZmF1bHRDaGVja2VkKSB7Ci0gICAgICAgICAgICBzZXRDaGVja2Vk
KG1fZGVmYXVsdENoZWNrZWQpOwotICAgICAgICAgICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRy
dWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXhsZW5ndGhB
dHRyKSB7Ci0gICAgICAgIG1fbWF4TGVuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUo
KS50b0ludCgpIDogLTE7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSAhYXR0ci0+aXNOdWxs
KCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAyMDsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBhbHRBdHRyKSB7Ci0gICAgICAgIGlmIChtX3JlbmRlciAmJiBtX3R5cGUgPT0gSU1B
R0UpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KG1fcmVuZGVyKS0+dXBk
YXRlQWx0VGV4dCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpIHsK
LSAgICAgICAgaWYgKG1fcmVuZGVyICYmIG1fdHlwZSA9PSBJTUFHRSkgewotICAgICAgICAgICAg
aWYgKCFtX2ltYWdlTG9hZGVyKQotICAgICAgICAgICAgICAgIG1faW1hZ2VMb2FkZXIgPSBuZXcg
SFRNTEltYWdlTG9hZGVyKHRoaXMpOwotICAgICAgICAgICAgbV9pbWFnZUxvYWRlci0+dXBkYXRl
RnJvbUVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IHVzZW1hcEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlB
dHRyKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBtb21lbnQKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2c3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fVE9QLCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRk
Q1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9CT1RUT00sIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgYWRk
Q1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9MRUZULCBhdHRyLT52YWx1ZSgpKTsKLSAg
ICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9SSUdIVCwgYXR0ci0+dmFs
dWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWxpZ25BdHRyKSB7Ci0gICAg
ICAgIGFkZEhUTUxBbGlnbm1lbnQoYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURU
SCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0
QXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfSEVJR0hULCBhdHRy
LT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmZvY3VzQXR0cikg
ewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxF
dmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gb25zZWxlY3RBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHNlbGVj
dEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmNoYW5nZUF0
dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoY2hhbmdlRXZlbnQsIGF0dHIpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uaW5wdXRBdHRyKSB7Ci0gICAgICAgIHNl
dEhUTUxFdmVudExpc3RlbmVyKGlucHV0RXZlbnQsIGF0dHIpOwotICAgIH0KLSAgICAvLyBTZWFy
Y2ggZmllbGQgYW5kIHNsaWRlciBhdHRyaWJ1dGVzIGFsbCBqdXN0IGNhdXNlIHVwZGF0ZUZyb21F
bGVtZW50IHRvIGJlIGNhbGxlZCB0aHJvdWdoIHN0eWxlCi0gICAgLy8gcmVjYWxjaW5nLgotICAg
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNlYXJjaEF0dHIpIHsKLSAgICAgICAgc2V0SFRN
TEV2ZW50TGlzdGVuZXIoc2VhcmNoRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IHJlc3VsdHNBdHRyKSB7Ci0gICAgICAgIG1fbWF4UmVzdWx0cyA9ICFhdHRyLT5p
c051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IC0xOwotICAgICAgICBzZXRDaGFuZ2Vk
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYXV0b3NhdmVBdHRyIHx8Ci0gICAg
ICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gaW5jcmVtZW50YWxBdHRyIHx8Ci0gICAgICAgICAg
ICAgICBhdHRyLT5uYW1lKCkgPT0gcGxhY2Vob2xkZXJBdHRyIHx8Ci0gICAgICAgICAgICAgICBh
dHRyLT5uYW1lKCkgPT0gbWluQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09
IG1heEF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBwcmVjaXNpb25BdHRy
KSB7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ib29s
IEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICpzdHls
ZSkKLXsKLSAgICBzd2l0Y2gobV90eXBlKQotICAgIHsKLSAgICBjYXNlIFRFWFQ6Ci0gICAgY2Fz
ZSBQQVNTV09SRDoKLSAgICBjYXNlIFNFQVJDSDoKLSAgICBjYXNlIFJBTkdFOgotICAgIGNhc2Ug
SVNJTkRFWDoKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgY2FzZSBT
VUJNSVQ6Ci0gICAgY2FzZSBJTUFHRToKLSAgICBjYXNlIFJFU0VUOgotICAgIGNhc2UgRklMRToK
LSAgICBjYXNlIEJVVFRPTjogICByZXR1cm4gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJl
bmRlcmVySXNOZWVkZWQoc3R5bGUpOwotICAgIGNhc2UgSElEREVOOiAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJlbmRl
ck9iamVjdCAqSFRNTElucHV0RWxlbWVudEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
ICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHN3aXRjaChtX3R5cGUpCi0gICAg
ewotICAgIGNhc2UgVEVYVDoKLSAgICBjYXNlIFBBU1NXT1JEOgotICAgIGNhc2UgU0VBUkNIOgot
ICAgIGNhc2UgSVNJTkRFWDogIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMaW5lRWRpdCh0aGlz
KTsKLSAgICBjYXNlIENIRUNLQk9YOgotICAgIGNhc2UgUkFESU86Ci0gICAgICAgIHJldHVybiBS
ZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci0gICAgY2FzZSBTVUJNSVQ6
Ci0gICAgY2FzZSBSRVNFVDoKLSAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgcmV0dXJuIG5ldyAo
YXJlbmEpIFJlbmRlckJ1dHRvbih0aGlzKTsKLSAgICBjYXNlIElNQUdFOiAgICByZXR1cm4gbmV3
IChhcmVuYSkgUmVuZGVySW1hZ2VCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBGSUxFOiAgICAgcmV0
dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZpbGVCdXR0b24odGhpcyk7Ci0gICAgY2FzZSBSQU5HRTog
ICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclNsaWRlcih0aGlzKTsKLSAgICBjYXNlIEhJRERF
TjogICBicmVhazsKLSAgICB9Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gMDsKLX0K
LQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBpZiAoIW1faW5p
dGVkKSB7Ci0gICAgICAgIGlmICghbV9oYXZlVHlwZSkKLSAgICAgICAgICAgIHNldElucHV0VHlw
ZShnZXRBdHRyaWJ1dGUodHlwZUF0dHIpKTsKLQotICAgICAgICAvLyBGSVhNRTogVGhpcyBuZWVk
cyB0byBiZSBkeW5hbWljLCBkb2Vzbid0IGl0LCBzaW5jZSBzb21lb25lIGNvdWxkIHNldCB0aGlz
Ci0gICAgICAgIC8vIGFmdGVyIGF0dGFjaG1lbnQ/Ci0gICAgICAgIERPTVN0cmluZyB2YWwgPSBn
ZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICAgICAgaWYgKCh1aW50KSBtX3R5cGUgPD0gSVNJ
TkRFWCAmJiAhdmFsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG5ld2xpbmUg
c3R1ZmYuLgotICAgICAgICAgICAgUVN0cmluZyBudmFsdWU7Ci0gICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGludCBpID0gMDsgaSA8IHZhbC5sZW5ndGgoKTsgKytpKQotICAgICAgICAgICAgICAg
IGlmICh2YWxbaV0gPj0gJyAnKQotICAgICAgICAgICAgICAgICAgICBudmFsdWUgKz0gdmFsW2ld
OwotCi0gICAgICAgICAgICBpZiAodmFsLmxlbmd0aCgpICE9IG52YWx1ZS5sZW5ndGgoKSkKLSAg
ICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBudmFsdWUpOwotICAgICAgICB9
Ci0KLSAgICAgICAgbV9pbml0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIERpc2FsbG93IHRo
ZSB3aWR0aCBhdHRyaWJ1dGUgb24gaW5wdXRzIG90aGVyIHRoYW4gSElEREVOIGFuZCBJTUFHRS4K
LSAgICAvLyBEdW1iIFdlYiBzaXRlcyB3aWxsIHRyeSB0byBzZXQgdGhlIHdpZHRoIGFzIGFuIGF0
dHJpYnV0ZSBvbiBmb3JtIGNvbnRyb2xzIHRoYXQgYXJlbid0Ci0gICAgLy8gaW1hZ2VzIG9yIGhp
ZGRlbi4KLSAgICBpZiAoaGFzTWFwcGVkQXR0cmlidXRlcygpICYmIG1fdHlwZSAhPSBISURERU4g
JiYgbV90eXBlICE9IElNQUdFICYmICFnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKS5pc0VtcHR5KCkp
IHsKLSAgICAgICAgaW50IGV4Y0NvZGU7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSh3aWR0aEF0
dHIsIGV4Y0NvZGUpOwotICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjph
dHRhY2goKTsKLQotICAgIGlmIChtX3R5cGUgPT0gSU1BR0UpIHsKLSAgICAgICAgaWYgKCFtX2lt
YWdlTG9hZGVyKQotICAgICAgICAgICAgbV9pbWFnZUxvYWRlciA9IG5ldyBIVE1MSW1hZ2VMb2Fk
ZXIodGhpcyk7Ci0gICAgICAgIG1faW1hZ2VMb2FkZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0g
ICAgICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbWFnZSogaW1hZ2VP
YmogPSBzdGF0aWNfY2FzdDxSZW5kZXJJbWFnZSo+KHJlbmRlcmVyKCkpOwotICAgICAgICAgICAg
aW1hZ2VPYmotPnNldEltYWdlKG1faW1hZ2VMb2FkZXItPmltYWdlKCkpOyAgICAKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIG5vdGUgd2UgZG9uJ3QgZGVhbCB3aXRoIGNhbGxpbmcgcGFzc3dv
cmRGaWVsZFJlbW92ZWQoKSBvbiBkZXRhY2gsIGJlY2F1c2UgdGhlIHRpbWluZwotICAgIC8vIHdh
cyBzdWNoIHRoYXQgaXQgY2xlYXJlZCBvdXIgc3RhdGUgdG9vIGVhcmx5Ci0gICAgaWYgKG1fdHlw
ZSA9PSBQQVNTV09SRCkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cGFzc3dvcmRGaWVsZEFkZGVk
KCk7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OmRldGFjaCgpCi17Ci0gICAgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmRldGFjaCgpOwotICAgIG1fdmFsdWVNYXRjaGVzUmVu
ZGVyZXIgPSBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjphbHRU
ZXh0KCkgY29uc3QKLXsKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1s
NDAtMTk5ODA0MjQvYXBwZW5kaXgvbm90ZXMuaHRtbCNhbHRnZW4KLSAgICAvLyBhbHNvIGhlYXZp
bHkgZGlzY3Vzc2VkIGJ5IEhpeGllIG9uIGJ1Z3ppbGxhCi0gICAgLy8gbm90ZSB0aGlzIGlzIGlu
dGVudGlvbmFsbHkgZGlmZmVyZW50IHRvIEhUTUxJbWFnZUVsZW1lbnRJbXBsOjphbHRUZXh0KCkK
LSAgICBET01TdHJpbmcgYWx0ID0gZ2V0QXR0cmlidXRlKGFsdEF0dHIpOwotICAgIC8vIGZhbGwg
YmFjayB0byB0aXRsZSBhdHRyaWJ1dGUKLSAgICBpZiAoYWx0LmlzTnVsbCgpKQotICAgICAgICBh
bHQgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICBpZiAoYWx0LmlzTnVsbCgpKQotICAg
ICAgICBhbHQgPSBnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKTsKLSAgICBpZiAoYWx0LmlzRW1wdHko
KSkKLSAgICAgICAgYWx0ID0gaW5wdXRFbGVtZW50QWx0VGV4dCgpOwotCi0gICAgcmV0dXJuIGFs
dDsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNTdWNjZXNzZnVsU3VibWl0QnV0
dG9uKCkgY29uc3QKLXsKLSAgICAvLyBIVE1MIHNwZWMgc2F5cyB0aGF0IGJ1dHRvbnMgbXVzdCBo
YXZlIG5hbWVzCi0gICAgLy8gdG8gYmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsLiBIb3dldmVyLCBv
dGhlciBicm93c2VycwotICAgIC8vIGRvIG5vdCBpbXBvc2UgdGhpcyBjb25zdHJhaW50LiBUaGVy
ZWZvcmUsIHdlIGJlaGF2ZQotICAgIC8vIGRpZmZlcmVudGx5IGFuZCBjYW4gdXNlIGRpZmZlcmVu
dCBidXR0b25zIHRoYW4gdGhlIAotICAgIC8vIGF1dGhvciBpbnRlbmRlZC4gCi0gICAgLy8gV2Fz
OiAobV90eXBlID09IFNVQk1JVCAmJiAhbmFtZSgpLmlzRW1wdHkoKSkKLSAgICByZXR1cm4gIW1f
ZGlzYWJsZWQgJiYgKG1fdHlwZSA9PSBJTUFHRSB8fCBtX3R5cGUgPT0gU1VCTUlUKTsKLX0KLQot
Ym9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6aXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdAotewot
ICAgIHJldHVybiBtX2FjdGl2ZVN1Ym1pdDsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykKLXsKLSAgICBtX2FjdGl2ZVN1Ym1pdCA9
IGZsYWc7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmFwcGVuZEZvcm1EYXRhKEZv
cm1EYXRhTGlzdCAmZW5jb2RpbmcsIGJvb2wgbXVsdGlwYXJ0KQotewotICAgIC8vIGltYWdlIGdl
bmVyYXRlcyBpdHMgb3duIG5hbWVzCi0gICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkgJiYgbV90eXBl
ICE9IElNQUdFKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAg
ICBjYXNlIEhJRERFTjoKLSAgICAgICAgY2FzZSBURVhUOgotICAgICAgICBjYXNlIFNFQVJDSDoK
LSAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgY2FzZSBQQVNTV09SRDoKLSAgICAgICAgICAg
IC8vIGFsd2F5cyBzdWNjZXNzZnVsCi0gICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5h
bWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBjYXNl
IENIRUNLQk9YOgotICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAgaWYgKGNoZWNrZWQo
KSkgewotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLCB2YWx1ZSgp
KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICBjYXNlIFJFU0VUOgot
ICAgICAgICAgICAgLy8gdGhvc2UgYnV0dG9ucyBhcmUgbmV2ZXIgc3VjY2Vzc2Z1bAotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICBp
ZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRh
KG5hbWUoKS5pc0VtcHR5KCkgPyAieCIgOiAobmFtZSgpICsgIi54IiksIGNsaWNrWCgpKTsKLSAg
ICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieSIg
OiAobmFtZSgpICsgIi55IiksIGNsaWNrWSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUo
KS5pc0VtcHR5KCkgJiYgIXZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBl
bmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBj
YXNlIFNVQk1JVDoKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVN1Ym1pdCkgewotICAgICAgICAg
ICAgICAgIERPTVN0cmluZyBlbmNfc3RyID0gdmFsdWVXaXRoRGVmYXVsdCgpOwotICAgICAgICAg
ICAgICAgIGlmICghZW5jX3N0ci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5j
b2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIGVuY19zdHIpOwotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBicmVhazsKLQotICAgICAgICBjYXNlIEZJTEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8v
IGNhbid0IHN1Ym1pdCBmaWxlIG9uIEdFVAotICAgICAgICAgICAgLy8gZG9uJ3Qgc3VibWl0IGlm
IGRpc3BsYXk6IG5vbmUgb3IgZGlzcGxheTogaGlkZGVuCi0gICAgICAgICAgICBpZighbXVsdGlw
YXJ0IHx8ICFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAh
PSBraHRtbDo6VklTSUJMRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAg
ICAgICAgIC8vIGlmIG5vIGZpbGVuYW1lIGF0IGFsbCBpcyBlbnRlcmVkLCByZXR1cm4gc3VjY2Vz
c2Z1bCwgaG93ZXZlciBlbXB0eQotICAgICAgICAgICAgLy8gbnVsbCB3b3VsZCBiZSBtb3JlIGxv
Z2ljYWwgYnV0IG5ldHNjYXBlIHBvc3RzIGFuIGVtcHR5IGZpbGUuIGFyZ2guCi0gICAgICAgICAg
ICBpZiAodmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBl
bmREYXRhKG5hbWUoKSwgUVN0cmluZygiIikpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmNvZGluZy5hcHBlbmRGaWxlKG5hbWUo
KSwgdmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAg
ICBjYXNlIElTSU5ERVg6Ci0gICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwg
dmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpyZXNldCgpCi17Ci0gICAgaWYg
KHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkpCi0gICAgICAgIHNldFZhbHVlKERP
TVN0cmluZygpKTsKLSAgICBzZXRDaGVja2VkKG1fZGVmYXVsdENoZWNrZWQpOwotICAgIG1fdXNl
RGVmYXVsdENoZWNrZWQgPSB0cnVlOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpz
ZXRDaGVja2VkKGJvb2wgX2NoZWNrZWQpCi17Ci0gICAgLy8gV2luSUUgZG9lcyBub3QgYWxsb3cg
dW5uYW1lZCByYWRpbyBidXR0b25zIHRvIGV2ZW4gYmUgY2hlY2tlZC4KLSAgICBpZiAoY2hlY2tl
ZCgpID09IF9jaGVja2VkIHx8IChtX3R5cGUgPT0gUkFESU8gJiYgbmFtZSgpLmlzRW1wdHkoKSkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3R5cGUgPT0gUkFESU8gJiYgX2NoZWNrZWQp
Ci0gICAgICAgIGdldERvY3VtZW50KCktPnJhZGlvQnV0dG9uQ2hlY2tlZCh0aGlzLCBtX2Zvcm0p
OwotCi0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IGZhbHNlOwotICAgIG1fY2hlY2tlZCA9IF9j
aGVja2VkOwotICAgIHNldENoYW5nZWQoKTsKLSAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJl
cigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHRoZW1lKCktPnN0YXRlQ2hh
bmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotICAgIG9uQ2hhbmdlKCk7Ci19Ci0KLXZv
aWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEluZGV0ZXJtaW5hdGUoYm9vbCBfaW5kZXRlcm1p
bmF0ZSkKLXsKLSAgICAvLyBPbmx5IGNoZWNrYm94ZXMgaG9ub3IgaW5kZXRlcm1pbmF0ZS4KLSAg
ICBpZiAobV90eXBlICE9IENIRUNLQk9YIHx8IGluZGV0ZXJtaW5hdGUoKSA9PSBfaW5kZXRlcm1p
bmF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9pbmRldGVybWluYXRlID0gX2luZGV0ZXJt
aW5hdGU7Ci0KLSAgICBzZXRDaGFuZ2VkKCk7Ci0KLSAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5k
ZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHRoZW1lKCktPnN0YXRl
Q2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwotfQotCi12b2lkIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjpjb3B5Tm9uQXR0cmlidXRlUHJvcGVydGllcyhjb25zdCBFbGVtZW50SW1wbCAq
c291cmNlKQotewotICAgIGNvbnN0IEhUTUxJbnB1dEVsZW1lbnRJbXBsICpzb3VyY2VFbGVtID0g
c3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudEltcGwgKj4oc291cmNlKTsKLQotICAg
IG1fdmFsdWUgPSBzb3VyY2VFbGVtLT5tX3ZhbHVlOwotICAgIG1fY2hlY2tlZCA9IHNvdXJjZUVs
ZW0tPm1fY2hlY2tlZDsKLSAgICBtX2luZGV0ZXJtaW5hdGUgPSBzb3VyY2VFbGVtLT5tX2luZGV0
ZXJtaW5hdGU7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6dmFsdWUoKSBj
b25zdAotewotICAgIERPTVN0cmluZyB2YWx1ZSA9IG1fdmFsdWU7Ci0KLSAgICAvLyBJdCdzIGlt
cG9ydGFudCAqbm90KiB0byBmYWxsIGJhY2sgdG8gdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgZmls
ZSBpbnB1dHMsCi0gICAgLy8gYmVjYXVzZSB0aGF0IHdvdWxkIGFsbG93IGEgbWFsaWNpb3VzIHdl
YiBwYWdlIHRvIHVwbG9hZCBmaWxlcyBieSBzZXR0aW5nIHRoZQotICAgIC8vIHZhbHVlIGF0dHJp
YnV0ZSBpbiBtYXJrdXAuCi0gICAgaWYgKHZhbHVlLmlzTnVsbCgpICYmIG1fdHlwZSAhPSBGSUxF
KQotICAgICAgICB2YWx1ZSA9IGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpOwotCi0gICAgLy8gSWYg
bm8gYXR0cmlidXRlIGV4aXN0cywgdGhlbiBqdXN0IHVzZSAib24iIG9yICIiIGJhc2VkIG9mZiB0
aGUgY2hlY2tlZCgpIHN0YXRlIG9mIHRoZSBjb250cm9sLgotICAgIGlmICh2YWx1ZS5pc051bGwo
KSAmJiAobV90eXBlID09IENIRUNLQk9YIHx8IG1fdHlwZSA9PSBSQURJTykpCi0gICAgICAgIHJl
dHVybiBET01TdHJpbmcoY2hlY2tlZCgpID8gIm9uIiA6ICIiKTsKLQotICAgIHJldHVybiB2YWx1
ZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjp2YWx1ZVdpdGhEZWZhdWx0
KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgdiA9IHZhbHVlKCk7Ci0gICAgaWYgKHYuaXNFbXB0
eSgpKSB7Ci0gICAgICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJFU0VU
OgotICAgICAgICAgICAgICAgIHYgPSByZXNldEJ1dHRvbkRlZmF1bHRMYWJlbCgpOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAg
ICAgICB2ID0gc3VibWl0QnV0dG9uRGVmYXVsdExhYmVsKCk7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgY2FzZSBDSEVDS0JP
WDoKLSAgICAgICAgICAgIGNhc2UgRklMRToKLSAgICAgICAgICAgIGNhc2UgSElEREVOOgotICAg
ICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAg
ICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAg
Y2FzZSBSQU5HRToKLSAgICAgICAgICAgIGNhc2UgU0VBUkNIOgotICAgICAgICAgICAgY2FzZSBU
RVhUOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVy
biB2OwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpzZXRWYWx1ZShjb25zdCBET01T
dHJpbmcgJnZhbHVlKQotewotICAgIGlmIChtX3R5cGUgPT0gRklMRSkgcmV0dXJuOwotCi0gICAg
bV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotICAgIGlmIChzdG9yZXNWYWx1ZVNlcGFy
YXRlRnJvbUF0dHJpYnV0ZSgpKSB7Ci0gICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKLSAgICAgICAg
aWYgKG1fcmVuZGVyKQotICAgICAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7
Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRBdHRyaWJ1
dGUodmFsdWVBdHRyLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJ
bXBsOjpzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAg
IG1fdmFsdWUgPSB2YWx1ZTsKLSAgICBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsKLSAg
ICAKLSAgICAvLyBGaXJlIHRoZSAiaW5wdXQiIERPTSBldmVudC4KLSAgICBkaXNwYXRjaEhUTUxF
dmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVu
dEltcGw6OnN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3QKLXsKLSAgICBz
d2l0Y2ggKG1fdHlwZSkgewotICAgICAgICBjYXNlIEJVVFRPTjoKLSAgICAgICAgY2FzZSBDSEVD
S0JPWDoKLSAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICBjYXNlIEhJRERFTjoKLSAgICAgICAg
Y2FzZSBJTUFHRToKLSAgICAgICAgY2FzZSBSQURJTzoKLSAgICAgICAgY2FzZSBSQU5HRToKLSAg
ICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgY2FzZSBTVUJNSVQ6Ci0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgSVNJTkRFWDoKLSAgICAgICAgY2FzZSBQQVNTV09SRDoK
LSAgICAgICAgY2FzZSBTRUFSQ0g6Ci0gICAgICAgIGNhc2UgVEVYVDoKLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQqIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpwcmVEaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsK
LSAgICAvLyBwcmV2ZW50RGVmYXVsdCBvciAicmV0dXJuIGZhbHNlIiBhcmUgdXNlZCB0byByZXZl
cnNlIHRoZSBhdXRvbWF0aWMgY2hlY2tpbmcvc2VsZWN0aW9uIHdlIGRvIGhlcmUuCi0gICAgLy8g
VGhpcyByZXN1bHQgZ2l2ZXMgdXMgZW5vdWdoIGluZm8gdG8gcGVyZm9ybSB0aGUgInVuZG8iIGlu
IHBvc3REaXNwYXRjaCBvZiB0aGUgYWN0aW9uIHdlIHRha2UgaGVyZS4KLSAgICB2b2lkKiByZXN1
bHQgPSAwOyAKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUgPT0gUkFESU8p
ICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tFdmVudCAmJiAK
LSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpLT5idXR0b24oKSA9PSAw
KSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gpIHsKLSAgICAgICAgICAgIC8vIEFz
IGEgd2F5IHRvIHN0b3JlIHRoZSBzdGF0ZSwgd2UgcmV0dXJuIDAgaWYgd2Ugd2VyZSB1bmNoZWNr
ZWQsIDEgaWYgd2Ugd2VyZSBjaGVja2VkLCBhbmQgMiBmb3IKLSAgICAgICAgICAgIC8vIGluZGV0
ZXJtaW5hdGUuCi0gICAgICAgICAgICBpZiAoaW5kZXRlcm1pbmF0ZSgpKSB7Ci0gICAgICAgICAg
ICAgICAgcmVzdWx0ID0gKHZvaWQqKTB4MjsKLSAgICAgICAgICAgICAgICBzZXRJbmRldGVybWlu
YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNo
ZWNrZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKTB4MTsKLSAgICAg
ICAgICAgICAgICBzZXRDaGVja2VkKCFjaGVja2VkKCkpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIHJhZGlvIGJ1dHRvbnMsIHN0b3JlIHRoZSBj
dXJyZW50IHNlbGVjdGVkIHJhZGlvIG9iamVjdC4KLSAgICAgICAgICAgIGlmIChuYW1lKCkuaXNF
bXB0eSgpIHx8IGNoZWNrZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gVW5uYW1l
ZCByYWRpbyBidXR0b25zIGRvbnQgZ2V0IGNoZWNrZWQuIENoZWNrZWQgYnV0dG9ucyBqdXN0IHN0
YXkgY2hlY2tlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IE5lZWQgdG8g
bGVhcm4gdG8gd29yayB3aXRob3V0IGEgZm9ybS4KLQotICAgICAgICAgICAgLy8gV2UgcmVhbGx5
IHdhbnQgcmFkaW8gZ3JvdXBzIHRvIGVuZCB1cCBpbiBzYW5lIHN0YXRlcywgaS5lLiwgdG8gaGF2
ZSBzb21ldGhpbmcgY2hlY2tlZC4KLSAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiBub3RoaW5n
IGlzIGN1cnJlbnRseSBzZWxlY3RlZCwgd2Ugd29uJ3QgYWxsb3cgdGhpcyBhY3Rpb24gdG8gYmUg
InVuZG9uZSIsIHNpbmNlCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHNvbWUgb2JqZWN0IGluIHRo
ZSByYWRpbyBncm91cCB0byBhY3R1YWxseSBnZXQgc2VsZWN0ZWQuCi0gICAgICAgICAgICBIVE1M
SW5wdXRFbGVtZW50SW1wbCogY3VyclJhZGlvID0gZ2V0RG9jdW1lbnQoKS0+Y2hlY2tlZFJhZGlv
QnV0dG9uRm9yR3JvdXAobmFtZSgpLmltcGwoKSwgbV9mb3JtKTsKLSAgICAgICAgICAgIGlmIChj
dXJyUmFkaW8pIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcmFkaW8gYnV0dG9uIHNl
bGVjdGVkIHRoYXQgaXMgbm90IHVzLiAgQ2FjaGUgaXQgaW4gb3VyIHJlc3VsdCBmaWVsZCBhbmQg
cmVmIGl0IHNvCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4ndCBiZSBkZXN0cm95ZWQu
Ci0gICAgICAgICAgICAgICAgY3VyclJhZGlvLT5yZWYoKTsKLSAgICAgICAgICAgICAgICByZXN1
bHQgPSBjdXJyUmFkaW87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRDaGVja2VkKHRy
dWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgSFRN
TElucHV0RWxlbWVudEltcGw6OnBvc3REaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2
dCwgdm9pZCogZGF0YSkKLXsKLSAgICBpZiAoKG1fdHlwZSA9PSBDSEVDS0JPWCB8fCBtX3R5cGUg
PT0gUkFESU8pICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgZXZ0LT50eXBlKCkgPT0gY2xpY2tF
dmVudCAmJiAKLSAgICAgICAgc3RhdGljX2Nhc3Q8TW91c2VFdmVudEltcGwqPihldnQpLT5idXR0
b24oKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3R5cGUgPT0gQ0hFQ0tCT1gpIHsKLSAgICAgICAg
ICAgIC8vIFJldmVyc2UgdGhlIGNoZWNraW5nIHdlIGRpZCBpbiBwcmVEaXNwYXRjaC4KLSAgICAg
ICAgICAgIGlmIChldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSB8fCBldnQtPmRlZmF1bHRIYW5kbGVk
KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSAodm9pZCopMHgyKQotICAgICAgICAg
ICAgICAgICAgICBzZXRJbmRldGVybWluYXRlKHRydWUpOwotICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZChkYXRhKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfSBlbHNlIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1w
bCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KGRhdGEpOwotICAg
ICAgICAgICAgaWYgKGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpIHx8IGV2dC0+ZGVmYXVsdEhhbmRs
ZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHNlbGVjdGVk
IHJhZGlvIGJ1dHRvbiBpZiBwb3NzaWJsZS4KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUg
aXQgaXMgc3RpbGwgYSByYWRpbyBidXR0b24gYW5kIG9ubHkgZG8gdGhlIHJlc3RvcmF0aW9uIGlm
IGl0IHN0aWxsCi0gICAgICAgICAgICAgICAgLy8gYmVsb25ncyB0byBvdXIgZ3JvdXAuCi0gICAg
ICAgICAgICAgICAgaWYgKGlucHV0LT5mb3JtKCkgPT0gZm9ybSgpICYmIGlucHV0LT5pbnB1dFR5
cGUoKSA9PSBSQURJTyAmJiBpbnB1dC0+bmFtZSgpID09IG5hbWUoKSkgewotICAgICAgICAgICAg
ICAgICAgICAvLyBPaywgdGhlIG9sZCByYWRpbyBidXR0b24gaXMgc3RpbGwgaW4gb3VyIGZvcm0g
YW5kIGluIG91ciBncm91cCBhbmQgaXMgc3RpbGwgYSAKLSAgICAgICAgICAgICAgICAgICAgLy8g
cmFkaW8gYnV0dG9uLCBzbyBpdCdzIHNhZmUgdG8gcmVzdG9yZSBzZWxlY3Rpb24gdG8gaXQuCi0g
ICAgICAgICAgICAgICAgICAgIGlucHV0LT5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LT5kZXJlZigpOwotICAgICAg
ICB9Ci0gICAgfQotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRI
YW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotICAgIGlmIChtX3R5cGUgPT0gSU1BR0UgJiYgZXZ0
LT5pc01vdXNlRXZlbnQoKSAmJiBldnQtPnR5cGUoKSA9PSBjbGlja0V2ZW50ICYmIG1fcmVuZGVy
KSB7Ci0gICAgICAgIC8vIHJlY29yZCB0aGUgbW91c2UgcG9zaXRpb24gZm9yIHdoZW4gd2UgZ2V0
IHRoZSBET01BY3RpdmF0ZSBldmVudAotICAgICAgICBNb3VzZUV2ZW50SW1wbCAqbWUgPSBzdGF0
aWNfY2FzdDxNb3VzZUV2ZW50SW1wbCo+KGV2dCk7Ci0gICAgICAgIGludCBvZmZzZXRYLCBvZmZz
ZXRZOwotICAgICAgICBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlvbihvZmZzZXRYLG9mZnNldFkp
OwotICAgICAgICB4UG9zID0gbWUtPmNsaWVudFgoKS1vZmZzZXRYOwotICAgICAgICB5UG9zID0g
bWUtPmNsaWVudFkoKS1vZmZzZXRZOwotCi0JbWUtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAg
fQotCi0gICAgLy8gRE9NQWN0aXZhdGUgZXZlbnRzIGNhdXNlIHRoZSBpbnB1dCB0byBiZSAiYWN0
aXZhdGVkIiAtIGluIHRoZSBjYXNlIG9mIGltYWdlIGFuZCBzdWJtaXQgaW5wdXRzLCB0aGlzIG1l
YW5zCi0gICAgLy8gYWN0dWFsbHkgc3VibWl0dGluZyB0aGUgZm9ybS4gRm9yIHJlc2V0IGlucHV0
cywgdGhlIGZvcm0gaXMgcmVzZXQuIFRoZXNlIGV2ZW50cyBhcmUgc2VudCB3aGVuIHRoZSB1c2Vy
IGNsaWNrcwotICAgIC8vIG9uIHRoZSBlbGVtZW50LCBvciBwcmVzc2VzIGVudGVyIHdoaWxlIGl0
IGlzIHRoZSBhY3RpdmUgZWxlbWVudC4gSmF2YWNzcmlwdCBjb2RlIHdpc2hpbmcgdG8gYWN0aXZh
dGUgdGhlIGVsZW1lbnQKLSAgICAvLyBtdXN0IGRpc3BhdGNoIGEgRE9NQWN0aXZhdGUgZXZlbnQg
LSBhIGNsaWNrIGV2ZW50IHdpbGwgbm90IGRvIHRoZSBqb2IuCi0gICAgaWYgKGV2dC0+dHlwZSgp
ID09IERPTUFjdGl2YXRlRXZlbnQpIHsKLSAgICAgICAgaWYgKG1fdHlwZSA9PSBJTUFHRSB8fCBt
X3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCkgewotICAgICAgICAgICAgaWYgKCFt
X2Zvcm0pCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKG1fdHlwZSA9
PSBSRVNFVCkKLSAgICAgICAgICAgICAgICBtX2Zvcm0tPnJlc2V0KCk7Ci0gICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAg
ICAgICAgaWYgKCFtX2Zvcm0tPnByZXBhcmVTdWJtaXQoKSkgewotICAgICAgICAgICAgICAgICAg
ICB4UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgeVBvcyA9IDA7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0gCi0gICAgfQotCi0gICAgLy8gVXNlIGtleSBwcmVzcyBldmVudCBoZXJl
IHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNlIGV2ZW50cwotICAgIC8vIG9uIGtleSBkb3du
IGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2YgdGhlIGtleSBwcmVzcyBldmVudC4KLSAgICBp
ZiAoZXZ0LT50eXBlKCkgPT0ga2V5cHJlc3NFdmVudCAmJiBldnQtPmlzS2V5Ym9hcmRFdmVudCgp
KSB7Ci0gICAgICAgIGJvb2wgY2xpY2tFbGVtZW50ID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgY2xp
Y2tEZWZhdWx0Rm9ybUJ1dHRvbiA9IGZhbHNlOwotCi0gICAgICAgIERPTVN0cmluZyBrZXkgPSBz
dGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpLT5rZXlJZGVudGlmaWVyKCk7Ci0K
LSAgICAgICAgaWYgKGtleSA9PSAiVSswMDAwMjAiKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1f
dHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgICAgIGNh
c2UgQ0hFQ0tCT1g6Ci0gICAgICAgICAgICAgICAgY2FzZSBGSUxFOgotICAgICAgICAgICAgICAg
IGNhc2UgSU1BR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgICAg
ICBjYXNlIFNVQk1JVDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbW91c2UgY2xp
Y2sgZm9yIHNwYWNlYmFyIGZvciB0aGVzZSB0eXBlcyBvZiBlbGVtZW50cy4KLSAgICAgICAgICAg
ICAgICAgICAgLy8gVGhlIEFwcEtpdCBhbHJlYWR5IGRvZXMgdGhpcyBmb3Igc29tZSwgYnV0IG5v
dCBhbGwsIG9mIHRoZW0uCi0gICAgICAgICAgICAgICAgICAgIGNsaWNrRWxlbWVudCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUkFESU86
Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIHVuc2VsZWN0ZWQgcmFkaW8gaXMgdGFiYmVk
IGludG8gKGJlY2F1c2UgdGhlIGVudGlyZSBncm91cCBoYXMgbm90aGluZwotICAgICAgICAgICAg
ICAgICAgICAvLyBjaGVja2VkLCBvciBiZWNhdXNlIG9mIHNvbWUgZXhwbGljaXQgLmZvY3VzKCkg
Y2FsbCksIHRoZW4gYWxsb3cgc3BhY2UgdG8gY2hlY2sgaXQuCi0gICAgICAgICAgICAgICAgICAg
IGlmICghY2hlY2tlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tFbGVtZW50ID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBI
SURERU46Ci0gICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgotICAgICAgICAgICAgICAgIGNh
c2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgICAgICAg
ICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6Ci0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtl
eSA9PSAiRW50ZXIiKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1fdHlwZSkgewotICAgICAgICAg
ICAgICAgIGNhc2UgQlVUVE9OOgotICAgICAgICAgICAgICAgIGNhc2UgQ0hFQ0tCT1g6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBISURERU46Ci0gICAgICAgICAgICAgICAgY2FzZSBJU0lOREVYOgot
ICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSQU5H
RToKLSAgICAgICAgICAgICAgICBjYXNlIFNFQVJDSDoKLSAgICAgICAgICAgICAgICBjYXNlIFRF
WFQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG1vdXNlIGNsaWNrIG9uIHRoZSBk
ZWZhdWx0IGZvcm0gYnV0dG9uIGZvciBlbnRlciBmb3IgdGhlc2UgdHlwZXMgb2YgZWxlbWVudHMu
Ci0gICAgICAgICAgICAgICAgICAgIGNsaWNrRGVmYXVsdEZvcm1CdXR0b24gPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZJTEU6Ci0gICAg
ICAgICAgICAgICAgY2FzZSBJTUFHRToKLSAgICAgICAgICAgICAgICBjYXNlIFJFU0VUOgotICAg
ICAgICAgICAgICAgIGNhc2UgU1VCTUlUOgotICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0
ZSBtb3VzZSBjbGljayBmb3IgZW50ZXIgZm9yIHRoZXNlIHR5cGVzIG9mIGVsZW1lbnRzLgotICAg
ICAgICAgICAgICAgICAgICBjbGlja0VsZW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJBRElPOgotICAgICAgICAgICAgICAgICAg
ICBicmVhazsgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIGVudGVyIG9uIGEgcmFkaW8gYnV0dG9u
LgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fdHlwZSA9PSBSQURJ
TyAmJiAoa2V5ID09ICJVcCIgfHwga2V5ID09ICJEb3duIiB8fCBrZXkgPT0gIkxlZnQiIHx8IGtl
eSA9PSAiUmlnaHQiKSkgewotICAgICAgICAgICAgLy8gTGVmdCBhbmQgdXAgbWVhbiAicHJldmlv
dXMgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFJpZ2h0IGFuZCBkb3duIG1lYW4gIm5l
eHQgcmFkaW8gYnV0dG9uIi4KLSAgICAgICAgICAgIC8vIFRlc3RlZCBpbiBXaW5JRSwgYW5kIGV2
ZW4gZm9yIFJUTCwgbGVmdCBzdGlsbCBtZWFucyBwcmV2aW91cyByYWRpbyBidXR0b24gKGFuZCBz
byBtb3ZlcwotICAgICAgICAgICAgLy8gdG8gdGhlIHJpZ2h0KS4gIFNlZW1zIHN0cmFuZ2UsIGJ1
dCB3ZSdsbCBtYXRjaCBpdC4KLSAgICAgICAgICAgIGJvb2wgZm9yd2FyZCA9IChrZXkgPT0gIkRv
d24iIHx8IGtleSA9PSAiUmlnaHQiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gV2Ug
Y2FuIG9ubHkgc3RheSB3aXRoaW4gdGhlIGZvcm0ncyBjaGlsZHJlbiBpZiB0aGUgZm9ybSBoYXNu
J3QgYmVlbiBkZW1vdGVkIHRvIGEgbGVhZiBiZWNhdXNlCi0gICAgICAgICAgICAvLyBvZiBtYWxm
b3JtZWQgSFRNTC4KLSAgICAgICAgICAgIE5vZGVJbXBsKiBuID0gdGhpczsKLSAgICAgICAgICAg
IHdoaWxlICgobiA9IChmb3J3YXJkID8gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpIDogbi0+dHJhdmVy
c2VQcmV2aW91c05vZGUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25jZSB3ZSBlbmNvdW50
ZXIgYSBmb3JtIGVsZW1lbnQsIHdlIGtub3cgd2UncmUgdGhyb3VnaC4KLSAgICAgICAgICAgICAg
ICBpZiAobi0+aGFzVGFnTmFtZShmb3JtVGFnKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIG1vcmUg
cmFkaW8gYnV0dG9ucy4KLSAgICAgICAgICAgICAgICBpZiAobi0+aGFzVGFnTmFtZShpbnB1dFRh
ZykpIHsKLSAgICAgICAgICAgICAgICAgICAgSFRNTElucHV0RWxlbWVudEltcGwqIGVsdCA9IHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnRJbXBsKj4obik7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChlbHQtPmZvcm0oKSAhPSBtX2Zvcm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoaW5wdXRUYWcpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogaW5wdXRFbHQgPSBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGlucHV0RWx0LT5pbnB1dFR5cGUoKSA9PSBSQURJTyAmJiBpbnB1dEVsdC0+bmFt
ZSgpID09IG5hbWUoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0LT5p
c0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQtPnNl
dENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQo
KS0+c2V0Rm9jdXNOb2RlKGlucHV0RWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnB1dEVsdC0+Y2xpY2soZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoY2xpY2tFbGVtZW50KSB7Ci0gICAgICAgICAgICBjbGljayhmYWxzZSk7Ci0gICAgICAgICAg
ICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xpY2tEZWZh
dWx0Rm9ybUJ1dHRvbiAmJiBtX2Zvcm0pIHsKLSAgICAgICAgICAgIG1fZm9ybS0+c3VibWl0Q2xp
Y2soKTsKLSAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5k
bGVyKGV2dCk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6OmlzRWRpdGFibGUoKQot
ewotICAgIHJldHVybiAoKG1fdHlwZSA9PSBURVhUKSB8fCAobV90eXBlID09IFBBU1NXT1JEKSB8
fAotICAgICAgICAgICAgKG1fdHlwZSA9PSBTRUFSQ0gpIHx8IChtX3R5cGUgPT0gSVNJTkRFWCkg
fHwgKG1fdHlwZSA9PSBGSUxFKSk7Ci19Ci0KLWJvb2wgSFRNTElucHV0RWxlbWVudEltcGw6Omlz
VVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChh
dHRyLT5uYW1lKCkgPT0gc3JjQXR0cik7Ci19Ci0KLURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50
SW1wbDo6ZGVmYXVsdFZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZh
bHVlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldERlZmF1bHRWYWx1
ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIs
IHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6ZGVmYXVsdENoZWNrZWQo
KSBjb25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKGNoZWNrZWRBdHRyKS5pc051bGwo
KTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1wbDo6c2V0RGVmYXVsdENoZWNrZWQoYm9v
bCBkZWZhdWx0Q2hlY2tlZCkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hlY2tlZEF0dHIsIGRlZmF1
bHRDaGVja2VkID8gIiIgOiAwKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnRJbXBs
OjphY2NlcHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0QXR0cik7
Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFjY2VwdChjb25zdCBET01TdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhY2NlcHRBdHRyLCB2YWx1ZSk7Ci19Ci0K
LURPTVN0cmluZyBIVE1MSW5wdXRFbGVtZW50SW1wbDo6YWNjZXNzS2V5KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnRJbXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRN
TElucHV0RWxlbWVudEltcGw6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldEFsaWdu
KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwg
dmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTElucHV0RWxlbWVudEltcGw6OmFsdCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSW5w
dXRFbGVtZW50SW1wbDo6c2V0QWx0KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGFsdEF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50SW1w
bDo6c2V0TWF4TGVuZ3RoKGludCBfbWF4TGVuZ3RoKQotewotICAgIHNldEF0dHJpYnV0ZShtYXhs
ZW5ndGhBdHRyLCBRU3RyaW5nOjpudW1iZXIoX21heExlbmd0aCkpOwotfQotCi12b2lkIEhUTUxJ
bnB1dEVsZW1lbnRJbXBsOjpzZXRTaXplKHVuc2lnbmVkIF9zaXplKQotewotICAgIHNldEF0dHJp
YnV0ZShzaXplQXR0ciwgUVN0cmluZzo6bnVtYmVyKF9zaXplKSk7Ci19Ci0KLURPTVN0cmluZyBI
VE1MSW5wdXRFbGVtZW50SW1wbDo6c3JjKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0RG9jdW1l
bnQoKS0+Y29tcGxldGVVUkwoZ2V0QXR0cmlidXRlKHNyY0F0dHIpKTsKLX0KLQotdm9pZCBIVE1M
SW5wdXRFbGVtZW50SW1wbDo6c2V0U3JjKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsOjp1c2VNYXAoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodXNl
bWFwQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElucHV0RWxlbWVudEltcGw6OnNldFVzZU1hcChjb25z
dCBET01TdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh1c2VtYXBBdHRyLCB2YWx1
ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTExhYmVsRWxlbWVudEltcGw6OkhU
TUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnRJ
bXBsKGxhYmVsVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxMYWJlbEVsZW1lbnRJbXBsOjp+SFRNTExh
YmVsRWxlbWVudEltcGwoKQotewotfQotCi1ib29sIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjppc0Zv
Y3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEhUTUxMYWJl
bEVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICph
dHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAg
c2V0SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudEltcGw6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1FbGVtZW50SW1wbCAqSFRNTExhYmVs
RWxlbWVudEltcGw6OmZvcm1FbGVtZW50KCkKLXsKLSAgICBET01TdHJpbmcgZm9ybUVsZW1lbnRJ
ZCA9IGdldEF0dHJpYnV0ZShmb3JBdHRyKTsKLSAgICBpZiAoZm9ybUVsZW1lbnRJZC5pc051bGwo
KSkgewotICAgICAgICAvLyBTZWFyY2ggY2hpbGRyZW4gb2YgdGhlIGxhYmVsIGVsZW1lbnQgZm9y
IGEgZm9ybSBlbGVtZW50LgotICAgICAgICBOb2RlSW1wbCAqbm9kZSA9IHRoaXM7Ci0gICAgICAg
IHdoaWxlICgobm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUodGhpcykpKSB7Ci0gICAgICAg
ICAgICBpZiAobm9kZS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgSFRNTEVs
ZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUp
OwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5pc0dlbmVyaWNGb3JtRWxlbWVudCgpKQot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGZvcm1FbGVtZW50SWQuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS0+Z2V0
RWxlbWVudEJ5SWQoZm9ybUVsZW1lbnRJZCk7Ci19Ci0KLXZvaWQgSFRNTExhYmVsRWxlbWVudElt
cGw6OmZvY3VzKCkKLXsKLSAgICBpZiAoRWxlbWVudEltcGwgKmVsZW1lbnQgPSBmb3JtRWxlbWVu
dCgpKQotICAgICAgICBlbGVtZW50LT5mb2N1cygpOwotfQotCi12b2lkIEhUTUxMYWJlbEVsZW1l
bnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQotewotICAgIEVs
ZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCkKLSAg
ICAgICAgZWxlbWVudC0+YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi1I
VE1MRm9ybUVsZW1lbnRJbXBsICpIVE1MTGFiZWxFbGVtZW50SW1wbDo6Zm9ybSgpCi17Ci0gICAg
Zm9yIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKTsgcCAhPSAwOyBwID0gcC0+cGFyZW50Tm9k
ZSgpKSB7Ci0gICAgICAgIGlmIChwLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAgICAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudEltcGwgKj4ocCk7Ci0gICAgfQotICAg
IAotICAgIHJldHVybiAwOwotfQotCi1ET01TdHJpbmcgSFRNTExhYmVsRWxlbWVudEltcGw6OmFj
Y2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRy
KTsKLX0KLQotdm9pZCBIVE1MTGFiZWxFbGVtZW50SW1wbDo6c2V0QWNjZXNzS2V5KGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIsIHZhbHVl
KTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMYWJlbEVsZW1lbnRJbXBsOjpodG1sRm9yKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZvckF0dHIpOwotfQotCi12b2lkIEhUTUxMYWJl
bEVsZW1lbnRJbXBsOjpzZXRIdG1sRm9yKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGZvckF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1IVE1MTGVnZW5kRWxlbWVudEltcGw6OkhUTUxMZWdlbmRFbGVtZW50SW1wbChEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZikKLTogSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwobGVnZW5kVGFnLCBkb2MsIGYpCi17Ci19Ci0KLUhUTUxMZWdlbmRFbGVtZW50SW1wbDo6
fkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpCi17Ci19Ci0KLWJvb2wgSFRNTExlZ2VuZEVsZW1lbnRJ
bXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5k
ZXJPYmplY3QqIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJl
bmEqIGFyZW5hLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEp
IFJlbmRlckxlZ2VuZCh0aGlzKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxMZWdlbmRFbGVtZW50SW1w
bDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJsZWdlbmQiOwotfQotCi1ET01TdHJpbmcg
SFRNTExlZ2VuZEVsZW1lbnRJbXBsOjphY2Nlc3NLZXkoKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJ
bXBsOjpzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUoYWNjZXNza2V5QXR0ciwgdmFsdWUpOwotfQotCi1ET01TdHJpbmcgSFRNTExlZ2VuZEVs
ZW1lbnRJbXBsOjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGln
bkF0dHIpOwotfQotCi12b2lkIEhUTUxMZWdlbmRFbGVtZW50SW1wbDo6c2V0QWxpZ24oY29uc3Qg
RE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7
Ci19Ci0KLUVsZW1lbnRJbXBsICpIVE1MTGVnZW5kRWxlbWVudEltcGw6OmZvcm1FbGVtZW50KCkK
LXsKLSAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgZmllbGRzZXQgYmVsb25naW5nIHRvIHRoaXMg
bGVnZW5kLgotICAgIE5vZGVJbXBsICpmaWVsZHNldCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGls
ZSAoZmllbGRzZXQgJiYgIWZpZWxkc2V0LT5oYXNUYWdOYW1lKGZpZWxkc2V0VGFnKSkKLSAgICAg
ICAgZmllbGRzZXQgPSBmaWVsZHNldC0+cGFyZW50Tm9kZSgpOwotICAgIGlmICghZmllbGRzZXQp
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gRmluZCBmaXJzdCBmb3JtIGVsZW1lbnQgaW5z
aWRlIHRoZSBmaWVsZHNldC4KLSAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGNhcmUgYWJvdXQgdGFi
aW5kZXg/Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBmaWVsZHNldDsKLSAgICB3aGlsZSAoKG5vZGUg
PSBub2RlLT50cmF2ZXJzZU5leHROb2RlKGZpZWxkc2V0KSkpIHsKLSAgICAgICAgaWYgKG5vZGUt
PmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplbGVtZW50
ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG5vZGUpOwotICAgICAgICAgICAgaWYg
KCFlbGVtZW50LT5oYXNMb2NhbE5hbWUobGVnZW5kVGFnKSAmJiBlbGVtZW50LT5pc0dlbmVyaWNG
b3JtRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTExlZ2VuZEVsZW1lbnRJbXBs
Ojpmb2N1cygpCi17Ci0gICAgaWYgKEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQo
KSkKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLX0KLQotdm9pZCBIVE1MTGVnZW5kRWxlbWVu
dEltcGw6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCi17Ci0gICAgaWYg
KEVsZW1lbnRJbXBsICplbGVtZW50ID0gZm9ybUVsZW1lbnQoKSkKLSAgICAgICAgZWxlbWVudC0+
YWNjZXNzS2V5QWN0aW9uKHNlbmRUb0FueUVsZW1lbnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNlbGVjdEVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwoc2VsZWN0VGFnLCBkb2MsIGYpLCBtX29wdGlvbnMoMCkKLXsKLSAgICBp
bml0KCk7Ci19Ci0KLUhUTUxTZWxlY3RFbGVtZW50SW1wbDo6SFRNTFNlbGVjdEVsZW1lbnRJbXBs
KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwodGFnTmFt
ZSwgZG9jLCBmKSwgbV9vcHRpb25zKDApCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6aW5pdCgpCi17Ci0gICAgbV9vcHRpb25zID0gMDsKLSAgICBtX211
bHRpcGxlID0gZmFsc2U7Ci0gICAgbV9yZWNhbGNMaXN0SXRlbXMgPSBmYWxzZTsKLSAgICAvLyAw
IG1lYW5zIGludmFsaWQgKGkuZS4gbm90IHNldCkKLSAgICBtX3NpemUgPSAwOwotICAgIG1fbWlu
d2lkdGggPSAwOwotfQotCi1IVE1MU2VsZWN0RWxlbWVudEltcGw6On5IVE1MU2VsZWN0RWxlbWVu
dEltcGwoKQotewotICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJlZ2lz
dGVyTWFpbnRhaW5zU3RhdGUodGhpcyk7Ci0gICAgaWYgKG1fb3B0aW9ucykgewotICAgICAgICBt
X29wdGlvbnMtPmRldGFjaCgpOwotICAgICAgICBtX29wdGlvbnMtPmRlcmVmKCk7Ci0gICAgfQot
fQotCi1ib29sIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6Y2hlY2tEVEQoY29uc3QgTm9kZUltcGwq
IG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpIHx8IG5ld0No
aWxkLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUob3B0Z3Jv
dXBUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGhyVGFnKSB8fAotICAgICAgICAgICBuZXdD
aGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAgICBpZiAoaGFzQ2hhbmdl
ZENoaWxkKCkgJiYgbV9yZW5kZXIpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8a2h0bWw6OlJlbmRl
clNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7Ci0gICAgfQotCi0g
ICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnJlY2FsY1N0eWxlKCBjaCApOwotfQotCi0K
LURPTVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnR5cGUoKSBjb25zdAotewotICAgIHJl
dHVybiAobV9tdWx0aXBsZSA/ICJzZWxlY3QtbXVsdGlwbGUiIDogInNlbGVjdC1vbmUiKTsKLX0K
LQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0Ci17Ci0g
ICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG9wdGlvbiBzZWxlY3RlZAotICAg
IHVpbnQgbyA9IDA7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7
Ci0gICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRl
bXNbaV0pLT5zZWxlY3RlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICAg
ICAgbysrOwotICAgICAgICB9Ci0gICAgfQotICAgIFFfQVNTRVJUKG1fbXVsdGlwbGUpOwotICAg
IHJldHVybiAtMTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNldFNlbGVjdGVk
SW5kZXgoIGludCAgaW5kZXggKQotewotICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25z
IGFuZCBzZWxlY3Qgb25seSB0aGUgbmV3IG9uZQotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudElt
cGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBsaXN0SW5kZXg7Ci0gICAgZm9yIChs
aXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBpbnQoaXRlbXMuc2l6ZSgpKTsgbGlzdEluZGV4Kysp
IHsKLSAgICAgICAgaWYgKGl0ZW1zW2xpc3RJbmRleF0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcp
KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNb
bGlzdEluZGV4XSktPnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgbGlzdEluZGV4ID0g
b3B0aW9uVG9MaXN0SW5kZXgoaW5kZXgpOwotICAgIGlmIChsaXN0SW5kZXggPj0gMCkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbbGlzdEluZGV4XSkt
PnNldFNlbGVjdGVkKHRydWUpOwotCi0gICAgc2V0Q2hhbmdlZCh0cnVlKTsKLX0KLQotaW50IEhU
TUxTZWxlY3RFbGVtZW50SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICBpbnQgbGVuID0gMDsK
LSAgICB1aW50IGk7Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAg
ICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBs
ZW4rKzsKLSAgICB9Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmFkZCggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBIVE1MRWxlbWVudEltcGwgKmJl
Zm9yZSwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBSZWZQdHI8SFRNTEVsZW1lbnRJbXBs
PiBwcm90ZWN0TmV3Q2hpbGQoZWxlbWVudCk7IC8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBy
ZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICBpZiAoIWVsZW1lbnQg
fHwgIShlbGVtZW50LT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSB8fCBlbGVtZW50LT5oYXNMb2Nh
bE5hbWUoaHJUYWcpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW5zZXJ0QmVmb3JlKGVsZW1l
bnQsIGJlZm9yZSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCFleGNlcHRpb25jb2RlKQotICAg
ICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudElt
cGw6OnJlbW92ZSggaW50IGluZGV4ICkKLXsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0g
ICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGluZGV4KTsKLQotICAgIFFNZW1B
cnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmKGxpc3RJ
bmRleCA8IDAgfHwgaW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkpCi0gICAgICAgIHJldHVybjsg
Ly8gIyMjIHdoYXQgc2hvdWxkIHdlIGRvID8gcmVtb3ZlIHRoZSBsYXN0IGl0ZW0/Ci0KLSAgICBO
b2RlSW1wbCAqaXRlbSA9IGl0ZW1zW2xpc3RJbmRleF07Ci0gICAgaXRlbS0+cmVmKCk7Ci0gICAg
cmVtb3ZlQ2hpbGQoaXRlbSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaXRlbS0+ZGVyZWYoKTsKLSAg
ICBpZiggIWV4Y2VwdGlvbmNvZGUgKQotICAgICAgICBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKLX0K
LQotRE9NU3RyaW5nIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6dmFsdWUoKQotewotICAgIHVpbnQg
aTsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsK
LSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0
ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudEltcGwqPihpdGVtc1tpXSktPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT52YWx1ZSgpOwot
ICAgIH0KLSAgICByZXR1cm4gRE9NU3RyaW5nKCIiKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxl
bWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgaWYgKHZh
bHVlLmlzTnVsbCgpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gZmluZCB0aGUgb3B0aW9uIHdp
dGggdmFsdWUoKSBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVyCi0gICAgLy8gYW5kIG1ha2Ug
aXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwq
PiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVt
cy5zaXplKCk7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9u
VGFnKSAmJiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSktPnZh
bHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVt
ZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLX0KLQotUVN0cmluZyBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnN0YXRl
KCkKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMo
KTsKLQotICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKLQotICAgIFFDaGFyIHN0YXRlQ2hhcnNb
bF07Ci0gICAgCi0gICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykKLSAgICAgICAgaWYoaXRl
bXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgIHN0YXRlQ2hh
cnNbaV0gPSAnWCc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlQ2hhcnNbaV0gPSAn
Lic7Ci0gICAgUVN0cmluZyBzdGF0ZShzdGF0ZUNoYXJzLCBsKTsKLQotICAgIHJldHVybiBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6c3RhdGUoKSArIHN0YXRlOwotfQotCi12b2lkIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZfc3RhdGVzKQotewot
ICAgIFFTdHJpbmcgX3N0YXRlID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmZpbmRNYXRj
aGluZ1N0YXRlKF9zdGF0ZXMpOwotICAgIGlmIChfc3RhdGUuaXNOdWxsKCkpIHJldHVybjsKLQot
ICAgIHJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAgUVN0cmluZyBzdGF0ZSA9IF9zdGF0ZTsKLSAg
ICBpZighc3RhdGUuaXNFbXB0eSgpICYmICFzdGF0ZS5jb250YWlucygnWCcpICYmICFtX211bHRp
cGxlKSB7Ci0gICAgICAgIHFXYXJuaW5nKCJzaG91bGQgbm90IGhhcHBlbiBpbiByZXN0b3JlU3Rh
dGUhIik7Ci0gICAgICAgIC8vIEtXUVN0cmluZyBkb2Vzbid0IHN1cHBvcnQgdGhpcyBvcGVyYXRp
b24uIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhbnl3YXkuCi0gICAgICAgIC8vc3RhdGVbMF0gPSAn
WCc7Ci0gICAgfQotCi0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0KLSAgICBpbnQgbCA9IGl0ZW1zLmNvdW50KCk7Ci0gICAgZm9yKGludCBpID0g
MDsgaSA8IGw7IGkrKykgewotICAgICAgICBpZihpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCogb2UgPSBzdGF0aWNf
Y2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihpdGVtc1tpXSk7Ci0gICAgICAgICAgICBvZS0+
c2V0U2VsZWN0ZWQoc3RhdGVbaV0gPT0gJ1gnKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXRD
aGFuZ2VkKHRydWUpOwotfQotCi1Ob2RlSW1wbCAqSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjppbnNl
cnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZl
eGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdDaGlsZCxyZWZDaGlsZCwgZXhjZXB0aW9uY29k
ZSApOwotICAgIGlmICghZXhjZXB0aW9uY29kZSkKLSAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1z
KCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwgKkhUTUxTZWxlY3RFbGVtZW50
SW1wbDo6cmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZXBsYWNlQ2hpbGQobmV3Q2hpbGQsb2xkQ2hpbGQsIGV4
Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2Fs
Y0xpc3RJdGVtcygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2Vs
ZWN0RWxlbWVudEltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKQotewotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlm
KCAhZXhjZXB0aW9uY29kZSApCi0gICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MU2VsZWN0RWxlbWVudEltcGw6OmFwcGVu
ZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXBwZW5kQ2hp
bGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmKCAhZXhjZXB0aW9uY29kZSApCi0g
ICAgICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQotTm9kZUltcGwqIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6YWRk
Q2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwot
ICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YWRkQ2hpbGQobmV3Q2hpbGQp
OwotfQotCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNp
emVBdHRyKSB7Ci0gICAgICAgIG1fc2l6ZSA9IGtNYXgoYXR0ci0+dmFsdWUoKS50b0ludCgpLCAx
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAg
bV9taW53aWR0aCA9IGtNYXgoIGF0dHItPnZhbHVlKCkudG9JbnQoKSwgMCApOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG11bHRpcGxlQXR0cikgewotICAgICAgICBtX211bHRpcGxl
ID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNj
ZXNza2V5QXR0cikgewotICAgICAgICAvLyBGSVhNRTogaWdub3JlIGZvciB0aGUgbW9tZW50Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgc2V0
SFRNTEV2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25ibHVyQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihi
bHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uY2hhbmdl
QXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwgYXR0cik7
Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MU2VsZWN0RWxlbWVu
dEltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0
eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTZWxlY3QodGhpcyk7Ci19Ci0K
LWJvb2wgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3Qm
IGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOwot
ICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IGxpc3RJdGVtcygpOwotCi0g
ICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAg
ICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAg
ICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGlmIChvcHRpb24tPnNlbGVjdGVk
KCkpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwg
b3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICMjIyB0aGlzIGNhc2Ugc2hv
dWxkIG5vdCBoYXBwZW4uIG1ha2Ugc3VyZSB0aGF0IHdlIHNlbGVjdCB0aGUgZmlyc3Qgb3B0aW9u
Ci0gICAgLy8gaW4gYW55IGNhc2UuIG90aGVyd2lzZSB3ZSBoYXZlIG5vIGNvbnNpc3RlbmN5IHdp
dGggdGhlIERPTSBpbnRlcmZhY2UuIEZJWE1FIQotICAgIC8vIHdlIHJldHVybiB0aGUgZmlyc3Qg
b25lIGlmIGl0IHdhcyBhIGNvbWJvYm94IHNlbGVjdAotICAgIGlmICghc3VjY2Vzc2Z1bCAmJiAh
bV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSAmJiBpdGVtcy5zaXplKCkgJiYKLSAgICAgICAgKGl0
ZW1zWzBdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkpIHsKLSAgICAgICAgSFRNTE9wdGlvbkVs
ZW1lbnRJbXBsICpvcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihp
dGVtc1swXSk7Ci0gICAgICAgIGlmIChvcHRpb24tPnZhbHVlKCkuaXNOdWxsKCkpCi0gICAgICAg
ICAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT50ZXh0KCkucXN0
cmluZygpLnN0cmlwV2hpdGVTcGFjZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZW5j
b2RlZF92YWx1ZXMuYXBwZW5kRGF0YShuYW1lKCksIG9wdGlvbi0+dmFsdWUoKSk7Ci0gICAgICAg
IHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzZnVsOwotfQot
Ci1pbnQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9u
SW5kZXgpIGNvbnN0Ci17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0g
bGlzdEl0ZW1zKCk7Ci0gICAgaWYgKG9wdGlvbkluZGV4IDwgMCB8fCBvcHRpb25JbmRleCA+PSBp
bnQoaXRlbXMuc2l6ZSgpKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IGxpc3RJbmRl
eCA9IDA7Ci0gICAgaW50IG9wdGlvbkluZGV4MiA9IDA7Ci0gICAgZm9yICg7Ci0gICAgICAgICBv
cHRpb25JbmRleDIgPCBpbnQoaXRlbXMuc2l6ZSgpKSAmJiBvcHRpb25JbmRleDIgPD0gb3B0aW9u
SW5kZXg7Ci0gICAgICAgICBsaXN0SW5kZXgrKykgeyAvLyBub3QgYSB0eXBvIQotICAgICAgICBp
ZiAoaXRlbXNbbGlzdEluZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAg
ICBvcHRpb25JbmRleDIrKzsKLSAgICB9Ci0gICAgbGlzdEluZGV4LS07Ci0gICAgcmV0dXJuIGxp
c3RJbmRleDsKLX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6bGlzdFRvT3B0aW9uSW5k
ZXgoaW50IGxpc3RJbmRleCkgY29uc3QKLXsKLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBs
Kj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpZiAobGlzdEluZGV4IDwgMCB8fCBsaXN0SW5k
ZXggPj0gaW50KGl0ZW1zLnNpemUoKSkgfHwKLSAgICAgICAgIWl0ZW1zW2xpc3RJbmRleF0tPmhh
c0xvY2FsTmFtZShvcHRpb25UYWcpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpbnQgb3B0
aW9uSW5kZXggPSAwOyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9uIG5vdCBjb3VudGluZyBPUFRH
Uk9VUCBlbnRyaWVzIHRoYXQgbWF5IGJlIGluIGxpc3QKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkg
PSAwOyBpIDwgbGlzdEluZGV4OyBpKyspCi0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxO
YW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBvcHRpb25JbmRleCsrOwotICAgIHJldHVybiBv
cHRpb25JbmRleDsKLX0KLQotLy8gRklYTUUgNDE5Nzk5NzogdGhpcyBtZXRob2QgaXMgdXNlZCBi
eSB0aGUgcHVibGljIEFQSSAtW0RPTUhUTUxTZWxlY3RFbGVtZW50IG9wdGlvbnNdLCBidXQgYWx3
YXlzIHJldHVybnMKLS8vIGFuIGVtcHR5IGxpc3QuCi1IVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBs
ICpIVE1MU2VsZWN0RWxlbWVudEltcGw6Om9wdGlvbnMoKQotewotICAgIGlmICghbV9vcHRpb25z
KSB7Ci0gICAgICAgIG1fb3B0aW9ucyA9IG5ldyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsKHRo
aXMpOwotICAgICAgICBtX29wdGlvbnMtPnJlZigpOwotICAgIH0KLSAgICByZXR1cm4gbV9vcHRp
b25zOwotfQotCi0vLyBGSVhNRTogRGVsZXRlIG9uY2UgdGhlIGFib3ZlIGZ1bmN0aW9uIGlzIHdv
cmtpbmcgd2VsbCBlbm91Z2ggdG8gdXNlIGZvciByZWFsLgotUmVmUHRyPEhUTUxDb2xsZWN0aW9u
SW1wbD4gSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpvcHRpb25zSFRNTENvbGxlY3Rpb24oKQotewot
ICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25J
bXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6U0VMRUNUX09QVElPTlMpKTsKLX0KLQotdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnJlY2FsY0xpc3RJdGVtcygpCi17Ci0gICAgTm9kZUlt
cGwqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7Ci0gICAgbV9saXN0SXRlbXMucmVzaXplKDApOwot
ICAgIEhUTUxPcHRpb25FbGVtZW50SW1wbCogZm91bmRTZWxlY3RlZCA9IDA7Ci0gICAgd2hpbGUo
Y3VycmVudCkgewotICAgICAgICBpZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykg
JiYgY3VycmVudC0+Zmlyc3RDaGlsZCgpKSB7Ci0gICAgICAgICAgICAvLyAjIyMgd2hhdCBpZiBv
cHRncm91cCBjb250YWlucyBqdXN0IGNvbW1lbnRzPyBkb24ndCB3YW50IG9uZSBvZiBubyBvcHRp
b25zIGluIGl0Li4uCi0gICAgICAgICAgICBtX2xpc3RJdGVtcy5yZXNpemUobV9saXN0SXRlbXMu
c2l6ZSgpKzEpOwotICAgICAgICAgICAgbV9saXN0SXRlbXNbbV9saXN0SXRlbXMuc2l6ZSgpLTFd
ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBj
dXJyZW50ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChj
dXJyZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1z
LnJlc2l6ZShtX2xpc3RJdGVtcy5zaXplKCkrMSk7Ci0gICAgICAgICAgICBtX2xpc3RJdGVtc1tt
X2xpc3RJdGVtcy5zaXplKCktMV0gPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudEltcGwqPihjdXJy
ZW50KTsKLSAgICAgICAgICAgIGlmICghZm91bmRTZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSAmJiBt
X3NpemUgPD0gMSkgewotICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihjdXJyZW50KTsKLSAgICAgICAgICAgICAgICBmb3Vu
ZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGVsc2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgIW1fbXVsdGlwbGUgJiYgc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnRJbXBsKj4oY3VycmVudCktPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAg
ICAgICBmb3VuZFNlbGVjdGVkLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
Zm91bmRTZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGN1cnJl
bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50LT5oYXNU
YWdOYW1lKGhyVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRlbXMucmVzaXplKG1fbGlzdEl0
ZW1zLnNpemUoKSsxKTsKLSAgICAgICAgICAgIG1fbGlzdEl0ZW1zW21fbGlzdEl0ZW1zLnNpemUo
KS0xXSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCo+KGN1cnJlbnQpOwotICAgICAgICB9
Ci0gICAgICAgIE5vZGVJbXBsICpwYXJlbnQgPSBjdXJyZW50LT5wYXJlbnROb2RlKCk7Ci0gICAg
ICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOwotICAgICAgICBpZiAoIWN1cnJl
bnQpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gdGhpcykKLSAgICAgICAgICAgICAgICBj
dXJyZW50ID0gcGFyZW50LT5uZXh0U2libGluZygpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1f
cmVjYWxjTGlzdEl0ZW1zID0gZmFsc2U7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIHNldFJlY2FsY0xpc3RJdGVtcygpOwotCi0gICAg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpOwotfQotCi12b2lk
IEhUTUxTZWxlY3RFbGVtZW50SW1wbDo6c2V0UmVjYWxjTGlzdEl0ZW1zKCkKLXsKLSAgICBtX3Jl
Y2FsY0xpc3RJdGVtcyA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNf
Y2FzdDxraHRtbDo6UmVuZGVyU2VsZWN0Kj4obV9yZW5kZXIpLT5zZXRPcHRpb25zQ2hhbmdlZCh0
cnVlKTsKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
OjpyZXNldCgpCi17Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0gICAgdWludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7
Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwgKm9wdGlvbiA9IHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50SW1wbCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGJvb2wgc2Vs
ZWN0ZWQgPSAoIW9wdGlvbi0+Z2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxsKCkpOwot
ICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZChzZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgaWYgKCBtX3JlbmRlciApCi0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNlbGVj
dCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uQ2hhbmdlZCh0cnVlKTsKLSAgICBzZXRDaGFuZ2Vk
KCB0cnVlICk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpub3RpZnlPcHRpb25T
ZWxlY3RlZChIVE1MT3B0aW9uRWxlbWVudEltcGwgKnNlbGVjdGVkT3B0aW9uLCBib29sIHNlbGVj
dGVkKQotewotICAgIGlmIChzZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSkgewotICAgICAgICAvLyBk
ZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucwotICAgICAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJ
bXBsKj4gaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICAgICAgdWludCBpOwotICAgICAgICBmb3Ig
KGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tp
XS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
SFRNTE9wdGlvbkVsZW1lbnRJbXBsKj4oaXRlbXNbaV0pLT5tX3NlbGVjdGVkID0gKGl0ZW1zW2ld
ID09IHNlbGVjdGVkT3B0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9yZW5kZXIp
Ci0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNlbGVjdCo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0
aW9uQ2hhbmdlZCh0cnVlKTsKLQotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQot
ewotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRl
ZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5k
aW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGtleXBy
ZXNzRXZlbnQpIHsKLSAgICAKLSAgICAgICAgaWYgKCFtX2Zvcm0gfHwgIW1fcmVuZGVyIHx8ICFl
dnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAg
ICAgICAgRE9NU3RyaW5nIGtleSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnRJbXBsICo+KGV2
dCktPmtleUlkZW50aWZpZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChrZXkgPT0gIkVudGVy
IikgewotICAgICAgICAgICAgbV9mb3JtLT5zdWJtaXRDbGljaygpOwotICAgICAgICAgICAgZXZ0
LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLXZvaWQgSFRN
TFNlbGVjdEVsZW1lbnRJbXBsOjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50
KQotewotICAgIGZvY3VzKCk7Ci19Ci0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnRJbXBsOjpzZXRN
dWx0aXBsZShib29sIG11bHRpcGxlKQotewotICAgIHNldEF0dHJpYnV0ZShtdWx0aXBsZUF0dHIs
IG11bHRpcGxlID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudEltcGw6OnNl
dFNpemUoaW50IHNpemUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNpemVBdHRyLCBRU3RyaW5nOjpu
dW1iZXIoc2l6ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxLZXlnZW5FbGVt
ZW50SW1wbDo6SFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCogZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsKiBmKQotICAgIDogSFRNTFNlbGVjdEVsZW1lbnRJbXBsKGtleWdlblRhZywg
ZG9jLCBmKQotewotICAgIFFTdHJpbmdMaXN0IGtleXMgPSBLU1NMS2V5R2VuOjpzdXBwb3J0ZWRL
ZXlTaXplcygpOwotICAgIGZvciAoUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGkgPSBrZXlzLmJlZ2lu
KCk7IGkgIT0ga2V5cy5lbmQoKTsgKytpKSB7Ci0gICAgICAgIEhUTUxPcHRpb25FbGVtZW50SW1w
bCogbyA9IG5ldyBIVE1MT3B0aW9uRWxlbWVudEltcGwoZG9jLCBmb3JtKCkpOwotICAgICAgICBh
ZGRDaGlsZChvKTsKLSAgICAgICAgby0+YWRkQ2hpbGQobmV3IFRleHRJbXBsKGRvYywgRE9NU3Ry
aW5nKCppKSkpOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIEhUTUxLZXlnZW5FbGVtZW50SW1wbDo6
dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJrZXlnZW4iOwotfQotCi12b2lkIEhUTUxLZXln
ZW5FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCog
YXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGNoYWxsZW5nZUF0dHIpCi0gICAgICAg
IG1fY2hhbGxlbmdlID0gYXR0ci0+dmFsdWUoKTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0ga2V5dHlwZUF0dHIpCi0gICAgICAgIG1fa2V5VHlwZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAg
ZWxzZQotICAgICAgICAvLyBza2lwIEhUTUxTZWxlY3RFbGVtZW50SW1wbCBwYXJzaW5nIQotICAg
ICAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0
cik7Ci19Ci0KLWJvb2wgSFRNTEtleWdlbkVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShGb3Jt
RGF0YUxpc3QmIGVuY29kZWRfdmFsdWVzLCBib29sKQotewotICAgIC8vIE9ubHkgUlNBIGlzIHN1
cHBvcnRlZCBhdCB0aGlzIHRpbWUuCi0gICAgaWYgKCFtX2tleVR5cGUuaXNOdWxsKCkgJiYgIWVx
dWFsSWdub3JpbmdDYXNlKG1fa2V5VHlwZSwgInJzYSIpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgUVN0cmluZyB2YWx1ZSA9IEtTU0xLZXlHZW46OnNpZ25lZFB1YmxpY0tleUFuZENoYWxs
ZW5nZVN0cmluZyhzZWxlY3RlZEluZGV4KCksIG1fY2hhbGxlbmdlLnFzdHJpbmcoKSwgZ2V0RG9j
dW1lbnQoKS0+ZnJhbWUoKS0+YmFzZVVSTCgpKTsKLSAgICBpZiAodmFsdWUuaXNOdWxsKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbmNvZGVkX3ZhbHVlcy5hcHBlbmREYXRhKG5hbWUo
KSwgdmFsdWUudXRmOCgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1IVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6SFRNTE9wdEdyb3VwRWxlbWVudEltcGwo
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYpCi0gICAgOiBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbChvcHRncm91cFRhZywgZG9jLCBmKQotewotfQotCi1IVE1MT3B0
R3JvdXBFbGVtZW50SW1wbDo6fkhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKCkKLXsKLX0KLQotYm9v
bCBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotRE9NU3RyaW5nIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjp0eXBl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gIm9wdGdyb3VwIjsKLX0KLQotTm9kZUltcGwgKkhUTUxP
cHRHcm91cEVsZW1lbnRJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5v
ZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBOb2RlSW1wbCAq
cmVzdWx0ID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6Omluc2VydEJlZm9yZShuZXdDaGls
ZCxyZWZDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCAhZXhjZXB0aW9uY29kZSApCi0g
ICAgICAgIHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1O
b2RlSW1wbCAqSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBs
ICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewot
ICAgIE5vZGVJbXBsICpyZXN1bHQgPSBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6cmVwbGFj
ZUNoaWxkKG5ld0NoaWxkLG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZighZXhjZXB0
aW9uY29kZSkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLU5vZGVJbXBsICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6cmVtb3ZlQ2hpbGQg
KCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUlt
cGwgKnJlc3VsdCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpyZW1vdmVDaGlsZChvbGRD
aGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAg
cmVjYWxjU2VsZWN0T3B0aW9ucygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBs
ICpIVE1MT3B0R3JvdXBFbGVtZW50SW1wbDo6YXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgTm9kZUltcGwgKnJlc3VsdCA9IEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjphcHBlbmRDaGlsZChuZXdDaGlsZCwgZXhjZXB0aW9uY29k
ZSk7Ci0gICAgaWYoICFleGNlcHRpb25jb2RlICkKLSAgICAgICAgcmVjYWxjU2VsZWN0T3B0aW9u
cygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLU5vZGVJbXBsKiBIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwqIG5ld0NoaWxkKQotewotICAgIHJlY2FsY1NlbGVj
dE9wdGlvbnMoKTsKLQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YWRk
Q2hpbGQobmV3Q2hpbGQpOwotfQotCi12b2lkIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsOjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKQotewotICAgIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLSAgICBy
ZWNhbGNTZWxlY3RPcHRpb25zKCk7Ci19Ci0KLXZvaWQgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6
OnJlY2FsY1NlbGVjdE9wdGlvbnMoKQotewotICAgIE5vZGVJbXBsICpzZWxlY3QgPSBwYXJlbnRO
b2RlKCk7Ci0gICAgd2hpbGUgKHNlbGVjdCAmJiAhc2VsZWN0LT5oYXNUYWdOYW1lKHNlbGVjdFRh
ZykpCi0gICAgICAgIHNlbGVjdCA9IHNlbGVjdC0+cGFyZW50Tm9kZSgpOwotICAgIGlmIChzZWxl
Y3QpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHNlbGVjdCkt
PnNldFJlY2FsY0xpc3RJdGVtcygpOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdEdyb3VwRWxlbWVu
dEltcGw6OmxhYmVsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxhYmVsQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTE9wdEdyb3VwRWxlbWVudEltcGw6OnNldExhYmVsKGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxhYmVsQXR0ciwgdmFsdWUpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxPcHRpb25FbGVtZW50SW1wbDo6SFRNTE9w
dGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
KQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwob3B0aW9uVGFnLCBkb2MsIGYpCi17
Ci0gICAgbV9zZWxlY3RlZCA9IGZhbHNlOwotfQotCi1ib29sIEhUTUxPcHRpb25FbGVtZW50SW1w
bDo6aXNGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRE9NU3Ry
aW5nIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJv
cHRpb24iOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjp0ZXh0KCkgY29u
c3QKLXsKLSAgICBET01TdHJpbmcgdGV4dDsKLQotICAgIC8vIFdpbklFIGRvZXMgbm90IHVzZSB0
aGUgbGFiZWwgYXR0cmlidXRlLCBzbyBhcyBhIHF1aXJrLCB3ZSBpZ25vcmUgaXQuCi0gICAgaWYg
KGdldERvY3VtZW50KCkgJiYgIWdldERvY3VtZW50KCktPmluQ29tcGF0TW9kZSgpKSB7Ci0gICAg
ICAgIERPTVN0cmluZyB0ZXh0ID0gZ2V0QXR0cmlidXRlKGxhYmVsQXR0cik7Ci0gICAgICAgIGlm
ICghdGV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAg
ICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXMtPmZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAobikg
ewotICAgICAgICBpZiAobi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUgfHwgbi0+bm9k
ZVR5cGUoKSA9PSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREUpCi0gICAgICAgICAgICB0ZXh0ICs9
IG4tPm5vZGVWYWx1ZSgpOwotICAgICAgICAvLyBza2lwIHNjcmlwdCBjb250ZW50Ci0gICAgICAg
IGlmIChuLT5pc0VsZW1lbnROb2RlKCkgJiYgbi0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNjcmlw
dFRhZykpCi0gICAgICAgICAgICBuID0gbi0+dHJhdmVyc2VOZXh0U2libGluZyh0aGlzKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUodGhpcyk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHRleHQ7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBs
OjpzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmdGV4dCwgaW50ICZleGNlcHRpb24pCi17Ci0gICAg
Ly8gSGFuZGxlIHRoZSBjb21tb24gc3BlY2lhbCBjYXNlIHdoZXJlIHRoZXJlJ3MgZXhhY3RseSAx
IGNoaWxkIG5vZGUsIGFuZCBpdCdzIGEgdGV4dCBub2RlLgotICAgIE5vZGVJbXBsICpjaGlsZCA9
IGZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzVGV4dE5vZGUoKSAmJiAh
Y2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8VGV4dEltcGwgKj4o
Y2hpbGQpLT5zZXREYXRhKHRleHQsIGV4Y2VwdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICByZW1vdmVDaGlsZHJlbigpOwotICAgIGFwcGVuZENoaWxkKG5ldyBUZXh0SW1wbChn
ZXREb2N1bWVudCgpLCB0ZXh0KSwgZXhjZXB0aW9uKTsKLX0KLQotaW50IEhUTUxPcHRpb25FbGVt
ZW50SW1wbDo6aW5kZXgoKSBjb25zdAotewotICAgIC8vIExldCdzIGRvIHRoaXMgZHluYW1pY2Fs
bHkuIE1pZ2h0IGJlIGEgYml0IHNsb3csIGJ1dCB3ZSdyZSBzdXJlCi0gICAgLy8gd2Ugd29uJ3Qg
Zm9yZ2V0IHRvIHVwZGF0ZSBhIG1lbWJlciB2YXJpYWJsZSBpbiBzb21lIGNhc2VzLi4uCi0gICAg
SFRNTFNlbGVjdEVsZW1lbnRJbXBsICpzZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgICBpZiAoc2Vs
ZWN0KSB7Ci0gICAgICAgIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBpdGVtcyA9IHNlbGVj
dC0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsID0gaXRlbXMuY291bnQoKTsKLSAgICAgICAg
aW50IG9wdGlvbkluZGV4ID0gMDsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGw7IGkrKykg
ewotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewot
ICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudEltcGwqPihp
dGVtc1tpXSkgPT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbkluZGV4
OwotICAgICAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1lbnRJbXBs
OjpzZXRJbmRleChpbnQsIGludCAmZXhjZXB0aW9uKQotewotICAgIGV4Y2VwdGlvbiA9IERPTUV4
Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgIC8vICMjIwotfQotCi12
b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0
cmlidXRlSW1wbCAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNlbGVjdGVkQXR0
cikKLSAgICAgICAgbV9zZWxlY3RlZCA9ICghYXR0ci0+aXNOdWxsKCkpOwotICAgIGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpCi0gICAgICAgIG1fdmFsdWUgPSBhdHRyLT52YWx1
ZSgpOwotICAgIGVsc2UKLSAgICAgICAgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ET01TdHJpbmcgSFRNTE9wdGlvbkVsZW1lbnRJ
bXBsOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCAhbV92YWx1ZS5pc051bGwoKSApCi0gICAg
ICAgIHJldHVybiBtX3ZhbHVlOwotICAgIC8vIFVzZSB0aGUgdGV4dCBpZiB0aGUgdmFsdWUgd2Fz
bid0IHNldC4KLSAgICByZXR1cm4gdGV4dCgpLnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKTsK
LX0KLQotdm9pZCBIVE1MT3B0aW9uRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgdmFsdWUpOwotfQotCi12
b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0U2VsZWN0ZWQoYm9vbCBfc2VsZWN0ZWQpCi17
Ci0gICAgaWYobV9zZWxlY3RlZCA9PSBfc2VsZWN0ZWQpCi0gICAgICAgIHJldHVybjsKLSAgICBt
X3NlbGVjdGVkID0gX3NlbGVjdGVkOwotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqc2VsZWN0
ID0gZ2V0U2VsZWN0KCk7Ci0gICAgaWYgKHNlbGVjdCkKLSAgICAgICAgc2VsZWN0LT5ub3RpZnlP
cHRpb25TZWxlY3RlZCh0aGlzLF9zZWxlY3RlZCk7Ci19Ci0KLXZvaWQgSFRNTE9wdGlvbkVsZW1l
bnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpz
ZWxlY3QgPSBnZXRTZWxlY3QoKTsKLSAgIGlmIChzZWxlY3QpCi0gICAgICAgc2VsZWN0LT5jaGls
ZHJlbkNoYW5nZWQoKTsKLX0KLQotSFRNTFNlbGVjdEVsZW1lbnRJbXBsICpIVE1MT3B0aW9uRWxl
bWVudEltcGw6OmdldFNlbGVjdCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnNlbGVjdCA9IHBh
cmVudE5vZGUoKTsKLSAgICB3aGlsZSAoc2VsZWN0ICYmICFzZWxlY3QtPmhhc1RhZ05hbWUoc2Vs
ZWN0VGFnKSkKLSAgICAgICAgc2VsZWN0ID0gc2VsZWN0LT5wYXJlbnROb2RlKCk7Ci0gICAgcmV0
dXJuIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHNlbGVjdCk7Ci19Ci0KLWJv
b2wgSFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpkZWZhdWx0U2VsZWN0ZWQoKSBjb25zdAotewotICAg
IHJldHVybiAhZ2V0QXR0cmlidXRlKHNlbGVjdGVkQXR0cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpzZXREZWZhdWx0U2VsZWN0ZWQoYm9vbCBiKQotewotICAg
IHNldEF0dHJpYnV0ZShzZWxlY3RlZEF0dHIsIGIgPyAiIiA6IDApOwotfQotCi1ET01TdHJpbmcg
SFRNTE9wdGlvbkVsZW1lbnRJbXBsOjpsYWJlbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShsYWJlbEF0dHIpOwotfQotCi12b2lkIEhUTUxPcHRpb25FbGVtZW50SW1wbDo6c2V0
TGFiZWwoY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobGFiZWxB
dHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRleHRBcmVhRWxl
bWVudEltcGw6OkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmKQotICAgIDogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwodGV4
dGFyZWFUYWcsIGRvYywgZiksIG1fdmFsdWVJc1ZhbGlkKGZhbHNlKSwgbV92YWx1ZU1hdGNoZXNS
ZW5kZXJlcihmYWxzZSkKLXsKLSAgICAvLyBEVEQgcmVxdWlyZXMgcm93cyAmIGNvbHMgYmUgc3Bl
Y2lmaWVkLCBidXQgd2Ugd2lsbCBwcm92aWRlIHJlYXNvbmFibGUgZGVmYXVsdHMKLSAgICBtX3Jv
d3MgPSAyOwotICAgIG1fY29scyA9IDIwOwotICAgIG1fd3JhcCA9IHRhX1ZpcnR1YWw7Ci19Ci0K
LUhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjp+SFRNTFRleHRBcmVhRWxlbWVudEltcGwoKQotewot
ICAgIGlmIChnZXREb2N1bWVudCgpKSBnZXREb2N1bWVudCgpLT5kZXJlZ2lzdGVyTWFpbnRhaW5z
U3RhdGUodGhpcyk7Ci19Ci0KLURPTVN0cmluZyBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6dHlw
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICJ0ZXh0YXJlYSI7Ci19Ci0KLVFTdHJpbmcgSFRNTFRl
eHRBcmVhRWxlbWVudEltcGw6OnN0YXRlKCApCi17Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBzdHJp
bmcgaXMgbm90IGVtcHR5IQotICAgIHJldHVybiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6
c3RhdGUoKSArIHZhbHVlKCkucXN0cmluZygpKycuJzsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMpCi17Ci0gICAgUVN0
cmluZyBzdGF0ZSA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpmaW5kTWF0Y2hpbmdTdGF0
ZShzdGF0ZXMpOwotICAgIGlmIChzdGF0ZS5pc051bGwoKSkgcmV0dXJuOwotICAgIHNldERlZmF1
bHRWYWx1ZShzdGF0ZS5sZWZ0KHN0YXRlLmxlbmd0aCgpLTEpKTsKLSAgICAvLyB0aGUgY2xvc2Uo
KSBpbiB0aGUgcmVuZGVydHJlZSB3aWxsIHRha2UgY2FyZSBvZiB0cmFuc2ZlcnJpbmcgZGVmYXVs
dHZhbHVlIHRvICd2YWx1ZScKLX0KLQotaW50IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZWxl
Y3Rpb25TdGFydCgpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25TdGFydCgpOwotICAg
IHJldHVybiAwOwotfQotCi1pbnQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNlbGVjdGlvbkVu
ZCgpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVu
ZGVyVGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZWxlY3Rpb25FbmQoKTsKLSAgICByZXR1cm4gMDsK
LX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0U2VsZWN0aW9uU3RhcnQoaW50
IHN0YXJ0KQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dEFyZWEgKj4obV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci19Ci0KLXZv
aWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewot
ICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEgKj4o
bV9yZW5kZXIpLT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbDo6c2VsZWN0KCAgKQotewotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPihtX3JlbmRlciktPnNlbGVjdCgpOwotfQotCi12b2lk
IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGlu
dCBlbmQpCi17Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJU
ZXh0QXJlYSAqPihtX3JlbmRlciktPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpOwotfQot
Ci12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAg
IHNldFZhbHVlKGRlZmF1bHRWYWx1ZSgpKTsKLX0KLSAgICAKLXZvaWQgSFRNTFRleHRBcmVhRWxl
bWVudEltcGw6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIp
Ci17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewotICAgICAgICBtX3Jvd3Mg
PSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAzOwotICAgICAgICBp
ZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5k
TWluTWF4UmVjYWxjKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY29sc0F0dHIp
IHsKLSAgICAgICAgbV9jb2xzID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0lu
dCgpIDogNjA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIo
KS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSB3cmFwQXR0cikgewotICAgICAgICAvLyB2aXJ0dWFsIC8gcGh5c2ljYWwgaXMg
TmV0c2NhcGUgZXh0ZW5zaW9uIG9mIEhUTUwgMy4wLCBub3cgZGVwcmVjYXRlZAotICAgICAgICAv
LyBzb2Z0LyBoYXJkIC8gb2ZmIGlzIHJlY29tbWVuZGF0aW9uIGZvciBIVE1MIDQgZXh0ZW5zaW9u
IGJ5IElFIGFuZCBOUyA0Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1
ZSgpLCAidmlydHVhbCIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJzb2Z0
IikpCi0gICAgICAgICAgICBtX3dyYXAgPSB0YV9WaXJ0dWFsOwotICAgICAgICBlbHNlIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAicGh5c2ljYWwiKSB8fCBlcXVhbElnbm9y
aW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiaGFyZCIpKQotICAgICAgICAgICAgbV93cmFwID0gdGFf
UGh5c2ljYWw7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVl
KCksICJvbiIgKSkKLSAgICAgICAgICAgIG1fd3JhcCA9IHRhX1BoeXNpY2FsOwotICAgICAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIikpCi0gICAgICAg
ICAgICBtX3dyYXAgPSB0YV9Ob1dyYXA7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAg
ICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7Ci0gICAgICAgIC8vIGln
bm9yZSBmb3IgdGhlIG1vbWVudAotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uZm9j
dXNBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGZvY3VzRXZlbnQsIGF0dHIp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmx1ckF0dHIpIHsKLSAgICAgICAg
c2V0SFRNTEV2ZW50TGlzdGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbnNlbGVjdEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVu
ZXIoc2VsZWN0RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
Y2hhbmdlQXR0cikgewotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjaGFuZ2VFdmVudCwg
YXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpw
YXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MVGV4dEFy
ZWFFbGVtZW50SW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJT
dHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclRleHRBcmVhKHRo
aXMpOwotfQotCi1ib29sIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphcHBlbmRGb3JtRGF0YShG
b3JtRGF0YUxpc3QmIGVuY29kaW5nLCBib29sKQotewotICAgIGlmIChuYW1lKCkuaXNFbXB0eSgp
KSByZXR1cm4gZmFsc2U7Ci0gICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCksIHZhbHVlKCkp
OwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjpy
ZXNldCgpCi17Ci0gICAgc2V0VmFsdWUoZGVmYXVsdFZhbHVlKCkpOwotfQotCi12b2lkIEhUTUxU
ZXh0QXJlYUVsZW1lbnRJbXBsOjp1cGRhdGVWYWx1ZSgpCi17Ci0gICAgaWYgKCAhbV92YWx1ZUlz
VmFsaWQgKSB7Ci0gICAgICAgIGlmICggbV9yZW5kZXIgKSB7Ci0gICAgICAgICAgICBtX3ZhbHVl
ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dEFyZWEqPiggbV9yZW5kZXIgKS0+dGV4dCgpLnFzdHJp
bmcoKTsKLSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0cnVlOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgbV92YWx1ZSA9IGRlZmF1bHRWYWx1ZSgpLnFzdHJpbmco
KTsKLSAgICAgICAgICAgIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSBmYWxzZTsKLSAgICAgICAg
fQotICAgICAgICBtX3ZhbHVlSXNWYWxpZCA9IHRydWU7Ci0gICAgfQotfQotCi1ET01TdHJpbmcg
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnZhbHVlKCkKLXsKLSAgICB1cGRhdGVWYWx1ZSgpOwot
ICAgIHJldHVybiBtX3ZhbHVlLmlzTnVsbCgpID8gRE9NU3RyaW5nKCIiKSA6IG1fdmFsdWU7Ci19
Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFZhbHVlKGNvbnN0IERPTVN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgbV92YWx1ZSA9IHZhbHVlLnFzdHJpbmcoKTsKLSAgICBtX3ZhbHVl
TWF0Y2hlc1JlbmRlcmVyID0gZmFsc2U7Ci0gICAgbV92YWx1ZUlzVmFsaWQgPSB0cnVlOwotICAg
IGlmIChtX3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXItPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0g
ICAgLy8gRklYTUU6IEZvcmNlIHJlbG9hZCBmcm9tIHJlbmRlcmVyLCBhcyByZW5kZXJlciBtYXkg
aGF2ZSBub3JtYWxpemVkIGxpbmUgZW5kaW5ncy4KLSAgICBtX3ZhbHVlSXNWYWxpZCA9IGZhbHNl
OwotICAgIHNldENoYW5nZWQodHJ1ZSk7Ci19Ci0KLQotRE9NU3RyaW5nIEhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsOjpkZWZhdWx0VmFsdWUoKQotewotICAgIERPTVN0cmluZyB2YWwgPSAiIjsKLSAg
ICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMgLSBqdXN0IGdyYWIgdGhlIHRleHQgbm9kZXMKLSAg
ICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0
U2libGluZygpKQotICAgICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFs
ICs9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4obiktPmRhdGEoKTsKICAgICAKLSAgICBpZiAodmFs
WzBdID09ICdccicgJiYgdmFsWzFdID09ICdcbicpIHsKLSAgICAgICAgdmFsID0gdmFsLmNvcHko
KTsKLSAgICAgICAgdmFsLnJlbW92ZSgwLDIpOwotICAgIH0gZWxzZSBpZiAodmFsWzBdID09ICdc
cicgfHwgdmFsWzBdID09ICdcbicpIHsKLSAgICAgICAgdmFsID0gdmFsLmNvcHkoKTsKLSAgICAg
ICAgdmFsLnJlbW92ZSgwLDEpOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQg
SFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcg
JmRlZmF1bHRWYWx1ZSkKLXsKLSAgICAvLyB0aGVyZSBtYXkgYmUgY29tbWVudHMgLSByZW1vdmUg
YWxsIHRoZSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBvbmUKLSAgICBRUHRyTGlz
dDxOb2RlSW1wbD4gdG9SZW1vdmU7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gZmly
c3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKG4tPmlzVGV4
dE5vZGUoKSkKLSAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChuKTsKLSAgICBRUHRyTGlzdEl0
ZXJhdG9yPE5vZGVJbXBsPiBpdCh0b1JlbW92ZSk7Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAw
OwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpIHsKLSAgICAgICAgTm9kZUltcGwgKm4g
PSBpdC5jdXJyZW50KCk7Ci0gICAgICAgIG4tPnJlZigpOwotICAgICAgICByZW1vdmVDaGlsZChu
LCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgbi0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgaW5zZXJ0
QmVmb3JlKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKGRlZmF1bHRWYWx1ZSksZmlyc3RD
aGlsZCgpLCBleGNlcHRpb25jb2RlKTsKLSAgICBzZXRWYWx1ZShkZWZhdWx0VmFsdWUpOwotfQot
Ci1ib29sIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsOjppc0VkaXRhYmxlKCkKLXsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6YWNjZXNzS2V5QWN0
aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKLXsKLSAgICBmb2N1cygpOwotfQotCi12b2lkIEhU
TUxUZXh0QXJlYUVsZW1lbnRJbXBsOjphdHRhY2goKQotewotICAgIG1fdmFsdWVJc1ZhbGlkID0g
dHJ1ZTsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6YXR0YWNoKCk7Ci0gICAgdXBk
YXRlVmFsdWUoKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6ZGV0YWNoKCkK
LXsKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDo6ZGV0YWNoKCk7Ci0gICAgbV92YWx1
ZU1hdGNoZXNSZW5kZXJlciA9IGZhbHNlOwotfQotCi1ET01TdHJpbmcgSFRNTFRleHRBcmVhRWxl
bWVudEltcGw6OmFjY2Vzc0tleSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShh
Y2Nlc3NrZXlBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0QWNj
ZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFjY2Vz
c2tleUF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbDo6c2V0
Q29scyhpbnQgY29scykKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY29sc0F0dHIsIFFTdHJpbmc6Om51
bWJlcihjb2xzKSk7Ci19Ci0KLXZvaWQgSFRNTFRleHRBcmVhRWxlbWVudEltcGw6OnNldFJvd3Mo
aW50IHJvd3MpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJvd3NBdHRyLCBRU3RyaW5nOjpudW1iZXIo
cm93cykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJc0luZGV4RWxlbWVudElt
cGw6OkhUTUxJc0luZGV4RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxl
bWVudEltcGwgKmYpCi0gICAgOiBIVE1MSW5wdXRFbGVtZW50SW1wbChpc2luZGV4VGFnLCBkb2Ms
IGYpCi17Ci0gICAgbV90eXBlID0gVEVYVDsKLSAgICBtX25hbWUgPSAiaXNpbmRleCI7Ci19Ci0K
LXZvaWQgSFRNTElzSW5kZXhFbGVtZW50SW1wbDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHByb21wdEF0
dHIpCi0Jc2V0VmFsdWUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZQotICAgICAgICAvLyBkb24n
dCBjYWxsIEhUTUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlIGhlcmUsIGFzIGl0
IHdvdWxkCi0gICAgICAgIC8vIGFjY2VwdCBhdHRyaWJ1dGVzIHRoaXMgZWxlbWVudCBkb2VzIG5v
dCBzdXBwb3J0Ci0gICAgICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotRE9NU3RyaW5nIEhUTUxJc0luZGV4RWxlbWVudEltcGw6
OnByb21wdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShwcm9tcHRBdHRyKTsK
LX0KLQotdm9pZCBIVE1MSXNJbmRleEVsZW1lbnRJbXBsOjpzZXRQcm9tcHQoY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUocHJvbXB0QXR0ciwgdmFsdWUpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVuc2lnbmVkIEhUTUxPcHRpb25zQ29sbGVjdGlvbklt
cGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZC4KLSAgICBy
ZXR1cm4gMDsKLX0KLQotdm9pZCBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpzZXRMZW5ndGgo
dW5zaWduZWQgbGVuZ3RoKQotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi19Ci0KLU5v
ZGVJbXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjppdGVtKHVuc2lnbmVkIGluZGV4KSBj
b25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAgcmV0dXJuIDA7Ci19Ci0K
LU5vZGVJbXBsICpIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOjpuYW1lZEl0ZW0oY29uc3QgRE9N
U3RyaW5nICZuYW1lKSBjb25zdAotewotICAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0gICAg
cmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9ybURhdGFMaXN0OjpGb3Jt
RGF0YUxpc3QoUVRleHRDb2RlYyAqYykKLSAgICA6IG1fY29kZWMoYykKLXsKLX0KLQotdm9pZCBG
b3JtRGF0YUxpc3Q6OmFwcGVuZFN0cmluZyhjb25zdCBRQ1N0cmluZyAmcykKLXsKLSAgICBtX2xp
c3QuYXBwZW5kKHMpOwotfQotCi12b2lkIEZvcm1EYXRhTGlzdDo6YXBwZW5kU3RyaW5nKGNvbnN0
IFFTdHJpbmcgJnMpCi17Ci0gICAgUUNTdHJpbmcgY3N0ciA9IGZpeExpbmVCcmVha3MobV9jb2Rl
Yy0+ZnJvbVVuaWNvZGUocywgdHJ1ZSkpOwotICAgIGNzdHIudHJ1bmNhdGUoY3N0ci5sZW5ndGgo
KSk7Ci0gICAgbV9saXN0LmFwcGVuZChjc3RyKTsKLX0KLQotdm9pZCBGb3JtRGF0YUxpc3Q6OmFw
cGVuZEZpbGUoY29uc3QgRE9NU3RyaW5nICZrZXksIGNvbnN0IERPTVN0cmluZyAmZmlsZW5hbWUp
Ci17Ci0gICAgYXBwZW5kU3RyaW5nKGtleS5xc3RyaW5nKCkpOwotICAgIG1fbGlzdC5hcHBlbmQo
ZmlsZW5hbWUucXN0cmluZygpKTsKLX0KLQogfSAvLyBuYW1lc3BhY2UKSW5kZXg6IGtodG1sL2h0
bWwvSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwv
SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbC5oCShyZXZpc2lvbiAxMTk3NikKKysrIGtodG1sL2h0
bWwvSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC00LDcgKzQs
NyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCiAg
KiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAg
KiAgICAgICAgICAgKEMpIDIwMDAgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMDQgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykg
MjAwNCwgMjAwNSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgogICoKICAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CkBAIC0yMiw4MDUgKzIyLDI1IEBACiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAq
CiAgKi8KLSNpZm5kZWYgSFRNTF9GT1JNSU1QTF9ICi0jZGVmaW5lIEhUTUxfRk9STUlNUExfSAor
I2lmbmRlZiBIVE1MX0hUTUxPcHRpb25zQ29sbGVjdGlvbkltcGxfSAorI2RlZmluZSBIVE1MX0hU
TUxPcHRpb25zQ29sbGVjdGlvbkltcGxfSAogCi0jaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRp
bXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX21pc2NpbXBsLmgiCi0KLSNpbmNsdWRlIDxxcHRy
dmVjdG9yLmg+Ci0jaW5jbHVkZSA8cW1lbWFycmF5Lmg+Ci0jaW5jbHVkZSA8a3htbGNvcmUvSGFz
aE1hcC5oPgotCi1jbGFzcyBLSFRNTFZpZXc7Ci1jbGFzcyBRVGV4dENvZGVjOwotCi1uYW1lc3Bh
Y2Uga2h0bWwKLXsKLSAgICBjbGFzcyBGb3JtRGF0YTsKLSAgICBjbGFzcyBSZW5kZXJGb3JtRWxl
bWVudDsKLSAgICBjbGFzcyBSZW5kZXJUZXh0QXJlYTsKLSAgICBjbGFzcyBSZW5kZXJTZWxlY3Q7
Ci0gICAgY2xhc3MgUmVuZGVyTGluZUVkaXQ7Ci0gICAgY2xhc3MgUmVuZGVyRmlsZUJ1dHRvbjsK
LSAgICBjbGFzcyBSZW5kZXJTbGlkZXI7Ci19CisjaW5jbHVkZSAibWlzYy9zaGFyZWQuaCIKIAog
bmFtZXNwYWNlIERPTSB7CiAKLWNsYXNzIERPTVN0cmluZzsKLWNsYXNzIEZvcm1EYXRhTGlzdDsK
LWNsYXNzIEhUTUxGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
OwotY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VFbGVtZW50SW1w
bDsKLWNsYXNzIEhUTUxJbWFnZUxvYWRlcjsKLWNsYXNzIEhUTUxPcHRpb25FbGVtZW50SW1wbDsK
LWNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGw7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotY2xhc3MgSFRNTEZvcm1FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsK
LXB1YmxpYzoKLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKTsKLSAg
ICB2aXJ0dWFsIH5IVE1MRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdT
dGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJl
ZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMzsgfQot
Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZElu
dG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0g
Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gZWxlbWVudHMoKTsKLSAgICBpbnQgbGVu
Z3RoKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgZW5jdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZW5jdHlwZTsgfQotICAgIHZvaWQgc2V0RW5jdHlwZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAg
ICBET01TdHJpbmcgYm91bmRhcnkoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kYXJ5OyB9Ci0gICAg
dm9pZCBzZXRCb3VuZGFyeShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBib29sIGF1dG9Db21w
bGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAg
ICB2b2lkIHJlZ2lzdGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7
Ci0gICAgdm9pZCByZW1vdmVGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAq
KTsKLSAgICB2b2lkIHJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1wbCAqKTsK
LSAgICB2b2lkIHJlbW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKik7Ci0KLSAg
ICBib29sIHByZXBhcmVTdWJtaXQoKTsKLSAgICB2b2lkIHN1Ym1pdChib29sIGFjdGl2YXRlU3Vi
bWl0QnV0dG9uID0gZmFsc2UpOwotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHZvaWQgc2V0TWFs
Zm9ybWVkKGJvb2wgbWFsZm9ybWVkKSB7IG1fbWFsZm9ybWVkID0gbWFsZm9ybWVkOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzTWFsZm9ybWVkKCkgeyByZXR1cm4gbV9tYWxmb3JtZWQ7IH0KLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29u
c3Q7Ci0gICAgCi0gICAgdm9pZCBzdWJtaXRDbGljaygpOwotICAgIGJvb2wgZm9ybVdvdWxkSGF2
ZVNlY3VyZVN1Ym1pc3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwpOwotCi0gICAgRE9NU3RyaW5n
IG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0g
ICAgRE9NU3RyaW5nIGFjY2VwdENoYXJzZXQoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2VwdENo
YXJzZXQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjdGlvbigpIGNvbnN0
OwotICAgIHZvaWQgc2V0QWN0aW9uKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmlu
ZyBtZXRob2QoKSBjb25zdDsKLSAgICB2b2lkIHNldE1ldGhvZChjb25zdCBET01TdHJpbmcgJik7
Ci0KLSAgICBET01TdHJpbmcgdGFyZ2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUYXJnZXQoY29u
c3QgRE9NU3RyaW5nICYpOwotCi0gICAgc3RhdGljIHZvaWQgaTE4bkRhdGEoKTsKLQotICAgIGZy
aWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIEhUTUxGb3JtQ29s
bGVjdGlvbkltcGw7Ci0KLSAgICBIVE1MQ29sbGVjdGlvbkltcGw6OkNvbGxlY3Rpb25JbmZvICpj
b2xsZWN0aW9uSW5mbzsKLQotICAgIFFQdHJWZWN0b3I8SFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGw+IGZvcm1FbGVtZW50czsKLSAgICBRUHRyVmVjdG9yPEhUTUxJbWFnZUVsZW1lbnRJbXBsPiBp
bWdFbGVtZW50czsKLSAgICBET01TdHJpbmcgbV91cmw7Ci0gICAgRE9NU3RyaW5nIG1fdGFyZ2V0
OwotICAgIERPTVN0cmluZyBtX2VuY3R5cGU7Ci0gICAgRE9NU3RyaW5nIG1fYm91bmRhcnk7Ci0g
ICAgRE9NU3RyaW5nIG1fYWNjZXB0Y2hhcnNldDsKLSAgICBib29sIG1fcG9zdCA6IDE7Ci0gICAg
Ym9vbCBtX211bHRpcGFydCA6IDE7Ci0gICAgYm9vbCBtX2F1dG9jb21wbGV0ZSA6IDE7Ci0gICAg
Ym9vbCBtX2luc3VibWl0IDogMTsKLSAgICBib29sIG1fZG9pbmdzdWJtaXQgOiAxOwotICAgIGJv
b2wgbV9pbnJlc2V0IDogMTsKLSAgICBib29sIG1fbWFsZm9ybWVkIDogMTsKLSAgICAKLXByaXZh
dGU6Ci0gICAgdm9pZCBwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIGJvb2wg
Zm9ybURhdGEoa2h0bWw6OkZvcm1EYXRhICYpIGNvbnN0OwotCi0gICAgdW5zaWduZWQgZm9ybUVs
ZW1lbnRJbmRleChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqKTsKLQotICAgIERPTVN0cmlu
ZyBvbGROYW1lQXR0cjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEdl
bmVyaWNGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCi17Ci0gICAgZnJp
ZW5kIGNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpS
ZW5kZXJGb3JtRWxlbWVudDsKLQotcHVibGljOgotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJ
bXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVu
dCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAgdmlydHVhbCBpbnQg
dGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAxOyB9Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmb3JtKCkgeyByZXR1cm4gbV9mb3JtOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0
eXBlKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBib29sIGlzQ29udHJvbCgpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1
cm4gIWRpc2FibGVkKCk7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7
Ci0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJvb2wgZGVlcCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cmVzZXQoKSB7fQotCi0gICAgdm9pZCBvblNlbGVjdCgpOwotICAgIHZvaWQgb25DaGFuZ2UoKTsK
LQotICAgIGJvb2wgZGlzYWJsZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERpc2FibGVkKGJvb2wg
X2Rpc2FibGVkKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBi
b29sIGlzTW91c2VGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJh
dGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgYm9vbCByZWFkT25seSgpIGNv
bnN0IHsgcmV0dXJuIG1fcmVhZE9ubHk7IH0KLSAgICB2b2lkIHNldFJlYWRPbmx5KGJvb2wgX3Jl
YWRPbmx5KTsKLQotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgKTsK
LQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUo
Y29uc3QgRE9NU3RyaW5nJiBuYW1lKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0dlbmVyaWNGb3Jt
RWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSYWRp
b0J1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAvKgotICAgICAqIG92ZXJy
aWRlIGluIGRlcml2ZWQgY2xhc3NlcyB0byBnZXQgdGhlIGVuY29kZWQgbmFtZT12YWx1ZSBwYWly
Ci0gICAgICogZm9yIHN1Ym1pdHRpbmcKLSAgICAgKiByZXR1cm4gdHJ1ZSBmb3IgYSBzdWNjZXNz
ZnVsIGNvbnRyb2wgKHNlZSBIVE1MNC0xNy4xMy4yKQotICAgICAqLwotICAgIHZpcnR1YWwgYm9v
bCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKSB7IHJldHVybiBmYWxzZTsgfQot
Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIHZpcnR1YWwgUVN0cmluZyBz
dGF0ZSgpOwotICAgIFFTdHJpbmcgZmluZE1hdGNoaW5nU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRl
cyk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3Qg
eyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNBY3RpdmF0ZWRTdWJtaXQoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJt
aXQoYm9vbCBmbGFnKSB7IH0KLQotICAgIGludCB0YWJJbmRleCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VGFiSW5kZXgoaW50KTsKLQotcHJvdGVjdGVkOgotICAgIEhUTUxGb3JtRWxlbWVudEltcGwg
KmdldEZvcm0oKSBjb25zdDsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKm1fZm9ybTsKLSAg
ICBib29sIG1fZGlzYWJsZWQgOiAxOwotICAgIGJvb2wgbV9yZWFkT25seTogMTsKLSAgICBib29s
IG1faW5pdGVkIDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEJ1
dHRvbkVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci1w
dWJsaWM6Ci0gICAgSFRNTEJ1dHRvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTEJ1dHRvbkVsZW1lbnRJ
bXBsKCk7Ci0KLSAgICBlbnVtIHR5cGVFbnVtIHsKLSAgICAgICAgU1VCTUlULAotICAgICAgICBS
RVNFVCwKLSAgICAgICAgQlVUVE9OCi0gICAgfTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29u
c3Q7Ci0gICAgICAgIAotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVu
ZGVyZXIoUmVuZGVyQXJlbmEqLCBraHRtbDo6UmVuZGVyU3R5bGUqKTsKLQotICAgIHZpcnR1YWwg
dm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAg
dmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAg
dmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfSAKLQot
ICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSBjb25zdDsKLSAgICB2
aXJ0dWFsIGJvb2wgaXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQg
c2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNz
S2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXNz
S2V5KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBE
T01TdHJpbmcgJik7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0g
ICAgRE9NU3RyaW5nIG1fY3VyclZhbHVlOwotICAgIHR5cGVFbnVtICBtX3R5cGUgOiAyOwotICAg
IGJvb2wgICAgICBtX2RpcnR5IDogMTsKLSAgICBib29sICAgICAgbV9hY3RpdmVTdWJtaXQgOiAx
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MRmllbGRTZXRFbGVtZW50
SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAg
IEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTEZpZWxkU2V0RWxlbWVudEltcGwoKTsK
LSAgICAKLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsKLQot
ICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwg
a2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6
OlJlbmRlclN0eWxlICopOwotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0Owot
fTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbCA6
IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBr
aHRtbDo6UmVuZGVyTGluZUVkaXQ7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJGaWxl
QnV0dG9uOwotCi0gICAgZnJpZW5kIGNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbDsKLSAgICBm
cmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlclNsaWRlcjsKLQotcHVibGljOgotICAgIC8vIGRvIG5v
dCBjaGFuZ2UgdGhlIG9yZGVyIQotICAgIGVudW0gdHlwZUVudW0gewotICAgICAgICBURVhULAot
ICAgICAgICBQQVNTV09SRCwKLSAgICAgICAgSVNJTkRFWCwKLSAgICAgICAgQ0hFQ0tCT1gsCi0g
ICAgICAgIFJBRElPLAotICAgICAgICBTVUJNSVQsCi0gICAgICAgIFJFU0VULAotICAgICAgICBG
SUxFLAotICAgICAgICBISURERU4sCi0gICAgICAgIElNQUdFLAotICAgICAgICBCVVRUT04KLSAg
ICAgICAgLFNFQVJDSCwKLSAgICAgICAgUkFOR0UKLSAgICB9OwotCi0gICAgSFRNTElucHV0RWxl
bWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsK
LSAgICBIVE1MSW5wdXRFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBE
b2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1
YWwgfkhUTUxJbnB1dEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0
dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdT
dGF0dXNGb3JiaWRkZW47IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsg
cmV0dXJuIDA7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gaW5w
dXRUeXBlKCkgIT0gSU1BR0U7IH0KLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5hbWUoKSBjb25z
dDsKLQotICAgIGJvb2wgYXV0b0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gbV9hdXRvY29tcGxl
dGU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0NoZWNrZWQoKSBjb25zdCB7IHJldHVybiBjaGVj
a2VkKCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbmRldGVybWluYXRlKCkgY29uc3QgeyByZXR1
cm4gaW5kZXRlcm1pbmF0ZSgpOyB9Ci0KLSAgICBib29sIGlzVGV4dEJ1dHRvbigpIGNvbnN0IHsg
cmV0dXJuIG1fdHlwZSA9PSBTVUJNSVQgfHwgbV90eXBlID09IFJFU0VUIHx8IG1fdHlwZSA9PSBC
VVRUT047IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSYWRpb0J1dHRvbigpIGNvbnN0IHsgcmV0dXJu
IG1fdHlwZSA9PSBSQURJTzsgfQotCi0gICAgYm9vbCBjaGVja2VkKCkgY29uc3QgeyByZXR1cm4g
bV9jaGVja2VkOyB9Ci0gICAgdm9pZCBzZXRDaGVja2VkKGJvb2wpOwotICAgIGJvb2wgaW5kZXRl
cm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXRlcm1pbmF0ZTsgfQotICAgIHZvaWQgc2V0
SW5kZXRlcm1pbmF0ZShib29sKTsKLSAgICBpbnQgbWF4TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4g
bV9tYXhMZW47IH0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotICAg
IERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUeXBlKGNvbnN0IERPTVN0cmlu
ZyYgdCk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldFZhbHVl
KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZVdpdGhEZWZhdWx0KCkg
Y29uc3Q7Ci0KLSAgICB2b2lkIHNldFZhbHVlRnJvbVJlbmRlcmVyKGNvbnN0IERPTVN0cmluZyAm
KTsKLSAgICBib29sIHZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV92YWx1
ZU1hdGNoZXNSZW5kZXJlcjsgfQotICAgIHZvaWQgc2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKSB7
IG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFp
bnRhaW5zU3RhdGUoKSB7IHJldHVybiBtX3R5cGUgIT0gUEFTU1dPUkQ7IH0KLSAgICB2aXJ0dWFs
IFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdM
aXN0ICYpOwotCi0gICAgYm9vbCBjYW5IYXZlU2VsZWN0aW9uKCk7Ci0KLSAgICBpbnQgc2VsZWN0
aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rp
b25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lk
IHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotICAgIAot
ICAgIHZpcnR1YWwgdm9pZCBjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cyA9IGZhbHNlLCBib29s
IHNob3dQcmVzc2VkTG9vayA9IHRydWUpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rp
b24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5
KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVz
dWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY29weU5vbkF0dHJpYnV0
ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudEltcGwgKnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoa2h0bWw6OlJl
bmRlclN0eWxlICopOwotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVu
ZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwg
dm9pZCBkZXRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFM
aXN0JiwgYm9vbCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9u
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdHlw
ZUVudW0gaW5wdXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9Ci0gICAgdm9pZCBzZXRJ
bnB1dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVz
ZXQoKTsKLQotICAgIC8vIHVzZWQgaW4gY2FzZSBpbnB1dCB0eXBlPWltYWdlIHdhcyBjbGlja2Vk
LgotICAgIGludCBjbGlja1goKSBjb25zdCB7IHJldHVybiB4UG9zOyB9Ci0gICAgaW50IGNsaWNr
WSgpIGNvbnN0IHsgcmV0dXJuIHlQb3M7IH0KLQotICAgIHZpcnR1YWwgdm9pZCogcHJlRGlzcGF0
Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBwb3N0RGlz
cGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQqIGRhdGEpOwotICAgIHZpcnR1
YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFs
IGJvb2wgaXNFZGl0YWJsZSgpOwotCi0gICAgRE9NU3RyaW5nIGFsdFRleHQoKSBjb25zdDsKLSAg
ICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikg
Y29uc3Q7Ci0KLSAgICBpbnQgbWF4UmVzdWx0cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF4UmVzdWx0
czsgfQotCi0gICAgRE9NU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0
RGVmYXVsdFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBib29sIGRlZmF1bHRD
aGVja2VkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREZWZhdWx0Q2hlY2tlZChib29sKTsKLQotICAg
IERPTVN0cmluZyBhY2NlcHQoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2VwdChjb25zdCBET01T
dHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWNjZXNzS2V5KCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFsaWduKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01T
dHJpbmcgYWx0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbHQoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgdm9pZCBzZXRTaXplKHVuc2lnbmVkKTsKLQotICAgIERPTVN0cmluZyBzcmMoKSBjb25z
dDsKLSAgICB2b2lkIHNldFNyYyhjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldE1h
eExlbmd0aChpbnQpOwotCi0gICAgRE9NU3RyaW5nIHVzZU1hcCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0VXNlTWFwKGNvbnN0IERPTVN0cmluZyAmKTsKLQotcHJvdGVjdGVkOgotICAgIGJvb2wgc3Rv
cmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSBjb25zdDsKLQotICAgIEF0b21pY1N0cmlu
ZyBtX25hbWU7Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAgaW50ICAgICAgIHhQb3M7Ci0g
ICAgc2hvcnQgICAgIG1fbWF4TGVuOwotICAgIHNob3J0ICAgICBtX3NpemU7Ci0gICAgc2hvcnQg
ICAgIHlQb3M7Ci0KLSAgICBzaG9ydCAgICAgbV9tYXhSZXN1bHRzOwotCi0gICAgSFRNTEltYWdl
TG9hZGVyKiBtX2ltYWdlTG9hZGVyOwotCi0gICAgdHlwZUVudW0gbV90eXBlIDogNDsKLSAgICBi
b29sIG1fY2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBtX2RlZmF1bHRDaGVja2VkIDogMTsKLSAgICBi
b29sIG1fdXNlRGVmYXVsdENoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9pbmRldGVybWluYXRlIDog
MTsKLSAgICBib29sIG1faGF2ZVR5cGUgOiAxOwotICAgIGJvb2wgbV9hY3RpdmVTdWJtaXQgOiAx
OwotICAgIGJvb2wgbV9hdXRvY29tcGxldGUgOiAxOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNS
ZW5kZXJlciA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMYWJl
bEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhU
TUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5IVE1M
TGFiZWxFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25z
dCB7IHJldHVybiA1OyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsK
LQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJ
bXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5k
VG9BbnlFbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIHRoZSBmb3JtIGVsZW1lbnQgdGhpcyBs
YWJlbCBpcyBhc3NvY2lhdGVkIHRvLgotICAgICAqLwotICAgIEVsZW1lbnRJbXBsICpmb3JtRWxl
bWVudCgpOwotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpOwotCi0gICAgRE9NU3Ry
aW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0
cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBodG1sRm9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRI
dG1sRm9yKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgZm9jdXMoKTsKLQotIHByaXZh
dGU6Ci0gICAgRE9NU3RyaW5nIG1fZm9ybUVsZW1lbnRJRDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotY2xhc3MgSFRNTExlZ2VuZEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTExlZ2VuZEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVh
bCB+SFRNTExlZ2VuZEVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2Fi
bGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0
ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZp
cnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NL
ZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFRoZSBm
aXJzdCBmb3JtIGVsZW1lbnQgaW4gdGhlIGxlZ2VuZCdzIGZpZWxkc2V0IAotICAgICAqLwotICAg
IEVsZW1lbnRJbXBsICpmb3JtRWxlbWVudCgpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3Ry
aW5nICYpOwotICAgIAotICAgIHZvaWQgZm9jdXMoKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0K
LXB1YmxpYzoKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwoY29u
c3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxl
bWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFNlbGVjdEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9p
ZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJu
IDY7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxk
KTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVj
YWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0
OwotICAgIHZvaWQgc2V0U2VsZWN0ZWRJbmRleCggaW50IGluZGV4ICk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBpbnQg
bGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICBpbnQgbWluV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21p
bndpZHRoOyB9Ci0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0g
ICAgYm9vbCBtdWx0aXBsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbXVsdGlwbGU7IH0KLQotICAgIHZv
aWQgYWRkICggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBIVE1MRWxlbWVudEltcGwgKmJlZm9y
ZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdm9pZCByZW1vdmUgKCBpbnQgaW5kZXggKTsK
LQotICAgIERPTVN0cmluZyB2YWx1ZSgpOwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICYpOwotICAgIAotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgKm9wdGlvbnMoKTsK
LSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBvcHRpb25zSFRNTENvbGxlY3Rpb24oKTsg
Ly8gRklYTUU6IFJlbW92ZSB0aGlzIGFuZCBtaWdyYXRlIHRvIG9wdGlvbnMoKS4KLQotICAgIHZp
cnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFs
IFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdM
aXN0ICYpOwotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUltcGwg
Km5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAg
IHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9k
ZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJ
bXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFkZENoaWxk
KCBOb2RlSW1wbCogbmV3Q2hpbGQgKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5n
ZWQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3Jl
YXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotICAgIHZp
cnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIC8v
IGdldCB0aGUgYWN0dWFsIGxpc3Rib3ggaW5kZXggb2YgdGhlIG9wdGlvbkluZGV4dGggb3B0aW9u
Ci0gICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3Q7Ci0gICAg
Ly8gcmV2ZXJzZSBvZiBvcHRpb25Ub0xpc3RJbmRleCAtIGdldCBvcHRpb25JbmRleCBmcm9tIGxp
c3Rib3hJbmRleAotICAgIGludCBsaXN0VG9PcHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBjb25z
dDsKLQotICAgIHZvaWQgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRN
TEVsZW1lbnRJbXBsKj4gbGlzdEl0ZW1zKCkgY29uc3QKLSAgICAgewotICAgICAgICAgaWYgKG1f
cmVjYWxjTGlzdEl0ZW1zKSBjb25zdF9jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHRoaXMp
LT5yZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgIHJldHVybiBtX2xpc3RJdGVtczsKLSAgICAg
fQotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotICAgIHZvaWQgbm90aWZ5T3B0aW9uU2VsZWN0
ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7
Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQp
OwotCi0gICAgdm9pZCBzZXRNdWx0aXBsZShib29sKTsKLQotICAgIHZvaWQgc2V0U2l6ZShpbnQp
OwotCi1wcml2YXRlOgotICAgIHZvaWQgcmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLXByb3RlY3RlZDoK
LSAgICBtdXRhYmxlIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBtX2xpc3RJdGVtczsKLSAg
ICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICptX29wdGlvbnM7Ci0gICAgc2hvcnQgbV9taW53
aWR0aDsKLSAgICBzaG9ydCBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJvb2wg
bV9yZWNhbGNMaXN0SXRlbXM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhU
TUxLZXlnZW5FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MU2VsZWN0RWxlbWVudEltcGwKLXsKLXB1
YmxpYzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkg
Y29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAg
IC8vICMjIyB0aGlzIGlzIGp1c3QgYSByb3VnaCBndWVzcwotICAgIHZpcnR1YWwgYm9vbCBpc0Vu
dW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmly
dHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotcHJvdGVjdGVk
OgotICAgIEF0b21pY1N0cmluZyBtX2NoYWxsZW5nZTsKLSAgICBBdG9taWNTdHJpbmcgbV9rZXlU
eXBlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0R3JvdXBFbGVt
ZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgot
ICAgIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTE9wdEdyb3VwRWxlbWVudEltcGwo
KTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQp
IHsgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKSB8fCBu
ZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmhyVGFnKTsgfQotCi0gICAgRE9NU3RyaW5n
IHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0Owot
ICAgIAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdD
aGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0
dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBs
ICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAq
cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCggTm9k
ZUltcGwqIG5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAgIHZvaWQgcmVjYWxjU2VsZWN0T3B0aW9u
cygpOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbChj
b25zdCBET01TdHJpbmcgJik7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlclNlbGVjdDsKLSAgICBmcmllbmQg
Y2xhc3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0KLXB1YmxpYzoKLSAgICBIVE1MT3B0
aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYg
PSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNv
bnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiAyOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNv
bnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8
fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNjcmlwdFRhZyk7IH0KLQotICAgIHZp
cnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBj
b25zdDsKLQotICAgIERPTVN0cmluZyB0ZXh0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUZXh0KGNv
bnN0IERPTVN0cmluZyAmLCBpbnQgJmV4Y2VwdGlvbik7Ci0KLSAgICBpbnQgaW5kZXgoKSBjb25z
dDsKLSAgICB2b2lkIHNldEluZGV4KGludCwgaW50ICZleGNlcHRpb24pOwotICAgIHZpcnR1YWwg
dm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQot
ICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9N
U3RyaW5nICYpOwotCi0gICAgYm9vbCBzZWxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0
ZWQ7IH0KLSAgICB2b2lkIHNldFNlbGVjdGVkKGJvb2wgX3NlbGVjdGVkKTsKLQotICAgIEhUTUxT
ZWxlY3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBib29sIGRlZmF1bHRTZWxlY3RlZCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKCBib29sICk7Ci0KLSAgICBET01TdHJpbmcgbGFi
ZWwoKSBjb25zdDsKLSAgICB2b2lkIHNldExhYmVsKCBjb25zdCBET01TdHJpbmcgJiApOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAgYm9vbCBtX3NlbGVjdGVkOwot
fTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNs
YXNzIGtodG1sOjpSZW5kZXJUZXh0QXJlYTsKLQotcHVibGljOgotICAgIGVudW0gV3JhcE1ldGhv
ZCB7Ci0gICAgICAgIHRhX05vV3JhcCwKLSAgICAgICAgdGFfVmlydHVhbCwKLSAgICAgICAgdGFf
UGh5c2ljYWwKLSAgICB9OwotCi0gICAgSFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJ
bXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFRleHRBcmVh
RWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1w
bCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCk7IH0KLQotICAgIGlu
dCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9Ci0gICAgaW50IHJvd3MoKSBjb25zdCB7
IHJldHVybiBtX3Jvd3M7IH0KLQotICAgIFdyYXBNZXRob2Qgd3JhcCgpIGNvbnN0IHsgcmV0dXJu
IG1fd3JhcDsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1
YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFT
dHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0
ICYpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgp
OwotCi0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0
aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCAoICApOwotICAgIHZvaWQgc2V0U2VsZWN0
aW9uUmFuZ2UoaW50LCBpbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgp
OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJ
bXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotICAgIHZpcnR1YWwgYm9v
bCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLSAgICB2aXJ0dWFsIHZvaWQg
cmVzZXQoKTsKLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0
IERPTVN0cmluZyAmdmFsdWUpOwotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKTsKLSAgICB2
b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLQotICAgIHZvaWQg
aW52YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVlSXNWYWxpZCA9IGZhbHNlOyB9Ci0gICAgdm9pZCB1
cGRhdGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hl
c1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmly
dHVhbCBib29sIGlzRWRpdGFibGUoKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5
QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0gICAgCi0gICAgRE9NU3RyaW5nIGFjY2Vz
c0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsK
LQotICAgIHZvaWQgc2V0Q29scyhpbnQpOwotCi0gICAgdm9pZCBzZXRSb3dzKGludCk7Ci0KLXBy
b3RlY3RlZDoKLSAgICBpbnQgbV9yb3dzOwotICAgIGludCBtX2NvbHM7Ci0gICAgV3JhcE1ldGhv
ZCBtX3dyYXA7Ci0gICAgUVN0cmluZyBtX3ZhbHVlOwotICAgIGJvb2wgbV92YWx1ZUlzVmFsaWQ7
Ci0gICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBIVE1MSXNJbmRleEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVu
dEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotCi0gICAgdmlydHVhbCBI
VE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVz
Rm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVy
biAwOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0
cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgcHJvbXB0KCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9N
U3RyaW5nIG1fcHJvbXB0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgTm9kZUlt
cGw7CitjbGFzcyBIVE1MU2VsZWN0RWxlbWVudEltcGw7CiAKIGNsYXNzIEhUTUxPcHRpb25zQ29s
bGVjdGlvbkltcGwgOiBwdWJsaWMga2h0bWw6OlNoYXJlZDxIVE1MT3B0aW9uc0NvbGxlY3Rpb25J
bXBsPgogewogcHVibGljOgogICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwoSFRNTFNlbGVj
dEVsZW1lbnRJbXBsICppbXBsKSA6IG1fc2VsZWN0KGltcGwpIHsgfQogCi0gICAgdW5zaWduZWQg
bGVuZ3RoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMZW5ndGgodW5zaWduZWQpOwotICAgIE5vZGVJ
bXBsICppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKLSAgICBOb2RlSW1wbCAqbmFtZWRJdGVt
KGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3Q7CisgICAgdW5zaWduZWQgbGVuZ3RoKCkgY29u
c3QgeyByZXR1cm4gMDsgfQorICAgIHZvaWQgc2V0TGVuZ3RoKHVuc2lnbmVkKSB7IH0KKyAgICBO
b2RlSW1wbCAqaXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIE5v
ZGVJbXBsICpuYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBjb25zdCB7IHJldHVybiAw
OyB9CiAKICAgICB2b2lkIGRldGFjaCgpIHsgbV9zZWxlY3QgPSAwOyB9CiAKSW5kZXg6IGtodG1s
L2h0bWwvSFRNTExlZ2VuZEVsZW1lbnRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9I
VE1MTGVnZW5kRWxlbWVudEltcGwuaAkocmV2aXNpb24gMTE5NzYpCisrKyBraHRtbC9odG1sL0hU
TUxMZWdlbmRFbGVtZW50SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBAQAogICog
Q29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCiAgKiAgICAgICAg
ICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCiAgKiAgICAgICAg
ICAgKEMpIDIwMDAgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDQgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAw
NSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yMiw0
ODEgKzIyLDE0IEBACiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqCiAgKi8KLSNp
Zm5kZWYgSFRNTF9GT1JNSU1QTF9ICi0jZGVmaW5lIEhUTUxfRk9STUlNUExfSAorI2lmbmRlZiBI
VE1MX0hUTUxMZWdlbmRFbGVtZW50SW1wbF9ICisjZGVmaW5lIEhUTUxfSFRNTExlZ2VuZEVsZW1l
bnRJbXBsX0gKIAotI2luY2x1ZGUgImh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUg
Imh0bWwvaHRtbF9taXNjaW1wbC5oIgotCi0jaW5jbHVkZSA8cXB0cnZlY3Rvci5oPgotI2luY2x1
ZGUgPHFtZW1hcnJheS5oPgotI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hNYXAuaD4KLQotY2xhc3Mg
S0hUTUxWaWV3OwotY2xhc3MgUVRleHRDb2RlYzsKLQotbmFtZXNwYWNlIGtodG1sCi17Ci0gICAg
Y2xhc3MgRm9ybURhdGE7Ci0gICAgY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQ7Ci0gICAgY2xhc3Mg
UmVuZGVyVGV4dEFyZWE7Ci0gICAgY2xhc3MgUmVuZGVyU2VsZWN0OwotICAgIGNsYXNzIFJlbmRl
ckxpbmVFZGl0OwotICAgIGNsYXNzIFJlbmRlckZpbGVCdXR0b247Ci0gICAgY2xhc3MgUmVuZGVy
U2xpZGVyOwotfQorI2luY2x1ZGUgIkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmgiCiAKIG5h
bWVzcGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7Ci1jbGFzcyBGb3JtRGF0YUxpc3Q7Ci1j
bGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsK
LWNsYXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3MgSFRNTEltYWdlRWxlbWVudEltcGw7
Ci1jbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGw7Ci1j
bGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCi17Ci1w
dWJsaWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAg
dmlydHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3Rh
dHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7
IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0KLQot
ICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRv
RG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotIAot
ICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1lbnRzKCk7Ci0gICAgaW50IGxlbmd0
aCgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUoKSBjb25zdCB7IHJldHVybiBtX2Vu
Y3R5cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAg
RE9NU3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZGFyeTsgfQotICAgIHZv
aWQgc2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBhdXRvQ29tcGxl
dGUoKSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsgfQotCi0gICAgdmlydHVhbCB2b2lk
IHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAg
dm9pZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsICopOwot
ICAgIHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7
Ci0gICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKik7Ci0g
ICAgdm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVsZW1lbnRJbXBsICopOwotCi0gICAg
Ym9vbCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJtaXQoYm9vbCBhY3RpdmF0ZVN1Ym1p
dEJ1dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2b2lkIHNldE1hbGZv
cm1lZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9IG1hbGZvcm1lZDsgfQotICAgIHZp
cnR1YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1fbWFsZm9ybWVkOyB9Ci0gICAgCi0g
ICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0
OwotICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAgICBib29sIGZvcm1Xb3VsZEhhdmVT
ZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJsKTsKLQotICAgIERPTVN0cmluZyBu
YW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IERPTVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHRDaGFy
c2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY3Rpb24oKSBjb25zdDsK
LSAgICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcg
bWV0aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2QoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkxOG5EYXRhKCk7Ci0KLSAgICBmcmll
bmQgY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUNvbGxl
Y3Rpb25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBsOjpDb2xsZWN0aW9uSW5mbyAqY29s
bGVjdGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBs
PiBmb3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1MSW1hZ2VFbGVtZW50SW1wbD4gaW1n
RWxlbWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAgIERPTVN0cmluZyBtX3RhcmdldDsK
LSAgICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0cmluZyBtX2JvdW5kYXJ5OwotICAg
IERPTVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9vbCBtX3Bvc3QgOiAxOwotICAgIGJv
b2wgbV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRvY29tcGxldGUgOiAxOwotICAgIGJv
b2wgbV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5nc3VibWl0IDogMTsKLSAgICBib29s
IG1faW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1lZCA6IDE7Ci0gICAgCi1wcml2YXRl
OgotICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICBib29sIGZv
cm1EYXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQotICAgIHVuc2lnbmVkIGZvcm1FbGVt
ZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0KLSAgICBET01TdHJpbmcg
b2xkTmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxHZW5l
cmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1wbAotewotICAgIGZyaWVu
ZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVu
ZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudEltcGwgKmRvYywgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQo
KSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRh
Z1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1w
bCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdHlw
ZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRyb2woKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJu
ICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwot
ICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wgZGVlcCk7Ci0gICAgdmlydHVh
bCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0gICAgdmlydHVhbCB2b2lkIHJl
c2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAgICB2b2lkIG9uQ2hhbmdlKCk7Ci0K
LSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREaXNhYmxlZChib29sIF9k
aXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9v
bCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRh
YmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIGJvb2wgcmVhZE9ubHkoKSBjb25z
dCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBzZXRSZWFkT25seShib29sIF9yZWFk
T25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0K
LSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNv
bnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNHZW5lcmljRm9ybUVs
ZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9C
dXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLyoKLSAgICAgKiBvdmVycmlk
ZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNvZGVkIG5hbWU9dmFsdWUgcGFpcgot
ICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJuIHRydWUgZm9yIGEgc3VjY2Vzc2Z1
bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wg
YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkgeyByZXR1cm4gZmFsc2U7IH0KLQot
ICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3Rh
dGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZXMp
OwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29u
c3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZhdGVkU3VibWl0
KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNl
dFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICpn
ZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICptX2Zvcm07Ci0gICAg
Ym9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVhZE9ubHk6IDE7Ci0gICAgYm9vbCBt
X2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCdXR0
b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVi
bGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxCdXR0b25FbGVtZW50SW1w
bCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAgIFNVQk1JVCwKLSAgICAgICAgUkVT
RVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0
OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxlKik7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAg
dmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZp
cnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIHZp
cnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0gCi0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNl
dEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tl
eUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tl
eSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQot
ICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9N
U3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAg
IERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51bSAgbV90eXBlIDogMjsKLSAgICBi
b29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAgIG1fYWN0aXZlU3VibWl0IDogMTsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEZpZWxkU2V0RWxlbWVudElt
cGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBI
VE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50
SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVsZFNldEVsZW1lbnRJbXBsKCk7Ci0g
ICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAzOyB9Ci0g
ICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGto
dG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpS
ZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLX07
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGwgOiBw
dWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0
bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRmlsZUJ1
dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0gICAgZnJp
ZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1YmxpYzoKLSAgICAvLyBkbyBub3Qg
Y2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVtIHsKLSAgICAgICAgVEVYVCwKLSAg
ICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0gICAgICAgIENIRUNLQk9YLAotICAg
ICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAgICBSRVNFVCwKLSAgICAgICAgRklM
RSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwKLSAgICAgICAgQlVUVE9OCi0gICAg
ICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsKLQotICAgIEhUTUxJbnB1dEVsZW1l
bnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0g
ICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9j
dW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB2aXJ0dWFs
IH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVh
bCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3Rh
dHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJl
dHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0
OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGlucHV0
VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7
Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRl
OyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gY2hlY2tl
ZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJu
IGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1RleHRCdXR0b24oKSBjb25zdCB7IHJl
dHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBSRVNFVCB8fCBtX3R5cGUgPT0gQlVU
VE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBt
X3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1f
Y2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29sKTsKLSAgICBib29sIGluZGV0ZXJt
aW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5hdGU7IH0KLSAgICB2b2lkIHNldElu
ZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1f
bWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KLSAgICBE
T01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VHlwZShjb25zdCBET01TdHJpbmcm
IHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNv
bnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBET01TdHJpbmcgJik7
Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVN
YXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBt
X3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIG1haW50
YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NXT1JEOyB9Ci0gICAgdmlydHVhbCBR
U3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3RyaW5nTGlz
dCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigpOwotCi0gICAgaW50IHNlbGVjdGlv
blN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9u
U3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBz
ZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMgPSBmYWxzZSwgYm9vbCBz
aG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9u
KGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShj
b25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3Vs
dCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0
dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQ
cm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lk
IGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5k
ZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlz
dCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1Ym1pdEJ1dHRvbigp
IGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRlZFN1Ym1pdCgpIGNvbnN0OwotICAg
IHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFnKTsKLQotICAgIHR5cGVF
bnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQotICAgIHZvaWQgc2V0SW5w
dXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0
KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlwZT1pbWFnZSB3YXMgY2xpY2tlZC4K
LSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBvczsgfQotICAgIGludCBjbGlja1ko
KSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQqIHByZURpc3BhdGNo
RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3Bh
dGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKTsKLSAgICB2aXJ0dWFs
IHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCBi
b29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBhbHRUZXh0KCkgY29uc3Q7Ci0gICAg
Ci0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZUltcGwgKmF0dHIpIGNv
bnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7IHJldHVybiBtX21heFJlc3VsdHM7
IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldERl
ZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAgCi0gICAgYm9vbCBkZWZhdWx0Q2hl
Y2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbCk7Ci0KLSAgICBE
T01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY2NlcHQoY29uc3QgRE9NU3Ry
aW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0
QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNv
bnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3Ry
aW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNvbnN0IERPTVN0cmluZyAmKTsKLQot
ICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBET01TdHJpbmcgc3JjKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXRNYXhM
ZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAoKSBjb25zdDsKLSAgICB2b2lkIHNl
dFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIHN0b3Jl
c1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7Ci0KLSAgICBBdG9taWNTdHJpbmcg
bV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAgIGludCAgICAgICB4UG9zOwotICAg
IHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAgbV9zaXplOwotICAgIHNob3J0ICAg
ICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0czsKLQotICAgIEhUTUxJbWFnZUxv
YWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVtIG1fdHlwZSA6IDQ7Ci0gICAgYm9v
bCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0Q2hlY2tlZCA6IDE7Ci0gICAgYm9v
bCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29sIG1faW5kZXRlcm1pbmF0ZSA6IDE7
Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29sIG1fYWN0aXZlU3VibWl0IDogMTsK
LSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBib29sIG1fdmFsdWVNYXRjaGVzUmVu
ZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MTGFiZWxF
bGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1M
TGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTExh
YmVsRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3Qg
eyByZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1w
bCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRv
QW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZm9ybSBlbGVtZW50IHRoaXMgbGFi
ZWwgaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1l
bnQoKTsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0oKTsKLQotICAgIERPTVN0cmlu
ZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBET01TdHJp
bmcgJik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0SHRt
bEZvcihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIGZvY3VzKCk7Ci0KLSBwcml2YXRl
OgotICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50SUQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCitjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwogCiBjbGFzcyBIVE1MTGVnZW5kRWxlbWVu
dEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKIHsKQEAgLTUyNiwzMDgg
KzU5LDYgQEAgcHVibGljOgogICAgIHZvaWQgZm9jdXMoKTsKIH07CiAKLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTZWxlY3Q7
Ci0KLXB1YmxpYzoKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFNlbGVjdEVsZW1lbnRJbXBsKCk7Ci0gICAg
dm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0
dXJuIDY7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0No
aWxkKTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICBpbnQgc2VsZWN0ZWRJbmRleCgpIGNv
bnN0OwotICAgIHZvaWQgc2V0U2VsZWN0ZWRJbmRleCggaW50IGluZGV4ICk7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBp
bnQgbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICBpbnQgbWluV2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X21pbndpZHRoOyB9Ci0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQot
Ci0gICAgYm9vbCBtdWx0aXBsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbXVsdGlwbGU7IH0KLQotICAg
IHZvaWQgYWRkICggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBIVE1MRWxlbWVudEltcGwgKmJl
Zm9yZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdm9pZCByZW1vdmUgKCBpbnQgaW5kZXgg
KTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpOwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9N
U3RyaW5nICYpOwotICAgIAotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgKm9wdGlvbnMo
KTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBvcHRpb25zSFRNTENvbGxlY3Rpb24o
KTsgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGFuZCBtaWdyYXRlIHRvIG9wdGlvbnMoKS4KLQotICAg
IHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0
dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJp
bmdMaXN0ICYpOwotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUlt
cGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwg
Tm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5v
ZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFkZENo
aWxkKCBOb2RlSW1wbCogbmV3Q2hpbGQgKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNo
YW5nZWQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAq
Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotICAg
IHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAg
IC8vIGdldCB0aGUgYWN0dWFsIGxpc3Rib3ggaW5kZXggb2YgdGhlIG9wdGlvbkluZGV4dGggb3B0
aW9uCi0gICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3Q7Ci0g
ICAgLy8gcmV2ZXJzZSBvZiBvcHRpb25Ub0xpc3RJbmRleCAtIGdldCBvcHRpb25JbmRleCBmcm9t
IGxpc3Rib3hJbmRleAotICAgIGludCBsaXN0VG9PcHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBj
b25zdDsKLQotICAgIHZvaWQgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLSAgICBRTWVtQXJyYXk8
SFRNTEVsZW1lbnRJbXBsKj4gbGlzdEl0ZW1zKCkgY29uc3QKLSAgICAgewotICAgICAgICAgaWYg
KG1fcmVjYWxjTGlzdEl0ZW1zKSBjb25zdF9jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHRo
aXMpLT5yZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgIHJldHVybiBtX2xpc3RJdGVtczsKLSAg
ICAgfQotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotICAgIHZvaWQgbm90aWZ5T3B0aW9uU2Vs
ZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwgYm9vbCBzZWxlY3Rl
ZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2
dCk7Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1l
bnQpOwotCi0gICAgdm9pZCBzZXRNdWx0aXBsZShib29sKTsKLQotICAgIHZvaWQgc2V0U2l6ZShp
bnQpOwotCi1wcml2YXRlOgotICAgIHZvaWQgcmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBtdXRhYmxlIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBtX2xpc3RJdGVtczsK
LSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICptX29wdGlvbnM7Ci0gICAgc2hvcnQgbV9t
aW53aWR0aDsKLSAgICBzaG9ydCBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJv
b2wgbV9yZWNhbGNMaXN0SXRlbXM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNz
IEhUTUxLZXlnZW5FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MU2VsZWN0RWxlbWVudEltcGwKLXsK
LXB1YmxpYzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5
KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQot
ICAgIC8vICMjIyB0aGlzIGlzIGp1c3QgYSByb3VnaCBndWVzcwotICAgIHZpcnR1YWwgYm9vbCBp
c0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAg
dmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotcHJvdGVj
dGVkOgotICAgIEF0b21pY1N0cmluZyBtX2NoYWxsZW5nZTsKLSAgICBBdG9taWNTdHJpbmcgbV9r
ZXlUeXBlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0R3JvdXBF
bGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGlj
OgotICAgIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9y
bUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTE9wdEdyb3VwRWxlbWVudElt
cGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hp
bGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKSB8
fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmhyVGFnKTsgfQotCi0gICAgRE9NU3Ry
aW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0
OwotICAgIAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpu
ZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJ
bXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1w
bCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSAp
OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxk
LCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCgg
Tm9kZUltcGwqIG5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmli
dXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAgIHZvaWQgcmVjYWxjU2VsZWN0T3B0
aW9ucygpOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJl
bChjb25zdCBET01TdHJpbmcgJik7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlclNlbGVjdDsKLSAgICBmcmll
bmQgY2xhc3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0KLXB1YmxpYzoKLSAgICBIVE1M
T3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwg
KmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFn
UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAyOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFRE
KGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUo
KSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNjcmlwdFRhZyk7IH0KLQotICAg
IHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIHR5cGUo
KSBjb25zdDsKLQotICAgIERPTVN0cmluZyB0ZXh0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUZXh0
KGNvbnN0IERPTVN0cmluZyAmLCBpbnQgJmV4Y2VwdGlvbik7Ci0KLSAgICBpbnQgaW5kZXgoKSBj
b25zdDsKLSAgICB2b2lkIHNldEluZGV4KGludCwgaW50ICZleGNlcHRpb24pOwotICAgIHZpcnR1
YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsK
LQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBzZWxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc2Vs
ZWN0ZWQ7IH0KLSAgICB2b2lkIHNldFNlbGVjdGVkKGJvb2wgX3NlbGVjdGVkKTsKLQotICAgIEhU
TUxTZWxlY3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBib29sIGRlZmF1bHRTZWxlY3RlZCgpIGNvbnN0
OwotICAgIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKCBib29sICk7Ci0KLSAgICBET01TdHJpbmcg
bGFiZWwoKSBjb25zdDsKLSAgICB2b2lkIHNldExhYmVsKCBjb25zdCBET01TdHJpbmcgJiApOwot
Ci1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAgYm9vbCBtX3NlbGVjdGVk
OwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1l
bnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5k
IGNsYXNzIGtodG1sOjpSZW5kZXJUZXh0QXJlYTsKLQotcHVibGljOgotICAgIGVudW0gV3JhcE1l
dGhvZCB7Ci0gICAgICAgIHRhX05vV3JhcCwKLSAgICAgICAgdGFfVmlydHVhbCwKLSAgICAgICAg
dGFfUGh5c2ljYWwKLSAgICB9OwotCi0gICAgSFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1l
bnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFRleHRB
cmVhRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2Rl
SW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCk7IH0KLQotICAg
IGludCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9Ci0gICAgaW50IHJvd3MoKSBjb25z
dCB7IHJldHVybiBtX3Jvd3M7IH0KLQotICAgIFdyYXBNZXRob2Qgd3JhcCgpIGNvbnN0IHsgcmV0
dXJuIG1fd3JhcDsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3Qg
eyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZp
cnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFs
IFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdM
aXN0ICYpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVu
ZCgpOwotCi0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2Vs
ZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCAoICApOwotICAgIHZvaWQgc2V0U2Vs
ZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdl
ZCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJl
bmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotICAgIHZpcnR1YWwg
Ym9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLSAgICB2aXJ0dWFsIHZv
aWQgcmVzZXQoKTsKLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKTsKLSAg
ICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLQotICAgIHZv
aWQgaW52YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVlSXNWYWxpZCA9IGZhbHNlOyB9Ci0gICAgdm9p
ZCB1cGRhdGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0
Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAg
dmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNz
S2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0gICAgCi0gICAgRE9NU3RyaW5nIGFj
Y2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAm
KTsKLQotICAgIHZvaWQgc2V0Q29scyhpbnQpOwotCi0gICAgdm9pZCBzZXRSb3dzKGludCk7Ci0K
LXByb3RlY3RlZDoKLSAgICBpbnQgbV9yb3dzOwotICAgIGludCBtX2NvbHM7Ci0gICAgV3JhcE1l
dGhvZCBtX3dyYXA7Ci0gICAgUVN0cmluZyBtX3ZhbHVlOwotICAgIGJvb2wgbV92YWx1ZUlzVmFs
aWQ7Ci0gICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOwotfTsKLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1jbGFzcyBIVE1MSXNJbmRleEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxJbnB1
dEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotCi0gICAgdmlydHVh
bCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3Rh
dHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJl
dHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgcHJvbXB0KCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAg
RE9NU3RyaW5nIG1fcHJvbXB0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsIDogcHVibGljIGtodG1sOjpTaGFyZWQ8SFRNTE9wdGlv
bnNDb2xsZWN0aW9uSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25J
bXBsKEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqaW1wbCkgOiBtX3NlbGVjdChpbXBsKSB7IH0KLQot
ICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TGVuZ3RoKHVuc2lnbmVk
KTsKLSAgICBOb2RlSW1wbCAqaXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3Q7Ci0gICAgTm9kZUlt
cGwgKm5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUpIGNvbnN0OwotCi0gICAgdm9pZCBk
ZXRhY2goKSB7IG1fc2VsZWN0ID0gMDsgfQotCi1wcml2YXRlOgotICAgIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbCAqbV9zZWxlY3Q7Ci19OwotCiB9IC8vbmFtZXNwYWNlCiAKICNlbmRpZgpJbmRleDog
a2h0bWwvaHRtbC9odG1sX2RvY3VtZW50aW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRt
bC9odG1sX2RvY3VtZW50aW1wbC5jcHAJKHJldmlzaW9uIDExOTc4KQorKysga2h0bWwvaHRtbC9o
dG1sX2RvY3VtZW50aW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDcgKzYwLDYgQEAKICNp
bmNsdWRlICJodG1sL2h0bWx0b2tlbml6ZXIuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfbWlzY2lt
cGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9o
dG1sX2Zvcm1pbXBsLmgiCiAjaW5jbHVkZSAiaHRtbGZhY3RvcnkuaCIKIAogI2luY2x1ZGUgImto
dG1sdmlldy5oIgpJbmRleDoga2h0bWwvaHRtbC9IVE1MRmllbGRTZXRFbGVtZW50SW1wbC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTEZpZWxkU2V0RWxlbWVudEltcGwuaAkocmV2aXNp
b24gMTE5NzYpCisrKyBraHRtbC9odG1sL0hUTUxGaWVsZFNldEVsZW1lbnRJbXBsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAo
a29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11
ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5j
LgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMu
CiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDI1NiArMjIsMjAgQEAKICAqIEJvc3RvbiwgTUEg
MDIxMTEtMTMwNywgVVNBLgogICoKICAqLwotI2lmbmRlZiBIVE1MX0ZPUk1JTVBMX0gKLSNkZWZp
bmUgSFRNTF9GT1JNSU1QTF9ICisjaWZuZGVmIEtIVE1MX0hUTUxGaWVsZFNldEVsZW1lbnRJbXBs
X0gKKyNkZWZpbmUgS0hUTUxfSFRNTEZpZWxkU2V0RWxlbWVudEltcGxfSAogCi0jaW5jbHVkZSAi
aHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX21pc2NpbXBsLmgi
CisjaW5jbHVkZSAiSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCIKIAotI2luY2x1ZGUgPHFw
dHJ2ZWN0b3IuaD4KLSNpbmNsdWRlIDxxbWVtYXJyYXkuaD4KLSNpbmNsdWRlIDxreG1sY29yZS9I
YXNoTWFwLmg+Ci0KLWNsYXNzIEtIVE1MVmlldzsKLWNsYXNzIFFUZXh0Q29kZWM7Ci0KLW5hbWVz
cGFjZSBraHRtbAotewotICAgIGNsYXNzIEZvcm1EYXRhOwotICAgIGNsYXNzIFJlbmRlckZvcm1F
bGVtZW50OwotICAgIGNsYXNzIFJlbmRlclRleHRBcmVhOwotICAgIGNsYXNzIFJlbmRlclNlbGVj
dDsKLSAgICBjbGFzcyBSZW5kZXJMaW5lRWRpdDsKLSAgICBjbGFzcyBSZW5kZXJGaWxlQnV0dG9u
OwotICAgIGNsYXNzIFJlbmRlclNsaWRlcjsKK25hbWVzcGFjZSBraHRtbCB7CisgICAgY2xhc3Mg
UmVuZGVyU3R5bGU7CiB9CiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7Ci1j
bGFzcyBGb3JtRGF0YUxpc3Q7CiBjbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3Mg
SFRNTEltYWdlRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1M
T3B0aW9uRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMg
SFRNTEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0g
ICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1
cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0
dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1l
bnRzKCk7Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUo
KSBjb25zdCB7IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4g
bV9ib3VuZGFyeTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgYm9vbCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsg
fQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTElt
YWdlRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVs
ZW1lbnRJbXBsICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJt
aXQoYm9vbCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7
Ci0KLSAgICB2b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9
IG1hbGZvcm1lZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1f
bWFsZm9ybWVkOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAg
ICBib29sIGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJs
KTsKLQotICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0
cmluZyBhY3Rpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2Qo
Y29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkx
OG5EYXRhKCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVu
ZCBjbGFzcyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBs
OjpDb2xsZWN0aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1M
SW1hZ2VFbGVtZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAg
IERPTVN0cmluZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0
cmluZyBtX2JvdW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9v
bCBtX3Bvc3QgOiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRv
Y29tcGxldGUgOiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5n
c3VibWl0IDogMTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1l
ZCA6IDE7Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0
cmluZyAmKTsKLSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQot
ICAgIHVuc2lnbmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwg
Kik7Ci0KLSAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVt
ZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZy
aWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwg
fkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0
dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0g
ICAgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAg
dmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBp
c0NvbnRyb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5h
YmxlZCgpIGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmly
dHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJv
b2wgZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwot
Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAg
ICB2b2lkIG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXREaXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNv
bnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAg
IGJvb2wgcmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBz
ZXRSZWFkT25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5
bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgaXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0g
ICAgLyoKLSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNv
ZGVkIG5hbWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJu
IHRydWUgZm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAg
Ki8KLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkg
eyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAg
ICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRl
KFFTdHJpbmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1
Ym1pdEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlz
QWN0aXZhdGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZv
aWQgc2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgo
KSBjb25zdDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBI
VE1MRm9ybUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1l
bnRJbXBsICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVh
ZE9ubHk6IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwg
fkhUTUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAg
IFNVQk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBE
T01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5k
ZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxl
Kik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZl
bnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxp
c3QmLCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0
dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7
Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAg
dmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0g
ICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERP
TVN0cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51
bSAgbV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAg
IG1fYWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIERv
Y3VtZW50SW1wbDsKK2NsYXNzIE5vZGVJbXBsOwogCiBjbGFzcyBIVE1MRmllbGRTZXRFbGVtZW50
SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAogewpAQCAtMjg5LDU0NSAr
NTMsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwogfTsK
IAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbCA6IHB1
YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRt
bDo6UmVuZGVyTGluZUVkaXQ7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJGaWxlQnV0
dG9uOwotCi0gICAgZnJpZW5kIGNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbDsKLSAgICBmcmll
bmQgY2xhc3Mga2h0bWw6OlJlbmRlclNsaWRlcjsKLQotcHVibGljOgotICAgIC8vIGRvIG5vdCBj
aGFuZ2UgdGhlIG9yZGVyIQotICAgIGVudW0gdHlwZUVudW0gewotICAgICAgICBURVhULAotICAg
ICAgICBQQVNTV09SRCwKLSAgICAgICAgSVNJTkRFWCwKLSAgICAgICAgQ0hFQ0tCT1gsCi0gICAg
ICAgIFJBRElPLAotICAgICAgICBTVUJNSVQsCi0gICAgICAgIFJFU0VULAotICAgICAgICBGSUxF
LAotICAgICAgICBISURERU4sCi0gICAgICAgIElNQUdFLAotICAgICAgICBCVVRUT04KLSAgICAg
ICAgLFNFQVJDSCwKLSAgICAgICAgUkFOR0UKLSAgICB9OwotCi0gICAgSFRNTElucHV0RWxlbWVu
dEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAg
ICBIVE1MSW5wdXRFbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwg
fkhUTUxJbnB1dEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFs
IEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0
dXNGb3JiaWRkZW47IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0
dXJuIDA7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gaW5wdXRU
eXBlKCkgIT0gSU1BR0U7IH0KLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5hbWUoKSBjb25zdDsK
LQotICAgIGJvb2wgYXV0b0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gbV9hdXRvY29tcGxldGU7
IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0NoZWNrZWQoKSBjb25zdCB7IHJldHVybiBjaGVja2Vk
KCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbmRldGVybWluYXRlKCkgY29uc3QgeyByZXR1cm4g
aW5kZXRlcm1pbmF0ZSgpOyB9Ci0KLSAgICBib29sIGlzVGV4dEJ1dHRvbigpIGNvbnN0IHsgcmV0
dXJuIG1fdHlwZSA9PSBTVUJNSVQgfHwgbV90eXBlID09IFJFU0VUIHx8IG1fdHlwZSA9PSBCVVRU
T047IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSYWRpb0J1dHRvbigpIGNvbnN0IHsgcmV0dXJuIG1f
dHlwZSA9PSBSQURJTzsgfQotCi0gICAgYm9vbCBjaGVja2VkKCkgY29uc3QgeyByZXR1cm4gbV9j
aGVja2VkOyB9Ci0gICAgdm9pZCBzZXRDaGVja2VkKGJvb2wpOwotICAgIGJvb2wgaW5kZXRlcm1p
bmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXRlcm1pbmF0ZTsgfQotICAgIHZvaWQgc2V0SW5k
ZXRlcm1pbmF0ZShib29sKTsKLSAgICBpbnQgbWF4TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9t
YXhMZW47IH0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotICAgIERP
TVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUeXBlKGNvbnN0IERPTVN0cmluZyYg
dCk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAgICB2b2lkIHNldFZhbHVlKGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZVdpdGhEZWZhdWx0KCkgY29u
c3Q7Ci0KLSAgICB2b2lkIHNldFZhbHVlRnJvbVJlbmRlcmVyKGNvbnN0IERPTVN0cmluZyAmKTsK
LSAgICBib29sIHZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZU1h
dGNoZXNSZW5kZXJlcjsgfQotICAgIHZvaWQgc2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKSB7IG1f
dmFsdWVNYXRjaGVzUmVuZGVyZXIgPSB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRh
aW5zU3RhdGUoKSB7IHJldHVybiBtX3R5cGUgIT0gUEFTU1dPUkQ7IH0KLSAgICB2aXJ0dWFsIFFT
dHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0
ICYpOwotCi0gICAgYm9vbCBjYW5IYXZlU2VsZWN0aW9uKCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9u
U3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25T
dGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNl
bGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotICAgIAotICAg
IHZpcnR1YWwgdm9pZCBjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cyA9IGZhbHNlLCBib29sIHNo
b3dQcmVzc2VkTG9vayA9IHRydWUpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24o
Ym9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNv
bnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0
KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0
cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY29weU5vbkF0dHJpYnV0ZVBy
b3BlcnRpZXMoY29uc3QgRWxlbWVudEltcGwgKnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
YXR0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoa2h0bWw6OlJlbmRl
clN0eWxlICopOwotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVy
ZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9p
ZCBkZXRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0
JiwgYm9vbCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7Ci0gICAg
dmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAgdHlwZUVu
dW0gaW5wdXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9Ci0gICAgdm9pZCBzZXRJbnB1
dFR5cGUoY29uc3QgRE9NU3RyaW5nJiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQo
KTsKLQotICAgIC8vIHVzZWQgaW4gY2FzZSBpbnB1dCB0eXBlPWltYWdlIHdhcyBjbGlja2VkLgot
ICAgIGludCBjbGlja1goKSBjb25zdCB7IHJldHVybiB4UG9zOyB9Ci0gICAgaW50IGNsaWNrWSgp
IGNvbnN0IHsgcmV0dXJuIHlQb3M7IH0KLQotICAgIHZpcnR1YWwgdm9pZCogcHJlRGlzcGF0Y2hF
dmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBwb3N0RGlzcGF0
Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQqIGRhdGEpOwotICAgIHZpcnR1YWwg
dm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2aXJ0dWFsIGJv
b2wgaXNFZGl0YWJsZSgpOwotCi0gICAgRE9NU3RyaW5nIGFsdFRleHQoKSBjb25zdDsKLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29u
c3Q7Ci0KLSAgICBpbnQgbWF4UmVzdWx0cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF4UmVzdWx0czsg
fQotCi0gICAgRE9NU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVm
YXVsdFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBib29sIGRlZmF1bHRDaGVj
a2VkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREZWZhdWx0Q2hlY2tlZChib29sKTsKLQotICAgIERP
TVN0cmluZyBhY2NlcHQoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2VwdChjb25zdCBET01TdHJp
bmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWNjZXNzS2V5KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRB
Y2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFsaWduKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJp
bmcgYWx0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0g
ICAgdm9pZCBzZXRTaXplKHVuc2lnbmVkKTsKLQotICAgIERPTVN0cmluZyBzcmMoKSBjb25zdDsK
LSAgICB2b2lkIHNldFNyYyhjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldE1heExl
bmd0aChpbnQpOwotCi0gICAgRE9NU3RyaW5nIHVzZU1hcCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
VXNlTWFwKGNvbnN0IERPTVN0cmluZyAmKTsKLQotcHJvdGVjdGVkOgotICAgIGJvb2wgc3RvcmVz
VmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSBjb25zdDsKLQotICAgIEF0b21pY1N0cmluZyBt
X25hbWU7Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAgaW50ICAgICAgIHhQb3M7Ci0gICAg
c2hvcnQgICAgIG1fbWF4TGVuOwotICAgIHNob3J0ICAgICBtX3NpemU7Ci0gICAgc2hvcnQgICAg
IHlQb3M7Ci0KLSAgICBzaG9ydCAgICAgbV9tYXhSZXN1bHRzOwotCi0gICAgSFRNTEltYWdlTG9h
ZGVyKiBtX2ltYWdlTG9hZGVyOwotCi0gICAgdHlwZUVudW0gbV90eXBlIDogNDsKLSAgICBib29s
IG1fY2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBtX2RlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29s
IG1fdXNlRGVmYXVsdENoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9pbmRldGVybWluYXRlIDogMTsK
LSAgICBib29sIG1faGF2ZVR5cGUgOiAxOwotICAgIGJvb2wgbV9hY3RpdmVTdWJtaXQgOiAxOwot
ICAgIGJvb2wgbV9hdXRvY29tcGxldGUgOiAxOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5k
ZXJlciA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMYWJlbEVs
ZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxM
YWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5IVE1MTGFi
ZWxFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7
IHJldHVybiA1OyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBs
ICphdHRyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9B
bnlFbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIHRoZSBmb3JtIGVsZW1lbnQgdGhpcyBsYWJl
bCBpcyBhc3NvY2lhdGVkIHRvLgotICAgICAqLwotICAgIEVsZW1lbnRJbXBsICpmb3JtRWxlbWVu
dCgpOwotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpOwotCi0gICAgRE9NU3RyaW5n
IGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmlu
ZyAmKTsKLQotICAgIERPTVN0cmluZyBodG1sRm9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIdG1s
Rm9yKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgZm9jdXMoKTsKLQotIHByaXZhdGU6
Ci0gICAgRE9NU3RyaW5nIG1fZm9ybUVsZW1lbnRJRDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTExlZ2VuZEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTExlZ2VuZEVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+
SFRNTExlZ2VuZEVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUo
KSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJl
bmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1
YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlB
Y3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmaXJz
dCBmb3JtIGVsZW1lbnQgaW4gdGhlIGxlZ2VuZCdzIGZpZWxkc2V0IAotICAgICAqLwotICAgIEVs
ZW1lbnRJbXBsICpmb3JtRWxlbWVudCgpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNv
bnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERP
TVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5n
ICYpOwotICAgIAotICAgIHZvaWQgZm9jdXMoKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0KLXB1
YmxpYzoKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxG
b3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVu
dEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFNlbGVjdEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9pZCBp
bml0KCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsK
LQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxj
U3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0U2VsZWN0ZWRJbmRleCggaW50IGluZGV4ICk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBpbnQgbGVu
Z3RoKCkgY29uc3Q7Ci0KLSAgICBpbnQgbWluV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21pbndp
ZHRoOyB9Ci0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAg
Ym9vbCBtdWx0aXBsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbXVsdGlwbGU7IH0KLQotICAgIHZvaWQg
YWRkICggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50LCBIVE1MRWxlbWVudEltcGwgKmJlZm9yZSwg
aW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdm9pZCByZW1vdmUgKCBpbnQgaW5kZXggKTsKLQot
ICAgIERPTVN0cmluZyB2YWx1ZSgpOwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5n
ICYpOwotICAgIAotICAgIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgKm9wdGlvbnMoKTsKLSAg
ICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBvcHRpb25zSFRNTENvbGxlY3Rpb24oKTsgLy8g
RklYTUU6IFJlbW92ZSB0aGlzIGFuZCBtaWdyYXRlIHRvIG9wdGlvbnMoKS4KLQotICAgIHZpcnR1
YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFT
dHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0
ICYpOwotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5l
d0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZp
cnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUlt
cGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBs
ICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFkZENoaWxkKCBO
b2RlSW1wbCogbmV3Q2hpbGQgKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQo
KTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRl
UmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1
YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLQotICAgIC8vIGdl
dCB0aGUgYWN0dWFsIGxpc3Rib3ggaW5kZXggb2YgdGhlIG9wdGlvbkluZGV4dGggb3B0aW9uCi0g
ICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3Q7Ci0gICAgLy8g
cmV2ZXJzZSBvZiBvcHRpb25Ub0xpc3RJbmRleCAtIGdldCBvcHRpb25JbmRleCBmcm9tIGxpc3Ri
b3hJbmRleAotICAgIGludCBsaXN0VG9PcHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBjb25zdDsK
LQotICAgIHZvaWQgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVs
ZW1lbnRJbXBsKj4gbGlzdEl0ZW1zKCkgY29uc3QKLSAgICAgewotICAgICAgICAgaWYgKG1fcmVj
YWxjTGlzdEl0ZW1zKSBjb25zdF9jYXN0PEhUTUxTZWxlY3RFbGVtZW50SW1wbCo+KHRoaXMpLT5y
ZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgIHJldHVybiBtX2xpc3RJdGVtczsKLSAgICAgfQot
ICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotICAgIHZvaWQgbm90aWZ5T3B0aW9uU2VsZWN0ZWQo
SFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3RlZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCk7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0g
ICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwot
Ci0gICAgdm9pZCBzZXRNdWx0aXBsZShib29sKTsKLQotICAgIHZvaWQgc2V0U2l6ZShpbnQpOwot
Ci1wcml2YXRlOgotICAgIHZvaWQgcmVjYWxjTGlzdEl0ZW1zKCk7Ci0KLXByb3RlY3RlZDoKLSAg
ICBtdXRhYmxlIFFNZW1BcnJheTxIVE1MRWxlbWVudEltcGwqPiBtX2xpc3RJdGVtczsKLSAgICBI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICptX29wdGlvbnM7Ci0gICAgc2hvcnQgbV9taW53aWR0
aDsKLSAgICBzaG9ydCBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJvb2wgbV9y
ZWNhbGNMaXN0SXRlbXM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxL
ZXlnZW5FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MU2VsZWN0RWxlbWVudEltcGwKLXsKLXB1Ymxp
YzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29u
c3QgeyByZXR1cm4gMDsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIC8v
ICMjIyB0aGlzIGlzIGp1c3QgYSByb3VnaCBndWVzcwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1l
cmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVh
bCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotcHJvdGVjdGVkOgot
ICAgIEF0b21pY1N0cmluZyBtX2NoYWxsZW5nZTsKLSAgICBBdG9taWNTdHJpbmcgbV9rZXlUeXBl
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAg
IEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1l
bnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoKTsK
LQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsg
cmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKSB8fCBuZXdD
aGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmhyVGFnKTsgfQotCi0gICAgRE9NU3RyaW5nIHR5
cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAg
IAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGls
ZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFs
IE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpv
bGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVt
b3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAg
IHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUlt
cGwqIG5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAgIHZvaWQgcmVjYWxjU2VsZWN0T3B0aW9ucygp
OwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbChjb25z
dCBET01TdHJpbmcgJik7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBI
VE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwK
LXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlclNlbGVjdDsKLSAgICBmcmllbmQgY2xh
c3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVudEltcGw7Ci0KLXB1YmxpYzoKLSAgICBIVE1MT3B0aW9u
RWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAw
KTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0
IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiAyOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0
IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBu
ZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNjcmlwdFRhZyk7IH0KLQotICAgIHZpcnR1
YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25z
dDsKLQotICAgIERPTVN0cmluZyB0ZXh0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUZXh0KGNvbnN0
IERPTVN0cmluZyAmLCBpbnQgJmV4Y2VwdGlvbik7Ci0KLSAgICBpbnQgaW5kZXgoKSBjb25zdDsK
LSAgICB2b2lkIHNldEluZGV4KGludCwgaW50ICZleGNlcHRpb24pOwotICAgIHZpcnR1YWwgdm9p
ZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAg
IERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3Ry
aW5nICYpOwotCi0gICAgYm9vbCBzZWxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWQ7
IH0KLSAgICB2b2lkIHNldFNlbGVjdGVkKGJvb2wgX3NlbGVjdGVkKTsKLQotICAgIEhUTUxTZWxl
Y3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hp
bGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBib29sIGRlZmF1bHRTZWxlY3RlZCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKCBib29sICk7Ci0KLSAgICBET01TdHJpbmcgbGFiZWwo
KSBjb25zdDsKLSAgICB2b2lkIHNldExhYmVsKCBjb25zdCBET01TdHJpbmcgJiApOwotCi1wcm90
ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAgYm9vbCBtX3NlbGVjdGVkOwotfTsK
LQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBs
IDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNz
IGtodG1sOjpSZW5kZXJUZXh0QXJlYTsKLQotcHVibGljOgotICAgIGVudW0gV3JhcE1ldGhvZCB7
Ci0gICAgICAgIHRhX05vV3JhcCwKLSAgICAgICAgdGFfVmlydHVhbCwKLSAgICAgICAgdGFfUGh5
c2ljYWwKLSAgICB9OwotCi0gICAgSFRNTFRleHRBcmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBs
ICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFRleHRBcmVhRWxl
bWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCog
bmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCk7IH0KLQotICAgIGludCBj
b2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9Ci0gICAgaW50IHJvd3MoKSBjb25zdCB7IHJl
dHVybiBtX3Jvd3M7IH0KLQotICAgIFdyYXBNZXRob2Qgd3JhcCgpIGNvbnN0IHsgcmV0dXJuIG1f
d3JhcDsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwg
Ym9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJp
bmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYp
OwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwot
Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9u
RW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCAoICApOwotICAgIHZvaWQgc2V0U2VsZWN0aW9u
UmFuZ2UoaW50LCBpbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwot
ICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBs
ICphdHRyKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQg
YXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCBh
cHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVz
ZXQoKTsKLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERP
TVN0cmluZyAmdmFsdWUpOwotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKTsKLSAgICB2b2lk
IHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLQotICAgIHZvaWQgaW52
YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVlSXNWYWxpZCA9IGZhbHNlOyB9Ci0gICAgdm9pZCB1cGRh
dGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1Jl
bmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVh
bCBib29sIGlzRWRpdGFibGUoKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0
aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0gICAgCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tl
eSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQot
ICAgIHZvaWQgc2V0Q29scyhpbnQpOwotCi0gICAgdm9pZCBzZXRSb3dzKGludCk7Ci0KLXByb3Rl
Y3RlZDoKLSAgICBpbnQgbV9yb3dzOwotICAgIGludCBtX2NvbHM7Ci0gICAgV3JhcE1ldGhvZCBt
X3dyYXA7Ci0gICAgUVN0cmluZyBtX3ZhbHVlOwotICAgIGJvb2wgbV92YWx1ZUlzVmFsaWQ7Ci0g
ICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBIVE1MSXNJbmRleEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxJbnB1dEVsZW1l
bnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTElzSW5kZXhFbGVtZW50SW1wbChEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotCi0gICAgdmlydHVhbCBIVE1M
VGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9y
YmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAw
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgcHJvbXB0KCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3Ry
aW5nIG1fcHJvbXB0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0
aW9uc0NvbGxlY3Rpb25JbXBsIDogcHVibGljIGtodG1sOjpTaGFyZWQ8SFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsKEhU
TUxTZWxlY3RFbGVtZW50SW1wbCAqaW1wbCkgOiBtX3NlbGVjdChpbXBsKSB7IH0KLQotICAgIHVu
c2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TGVuZ3RoKHVuc2lnbmVkKTsKLSAg
ICBOb2RlSW1wbCAqaXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKm5h
bWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUpIGNvbnN0OwotCi0gICAgdm9pZCBkZXRhY2go
KSB7IG1fc2VsZWN0ID0gMDsgfQotCi1wcml2YXRlOgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1w
bCAqbV9zZWxlY3Q7Ci19OwotCiB9IC8vbmFtZXNwYWNlCiAKICNlbmRpZgpJbmRleDoga2h0bWwv
aHRtbC9IVE1MSW5wdXRFbGVtZW50SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRN
TElucHV0RWxlbWVudEltcGwuaAkocmV2aXNpb24gMTE5NzYpCisrKyBraHRtbC9odG1sL0hUTUxJ
bnB1dEVsZW1lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5
cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAo
QykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAo
QykgMjAwMCBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykg
MjAwNCBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAy
MDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDI1ICsy
MiwxMiBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZuZGVm
IEhUTUxfRk9STUlNUExfSAotI2RlZmluZSBIVE1MX0ZPUk1JTVBMX0gKKyNpZm5kZWYgSFRNTF9I
VE1MSW5wdXRFbGVtZW50SW1wbExfSAorI2RlZmluZSBIVE1MX0hUTUxJbnB1dEVsZW1lbnRJbXBs
TF9ICiAKLSNpbmNsdWRlICJodG1sL2h0bWxfZWxlbWVudGltcGwuaCIKLSNpbmNsdWRlICJodG1s
L2h0bWxfbWlzY2ltcGwuaCIKKyNpbmNsdWRlICJIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5o
IgogCi0jaW5jbHVkZSA8cXB0cnZlY3Rvci5oPgotI2luY2x1ZGUgPHFtZW1hcnJheS5oPgotI2lu
Y2x1ZGUgPGt4bWxjb3JlL0hhc2hNYXAuaD4KLQotY2xhc3MgS0hUTUxWaWV3OwotY2xhc3MgUVRl
eHRDb2RlYzsKLQotbmFtZXNwYWNlIGtodG1sCi17Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAg
Y2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQ7Ci0gICAgY2xhc3MgUmVuZGVyVGV4dEFyZWE7Ci0gICAg
Y2xhc3MgUmVuZGVyU2VsZWN0OworbmFtZXNwYWNlIGtodG1sIHsKICAgICBjbGFzcyBSZW5kZXJM
aW5lRWRpdDsKICAgICBjbGFzcyBSZW5kZXJGaWxlQnV0dG9uOwogICAgIGNsYXNzIFJlbmRlclNs
aWRlcjsKQEAgLTQ4LDI0OCArMzUsNyBAQCBuYW1lc3BhY2Uga2h0bWwKIAogbmFtZXNwYWNlIERP
TSB7CiAKLWNsYXNzIERPTVN0cmluZzsKLWNsYXNzIEZvcm1EYXRhTGlzdDsKLWNsYXNzIEhUTUxG
b3JtRWxlbWVudDsKLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsOwotY2xhc3MgSFRN
TElucHV0RWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VFbGVtZW50SW1wbDsKIGNsYXNzIEhU
TUxJbWFnZUxvYWRlcjsKLWNsYXNzIEhUTUxPcHRpb25FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxP
cHRpb25zQ29sbGVjdGlvbkltcGw7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRN
TEZvcm1FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAg
ICBIVE1MRm9ybUVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5I
VE1MRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFn
UmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMzsgfQotCi0gICAgdmlydHVh
bCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgp
OwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gCi0gICAgUmVmUHRy
PEhUTUxDb2xsZWN0aW9uSW1wbD4gZWxlbWVudHMoKTsKLSAgICBpbnQgbGVuZ3RoKCkgY29uc3Q7
Ci0KLSAgICBET01TdHJpbmcgZW5jdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZW5jdHlwZTsgfQot
ICAgIHZvaWQgc2V0RW5jdHlwZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcg
Ym91bmRhcnkoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kYXJ5OyB9Ci0gICAgdm9pZCBzZXRCb3Vu
ZGFyeShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2b2lkIHJlZ2lz
dGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCBy
ZW1vdmVGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqKTsKLSAgICB2b2lk
IHJlZ2lzdGVySW1nRWxlbWVudChIVE1MSW1hZ2VFbGVtZW50SW1wbCAqKTsKLSAgICB2b2lkIHJl
bW92ZUltZ0VsZW1lbnQoSFRNTEltYWdlRWxlbWVudEltcGwgKik7Ci0KLSAgICBib29sIHByZXBh
cmVTdWJtaXQoKTsKLSAgICB2b2lkIHN1Ym1pdChib29sIGFjdGl2YXRlU3VibWl0QnV0dG9uID0g
ZmFsc2UpOwotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHZvaWQgc2V0TWFsZm9ybWVkKGJvb2wg
bWFsZm9ybWVkKSB7IG1fbWFsZm9ybWVkID0gbWFsZm9ybWVkOyB9Ci0gICAgdmlydHVhbCBib29s
IGlzTWFsZm9ybWVkKCkgeyByZXR1cm4gbV9tYWxmb3JtZWQ7IH0KLSAgICAKLSAgICB2aXJ0dWFs
IGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqYXR0cikgY29uc3Q7Ci0gICAgCi0g
ICAgdm9pZCBzdWJtaXRDbGljaygpOwotICAgIGJvb2wgZm9ybVdvdWxkSGF2ZVNlY3VyZVN1Ym1p
c3Npb24oY29uc3QgRE9NU3RyaW5nICZ1cmwpOwotCi0gICAgRE9NU3RyaW5nIG5hbWUoKSBjb25z
dDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5n
IGFjY2VwdENoYXJzZXQoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2VwdENoYXJzZXQoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjdGlvbigpIGNvbnN0OwotICAgIHZvaWQg
c2V0QWN0aW9uKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBtZXRob2QoKSBj
b25zdDsKLSAgICB2b2lkIHNldE1ldGhvZChjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01T
dHJpbmcgdGFyZ2V0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUYXJnZXQoY29uc3QgRE9NU3RyaW5n
ICYpOwotCi0gICAgc3RhdGljIHZvaWQgaTE4bkRhdGEoKTsKLQotICAgIGZyaWVuZCBjbGFzcyBI
VE1MRm9ybUVsZW1lbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIEhUTUxGb3JtQ29sbGVjdGlvbkltcGw7
Ci0KLSAgICBIVE1MQ29sbGVjdGlvbkltcGw6OkNvbGxlY3Rpb25JbmZvICpjb2xsZWN0aW9uSW5m
bzsKLQotICAgIFFQdHJWZWN0b3I8SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGw+IGZvcm1FbGVt
ZW50czsKLSAgICBRUHRyVmVjdG9yPEhUTUxJbWFnZUVsZW1lbnRJbXBsPiBpbWdFbGVtZW50czsK
LSAgICBET01TdHJpbmcgbV91cmw7Ci0gICAgRE9NU3RyaW5nIG1fdGFyZ2V0OwotICAgIERPTVN0
cmluZyBtX2VuY3R5cGU7Ci0gICAgRE9NU3RyaW5nIG1fYm91bmRhcnk7Ci0gICAgRE9NU3RyaW5n
IG1fYWNjZXB0Y2hhcnNldDsKLSAgICBib29sIG1fcG9zdCA6IDE7Ci0gICAgYm9vbCBtX211bHRp
cGFydCA6IDE7Ci0gICAgYm9vbCBtX2F1dG9jb21wbGV0ZSA6IDE7Ci0gICAgYm9vbCBtX2luc3Vi
bWl0IDogMTsKLSAgICBib29sIG1fZG9pbmdzdWJtaXQgOiAxOwotICAgIGJvb2wgbV9pbnJlc2V0
IDogMTsKLSAgICBib29sIG1fbWFsZm9ybWVkIDogMTsKLSAgICAKLXByaXZhdGU6Ci0gICAgdm9p
ZCBwYXJzZUVuY3R5cGUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIGJvb2wgZm9ybURhdGEoa2h0
bWw6OkZvcm1EYXRhICYpIGNvbnN0OwotCi0gICAgdW5zaWduZWQgZm9ybUVsZW1lbnRJbmRleChI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbCAqKTsKLQotICAgIERPTVN0cmluZyBvbGROYW1lQXR0
cjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEdlbmVyaWNGb3JtRWxl
bWVudEltcGwgOiBwdWJsaWMgSFRNTEVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIEhU
TUxGb3JtRWxlbWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJGb3JtRWxl
bWVudDsKLQotcHVibGljOgotICAgIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKGNvbnN0IFF1
YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwoKTsK
LQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsg
cmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHko
KSBjb25zdCB7IHJldHVybiAxOyB9Ci0KLSAgICBIVE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKCkg
eyByZXR1cm4gbV9mb3JtOyB9Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3Qg
PSAwOwotCi0gICAgdmlydHVhbCBib29sIGlzQ29udHJvbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gIWRpc2FibGVk
KCk7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVh
bCB2b2lkIGluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVt
b3ZlZEZyb21UcmVlKGJvb2wgZGVlcCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQot
Ci0gICAgdm9pZCBvblNlbGVjdCgpOwotICAgIHZvaWQgb25DaGFuZ2UoKTsKLQotICAgIGJvb2wg
ZGlzYWJsZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERpc2FibGVkKGJvb2wgX2Rpc2FibGVkKTsK
LQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9v
bCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzTW91c2VG
b2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25z
dCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgYm9vbCByZWFkT25seSgpIGNvbnN0IHsgcmV0dXJu
IG1fcmVhZE9ubHk7IH0KLSAgICB2b2lkIHNldFJlYWRPbmx5KGJvb2wgX3JlYWRPbmx5KTsKLQot
ICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgKTsKLQotICAgIHZpcnR1
YWwgRE9NU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgRE9NU3Ry
aW5nJiBuYW1lKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0dlbmVyaWNGb3JtRWxlbWVudCgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSYWRpb0J1dHRvbigpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAvKgotICAgICAqIG92ZXJyaWRlIGluIGRlcml2
ZWQgY2xhc3NlcyB0byBnZXQgdGhlIGVuY29kZWQgbmFtZT12YWx1ZSBwYWlyCi0gICAgICogZm9y
IHN1Ym1pdHRpbmcKLSAgICAgKiByZXR1cm4gdHJ1ZSBmb3IgYSBzdWNjZXNzZnVsIGNvbnRyb2wg
KHNlZSBIVE1MNC0xNy4xMy4yKQotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3Jt
RGF0YShGb3JtRGF0YUxpc3QmLCBib29sKSB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVh
bCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIHZpcnR1YWwgUVN0cmluZyBzdGF0ZSgpOwotICAg
IFFTdHJpbmcgZmluZE1hdGNoaW5nU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlcyk7Ci0KLSAgICB2
aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0dG9uKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9vbCBmbGFn
KSB7IH0KLQotICAgIGludCB0YWJJbmRleCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGFiSW5kZXgo
aW50KTsKLQotcHJvdGVjdGVkOgotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmdldEZvcm0oKSBj
b25zdDsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKm1fZm9ybTsKLSAgICBib29sIG1fZGlz
YWJsZWQgOiAxOwotICAgIGJvb2wgbV9yZWFkT25seTogMTsKLSAgICBib29sIG1faW5pdGVkIDog
MTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEJ1dHRvbkVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAg
SFRNTEJ1dHRvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTEJ1dHRvbkVsZW1lbnRJbXBsKCk7Ci0KLSAg
ICBlbnVtIHR5cGVFbnVtIHsKLSAgICAgICAgU1VCTUlULAotICAgICAgICBSRVNFVCwKLSAgICAg
ICAgQlVUVE9OCi0gICAgfTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0gICAgICAg
IAotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVy
QXJlbmEqLCBraHRtbDo6UmVuZGVyU3R5bGUqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIHZv
aWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCBib29s
IGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29s
IGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfSAKLQotICAgIHZpcnR1YWwg
Ym9vbCBpc1N1Y2Nlc3NmdWxTdWJtaXRCdXR0b24oKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wg
aXNBY3RpdmF0ZWRTdWJtaXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZhdGVk
U3VibWl0KGJvb2wgZmxhZyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJv
b2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXNzS2V5KCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRBY2Nlc3NLZXkoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3Ry
aW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7
Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7Ci0gICAgRE9NU3RyaW5n
IG1fY3VyclZhbHVlOwotICAgIHR5cGVFbnVtICBtX3R5cGUgOiAyOwotICAgIGJvb2wgICAgICBt
X2RpcnR5IDogMTsKLSAgICBib29sICAgICAgbV9hY3RpdmVTdWJtaXQgOiAxOwotfTsKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MRmllbGRTZXRFbGVtZW50SW1wbCA6IHB1Ymxp
YyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxGaWVsZFNl
dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0g
MCk7Ci0gICAgdmlydHVhbCB+SFRNTEZpZWxkU2V0RWxlbWVudEltcGwoKTsKLSAgICAKLSAgICB2
aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDM7IH0KLSAgICB2aXJ0dWFs
IGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsKLQotICAgIHZpcnR1YWwg
Ym9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRl
ck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxl
ICopOwotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotfTsKLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQogCiBjbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbAogewpAQCAtMzEyLDggKzU4LDggQEAgcHVibGljOgogICAg
ICAgICBGSUxFLAogICAgICAgICBISURERU4sCiAgICAgICAgIElNQUdFLAotICAgICAgICBCVVRU
T04KLSAgICAgICAgLFNFQVJDSCwKKyAgICAgICAgQlVUVE9OLAorICAgICAgICBTRUFSQ0gsCiAg
ICAgICAgIFJBTkdFCiAgICAgfTsKIApAQCAtNDYxLDM3MyArMjA3LDYgQEAgcHJvdGVjdGVkOgog
ICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA6IDE7CiB9OwogCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLWNsYXNzIEhUTUxMYWJlbEVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVtZW50
SW1wbAotewotcHVibGljOgotICAgIEhUTUxMYWJlbEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAq
ZG9jKTsKLSAgICB2aXJ0dWFsIH5IVE1MTGFiZWxFbGVtZW50SW1wbCgpOwotCi0gICAgdmlydHVh
bCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA1OyB9Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBh
Y2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIC8qKgotICAgICAq
IHRoZSBmb3JtIGVsZW1lbnQgdGhpcyBsYWJlbCBpcyBhc3NvY2lhdGVkIHRvLgotICAgICAqLwot
ICAgIEVsZW1lbnRJbXBsICpmb3JtRWxlbWVudCgpOwotCi0gICAgSFRNTEZvcm1FbGVtZW50SW1w
bCAqZm9ybSgpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBodG1sRm9y
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIdG1sRm9yKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IHZvaWQgZm9jdXMoKTsKLQotIHByaXZhdGU6Ci0gICAgRE9NU3RyaW5nIG1fZm9ybUVsZW1lbnRJ
RDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTExlZ2VuZEVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAg
SFRNTExlZ2VuZEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJ
bXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+SFRNTExlZ2VuZEVsZW1lbnRJbXBsKCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGto
dG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpS
ZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsK
LQotICAgIC8qKgotICAgICAqIFRoZSBmaXJzdCBmb3JtIGVsZW1lbnQgaW4gdGhlIGxlZ2VuZCdz
IGZpZWxkc2V0IAotICAgICAqLwotICAgIEVsZW1lbnRJbXBsICpmb3JtRWxlbWVudCgpOwotCi0g
ICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZv
aWQgc2V0QWxpZ24oY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotICAgIHZvaWQgZm9jdXMoKTsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnRJbXBs
IDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNz
IGtodG1sOjpSZW5kZXJTZWxlY3Q7Ci0KLXB1YmxpYzoKLSAgICBIVE1MU2VsZWN0RWxlbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICBI
VE1MU2VsZWN0RWxlbWVudEltcGwoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLSAgICB+SFRNTFNlbGVj
dEVsZW1lbnRJbXBsKCk7Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKTsKLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICBp
bnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0OwotICAgIHZvaWQgc2V0U2VsZWN0ZWRJbmRleCggaW50
IGluZGV4ICk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLSAgICBpbnQgbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICBpbnQgbWluV2lk
dGgoKSBjb25zdCB7IHJldHVybiBtX21pbndpZHRoOyB9Ci0KLSAgICBpbnQgc2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi0gICAgYm9vbCBtdWx0aXBsZSgpIGNvbnN0IHsgcmV0dXJu
IG1fbXVsdGlwbGU7IH0KLQotICAgIHZvaWQgYWRkICggSFRNTEVsZW1lbnRJbXBsICplbGVtZW50
LCBIVE1MRWxlbWVudEltcGwgKmJlZm9yZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdm9p
ZCByZW1vdmUgKCBpbnQgaW5kZXggKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpOwotICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotICAgIEhUTUxPcHRpb25zQ29s
bGVjdGlvbkltcGwgKm9wdGlvbnMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBv
cHRpb25zSFRNTENvbGxlY3Rpb24oKTsgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGFuZCBtaWdyYXRl
IHRvIG9wdGlvbnMoKS4KLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0
dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZv
aWQgcmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAq
aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGlu
dCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAo
IE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5k
Q2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZp
cnR1YWwgTm9kZUltcGwgKmFkZENoaWxkKCBOb2RlSW1wbCogbmV3Q2hpbGQgKTsKLQotICAgIHZp
cnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIHZpcnR1YWwg
a2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6
OlJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0
YUxpc3QmLCBib29sKTsKLQotICAgIC8vIGdldCB0aGUgYWN0dWFsIGxpc3Rib3ggaW5kZXggb2Yg
dGhlIG9wdGlvbkluZGV4dGggb3B0aW9uCi0gICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBv
cHRpb25JbmRleCkgY29uc3Q7Ci0gICAgLy8gcmV2ZXJzZSBvZiBvcHRpb25Ub0xpc3RJbmRleCAt
IGdldCBvcHRpb25JbmRleCBmcm9tIGxpc3Rib3hJbmRleAotICAgIGludCBsaXN0VG9PcHRpb25J
bmRleChpbnQgbGlzdEluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgc2V0UmVjYWxjTGlzdEl0ZW1z
KCk7Ci0KLSAgICBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBsKj4gbGlzdEl0ZW1zKCkgY29uc3QK
LSAgICAgewotICAgICAgICAgaWYgKG1fcmVjYWxjTGlzdEl0ZW1zKSBjb25zdF9jYXN0PEhUTUxT
ZWxlY3RFbGVtZW50SW1wbCo+KHRoaXMpLT5yZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgIHJl
dHVybiBtX2xpc3RJdGVtczsKLSAgICAgfQotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotICAg
IHZvaWQgbm90aWZ5T3B0aW9uU2VsZWN0ZWQoSFRNTE9wdGlvbkVsZW1lbnRJbXBsICpzZWxlY3Rl
ZE9wdGlvbiwgYm9vbCBzZWxlY3RlZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50
SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlv
bihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0gICAgdm9pZCBzZXRNdWx0aXBsZShib29sKTsK
LQotICAgIHZvaWQgc2V0U2l6ZShpbnQpOwotCi1wcml2YXRlOgotICAgIHZvaWQgcmVjYWxjTGlz
dEl0ZW1zKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBtdXRhYmxlIFFNZW1BcnJheTxIVE1MRWxlbWVu
dEltcGwqPiBtX2xpc3RJdGVtczsKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsICptX29w
dGlvbnM7Ci0gICAgc2hvcnQgbV9taW53aWR0aDsKLSAgICBzaG9ydCBtX3NpemU7Ci0gICAgYm9v
bCBtX211bHRpcGxlOwotICAgIGJvb2wgbV9yZWNhbGNMaXN0SXRlbXM7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxLZXlnZW5FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1M
U2VsZWN0RWxlbWVudEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MS2V5Z2VuRWxlbWVudEltcGwo
RG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgRE9NU3Ry
aW5nIHR5cGUoKSBjb25zdDsKLQotICAgIC8vICMjIyB0aGlzIGlzIGp1c3QgYSByb3VnaCBndWVz
cwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNl
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBib29sIGFwcGVuZEZvcm1EYXRhKEZvcm1EYXRh
TGlzdCYsIGJvb2wpOwotcHJvdGVjdGVkOgotICAgIEF0b21pY1N0cmluZyBtX2NoYWxsZW5nZTsK
LSAgICBBdG9taWNTdHJpbmcgbV9rZXlUeXBlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgdmlydHVhbCB+
SFRNTE9wdEdyb3VwRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChj
b25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhU
TUxOYW1lczo6b3B0aW9uVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Omhy
VGFnKTsgfQotCi0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9v
bCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2Vy
dEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxk
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFs
IE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCB2
b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotICAg
IHZvaWQgcmVjYWxjU2VsZWN0T3B0aW9ucygpOwotCi0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRMYWJlbChjb25zdCBET01TdHJpbmcgJik7Ci19OwotCi0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uRWxlbWVudEltcGwgOiBwdWJsaWMg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsKLSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJl
bmRlclNlbGVjdDsKLSAgICBmcmllbmQgY2xhc3MgRE9NOjpIVE1MU2VsZWN0RWxlbWVudEltcGw7
Ci0KLXB1YmxpYzoKLSAgICBIVE1MT3B0aW9uRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2Ms
IEhUTUxGb3JtRWxlbWVudEltcGwgKmYgPSAwKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1
cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9
Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAyOyB9Ci0gICAg
dmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJbXBsKiBuZXdDaGlsZCkgeyByZXR1cm4g
bmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6
OnNjcmlwdFRhZyk7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0Owot
Ci0gICAgRE9NU3RyaW5nIHR5cGUoKSBjb25zdDsKLQotICAgIERPTVN0cmluZyB0ZXh0KCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRUZXh0KGNvbnN0IERPTVN0cmluZyAmLCBpbnQgJmV4Y2VwdGlvbik7
Ci0KLSAgICBpbnQgaW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldEluZGV4KGludCwgaW50ICZl
eGNlcHRpb24pOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGVJbXBsICphdHRyKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAg
IHZvaWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgYm9vbCBzZWxlY3RlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWQ7IH0KLSAgICB2b2lkIHNldFNlbGVjdGVkKGJvb2wg
X3NlbGVjdGVkKTsKLQotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqZ2V0U2VsZWN0KCkgY29u
c3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICBib29sIGRl
ZmF1bHRTZWxlY3RlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGVkKCBib29s
ICk7Ci0KLSAgICBET01TdHJpbmcgbGFiZWwoKSBjb25zdDsKLSAgICB2b2lkIHNldExhYmVsKCBj
b25zdCBET01TdHJpbmcgJiApOwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fdmFsdWU7
Ci0gICAgYm9vbCBtX3NlbGVjdGVkOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJUZXh0QXJlYTsKLQotcHVi
bGljOgotICAgIGVudW0gV3JhcE1ldGhvZCB7Ci0gICAgICAgIHRhX05vV3JhcCwKLSAgICAgICAg
dGFfVmlydHVhbCwKLSAgICAgICAgdGFfUGh5c2ljYWwKLSAgICB9OwotCi0gICAgSFRNTFRleHRB
cmVhRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwgKmYg
PSAwKTsKLSAgICB+SFRNTFRleHRBcmVhRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgYm9v
bCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0NoaWxkLT5p
c1RleHROb2RlKCk7IH0KLQotICAgIGludCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzOyB9
Ci0gICAgaW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KLQotICAgIFdyYXBNZXRo
b2Qgd3JhcCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JhcDsgfQotCi0gICAgdmlydHVhbCBib29sIGlz
RW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgRE9NU3RyaW5nIHR5
cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBtYWludGFpbnNTdGF0ZSgpIHsgcmV0dXJu
IHRydWU7IH0KLSAgICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQg
cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7
Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotCi0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChp
bnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0KLSAgICB2b2lkIHNlbGVjdCAo
ICApOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi0gICAgdmlydHVh
bCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpS
ZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJT
dHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRl
dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBi
b29sKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICBET01TdHJpbmcgdmFsdWUoKTsK
LSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIERPTVN0cmlu
ZyBkZWZhdWx0VmFsdWUoKTsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJp
bmcgJnZhbHVlKTsKLQotICAgIHZvaWQgaW52YWxpZGF0ZVZhbHVlKCkgeyBtX3ZhbHVlSXNWYWxp
ZCA9IGZhbHNlOyB9Ci0gICAgdm9pZCB1cGRhdGVWYWx1ZSgpOwotCi0gICAgYm9vbCB2YWx1ZU1h
dGNoZXNSZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0K
LSAgICB2b2lkIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRl
cmVyID0gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLSAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0g
ICAgCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNz
S2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0Q29scyhpbnQpOwotCi0gICAg
dm9pZCBzZXRSb3dzKGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQgbV9yb3dzOwotICAgIGlu
dCBtX2NvbHM7Ci0gICAgV3JhcE1ldGhvZCBtX3dyYXA7Ci0gICAgUVN0cmluZyBtX3ZhbHVlOwot
ICAgIGJvb2wgbV92YWx1ZUlzVmFsaWQ7Ci0gICAgYm9vbCBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVy
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSXNJbmRleEVsZW1lbnRJ
bXBsIDogcHVibGljIEhUTUxJbnB1dEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTElz
SW5kZXhFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAq
ZiA9IDApOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFn
UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJp
bmcgcHJvbXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRQcm9tcHQoY29uc3QgRE9NU3RyaW5nICYp
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgRE9NU3RyaW5nIG1fcHJvbXB0OwotfTsKLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsIDogcHVibGljIGto
dG1sOjpTaGFyZWQ8SFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBI
VE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsKEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqaW1wbCkgOiBt
X3NlbGVjdChpbXBsKSB7IH0KLQotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0TGVuZ3RoKHVuc2lnbmVkKTsKLSAgICBOb2RlSW1wbCAqaXRlbSh1bnNpZ25lZCBpbmRl
eCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKm5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUp
IGNvbnN0OwotCi0gICAgdm9pZCBkZXRhY2goKSB7IG1fc2VsZWN0ID0gMDsgfQotCi1wcml2YXRl
OgotICAgIEhUTUxTZWxlY3RFbGVtZW50SW1wbCAqbV9zZWxlY3Q7Ci19OwotCiB9IC8vbmFtZXNw
YWNlCiAKICNlbmRpZgpJbmRleDoga2h0bWwvaHRtbC9IVE1MSXNJbmRleEVsZW1lbnRJbXBsLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9IVE1MSXNJbmRleEVsZW1lbnRJbXBsLmgJKHJldmlz
aW9uIDExOTc2KQorKysga2h0bWwvaHRtbC9IVE1MSXNJbmRleEVsZW1lbnRJbXBsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAo
a29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11
ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5j
LgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMu
CiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDc3NyArMjIsMTMgQEAKICAqIEJvc3RvbiwgTUEg
MDIxMTEtMTMwNywgVVNBLgogICoKICAqLwotI2lmbmRlZiBIVE1MX0ZPUk1JTVBMX0gKLSNkZWZp
bmUgSFRNTF9GT1JNSU1QTF9ICisjaWZuZGVmIEhUTUxfSFRNTElucHV0RWxlbWVudEltcGxfSAor
I2RlZmluZSBIVE1MX0hUTUxJbnB1dEVsZW1lbnRJbXBsX0gKIAotI2luY2x1ZGUgImh0bWwvaHRt
bF9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9taXNjaW1wbC5oIgotCi0jaW5j
bHVkZSA8cXB0cnZlY3Rvci5oPgotI2luY2x1ZGUgPHFtZW1hcnJheS5oPgotI2luY2x1ZGUgPGt4
bWxjb3JlL0hhc2hNYXAuaD4KLQotY2xhc3MgS0hUTUxWaWV3OwotY2xhc3MgUVRleHRDb2RlYzsK
LQotbmFtZXNwYWNlIGtodG1sCi17Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAgY2xhc3MgUmVu
ZGVyRm9ybUVsZW1lbnQ7Ci0gICAgY2xhc3MgUmVuZGVyVGV4dEFyZWE7Ci0gICAgY2xhc3MgUmVu
ZGVyU2VsZWN0OwotICAgIGNsYXNzIFJlbmRlckxpbmVFZGl0OwotICAgIGNsYXNzIFJlbmRlckZp
bGVCdXR0b247Ci0gICAgY2xhc3MgUmVuZGVyU2xpZGVyOwotfQorI2luY2x1ZGUgIkhUTUxJbnB1
dEVsZW1lbnRJbXBsLmgiCiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFzcyBET01TdHJpbmc7Ci1j
bGFzcyBGb3JtRGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotY2xhc3Mg
SFRNTEltYWdlRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci1jbGFzcyBIVE1M
T3B0aW9uRWxlbWVudEltcGw7Ci1jbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsOwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGb3JtRWxlbWVudEltcGwgOiBwdWJsaWMg
SFRNTEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEZvcm1FbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+SFRNTEZvcm1FbGVtZW50SW1wbCgpOwotCi0g
ICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1
cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIDM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0
dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotIAotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGVsZW1l
bnRzKCk7Ci0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIGVuY3R5cGUo
KSBjb25zdCB7IHJldHVybiBtX2VuY3R5cGU7IH0KLSAgICB2b2lkIHNldEVuY3R5cGUoY29uc3Qg
RE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGJvdW5kYXJ5KCkgY29uc3QgeyByZXR1cm4g
bV9ib3VuZGFyeTsgfQotICAgIHZvaWQgc2V0Qm91bmRhcnkoY29uc3QgRE9NU3RyaW5nICYpOwot
Ci0gICAgYm9vbCBhdXRvQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtX2F1dG9jb21wbGV0ZTsg
fQotCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZUltcGwgKmF0dHIpOwotCi0gICAgdm9pZCByZWdpc3RlckZvcm1FbGVtZW50KEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsICopOwotICAgIHZvaWQgcmVtb3ZlRm9ybUVsZW1lbnQoSFRNTEdlbmVy
aWNGb3JtRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZWdpc3RlckltZ0VsZW1lbnQoSFRNTElt
YWdlRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWdFbGVtZW50KEhUTUxJbWFnZUVs
ZW1lbnRJbXBsICopOwotCi0gICAgYm9vbCBwcmVwYXJlU3VibWl0KCk7Ci0gICAgdm9pZCBzdWJt
aXQoYm9vbCBhY3RpdmF0ZVN1Ym1pdEJ1dHRvbiA9IGZhbHNlKTsKLSAgICB2b2lkIHJlc2V0KCk7
Ci0KLSAgICB2b2lkIHNldE1hbGZvcm1lZChib29sIG1hbGZvcm1lZCkgeyBtX21hbGZvcm1lZCA9
IG1hbGZvcm1lZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZvcm1lZCgpIHsgcmV0dXJuIG1f
bWFsZm9ybWVkOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3VibWl0Q2xpY2soKTsKLSAg
ICBib29sIGZvcm1Xb3VsZEhhdmVTZWN1cmVTdWJtaXNzaW9uKGNvbnN0IERPTVN0cmluZyAmdXJs
KTsKLQotICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0
IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyBhY2NlcHRDaGFyc2V0KCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRBY2NlcHRDaGFyc2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0
cmluZyBhY3Rpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFjdGlvbihjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICBET01TdHJpbmcgbWV0aG9kKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZXRob2Qo
Y29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIHRhcmdldCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0VGFyZ2V0KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIHN0YXRpYyB2b2lkIGkx
OG5EYXRhKCk7Ci0KLSAgICBmcmllbmQgY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotICAgIGZyaWVu
ZCBjbGFzcyBIVE1MRm9ybUNvbGxlY3Rpb25JbXBsOwotCi0gICAgSFRNTENvbGxlY3Rpb25JbXBs
OjpDb2xsZWN0aW9uSW5mbyAqY29sbGVjdGlvbkluZm87Ci0KLSAgICBRUHRyVmVjdG9yPEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsPiBmb3JtRWxlbWVudHM7Ci0gICAgUVB0clZlY3RvcjxIVE1M
SW1hZ2VFbGVtZW50SW1wbD4gaW1nRWxlbWVudHM7Ci0gICAgRE9NU3RyaW5nIG1fdXJsOwotICAg
IERPTVN0cmluZyBtX3RhcmdldDsKLSAgICBET01TdHJpbmcgbV9lbmN0eXBlOwotICAgIERPTVN0
cmluZyBtX2JvdW5kYXJ5OwotICAgIERPTVN0cmluZyBtX2FjY2VwdGNoYXJzZXQ7Ci0gICAgYm9v
bCBtX3Bvc3QgOiAxOwotICAgIGJvb2wgbV9tdWx0aXBhcnQgOiAxOwotICAgIGJvb2wgbV9hdXRv
Y29tcGxldGUgOiAxOwotICAgIGJvb2wgbV9pbnN1Ym1pdCA6IDE7Ci0gICAgYm9vbCBtX2RvaW5n
c3VibWl0IDogMTsKLSAgICBib29sIG1faW5yZXNldCA6IDE7Ci0gICAgYm9vbCBtX21hbGZvcm1l
ZCA6IDE7Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgcGFyc2VFbmN0eXBlKGNvbnN0IERPTVN0
cmluZyAmKTsKLSAgICBib29sIGZvcm1EYXRhKGtodG1sOjpGb3JtRGF0YSAmKSBjb25zdDsKLQot
ICAgIHVuc2lnbmVkIGZvcm1FbGVtZW50SW5kZXgoSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwg
Kik7Ci0KLSAgICBET01TdHJpbmcgb2xkTmFtZUF0dHI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxFbGVt
ZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGZy
aWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyRm9ybUVsZW1lbnQ7Ci0KLXB1YmxpYzoKLSAgICBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwg
fkhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0
dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0g
ICAgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSgpIHsgcmV0dXJuIG1fZm9ybTsgfQotCi0gICAg
dmlydHVhbCBET01TdHJpbmcgdHlwZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBp
c0NvbnRyb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzRW5h
YmxlZCgpIGNvbnN0IHsgcmV0dXJuICFkaXNhYmxlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmly
dHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJv
b2wgZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwot
Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KLQotICAgIHZvaWQgb25TZWxlY3QoKTsKLSAg
ICB2b2lkIG9uQ2hhbmdlKCk7Ci0KLSAgICBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXREaXNhYmxlZChib29sIF9kaXNhYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNv
bnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAg
IGJvb2wgcmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBtX3JlYWRPbmx5OyB9Ci0gICAgdm9pZCBz
ZXRSZWFkT25seShib29sIF9yZWFkT25seSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5
bGUoIFN0eWxlQ2hhbmdlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBuYW1lKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXROYW1lKGNvbnN0IERPTVN0cmluZyYgbmFtZSk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgaXNHZW5lcmljRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzUmFkaW9CdXR0b24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0g
ICAgLyoKLSAgICAgKiBvdmVycmlkZSBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZ2V0IHRoZSBlbmNv
ZGVkIG5hbWU9dmFsdWUgcGFpcgotICAgICAqIGZvciBzdWJtaXR0aW5nCi0gICAgICogcmV0dXJu
IHRydWUgZm9yIGEgc3VjY2Vzc2Z1bCBjb250cm9sIChzZWUgSFRNTDQtMTcuMTMuMikKLSAgICAg
Ki8KLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCkg
eyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0KLSAg
ICB2aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLSAgICBRU3RyaW5nIGZpbmRNYXRjaGluZ1N0YXRl
KFFTdHJpbmdMaXN0ICZzdGF0ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bFN1
Ym1pdEJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlz
QWN0aXZhdGVkU3VibWl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZv
aWQgc2V0QWN0aXZhdGVkU3VibWl0KGJvb2wgZmxhZykgeyB9Ci0KLSAgICBpbnQgdGFiSW5kZXgo
KSBjb25zdDsKLSAgICB2b2lkIHNldFRhYkluZGV4KGludCk7Ci0KLXByb3RlY3RlZDoKLSAgICBI
VE1MRm9ybUVsZW1lbnRJbXBsICpnZXRGb3JtKCkgY29uc3Q7Ci0KLSAgICBIVE1MRm9ybUVsZW1l
bnRJbXBsICptX2Zvcm07Ci0gICAgYm9vbCBtX2Rpc2FibGVkIDogMTsKLSAgICBib29sIG1fcmVh
ZE9ubHk6IDE7Ci0gICAgYm9vbCBtX2luaXRlZCA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIEhUTUxCdXR0b25FbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxCdXR0b25FbGVtZW50SW1wbChEb2N1
bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwg
fkhUTUxCdXR0b25FbGVtZW50SW1wbCgpOwotCi0gICAgZW51bSB0eXBlRW51bSB7Ci0gICAgICAg
IFNVQk1JVCwKLSAgICAgICAgUkVTRVQsCi0gICAgICAgIEJVVFRPTgotICAgIH07Ci0KLSAgICBE
T01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5k
ZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwga2h0bWw6OlJlbmRlclN0eWxl
Kik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZl
bnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxp
c3QmLCBib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0gCi0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsU3VibWl0QnV0
dG9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzQWN0aXZhdGVkU3VibWl0KCkgY29uc3Q7
Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2YXRlZFN1Ym1pdChib29sIGZsYWcpOwotCi0gICAg
dmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotCi0g
ICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIERPTVN0cmluZyB2YWx1ZSgpIGNvbnN0OwotICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgRE9NU3RyaW5nICYpOwotICAgIAotcHJvdGVjdGVkOgotICAgIERP
TVN0cmluZyBtX3ZhbHVlOwotICAgIERPTVN0cmluZyBtX2N1cnJWYWx1ZTsKLSAgICB0eXBlRW51
bSAgbV90eXBlIDogMjsKLSAgICBib29sICAgICAgbV9kaXJ0eSA6IDE7Ci0gICAgYm9vbCAgICAg
IG1fYWN0aXZlU3VibWl0IDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
SFRNTEZpZWxkU2V0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudElt
cGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MRmllbGRTZXRFbGVtZW50SW1wbChEb2N1bWVudEltcGwg
KmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxGaWVs
ZFNldEVsZW1lbnRJbXBsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBj
b25zdCB7IHJldHVybiAzOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGVJ
bXBsKiBuZXdDaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsK
LSAgICAKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgRE9NU3Ry
aW5nIHR5cGUoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRN
TElucHV0RWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwKLXsK
LSAgICBmcmllbmQgY2xhc3Mga2h0bWw6OlJlbmRlckxpbmVFZGl0OwotICAgIGZyaWVuZCBjbGFz
cyBraHRtbDo6UmVuZGVyRmlsZUJ1dHRvbjsKLQotICAgIGZyaWVuZCBjbGFzcyBIVE1MU2VsZWN0
RWxlbWVudEltcGw7Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJTbGlkZXI7Ci0KLXB1
YmxpYzoKLSAgICAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciEKLSAgICBlbnVtIHR5cGVFbnVt
IHsKLSAgICAgICAgVEVYVCwKLSAgICAgICAgUEFTU1dPUkQsCi0gICAgICAgIElTSU5ERVgsCi0g
ICAgICAgIENIRUNLQk9YLAotICAgICAgICBSQURJTywKLSAgICAgICAgU1VCTUlULAotICAgICAg
ICBSRVNFVCwKLSAgICAgICAgRklMRSwKLSAgICAgICAgSElEREVOLAotICAgICAgICBJTUFHRSwK
LSAgICAgICAgQlVUVE9OCi0gICAgICAgICxTRUFSQ0gsCi0gICAgICAgIFJBTkdFCi0gICAgfTsK
LQotICAgIEhUTUxJbnB1dEVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTElucHV0RWxlbWVudEltcGwoY29uc3QgUXVhbGlm
aWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnRJbXBsICpkb2MsIEhUTUxGb3JtRWxlbWVudEltcGwg
KmYgPSAwKTsKLSAgICB2aXJ0dWFsIH5IVE1MSW5wdXRFbGVtZW50SW1wbCgpOwotICAgIHZvaWQg
aW5pdCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFn
UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXli
b2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1lcmF0YWJsZSgp
IGNvbnN0IHsgcmV0dXJuIGlucHV0VHlwZSgpICE9IElNQUdFOyB9Ci0KLSAgICB2aXJ0dWFsIERP
TVN0cmluZyBuYW1lKCkgY29uc3Q7Ci0KLSAgICBib29sIGF1dG9Db21wbGV0ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYXV0b2NvbXBsZXRlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkg
Y29uc3QgeyByZXR1cm4gY2hlY2tlZCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1p
bmF0ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGV0ZXJtaW5hdGUoKTsgfQotCi0gICAgYm9vbCBpc1Rl
eHRCdXR0b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU1VCTUlUIHx8IG1fdHlwZSA9PSBS
RVNFVCB8fCBtX3R5cGUgPT0gQlVUVE9OOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUmFkaW9CdXR0
b24oKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUkFESU87IH0KLQotICAgIGJvb2wgY2hlY2tl
ZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQotICAgIHZvaWQgc2V0Q2hlY2tlZChib29s
KTsKLSAgICBib29sIGluZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBtX2luZGV0ZXJtaW5h
dGU7IH0KLSAgICB2b2lkIHNldEluZGV0ZXJtaW5hdGUoYm9vbCk7Ci0gICAgaW50IG1heExlbmd0
aCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuOyB9Ci0gICAgaW50IHNpemUoKSBjb25zdCB7IHJl
dHVybiBtX3NpemU7IH0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0
VHlwZShjb25zdCBET01TdHJpbmcmIHQpOwotCi0gICAgRE9NU3RyaW5nIHZhbHVlKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcg
dmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJl
cihjb25zdCBET01TdHJpbmcgJik7Ci0gICAgYm9vbCB2YWx1ZU1hdGNoZXNSZW5kZXJlcigpIGNv
bnN0IHsgcmV0dXJuIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXI7IH0KLSAgICB2b2lkIHNldFZhbHVl
TWF0Y2hlc1JlbmRlcmVyKCkgeyBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyID0gdHJ1ZTsgfQotCi0g
ICAgdmlydHVhbCBib29sIG1haW50YWluc1N0YXRlKCkgeyByZXR1cm4gbV90eXBlICE9IFBBU1NX
T1JEOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJl
c3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGJvb2wgY2FuSGF2ZVNlbGVjdGlvbigp
OwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwot
ICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVu
ZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdl
KGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VF
dmVudHMgPSBmYWxzZSwgYm9vbCBzaG93UHJlc3NlZExvb2sgPSB0cnVlKTsKLSAgICB2aXJ0dWFs
IHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVk
QXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUltcGwgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2
b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnRJbXBsICpzb3VyY2Up
OwotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJl
cklzTmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5k
ZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5kZXJTdHls
ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIGFwcGVu
ZEZvcm1EYXRhKEZvcm1EYXRhTGlzdCYsIGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3Vj
Y2Vzc2Z1bFN1Ym1pdEJ1dHRvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRl
ZFN1Ym1pdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmF0ZWRTdWJtaXQoYm9v
bCBmbGFnKTsKLQotICAgIHR5cGVFbnVtIGlucHV0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlw
ZTsgfQotICAgIHZvaWQgc2V0SW5wdXRUeXBlKGNvbnN0IERPTVN0cmluZyYgdmFsdWUpOwotCi0g
ICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAvLyB1c2VkIGluIGNhc2UgaW5wdXQgdHlw
ZT1pbWFnZSB3YXMgY2xpY2tlZC4KLSAgICBpbnQgY2xpY2tYKCkgY29uc3QgeyByZXR1cm4geFBv
czsgfQotICAgIGludCBjbGlja1koKSBjb25zdCB7IHJldHVybiB5UG9zOyB9Ci0KLSAgICB2aXJ0
dWFsIHZvaWQqIHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLSAgICB2
aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lk
KiBkYXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwg
KmV2dCk7Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKTsKLQotICAgIERPTVN0cmluZyBh
bHRUZXh0KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0
dHJpYnV0ZUltcGwgKmF0dHIpIGNvbnN0OwotCi0gICAgaW50IG1heFJlc3VsdHMoKSBjb25zdCB7
IHJldHVybiBtX21heFJlc3VsdHM7IH0KLQotICAgIERPTVN0cmluZyBkZWZhdWx0VmFsdWUoKSBj
b25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShjb25zdCBET01TdHJpbmcgJik7Ci0gICAg
Ci0gICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RGVmYXVsdENo
ZWNrZWQoYm9vbCk7Ci0KLSAgICBET01TdHJpbmcgYWNjZXB0KCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRBY2NlcHQoY29uc3QgRE9NU3RyaW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFjY2Vzc0tleSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0QWNjZXNzS2V5KGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAg
IERPTVN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgRE9NU3Ry
aW5nICYpOwotCi0gICAgRE9NU3RyaW5nIGFsdCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QWx0KGNv
bnN0IERPTVN0cmluZyAmKTsKLQotICAgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCk7Ci0KLSAgICBE
T01TdHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgRE9NU3RyaW5nICYp
OwotCi0gICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50KTsKLQotICAgIERPTVN0cmluZyB1c2VNYXAo
KSBjb25zdDsKLSAgICB2b2lkIHNldFVzZU1hcChjb25zdCBET01TdHJpbmcgJik7Ci0KLXByb3Rl
Y3RlZDoKLSAgICBib29sIHN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3Q7
Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAg
IGludCAgICAgICB4UG9zOwotICAgIHNob3J0ICAgICBtX21heExlbjsKLSAgICBzaG9ydCAgICAg
bV9zaXplOwotICAgIHNob3J0ICAgICB5UG9zOwotCi0gICAgc2hvcnQgICAgIG1fbWF4UmVzdWx0
czsKLQotICAgIEhUTUxJbWFnZUxvYWRlciogbV9pbWFnZUxvYWRlcjsKLQotICAgIHR5cGVFbnVt
IG1fdHlwZSA6IDQ7Ci0gICAgYm9vbCBtX2NoZWNrZWQgOiAxOwotICAgIGJvb2wgbV9kZWZhdWx0
Q2hlY2tlZCA6IDE7Ci0gICAgYm9vbCBtX3VzZURlZmF1bHRDaGVja2VkIDogMTsKLSAgICBib29s
IG1faW5kZXRlcm1pbmF0ZSA6IDE7Ci0gICAgYm9vbCBtX2hhdmVUeXBlIDogMTsKLSAgICBib29s
IG1fYWN0aXZlU3VibWl0IDogMTsKLSAgICBib29sIG1fYXV0b2NvbXBsZXRlIDogMTsKLSAgICBi
b29sIG1fdmFsdWVNYXRjaGVzUmVuZGVyZXIgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBIVE1MTGFiZWxFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MRWxlbWVudEltcGwK
LXsKLXB1YmxpYzoKLSAgICBIVE1MTGFiZWxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7
Ci0gICAgdmlydHVhbCB+SFRNTExhYmVsRWxlbWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgaW50
IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotCi0gICAgdmlydHVhbCBib29sIGlz
Rm9jdXNhYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNz
S2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUg
Zm9ybSBlbGVtZW50IHRoaXMgbGFiZWwgaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKi8KLSAgICBF
bGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIEhUTUxGb3JtRWxlbWVudEltcGwgKmZv
cm0oKTsKLQotICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFj
Y2Vzc0tleShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgaHRtbEZvcigpIGNv
bnN0OwotICAgIHZvaWQgc2V0SHRtbEZvcihjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lk
IGZvY3VzKCk7Ci0KLSBwcml2YXRlOgotICAgIERPTVN0cmluZyBtX2Zvcm1FbGVtZW50SUQ7Ci19
OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxMZWdlbmRFbGVtZW50SW1wbCA6
IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotcHVibGljOgotICAgIEhUTUxM
ZWdlbmRFbGVtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAq
ZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxMZWdlbmRFbGVtZW50SW1wbCgpOwotCi0gICAgdmly
dHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBraHRtbDo6
UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVy
U3R5bGUgKik7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCk7Ci0KLSAg
ICAvKioKLSAgICAgKiBUaGUgZmlyc3QgZm9ybSBlbGVtZW50IGluIHRoZSBsZWdlbmQncyBmaWVs
ZHNldCAKLSAgICAgKi8KLSAgICBFbGVtZW50SW1wbCAqZm9ybUVsZW1lbnQoKTsKLQotICAgIERP
TVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShjb25zdCBE
T01TdHJpbmcgJik7Ci0KLSAgICBET01TdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNl
dEFsaWduKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICB2b2lkIGZvY3VzKCk7Ci19Owot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1wbCA6IHB1
YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBraHRt
bDo6UmVuZGVyU2VsZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgSFRNTFNl
bGVjdEVsZW1lbnRJbXBsKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50SW1w
bCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0gICAgfkhUTUxTZWxlY3RFbGVt
ZW50SW1wbCgpOwotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiA2OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0
IE5vZGVJbXBsKiBuZXdDaGlsZCk7Ci0KLSAgICBET01TdHJpbmcgdHlwZSgpIGNvbnN0OwotCi0g
ICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSApOwotCi0gICAgaW50IHNl
bGVjdGVkSW5kZXgoKSBjb25zdDsKLSAgICB2b2lkIHNldFNlbGVjdGVkSW5kZXgoIGludCBpbmRl
eCApOwotCi0gICAgdmlydHVhbCBib29sIGlzRW51bWVyYXRhYmxlKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotCi0gICAgaW50IGxlbmd0aCgpIGNvbnN0OwotCi0gICAgaW50IG1pbldpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV9taW53aWR0aDsgfQotCi0gICAgaW50IHNpemUoKSBjb25zdCB7IHJl
dHVybiBtX3NpemU7IH0KLQotICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211
bHRpcGxlOyB9Ci0KLSAgICB2b2lkIGFkZCAoIEhUTUxFbGVtZW50SW1wbCAqZWxlbWVudCwgSFRN
TEVsZW1lbnRJbXBsICpiZWZvcmUsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZvaWQgcmVt
b3ZlICggaW50IGluZGV4ICk7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKTsKLSAgICB2b2lkIHNl
dFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLSAgICAKLSAgICBIVE1MT3B0aW9uc0NvbGxlY3Rp
b25JbXBsICpvcHRpb25zKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gb3B0aW9u
c0hUTUxDb2xsZWN0aW9uKCk7IC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBhbmQgbWlncmF0ZSB0byBv
cHRpb25zKCkuCi0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0
cnVlOyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJl
c3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2Vy
dEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxk
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFs
IE5vZGVJbXBsICphZGRDaGlsZCggTm9kZUltcGwqIG5ld0NoaWxkICk7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIGtodG1s
OjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIGtodG1sOjpSZW5k
ZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0
JiwgYm9vbCk7Ci0KLSAgICAvLyBnZXQgdGhlIGFjdHVhbCBsaXN0Ym94IGluZGV4IG9mIHRoZSBv
cHRpb25JbmRleHRoIG9wdGlvbgotICAgIGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9u
SW5kZXgpIGNvbnN0OwotICAgIC8vIHJldmVyc2Ugb2Ygb3B0aW9uVG9MaXN0SW5kZXggLSBnZXQg
b3B0aW9uSW5kZXggZnJvbSBsaXN0Ym94SW5kZXgKLSAgICBpbnQgbGlzdFRvT3B0aW9uSW5kZXgo
aW50IGxpc3RJbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFJlY2FsY0xpc3RJdGVtcygpOwot
Ci0gICAgUU1lbUFycmF5PEhUTUxFbGVtZW50SW1wbCo+IGxpc3RJdGVtcygpIGNvbnN0Ci0gICAg
IHsKLSAgICAgICAgIGlmIChtX3JlY2FsY0xpc3RJdGVtcykgY29uc3RfY2FzdDxIVE1MU2VsZWN0
RWxlbWVudEltcGwqPih0aGlzKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgICByZXR1cm4g
bV9saXN0SXRlbXM7Ci0gICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lk
IG5vdGlmeU9wdGlvblNlbGVjdGVkKEhUTUxPcHRpb25FbGVtZW50SW1wbCAqc2VsZWN0ZWRPcHRp
b24sIGJvb2wgc2VsZWN0ZWQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRlZmF1bHRFdmVudEhhbmRs
ZXIoRXZlbnRJbXBsICpldnQpOwotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9v
bCBzZW5kVG9BbnlFbGVtZW50KTsKLQotICAgIHZvaWQgc2V0TXVsdGlwbGUoYm9vbCk7Ci0KLSAg
ICB2b2lkIHNldFNpemUoaW50KTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlY2FsY0xpc3RJdGVt
cygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgbXV0YWJsZSBRTWVtQXJyYXk8SFRNTEVsZW1lbnRJbXBs
Kj4gbV9saXN0SXRlbXM7Ci0gICAgSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbCAqbV9vcHRpb25z
OwotICAgIHNob3J0IG1fbWlud2lkdGg7Ci0gICAgc2hvcnQgbV9zaXplOwotICAgIGJvb2wgbV9t
dWx0aXBsZTsKLSAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOwotfTsKLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1jbGFzcyBIVE1MS2V5Z2VuRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTFNlbGVj
dEVsZW1lbnRJbXBsCi17Ci1wdWJsaWM6Ci0gICAgSFRNTEtleWdlbkVsZW1lbnRJbXBsKERvY3Vt
ZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFs
IGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIERPTVN0cmluZyB0
eXBlKCkgY29uc3Q7Ci0KLSAgICAvLyAjIyMgdGhpcyBpcyBqdXN0IGEgcm91Z2ggZ3Vlc3MKLSAg
ICB2aXJ0dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZUlt
cGwgKmF0dHIpOwotICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3Qm
LCBib29sKTsKLXByb3RlY3RlZDoKLSAgICBBdG9taWNTdHJpbmcgbV9jaGFsbGVuZ2U7Ci0gICAg
QXRvbWljU3RyaW5nIG1fa2V5VHlwZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xh
c3MgSFRNTE9wdEdyb3VwRWxlbWVudEltcGwgOiBwdWJsaWMgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dEltcGwKLXsKLXB1YmxpYzoKLSAgICBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbChEb2N1bWVudElt
cGwgKmRvYywgSFRNTEZvcm1FbGVtZW50SW1wbCAqZiA9IDApOwotICAgIHZpcnR1YWwgfkhUTUxP
cHRHcm91cEVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3Qg
Tm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFt
ZXM6Om9wdGlvblRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpoclRhZyk7
IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNG
b2N1c2FibGUoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRCZWZv
cmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRp
b25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUltcGwg
Km5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAg
IHZpcnR1YWwgTm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2Rl
SW1wbCAqYWRkQ2hpbGQoIE5vZGVJbXBsKiBuZXdDaGlsZCApOwotICAgIHZpcnR1YWwgdm9pZCBw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGVJbXBsICphdHRyKTsKLSAgICB2b2lk
IHJlY2FsY1NlbGVjdE9wdGlvbnMoKTsKLQotICAgIERPTVN0cmluZyBsYWJlbCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0TGFiZWwoY29uc3QgRE9NU3RyaW5nICYpOwotfTsKLQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTE9wdGlvbkVsZW1lbnRJbXBsIDogcHVibGljIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsCi17Ci0gICAgZnJpZW5kIGNsYXNzIGtodG1sOjpSZW5kZXJT
ZWxlY3Q7Ci0gICAgZnJpZW5kIGNsYXNzIERPTTo6SFRNTFNlbGVjdEVsZW1lbnRJbXBsOwotCi1w
dWJsaWM6Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1M
Rm9ybUVsZW1lbnRJbXBsICpmID0gMCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5k
VGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAg
IHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMjsgfQotICAgIHZpcnR1
YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlSW1wbCogbmV3Q2hpbGQpIHsgcmV0dXJuIG5ld0No
aWxkLT5pc1RleHROb2RlKCkgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3Jp
cHRUYWcpOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLQotICAg
IERPTVN0cmluZyB0eXBlKCkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgdGV4dCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0VGV4dChjb25zdCBET01TdHJpbmcgJiwgaW50ICZleGNlcHRpb24pOwotCi0g
ICAgaW50IGluZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRJbmRleChpbnQsIGludCAmZXhjZXB0
aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlSW1wbCAqYXR0cik7Ci0KLSAgICBET01TdHJpbmcgdmFsdWUoKSBjb25zdDsKLSAgICB2b2lk
IHNldFZhbHVlKGNvbnN0IERPTVN0cmluZyAmKTsKLQotICAgIGJvb2wgc2VsZWN0ZWQoKSBjb25z
dCB7IHJldHVybiBtX3NlbGVjdGVkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3RlZChib29sIF9zZWxl
Y3RlZCk7Ci0KLSAgICBIVE1MU2VsZWN0RWxlbWVudEltcGwgKmdldFNlbGVjdCgpIGNvbnN0Owot
Ci0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgYm9vbCBkZWZhdWx0
U2VsZWN0ZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldERlZmF1bHRTZWxlY3RlZCggYm9vbCApOwot
Ci0gICAgRE9NU3RyaW5nIGxhYmVsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMYWJlbCggY29uc3Qg
RE9NU3RyaW5nICYgKTsKLQotcHJvdGVjdGVkOgotICAgIERPTVN0cmluZyBtX3ZhbHVlOwotICAg
IGJvb2wgbV9zZWxlY3RlZDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBI
VE1MVGV4dEFyZWFFbGVtZW50SW1wbCA6IHB1YmxpYyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1w
bAotewotICAgIGZyaWVuZCBjbGFzcyBraHRtbDo6UmVuZGVyVGV4dEFyZWE7Ci0KLXB1YmxpYzoK
LSAgICBlbnVtIFdyYXBNZXRob2QgewotICAgICAgICB0YV9Ob1dyYXAsCi0gICAgICAgIHRhX1Zp
cnR1YWwsCi0gICAgICAgIHRhX1BoeXNpY2FsCi0gICAgfTsKLQotICAgIEhUTUxUZXh0QXJlYUVs
ZW1lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmID0gMCk7
Ci0gICAgfkhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY2hl
Y2tEVEQoY29uc3QgTm9kZUltcGwqIG5ld0NoaWxkKSB7IHJldHVybiBuZXdDaGlsZC0+aXNUZXh0
Tm9kZSgpOyB9Ci0KLSAgICBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQotICAg
IGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzOyB9Ci0KLSAgICBXcmFwTWV0aG9kIHdy
YXAoKSBjb25zdCB7IHJldHVybiBtX3dyYXA7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VudW1l
cmF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIERPTVN0cmluZyB0eXBlKCkg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKSB7IHJldHVybiB0cnVl
OyB9Ci0gICAgdmlydHVhbCBRU3RyaW5nIHN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3Rv
cmVTdGF0ZShRU3RyaW5nTGlzdCAmKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAg
IGludCBzZWxlY3Rpb25FbmQoKTsKLQotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsK
LSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotCi0gICAgdm9pZCBzZWxlY3QgKCAgKTsK
LSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLQotICAgIHZpcnR1YWwgdm9p
ZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlSW1wbCAqYXR0cik7Ci0gICAgdmlydHVhbCBraHRtbDo6UmVuZGVy
T2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6UmVuZGVyU3R5bGUg
Kik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2go
KTsKLSAgICB2aXJ0dWFsIGJvb2wgYXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiwgYm9vbCk7
Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0gICAgRE9NU3RyaW5nIHZhbHVlKCk7Ci0gICAg
dm9pZCBzZXRWYWx1ZShjb25zdCBET01TdHJpbmcgJnZhbHVlKTsKLSAgICBET01TdHJpbmcgZGVm
YXVsdFZhbHVlKCk7Ci0gICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoY29uc3QgRE9NU3RyaW5nICZ2
YWx1ZSk7Ci0KLSAgICB2b2lkIGludmFsaWRhdGVWYWx1ZSgpIHsgbV92YWx1ZUlzVmFsaWQgPSBm
YWxzZTsgfQotICAgIHZvaWQgdXBkYXRlVmFsdWUoKTsKLQotICAgIGJvb2wgdmFsdWVNYXRjaGVz
UmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlTWF0Y2hlc1JlbmRlcmVyOyB9Ci0gICAg
dm9pZCBzZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpIHsgbV92YWx1ZU1hdGNoZXNSZW5kZXJlciA9
IHRydWU7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCk7Ci0gICAgCi0gICAgdmly
dHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpOwotICAgIAot
ICAgIERPTVN0cmluZyBhY2Nlc3NLZXkoKSBjb25zdDsKLSAgICB2b2lkIHNldEFjY2Vzc0tleShj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICB2b2lkIHNldENvbHMoaW50KTsKLQotICAgIHZvaWQg
c2V0Um93cyhpbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1fcm93czsKLSAgICBpbnQgbV9j
b2xzOwotICAgIFdyYXBNZXRob2QgbV93cmFwOwotICAgIFFTdHJpbmcgbV92YWx1ZTsKLSAgICBi
b29sIG1fdmFsdWVJc1ZhbGlkOwotICAgIGJvb2wgbV92YWx1ZU1hdGNoZXNSZW5kZXJlcjsKLX07
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogY2xhc3MgSFRNTElzSW5kZXhFbGVtZW50SW1wbCA6
IHB1YmxpYyBIVE1MSW5wdXRFbGVtZW50SW1wbAogewogcHVibGljOgpAQCAtODEwLDI0ICs0Niw2
IEBAIHByb3RlY3RlZDoKICAgICBET01TdHJpbmcgbV9wcm9tcHQ7CiB9OwogCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwgOiBwdWJsaWMga2h0
bWw6OlNoYXJlZDxIVE1MT3B0aW9uc0NvbGxlY3Rpb25JbXBsPgotewotcHVibGljOgotICAgIEhU
TUxPcHRpb25zQ29sbGVjdGlvbkltcGwoSFRNTFNlbGVjdEVsZW1lbnRJbXBsICppbXBsKSA6IG1f
c2VsZWN0KGltcGwpIHsgfQotCi0gICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRMZW5ndGgodW5zaWduZWQpOwotICAgIE5vZGVJbXBsICppdGVtKHVuc2lnbmVkIGluZGV4
KSBjb25zdDsKLSAgICBOb2RlSW1wbCAqbmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFtZSkg
Y29uc3Q7Ci0KLSAgICB2b2lkIGRldGFjaCgpIHsgbV9zZWxlY3QgPSAwOyB9Ci0KLXByaXZhdGU6
Ci0gICAgSFRNTFNlbGVjdEVsZW1lbnRJbXBsICptX3NlbGVjdDsKLX07Ci0KIH0gLy9uYW1lc3Bh
Y2UKIAogI2VuZGlmCkluZGV4OiBraHRtbC9lY21hL2tqc19odG1sLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBraHRtbC9lY21hL2tqc19odG1sLmNwcAkocmV2aXNpb24gMTE5NzgpCisrKyBraHRtbC9lY21h
L2tqc19odG1sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsMTMgKzMzLDI0IEBACiAjaW5jbHVk
ZSAiaHRtbC9odG1sX2Jsb2NraW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9jYW52YXNpbXBs
LmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgotI2luY2x1ZGUgImh0bWwv
aHRtbF9mb3JtaW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9oZWFkaW1wbC5oIgogI2luY2x1
ZGUgImh0bWwvaHRtbF9pbWFnZWltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfaW5saW5laW1w
bC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9saXN0aW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRt
bF9vYmplY3RpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX3RhYmxlaW1wbC5oIgorI2luY2x1
ZGUgIkhUTUxTZWxlY3RFbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnRJ
bXBsLmgiCisjaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxJ
c0luZGV4RWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5o
IgorI2luY2x1ZGUgIkhUTUxMYWJlbEVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiSFRNTExlZ2Vu
ZEVsZW1lbnRJbXBsLmgiCisjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCIKKyNp
bmNsdWRlICJIVE1MQnV0dG9uRWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MRmllbGRTZXRF
bGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50SW1wbC5oIgorI2luY2x1
ZGUgIkhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwuaCIKIAogI2luY2x1ZGUgIkZyYW1lLmgiCiAj
aW5jbHVkZSAia2h0bWx2aWV3LmgiCkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Zvcm0u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAkocmV2aXNpb24g
MTE5NzgpCisrKyBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAkod29ya2luZyBjb3B5KQpA
QCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuaCIK
ICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2ltYWdlLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5n
L3JlbmRlcl9ibG9jay5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9mb3JtaW1wbC5oIgogCiBjbGFz
cyBRV2lkZ2V0OwogY2xhc3MgUUxpc3Rib3hJdGVtOwpAQCAtMzgsMTIgKzM3LDEzIEBAIGNsYXNz
IFFMaXN0Qm94OwogI2luY2x1ZGUgPHFsaW5lZWRpdC5oPgogI2luY2x1ZGUgPHFjb21ib2JveC5o
PgogCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MU2Vs
ZWN0RWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50SW1wbC5oIgor
CiBuYW1lc3BhY2UgRE9NIHsKICAgICBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGNs
YXNzIEhUTUxJbnB1dEVsZW1lbnRJbXBsOwotICAgIGNsYXNzIEhUTUxTZWxlY3RFbGVtZW50SW1w
bDsKICAgICBjbGFzcyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbDsKLSAgICBjbGFzcyBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbDsKIH07CiAKIG5hbWVzcGFjZSBraHRtbCB7CkluZGV4OiBraHRt
bC9yZW5kZXJpbmcvcmVuZGVyX2xpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmlu
Zy9yZW5kZXJfbGluZS5jcHAJKHJldmlzaW9uIDExOTc4KQorKysga2h0bWwvcmVuZGVyaW5nL3Jl
bmRlcl9saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUg
InhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKICNpbmNs
dWRlICJDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9mb3JtaW1wbC5oIgogI2lu
Y2x1ZGUgInJlbmRlcl9pbmxpbmUuaCIKICNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKICNpbmNs
dWRlICJyZW5kZXJfYXJlbmEuaCIKSW5kZXg6IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfdGhlbWUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfdGhlbWUuY3BwCShyZXZp
c2lvbiAxMTk3OCkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfdGhlbWUuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlICJyZW5kZXJfc3R5bGUuaCIKICNp
bmNsdWRlICJodG1sbmFtZXMuaCIKLSNpbmNsdWRlICJodG1sX2Zvcm1pbXBsLmgiCisjaW5jbHVk
ZSAiSFRNTElucHV0RWxlbWVudEltcGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5h
bWVzOwogCkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Zsb3cuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfZmxvdy5jcHAJKHJldmlzaW9uIDExOTc4KQorKysg
a2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9mbG93LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsMTYg
KzMzLDE2IEBACiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9jYW52YXMuaCIKICNpbmNsdWRl
ICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCi0jaW5j
bHVkZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCiAjaW5jbHVkZSAicmVuZGVyX2lubGluZS5oIgog
I2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgogI2luY2x1ZGUgInJlbmRlcl9hcmVuYS5oIgogI2lu
Y2x1ZGUgInJlbmRlcl9saW5lLmgiCisjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCiAKICNpbmNsdWRl
ICJraHRtbHZpZXcuaCIKIAogdXNpbmcgbmFtZXNwYWNlIERPTTsKLXVzaW5nIG5hbWVzcGFjZSBI
VE1MTmFtZXM7Cit1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiB1c2luZyBuYW1lc3Bh
Y2Uga2h0bWw7CiAKIFJlbmRlckZsb3cqIFJlbmRlckZsb3c6OmNyZWF0ZUFub255bW91c0Zsb3co
RE9NOjpEb2N1bWVudEltcGwqIGRvYywgUmVuZGVyU3R5bGUqIHN0eWxlKQpJbmRleDoga2h0bWwv
cmVuZGVyaW5nL3JlbmRlcl9jYW52YXNpbWFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVu
ZGVyaW5nL3JlbmRlcl9jYW52YXNpbWFnZS5jcHAJKHJldmlzaW9uIDExOTc4KQorKysga2h0bWwv
cmVuZGVyaW5nL3JlbmRlcl9jYW52YXNpbWFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcg
KzMzLDYgQEAKIAogI2luY2x1ZGUgImNzcy9jc3NoZWxwZXIuaCIKICNpbmNsdWRlICJtaXNjL2hl
bHBlci5oIgotI2luY2x1ZGUgImh0bWwvaHRtbF9mb3JtaW1wbC5oIgogI2luY2x1ZGUgImh0bWwv
aHRtbF9jYW52YXNpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgogI2lu
Y2x1ZGUgImh0bWwvaHRtbF9kb2N1bWVudGltcGwuaCIKSW5kZXg6IGtodG1sL3JlbmRlcmluZy9y
ZW5kZXJfaW1hZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfaW1h
Z2UuY3BwCShyZXZpc2lvbiAxMTk3OCkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfaW1hZ2Uu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCwxMCArMzQsMTAgQEAKIAogI2luY2x1ZGUgImNzcy9j
c3NoZWxwZXIuaCIKICNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgotI2luY2x1ZGUgImh0bWwvaHRt
bF9mb3JtaW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9pbWFnZWltcGwuaCIKICNpbmNsdWRl
ICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1w
bC5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnRJbXBsLmgiCiAKIHVzaW5nIG5hbWVzcGFj
ZSBET007CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwpJbmRleDoga2h0bWwvcmVuZGVyaW5n
L3JlbmRlcl9mb3JtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Zv
cm0uY3BwCShyZXZpc2lvbiAxMTk3OCkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfZm9ybS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDggKzMxLDEzIEBACiAjaW5jbHVkZSA8cXN0eWxlLmg+
CiAKICNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnRJ
bXBsLmgiCisjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJI
VE1MT3B0aW9uRWxlbWVudEltcGwuaCIKKyNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudEltcGwu
aCIKKyNpbmNsdWRlICJIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5oIgorI2luY2x1ZGUgIkhUTUxG
b3JtRWxlbWVudEltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5j
bHVkZSAiaHRtbC9odG1sX2Zvcm1pbXBsLmgiCiAKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVy
X2Zvcm0uaCIKICNpbmNsdWRlIDxhc3NlcnQuaD4KSW5kZXg6IGtodG1sL3JlbmRlcmluZy9yZW5k
ZXJfYnV0dG9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2J1dHRv
bi5jcHAJKHJldmlzaW9uIDExOTc4KQorKysga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9idXR0b24u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSAicmVuZGVyX2J1
dHRvbi5oIgogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJodG1sbmFtZXMuaCIK
LSNpbmNsdWRlICJodG1sX2Zvcm1pbXBsLmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudElt
cGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIERPTTsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7
CkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAkocmV2aXNpb24gMTE5NzgpCisrKyBraHRt
bC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsMTAgKzMx
LDEwIEBACiAjaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21f
ZG9jaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fcG9zaXRpb24uaCIKLSNpbmNsdWRlICJodG1s
L2h0bWxfZm9ybWltcGwuaCIKICNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKICNpbmNsdWRlICJl
ZGl0aW5nL1NlbGVjdGlvbkNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIK
KyNpbmNsdWRlICJodG1sbmFtZXMuaCIKIAogI2luY2x1ZGUgImtodG1sdmlldy5oIgogI2luY2x1
ZGUgIkZyYW1lLmgiCkluZGV4OiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAx
MTk3OCkKKysrIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5
KQpAQCAtMTE2LDcgKzExNiw2IEBACiAJCTkzRjE5OEU0MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1s
X2Jsb2NraW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRjUyM0QyM0EwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfYmxvY2tpbXBsLmggKi87IH07CiAJ
CTkzRjE5OEU1MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2RvY3VtZW50aW1wbC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyM0MwMkRFNDM5NjAx
ODYzNUNBIC8qIGh0bWxfZG9jdW1lbnRpbXBsLmggKi87IH07CiAJCTkzRjE5OEU2MDgyNDVFNTkw
MDFFOUFCQyAvKiBodG1sX2VsZW1lbnRpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDIzRjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9lbGVt
ZW50aW1wbC5oICovOyB9OwotCQk5M0YxOThFNzA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9mb3Jt
aW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUy
M0QyNDEwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfZm9ybWltcGwuaCAqLzsgfTsKIAkJOTNGMTk4
RTgwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfaGVhZGltcGwuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjQzMDJERTQzOTYwMTg2MzVDQSAvKiBo
dG1sX2hlYWRpbXBsLmggKi87IH07CiAJCTkzRjE5OEU5MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1s
X2ltYWdlaW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRjUyM0QyNDUwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfaW1hZ2VpbXBsLmggKi87IH07CiAJ
CTkzRjE5OEVBMDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2lubGluZWltcGwuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjQ3MDJERTQzOTYwMTg2
MzVDQSAvKiBodG1sX2lubGluZWltcGwuaCAqLzsgfTsKQEAgLTQ2MCw3ICs0NTksNiBAQAogCQk5
M0YxOUE5MDA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9ibG9ja2ltcGwuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyMzkwMkRFNDM5NjAxODYz
NUNBIC8qIGh0bWxfYmxvY2tpbXBsLmNwcCAqLzsgfTsKIAkJOTNGMTlBOTEwODI0NUU1OTAwMUU5
QUJDIC8qIGh0bWxfZG9jdW1lbnRpbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjNCMDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2RvY3Vt
ZW50aW1wbC5jcHAgKi87IH07CiAJCTkzRjE5QTkyMDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2Vs
ZW1lbnRpbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEY1MjNEMjNFMDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2VsZW1lbnRpbXBsLmNwcCAqLzsg
fTsKLQkJOTNGMTlBOTMwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfZm9ybWltcGwuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDAwMkRFNDM5
NjAxODYzNUNBIC8qIGh0bWxfZm9ybWltcGwuY3BwICovOyB9OwogCQk5M0YxOUE5NDA4MjQ1RTU5
MDAxRTlBQkMgLyogaHRtbF9oZWFkaW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDI0MjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9oZWFk
aW1wbC5jcHAgKi87IH07CiAJCTkzRjE5QTk1MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2ltYWdl
aW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBG
NTIzRDI0NDAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9pbWFnZWltcGwuY3BwICovOyB9OwogCQk5
M0YxOUE5NjA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9pbmxpbmVpbXBsLmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjQ2MDJERTQzOTYwMTg2
MzVDQSAvKiBodG1sX2lubGluZWltcGwuY3BwICovOyB9OwpAQCAtNjI0LDYgKzYyMiw2NCBAQAog
CQlBODEzNUJCNTA5NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM1Qjg5
MDk3MjQwMzkwMEQ3NDQ2MyAvKiBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIuY3BwICovOyB9Owog
CQlBODEzNUJCNjA5NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0LmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNUI4QTA5NzI0MDM5MDBENzQ0
NjMgLyogQ2FjaGVkT2JqZWN0LmggKi87IH07CiAJCUE4MTM1QkI3MDk3MjQwM0EwMEQ3NDQ2MyAv
KiBDYWNoZWRPYmplY3QuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQTgxMzVCOEIwOTcyNDAzOTAwRDc0NDYzIC8qIENhY2hlZE9iamVjdC5jcHAgKi87
IH07CisJCUE4MTM2OUNBMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1lbnRJbXBs
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlB
RTA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTElzSW5kZXhFbGVtZW50SW1wbC5oICovOyB9OworCQlB
ODEzNjlDQjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTElzSW5kZXhFbGVtZW50SW1wbC5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlBRjA5NzM3
NEY1MDBENzQ0NjMgLyogSFRNTElzSW5kZXhFbGVtZW50SW1wbC5jcHAgKi87IH07CisJCUE4MTM2
OUNDMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MSW5wdXRFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QjAwOTczNzRGNTAwRDc0
NDYzIC8qIEhUTUxJbnB1dEVsZW1lbnRJbXBsLmggKi87IH07CisJCUE4MTM2OUNEMDk3Mzc0RjYw
MEQ3NDQ2MyAvKiBIVE1MSW5wdXRFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlCMTA5NzM3NEY1MDBENzQ0NjMgLyogSFRN
TElucHV0RWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEzNjlDRTA5NzM3NEY2MDBENzQ0NjMg
LyogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUIyMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50SW1wbC5oICovOyB9OworCQlBODEzNjlDRjA5NzM3NEY2MDBENzQ0NjMg
LyogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QjMwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5RDAwOTczNzRGNjAwRDc0
NDYzIC8qIEhUTUxGb3JtRWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUI0MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MRm9ybUVs
ZW1lbnRJbXBsLmggKi87IH07CisJCUE4MTM2OUQxMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MRm9y
bUVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEE4MTM2OUI1MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MRm9ybUVsZW1lbnRJbXBsLmNw
cCAqLzsgfTsKKwkJQTgxMzY5RDIwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxCdXR0b25FbGVtZW50
SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgx
MzY5QjYwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxCdXR0b25FbGVtZW50SW1wbC5oICovOyB9Owor
CQlBODEzNjlEMzA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUI3MDk3
Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MQnV0dG9uRWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEz
NjlENDA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEZpZWxkU2V0RWxlbWVudEltcGwuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUI4MDk3Mzc0RjUw
MEQ3NDQ2MyAvKiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbC5oICovOyB9OworCQlBODEzNjlENTA5
NzM3NEY2MDBENzQ0NjMgLyogSFRNTEZpZWxkU2V0RWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QjkwOTczNzRGNTAwRDc0
NDYzIC8qIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5RDYwOTcz
NzRGNjAwRDc0NDYzIC8qIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlCQTA5NzM3NEY1MDBENzQ0NjMg
LyogSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCAqLzsgfTsKKwkJQTgxMzY5RDcwOTczNzRGNjAw
RDc0NDYzIC8qIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUJCMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBI
VE1MVGV4dEFyZWFFbGVtZW50SW1wbC5jcHAgKi87IH07CisJCUE4MTM2OUQ4MDk3Mzc0RjYwMEQ3
NDQ2MyAvKiBIVE1MU2VsZWN0RWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUJDMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MU2Vs
ZWN0RWxlbWVudEltcGwuaCAqLzsgfTsKKwkJQTgxMzY5RDkwOTczNzRGNjAwRDc0NDYzIC8qIEhU
TUxTZWxlY3RFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBODEzNjlCRDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTFNlbGVjdEVsZW1l
bnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5REEwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxPcHRp
b25zQ29sbGVjdGlvbkltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEE4MTM2OUJFMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MT3B0aW9uc0NvbGxlY3Rp
b25JbXBsLmggKi87IH07CisJCUE4MTM2OURDMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MT3B0aW9u
RWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEE4MTM2OUMwMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MT3B0aW9uRWxlbWVudEltcGwuaCAq
LzsgfTsKKwkJQTgxMzY5REQwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxPcHRpb25FbGVtZW50SW1w
bC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEz
NjlDMTA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmNwcCAqLzsgfTsK
KwkJQTgxMzY5REUwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlDMjA5
NzM3NEY1MDBENzQ0NjMgLyogSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuaCAqLzsgfTsKKwkJQTgx
MzY5REYwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUMzMDk3Mzc0
RjUwMEQ3NDQ2MyAvKiBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5jcHAgKi87IH07CisJCUE4MTM2
OUUwMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MTGVnZW5kRWxlbWVudEltcGwuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUM0MDk3Mzc0RjUwMEQ3
NDQ2MyAvKiBIVE1MTGVnZW5kRWxlbWVudEltcGwuaCAqLzsgfTsKKwkJQTgxMzY5RTEwOTczNzRG
NjAwRDc0NDYzIC8qIEhUTUxMZWdlbmRFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlDNTA5NzM3NEY1MDBENzQ0NjMgLyog
SFRNTExlZ2VuZEVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5RTIwOTczNzRGNjAwRDc0
NDYzIC8qIEhUTUxMYWJlbEVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlDNjA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTExhYmVs
RWxlbWVudEltcGwuaCAqLzsgfTsKKwkJQTgxMzY5RTMwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxM
YWJlbEVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEE4MTM2OUM3MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MTGFiZWxFbGVtZW50SW1w
bC5jcHAgKi87IH07CisJCUE4MTM2OUU0MDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MS2V5Z2VuRWxl
bWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEE4MTM2OUM4MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MS2V5Z2VuRWxlbWVudEltcGwuaCAqLzsg
fTsKKwkJQTgxMzY5RTUwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxLZXlnZW5FbGVtZW50SW1wbC5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlD
OTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJ
QTgxMzY5RTYwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxJc0luZGV4RWxlbWVudEltcGwuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUFFMDk3Mzc0
RjUwMEQ3NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1lbnRJbXBsLmggKi87IH07CisJCUE4MTM2OUU3
MDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUFGMDk3Mzc0RjUwMEQ3
NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5RTgwOTcz
NzRGNjAwRDc0NDYzIC8qIEhUTUxJbnB1dEVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlCMDA5NzM3NEY1MDBENzQ0NjMgLyog
SFRNTElucHV0RWxlbWVudEltcGwuaCAqLzsgfTsKKwkJQTgxMzY5RTkwOTczNzRGNjAwRDc0NDYz
IC8qIEhUTUxJbnB1dEVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUIxMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MSW5wdXRF
bGVtZW50SW1wbC5jcHAgKi87IH07CisJCUE4MTM2OUVBMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQTgxMzY5QjIwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxHZW5lcmljRm9y
bUVsZW1lbnRJbXBsLmggKi87IH07CisJCUE4MTM2OUVCMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlCMzA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEdlbmVyaWNG
b3JtRWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEzNjlFQzA5NzM3NEY2MDBENzQ0NjMgLyog
SFRNTEZvcm1FbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQTgxMzY5QjQwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxGb3JtRWxlbWVudElt
cGwuaCAqLzsgfTsKKwkJQTgxMzY5RUQwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxGb3JtRWxlbWVu
dEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTgxMzY5QjUwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxGb3JtRWxlbWVudEltcGwuY3BwICovOyB9
OworCQlBODEzNjlFRTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlCNjA5
NzM3NEY1MDBENzQ0NjMgLyogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsLmggKi87IH07CisJCUE4MTM2
OUVGMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MQnV0dG9uRWxlbWVudEltcGwuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QjcwOTczNzRGNTAw
RDc0NDYzIC8qIEhUTUxCdXR0b25FbGVtZW50SW1wbC5jcHAgKi87IH07CisJCUE4MTM2OUYwMDk3
Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QjgwOTczNzRGNTAwRDc0NDYz
IC8qIEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsLmggKi87IH07CisJCUE4MTM2OUYxMDk3Mzc0RjYw
MEQ3NDQ2MyAvKiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNjlCOTA5NzM3NEY1MDBENzQ0NjMgLyog
SFRNTEZpZWxkU2V0RWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEzNjlGMjA5NzM3NEY2MDBE
NzQ0NjMgLyogSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUJBMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1M
VGV4dEFyZWFFbGVtZW50SW1wbC5oICovOyB9OworCQlBODEzNjlGMzA5NzM3NEY2MDBENzQ0NjMg
LyogSFRNTFRleHRBcmVhRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QkIwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxUZXh0
QXJlYUVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5RjQwOTczNzRGNjAwRDc0NDYzIC8q
IEhUTUxTZWxlY3RFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQTgxMzY5QkMwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxTZWxlY3RFbGVt
ZW50SW1wbC5oICovOyB9OworCQlBODEzNjlGNTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTFNlbGVj
dEVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEE4MTM2OUJEMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MU2VsZWN0RWxlbWVudEltcGwu
Y3BwICovOyB9OworCQlBODEzNjlGNjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTE9wdGlvbnNDb2xs
ZWN0aW9uSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTgxMzY5QkUwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwu
aCAqLzsgfTsKKwkJQTgxMzY5RjgwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxPcHRpb25FbGVtZW50
SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgx
MzY5QzAwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRpb25FbGVtZW50SW1wbC5oICovOyB9Owor
CQlBODEzNjlGOTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUMxMDk3
Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MT3B0aW9uRWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEz
NjlGQTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUMyMDk3Mzc0RjUw
MEQ3NDQ2MyAvKiBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5oICovOyB9OworCQlBODEzNjlGQjA5
NzM3NEY2MDBENzQ0NjMgLyogSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QzMwOTczNzRGNTAwRDc0
NDYzIC8qIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxMzY5RkMwOTcz
NzRGNjAwRDc0NDYzIC8qIEhUTUxMZWdlbmRFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5QzQwOTczNzRGNTAwRDc0NDYzIC8q
IEhUTUxMZWdlbmRFbGVtZW50SW1wbC5oICovOyB9OworCQlBODEzNjlGRDA5NzM3NEY2MDBENzQ0
NjMgLyogSFRNTExlZ2VuZEVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUM1MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MTGVn
ZW5kRWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEzNjlGRTA5NzM3NEY2MDBENzQ0NjMgLyog
SFRNTExhYmVsRWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEE4MTM2OUM2MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MTGFiZWxFbGVtZW50
SW1wbC5oICovOyB9OworCQlBODEzNjlGRjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTExhYmVsRWxl
bWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTgxMzY5QzcwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxMYWJlbEVsZW1lbnRJbXBsLmNwcCAq
LzsgfTsKKwkJQTgxMzZBMDAwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxLZXlnZW5FbGVtZW50SW1w
bC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxMzY5
QzgwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxLZXlnZW5FbGVtZW50SW1wbC5oICovOyB9OworCQlB
ODEzNkEwMTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2OUM5MDk3Mzc0
RjYwMEQ3NDQ2MyAvKiBIVE1MS2V5Z2VuRWxlbWVudEltcGwuY3BwICovOyB9OworCQlBODEzNkQz
ODA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODEzNkQzNjA5NzNBOEU3MDBENzQ0NjMgLyogRm9y
bURhdGFMaXN0LmggKi87IH07CisJCUE4MTM2RDM5MDk3M0E4RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0
YUxpc3QuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTgxMzZEMzcwOTczQThFNzAwRDc0NDYzIC8qIEZvcm1EYXRhTGlzdC5jcHAgKi87IH07CisJCUE4
MTM2RDNBMDk3M0E4RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0YUxpc3QuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTM2RDM2MDk3M0E4RTcwMEQ3NDQ2MyAv
KiBGb3JtRGF0YUxpc3QuaCAqLzsgfTsKKwkJQTgxMzZEM0IwOTczQThFNzAwRDc0NDYzIC8qIEZv
cm1EYXRhTGlzdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBODEzNkQzNzA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0LmNwcCAqLzsgfTsK
IAkJQTgxNjU1RDQwOTZCQkVBQzAwNjAxMDU4IC8qIEtDYW52YXNNYXNrZXJRdWFydHouaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTY1NUQyMDk2QkJF
QUMwMDYwMTA1OCAvKiBLQ2FudmFzTWFza2VyUXVhcnR6LmggKi87IH07CiAJCUE4MTY1NUQ1MDk2
QkJFQUMwMDYwMTA1OCAvKiBLQ2FudmFzTWFza2VyUXVhcnR6Lm1tIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxNjU1RDMwOTZCQkVBQzAwNjAxMDU4IC8q
IEtDYW52YXNNYXNrZXJRdWFydHoubW0gKi87IH07CiAJCUE4MTY1NUU0MDk2QkMxMzkwMDYwMTA1
OCAvKiBTVkdNYXNrRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQTgxNjU1RTIwOTZCQzEzOTAwNjAxMDU4IC8qIFNWR01hc2tFbGVt
ZW50SW1wbC5jcHAgKi87IH07CkBAIC02NzAsNyArNzI2LDYgQEAKIAkJQTg4QUQxMzIwOTUyNDgw
QTAwMUREMTk2IC8qIGh0bWxfYmxvY2tpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDIzQTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9ibG9j
a2ltcGwuaCAqLzsgfTsKIAkJQTg4QUQxMzMwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfZG9jdW1l
bnRpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBG
NTIzRDIzQzAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9kb2N1bWVudGltcGwuaCAqLzsgfTsKIAkJ
QTg4QUQxMzQwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfZWxlbWVudGltcGwuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjNGMDJERTQzOTYwMTg2
MzVDQSAvKiBodG1sX2VsZW1lbnRpbXBsLmggKi87IH07Ci0JCUE4OEFEMTM1MDk1MjQ4MEEwMDFE
RDE5NiAvKiBodG1sX2Zvcm1pbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGNTIzRDI0MTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9mb3JtaW1wbC5o
ICovOyB9OwogCQlBODhBRDEzNjA5NTI0ODBBMDAxREQxOTYgLyogaHRtbF9oZWFkaW1wbC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDMwMkRF
NDM5NjAxODYzNUNBIC8qIGh0bWxfaGVhZGltcGwuaCAqLzsgfTsKIAkJQTg4QUQxMzcwOTUyNDgw
QTAwMUREMTk2IC8qIGh0bWxfaW1hZ2VpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDI0NTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9pbWFn
ZWltcGwuaCAqLzsgfTsKIAkJQTg4QUQxMzgwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfaW5saW5l
aW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUy
M0QyNDcwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfaW5saW5laW1wbC5oICovOyB9OwpAQCAtMTA1
Niw3ICsxMTExLDYgQEAKIAkJQTg4QUQyRDMwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfYmxvY2tp
bXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1
MjNEMjM5MDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2Jsb2NraW1wbC5jcHAgKi87IH07CiAJCUE4
OEFEMkQ0MDk1MjQ4MEEwMDFERDE5NiAvKiBodG1sX2RvY3VtZW50aW1wbC5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDIzQjAyREU0Mzk2MDE4
NjM1Q0EgLyogaHRtbF9kb2N1bWVudGltcGwuY3BwICovOyB9OwogCQlBODhBRDJENTA5NTI0ODBB
MDAxREQxOTYgLyogaHRtbF9lbGVtZW50aW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDIzRTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9l
bGVtZW50aW1wbC5jcHAgKi87IH07Ci0JCUE4OEFEMkQ2MDk1MjQ4MEEwMDFERDE5NiAvKiBodG1s
X2Zvcm1pbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEY1MjNEMjQwMDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2Zvcm1pbXBsLmNwcCAqLzsgfTsK
IAkJQTg4QUQyRDcwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfaGVhZGltcGwuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDIwMkRFNDM5NjAx
ODYzNUNBIC8qIGh0bWxfaGVhZGltcGwuY3BwICovOyB9OwogCQlBODhBRDJEODA5NTI0ODBBMDAx
REQxOTYgLyogaHRtbF9pbWFnZWltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDQwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfaW1hZ2Vp
bXBsLmNwcCAqLzsgfTsKIAkJQTg4QUQyRDkwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfaW5saW5l
aW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBG
NTIzRDI0NjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9pbmxpbmVpbXBsLmNwcCAqLzsgfTsKQEAg
LTE5NTYsNiArMjAxMCwzNSBAQAogCQlBODEzNUI4OTA5NzI0MDM5MDBENzQ0NjMgLyogQ2FjaGVk
T2JqZWN0Q2xpZW50V2Fsa2VyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBDYWNoZWRPYmplY3RDbGllbnRXYWxrZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlBODEzNUI4QTA5NzI0MDM5MDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDYWNoZWRPYmplY3QuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJQTgxMzVCOEIwOTcyNDAzOTAwRDc0NDYzIC8qIENhY2hlZE9iamVj
dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ2FjaGVkT2JqZWN0
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxMzY5QUUwOTczNzRGNTAwRDc0
NDYzIC8qIEhUTUxJc0luZGV4RWxlbWVudEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEhUTUxJc0luZGV4RWxlbWVudEltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQTgxMzY5QUYwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxJc0luZGV4RWxlbWVudElt
cGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEhUTUxJc0luZGV4
RWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlCMDA5
NzM3NEY1MDBENzQ0NjMgLyogSFRNTElucHV0RWxlbWVudEltcGwuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxJbnB1dEVsZW1lbnRJbXBsLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUE4MTM2OUIxMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MSW5wdXRFbGVt
ZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
MzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTElu
cHV0RWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlC
MjA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTM2OUIzMDk3Mzc0RjUwMEQ3NDQ2MyAv
KiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQlBODEzNjlCNDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEZvcm1F
bGVtZW50SW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRNTEZvcm1F
bGVtZW50SW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlCNTA5NzM3
NEY1MDBENzQ0NjMgLyogSFRNTEZvcm1FbGVtZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTEZvcm1FbGVtZW50SW1wbC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUE4MTM2OUI2MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MQnV0dG9u
RWxlbWVudEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxCdXR0
b25FbGVtZW50SW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlCNzA5
NzM3NEY1MDBENzQ0NjMgLyogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1MQnV0dG9uRWxlbWVudEltcGwuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlCODA5NzM3NEY1MDBENzQ0NjMgLyogSFRN
TEZpZWxkU2V0RWxlbWVudEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEhUTUxGaWVsZFNldEVsZW1lbnRJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CUE4MTM2OUI5MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MRmllbGRTZXRFbGVtZW50SW1wbC5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTEZpZWxkU2V0RWxlbWVu
dEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlCQTA5NzM3NEY1
MDBENzQ0NjMgLyogSFRNTFRleHRBcmVhRWxlbWVudEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUE4MTM2OUJCMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MVGV4dEFyZWFF
bGVtZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRN
TFRleHRBcmVhRWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlB
ODEzNjlCQzA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTFNlbGVjdEVsZW1lbnRJbXBsLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MU2VsZWN0RWxlbWVudEltcGwuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxMzY5QkQwOTczNzRGNTAwRDc0NDYzIC8qIEhU
TUxTZWxlY3RFbGVtZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gSFRNTFNlbGVjdEVsZW1lbnRJbXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQTgxMzY5QkUwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRpb25zQ29sbGVjdGlvbklt
cGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxPcHRpb25zQ29sbGVj
dGlvbkltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxMzY5QzAwOTczNzRG
NTAwRDc0NDYzIC8qIEhUTUxPcHRpb25FbGVtZW50SW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCUE4MTM2OUMxMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MT3B0aW9uRWxlbWVu
dEltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEhUTUxPcHRp
b25FbGVtZW50SW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTM2OUMy
MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxMzY5QzMwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxP
cHRHcm91cEVsZW1lbnRJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUE4MTM2OUM0MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MTGVnZW5kRWxlbWVudEltcGwu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxMZWdlbmRFbGVtZW50SW1w
bC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODEzNjlDNTA5NzM3NEY1MDBENzQ0
NjMgLyogSFRNTExlZ2VuZEVsZW1lbnRJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBIVE1MTGVnZW5kRWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlBODEzNjlDNjA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTExhYmVsRWxlbWVu
dEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxMYWJlbEVsZW1l
bnRJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTM2OUM3MDk3Mzc0RjUw
MEQ3NDQ2MyAvKiBIVE1MTGFiZWxFbGVtZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gSFRNTExhYmVsRWxlbWVudEltcGwuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlBODEzNjlDODA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEtleWdlbkVs
ZW1lbnRJbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
MzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MS2V5Z2Vu
RWxlbWVudEltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxMzY5QzkwOTcz
NzRGNjAwRDc0NDYzIC8qIEhUTUxLZXlnZW5FbGVtZW50SW1wbC5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxMzZEMzYwOTczQThFNzAwRDc0NDYzIC8qIEZvcm1E
YXRhTGlzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRm9ybURhdGFMaXN0
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTM2RDM3MDk3M0E4RTcwMEQ3NDQ2
MyAvKiBGb3JtRGF0YUxpc3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IEZvcm1EYXRhTGlzdC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE4MTY1
NUQyMDk2QkJFQUMwMDYwMTA1OCAvKiBLQ2FudmFzTWFza2VyUXVhcnR6LmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBLQ2FudmFzTWFza2VyUXVhcnR6Lmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCUE4MTY1NUQzMDk2QkJFQUMwMDYwMTA1OCAvKiBLQ2FudmFzTWFz
a2VyUXVhcnR6Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IEtD
YW52YXNNYXNrZXJRdWFydHoubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE4MTY1
NUUyMDk2QkMxMzkwMDYwMTA1OCAvKiBTVkdNYXNrRWxlbWVudEltcGwuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFNWR01hc2tFbGVtZW50SW1wbC5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNDcyLDggKzI1NTUsNiBAQAogCQlGNTIzRDIzQzAy
REU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9kb2N1bWVudGltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gaHRtbF9kb2N1bWVudGltcGwuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUY1
MjNEMjNFMDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2VsZW1lbnRpbXBsLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGh0bWxfZWxlbWVu
dGltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJz
ID0gMDsgfTsKIAkJRjUyM0QyM0YwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfZWxlbWVudGltcGwu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50
V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gaHRt
bF9lbGVtZW50aW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVz
ZXNUYWJzID0gMDsgfTsKLQkJRjUyM0QyNDAwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfZm9ybWlt
cGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBp
bmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gaHRtbF9mb3JtaW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRo
ID0gODsgdXNlc1RhYnMgPSAwOyB9OwotCQlGNTIzRDI0MTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRt
bF9mb3JtaW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBodG1sX2Zvcm1pbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRo
ID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDI0MjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRt
bF9oZWFkaW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBodG1sX2hlYWRpbXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
dGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUY1MjNEMjQzMDJERTQzOTYwMTg2MzVD
QSAvKiBodG1sX2hlYWRpbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IGh0bWxfaGVhZGltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
dGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUY1MjNEMjQ0MDJERTQzOTYwMTg2MzVD
QSAvKiBodG1sX2ltYWdlaW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBodG1sX2ltYWdlaW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpAQCAtMzc2MSw4ICszODQy
LDYgQEAKIAkJCQlGNTIzRDIzQzAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9kb2N1bWVudGltcGwu
aCAqLywKIAkJCQlGNTIzRDIzRTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9lbGVtZW50aW1wbC5j
cHAgKi8sCiAJCQkJRjUyM0QyM0YwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfZWxlbWVudGltcGwu
aCAqLywKLQkJCQlGNTIzRDI0MDAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9mb3JtaW1wbC5jcHAg
Ki8sCi0JCQkJRjUyM0QyNDEwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfZm9ybWltcGwuaCAqLywK
IAkJCQlGNTIzRDI0MjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9oZWFkaW1wbC5jcHAgKi8sCiAJ
CQkJRjUyM0QyNDMwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfaGVhZGltcGwuaCAqLywKIAkJCQlG
NTIzRDI0NDAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9pbWFnZWltcGwuY3BwICovLApAQCAtMzc4
MSw2ICszODYwLDM1IEBACiAJCQkJRjUyM0QyNTEwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxwYXJz
ZXIuaCAqLywKIAkJCQlGNTIzRDI1MjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbHRva2VuaXplci5j
cHAgKi8sCiAJCQkJRjUyM0QyNTMwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWx0b2tlbml6ZXIuaCAq
LywKKwkJCQlBODEzNjlBRTA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTElzSW5kZXhFbGVtZW50SW1w
bC5oICovLAorCQkJCUE4MTM2OUFGMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1l
bnRJbXBsLmNwcCAqLywKKwkJCQlBODEzNjlCMDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTElucHV0
RWxlbWVudEltcGwuaCAqLywKKwkJCQlBODEzNjlCMTA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTElu
cHV0RWxlbWVudEltcGwuY3BwICovLAorCQkJCUE4MTM2OUIyMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5oICovLAorCQkJCUE4MTM2OUIzMDk3Mzc0RjUwMEQ3
NDQ2MyAvKiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxMzY5QjQw
OTczNzRGNTAwRDc0NDYzIC8qIEhUTUxGb3JtRWxlbWVudEltcGwuaCAqLywKKwkJCQlBODEzNjlC
NTA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEZvcm1FbGVtZW50SW1wbC5jcHAgKi8sCisJCQkJQTgx
MzY5QjYwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxCdXR0b25FbGVtZW50SW1wbC5oICovLAorCQkJ
CUE4MTM2OUI3MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MQnV0dG9uRWxlbWVudEltcGwuY3BwICov
LAorCQkJCUE4MTM2OUI4MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MRmllbGRTZXRFbGVtZW50SW1w
bC5oICovLAorCQkJCUE4MTM2OUI5MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MRmllbGRTZXRFbGVt
ZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxMzY5QkEwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxUZXh0
QXJlYUVsZW1lbnRJbXBsLmggKi8sCisJCQkJQTgxMzY5QkIwOTczNzRGNTAwRDc0NDYzIC8qIEhU
TUxUZXh0QXJlYUVsZW1lbnRJbXBsLmNwcCAqLywKKwkJCQlBODEzNjlCQzA5NzM3NEY1MDBENzQ0
NjMgLyogSFRNTFNlbGVjdEVsZW1lbnRJbXBsLmggKi8sCisJCQkJQTgxMzY5QkQwOTczNzRGNTAw
RDc0NDYzIC8qIEhUTUxTZWxlY3RFbGVtZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxMzY5QkUwOTcz
NzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwuaCAqLywKKwkJCQlBODEz
NjlDMDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmggKi8sCisJCQkJ
QTgxMzY5QzEwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRpb25FbGVtZW50SW1wbC5jcHAgKi8s
CisJCQkJQTgxMzY5QzIwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRHcm91cEVsZW1lbnRJbXBs
LmggKi8sCisJCQkJQTgxMzY5QzMwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxPcHRHcm91cEVsZW1l
bnRJbXBsLmNwcCAqLywKKwkJCQlBODEzNjlDNDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTExlZ2Vu
ZEVsZW1lbnRJbXBsLmggKi8sCisJCQkJQTgxMzY5QzUwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxM
ZWdlbmRFbGVtZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxMzY5QzYwOTczNzRGNTAwRDc0NDYzIC8q
IEhUTUxMYWJlbEVsZW1lbnRJbXBsLmggKi8sCisJCQkJQTgxMzY5QzcwOTczNzRGNTAwRDc0NDYz
IC8qIEhUTUxMYWJlbEVsZW1lbnRJbXBsLmNwcCAqLywKKwkJCQlBODEzNjlDODA5NzM3NEY1MDBE
NzQ0NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmggKi8sCisJCQkJQTgxMzY5QzkwOTczNzRG
NjAwRDc0NDYzIC8qIEhUTUxLZXlnZW5FbGVtZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxMzZEMzYw
OTczQThFNzAwRDc0NDYzIC8qIEZvcm1EYXRhTGlzdC5oICovLAorCQkJCUE4MTM2RDM3MDk3M0E4
RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0YUxpc3QuY3BwICovLAogCQkJKTsKIAkJCXBhdGggPSBodG1s
OwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTQyNzYsNyArNDM4NCw2IEBACiAJCQkJ
OTNGMTk4RTQwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfYmxvY2tpbXBsLmggaW4gSGVhZGVycyAq
LywKIAkJCQk5M0YxOThFNTA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9kb2N1bWVudGltcGwuaCBp
biBIZWFkZXJzICovLAogCQkJCTkzRjE5OEU2MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2VsZW1l
bnRpbXBsLmggaW4gSGVhZGVycyAqLywKLQkJCQk5M0YxOThFNzA4MjQ1RTU5MDAxRTlBQkMgLyog
aHRtbF9mb3JtaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk4RTgwODI0NUU1OTAwMUU5
QUJDIC8qIGh0bWxfaGVhZGltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OEU5MDgyNDVF
NTkwMDFFOUFCQyAvKiBodG1sX2ltYWdlaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk4
RUEwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfaW5saW5laW1wbC5oIGluIEhlYWRlcnMgKi8sCkBA
IC00NzUwLDYgKzQ4NTcsMjEgQEAKIAkJCQlBODEzNUI5QzA5NzI0MDNBMDBENzQ0NjMgLyogQ2Fj
aGVkU2NyaXB0LmggaW4gSGVhZGVycyAqLywKIAkJCQlBODEzNUI5RTA5NzI0MDNBMDBENzQ0NjMg
LyogQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyLmggaW4gSGVhZGVycyAqLywKIAkJCQlBODEzNUJB
MDA5NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0LmggaW4gSGVhZGVycyAqLywKKwkJCQlB
ODEzNjlDQTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTElzSW5kZXhFbGVtZW50SW1wbC5oIGluIEhl
YWRlcnMgKi8sCisJCQkJQTgxMzY5Q0MwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxJbnB1dEVsZW1l
bnRJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlDRTA5NzM3NEY2MDBENzQ0NjMgLyog
SFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTM2OUQw
MDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MRm9ybUVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLywK
KwkJCQlBODEzNjlEMjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEJ1dHRvbkVsZW1lbnRJbXBsLmgg
aW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlENDA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEZpZWxk
U2V0RWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTM2OUQ2MDk3Mzc0RjYwMEQ3
NDQ2MyAvKiBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgx
MzY5RDgwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxTZWxlY3RFbGVtZW50SW1wbC5oIGluIEhlYWRl
cnMgKi8sCisJCQkJQTgxMzY5REEwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxPcHRpb25zQ29sbGVj
dGlvbkltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTM2OURDMDk3Mzc0RjYwMEQ3NDQ2MyAv
KiBIVE1MT3B0aW9uRWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTM2OURFMDk3
Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8s
CisJCQkJQTgxMzY5RTAwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxMZWdlbmRFbGVtZW50SW1wbC5o
IGluIEhlYWRlcnMgKi8sCisJCQkJQTgxMzY5RTIwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxMYWJl
bEVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlFNDA5NzM3NEY2MDBENzQ0
NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODEzNkQz
ODA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0LmggaW4gSGVhZGVycyAqLywKIAkJCSk7
CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTQ3
ODUsNyArNDkwNyw2IEBACiAJCQkJQTg4QUQxMzIwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfYmxv
Y2tpbXBsLmggaW4gSGVhZGVycyAqLywKIAkJCQlBODhBRDEzMzA5NTI0ODBBMDAxREQxOTYgLyog
aHRtbF9kb2N1bWVudGltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4OEFEMTM0MDk1MjQ4MEEw
MDFERDE5NiAvKiBodG1sX2VsZW1lbnRpbXBsLmggaW4gSGVhZGVycyAqLywKLQkJCQlBODhBRDEz
NTA5NTI0ODBBMDAxREQxOTYgLyogaHRtbF9mb3JtaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
QTg4QUQxMzYwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfaGVhZGltcGwuaCBpbiBIZWFkZXJzICov
LAogCQkJCUE4OEFEMTM3MDk1MjQ4MEEwMDFERDE5NiAvKiBodG1sX2ltYWdlaW1wbC5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJQTg4QUQxMzgwOTUyNDgwQTAwMUREMTk2IC8qIGh0bWxfaW5saW5laW1w
bC5oIGluIEhlYWRlcnMgKi8sCkBAIC01MDc3LDYgKzUxOTgsMjEgQEAKIAkJCQlBODEzNUJCMjA5
NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkU2NyaXB0LmggaW4gSGVhZGVycyAqLywKIAkJCQlBODEz
NUJCNDA5NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0Q2xpZW50V2Fsa2VyLmggaW4gSGVh
ZGVycyAqLywKIAkJCQlBODEzNUJCNjA5NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0Lmgg
aW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlFNjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTElzSW5k
ZXhFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgxMzY5RTgwOTczNzRGNjAwRDc0
NDYzIC8qIEhUTUxJbnB1dEVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlF
QTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuaCBpbiBIZWFk
ZXJzICovLAorCQkJCUE4MTM2OUVDMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MRm9ybUVsZW1lbnRJ
bXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlFRTA5NzM3NEY2MDBENzQ0NjMgLyogSFRN
TEJ1dHRvbkVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODEzNjlGMDA5NzM3NEY2
MDBENzQ0NjMgLyogSFRNTEZpZWxkU2V0RWxlbWVudEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJ
CUE4MTM2OUYyMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MVGV4dEFyZWFFbGVtZW50SW1wbC5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJQTgxMzY5RjQwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxTZWxlY3RF
bGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgxMzY5RjYwOTczNzRGNjAwRDc0NDYz
IC8qIEhUTUxPcHRpb25zQ29sbGVjdGlvbkltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTM2
OUY4MDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MT3B0aW9uRWxlbWVudEltcGwuaCBpbiBIZWFkZXJz
ICovLAorCQkJCUE4MTM2OUZBMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MT3B0R3JvdXBFbGVtZW50
SW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgxMzY5RkMwOTczNzRGNjAwRDc0NDYzIC8qIEhU
TUxMZWdlbmRFbGVtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgxMzY5RkUwOTczNzRG
NjAwRDc0NDYzIC8qIEhUTUxMYWJlbEVsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlB
ODEzNkEwMDA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmggaW4gSGVh
ZGVycyAqLywKKwkJCQlBODEzNkQzQTA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0Lmgg
aW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNz
aW5nID0gMDsKIAkJfTsKQEAgLTYyNjIsNyArNjM5OCw2IEBACiAJCQkJOTNGMTlBOTAwODI0NUU1
OTAwMUU5QUJDIC8qIGh0bWxfYmxvY2tpbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzRjE5
QTkxMDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2RvY3VtZW50aW1wbC5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQk5M0YxOUE5MjA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9lbGVtZW50aW1wbC5jcHAg
aW4gU291cmNlcyAqLywKLQkJCQk5M0YxOUE5MzA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9mb3Jt
aW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YxOUE5NDA4MjQ1RTU5MDAxRTlBQkMgLyog
aHRtbF9oZWFkaW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YxOUE5NTA4MjQ1RTU5MDAx
RTlBQkMgLyogaHRtbF9pbWFnZWltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBOTYw
ODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfaW5saW5laW1wbC5jcHAgaW4gU291cmNlcyAqLywKQEAg
LTY2MDIsNiArNjczNywyMCBAQAogCQkJCUE4MTM1QjlEMDk3MjQwM0EwMEQ3NDQ2MyAvKiBDYWNo
ZWRTY3JpcHQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgxMzVCOUYwOTcyNDAzQTAwRDc0NDYz
IC8qIENhY2hlZE9iamVjdENsaWVudFdhbGtlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODEz
NUJBMTA5NzI0MDNBMDBENzQ0NjMgLyogQ2FjaGVkT2JqZWN0LmNwcCBpbiBTb3VyY2VzICovLAor
CQkJCUE4MTM2OUNCMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1lbnRJbXBsLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTM2OUNEMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MSW5w
dXRFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNjlDRjA5NzM3NEY2MDBE
NzQ0NjMgLyogSFRNTEdlbmVyaWNGb3JtRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJ
CQkJQTgxMzY5RDEwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxGb3JtRWxlbWVudEltcGwuY3BwIGlu
IFNvdXJjZXMgKi8sCisJCQkJQTgxMzY5RDMwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxCdXR0b25F
bGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNjlENTA5NzM3NEY2MDBENzQ0
NjMgLyogSFRNTEZpZWxkU2V0RWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgx
MzY5RDcwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxUZXh0QXJlYUVsZW1lbnRJbXBsLmNwcCBpbiBT
b3VyY2VzICovLAorCQkJCUE4MTM2OUQ5MDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MU2VsZWN0RWxl
bWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgxMzY5REQwOTczNzRGNjAwRDc0NDYz
IC8qIEhUTUxPcHRpb25FbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNjlE
RjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuY3BwIGluIFNvdXJj
ZXMgKi8sCisJCQkJQTgxMzY5RTEwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxMZWdlbmRFbGVtZW50
SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNjlFMzA5NzM3NEY2MDBENzQ0NjMgLyog
SFRNTExhYmVsRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgxMzY5RTUwOTcz
NzRGNjAwRDc0NDYzIC8qIEhUTUxLZXlnZW5FbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQlBODEzNkQzOTA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwogCQl9OwpAQCAtNjcwNSw3ICs2ODU0LDYgQEAKIAkJCQlBODhBRDJEMzA5NTI0ODBBMDAxREQx
OTYgLyogaHRtbF9ibG9ja2ltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTg4QUQyRDQwOTUy
NDgwQTAwMUREMTk2IC8qIGh0bWxfZG9jdW1lbnRpbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CUE4OEFEMkQ1MDk1MjQ4MEEwMDFERDE5NiAvKiBodG1sX2VsZW1lbnRpbXBsLmNwcCBpbiBTb3Vy
Y2VzICovLAotCQkJCUE4OEFEMkQ2MDk1MjQ4MEEwMDFERDE5NiAvKiBodG1sX2Zvcm1pbXBsLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUE4OEFEMkQ3MDk1MjQ4MEEwMDFERDE5NiAvKiBodG1sX2hl
YWRpbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4OEFEMkQ4MDk1MjQ4MEEwMDFERDE5NiAv
KiBodG1sX2ltYWdlaW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODhBRDJEOTA5NTI0ODBB
MDAxREQxOTYgLyogaHRtbF9pbmxpbmVpbXBsLmNwcCBpbiBTb3VyY2VzICovLApAQCAtNjg3Miw2
ICs3MDIwLDIwIEBACiAJCQkJQTgxMzVCQjMwOTcyNDAzQTAwRDc0NDYzIC8qIENhY2hlZFNjcmlw
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODEzNUJCNTA5NzI0MDNBMDBENzQ0NjMgLyogQ2Fj
aGVkT2JqZWN0Q2xpZW50V2Fsa2VyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTM1QkI3MDk3
MjQwM0EwMEQ3NDQ2MyAvKiBDYWNoZWRPYmplY3QuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgx
MzY5RTcwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxJc0luZGV4RWxlbWVudEltcGwuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJQTgxMzY5RTkwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxJbnB1dEVsZW1l
bnRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTM2OUVCMDk3Mzc0RjYwMEQ3NDQ2MyAv
KiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEz
NjlFRDA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEZvcm1FbGVtZW50SW1wbC5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQlBODEzNjlFRjA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTEJ1dHRvbkVsZW1lbnRJ
bXBsLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTM2OUYxMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBI
VE1MRmllbGRTZXRFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNjlGMzA5
NzM3NEY2MDBENzQ0NjMgLyogSFRNTFRleHRBcmVhRWxlbWVudEltcGwuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJQTgxMzY5RjUwOTczNzRGNjAwRDc0NDYzIC8qIEhUTUxTZWxlY3RFbGVtZW50SW1w
bC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNjlGOTA5NzM3NEY2MDBENzQ0NjMgLyogSFRN
TE9wdGlvbkVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTM2OUZCMDk3Mzc0
RjYwMEQ3NDQ2MyAvKiBIVE1MT3B0R3JvdXBFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQlBODEzNjlGRDA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTExlZ2VuZEVsZW1lbnRJbXBsLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTM2OUZGMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MTGFi
ZWxFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODEzNkEwMTA5NzM3NEY2MDBE
NzQ0NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4
MTM2RDNCMDk3M0E4RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0YUxpc3QuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07
CkluZGV4OiBrd3EvRE9NSFRNTC5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrd3EvRE9NSFRNTC5tbQkocmV2
aXNpb24gMTE5NzgpCisrKyBrd3EvRE9NSFRNTC5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsNyAr
MzEsMTggQEAKICNpbXBvcnQgImh0bWxfYmxvY2tpbXBsLmgiCiAjaW1wb3J0ICJodG1sX2RvY3Vt
ZW50aW1wbC5oIgogI2ltcG9ydCAiaHRtbF9lbGVtZW50aW1wbC5oIgotI2ltcG9ydCAiaHRtbF9m
b3JtaW1wbC5oIgorI2ltcG9ydCAiSFRNTE9wdGlvbnNDb2xsZWN0aW9uSW1wbC5oIgorI2ltcG9y
dCAiSFRNTEZvcm1FbGVtZW50SW1wbC5oIgorI2ltcG9ydCAiSFRNTElucHV0RWxlbWVudEltcGwu
aCIKKyNpbXBvcnQgIkhUTUxJc0luZGV4RWxlbWVudEltcGwuaCIKKyNpbXBvcnQgIkhUTUxTZWxl
Y3RFbGVtZW50SW1wbC5oIgorI2ltcG9ydCAiSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmgiCisjaW1w
b3J0ICJIVE1MVGV4dEFyZWFFbGVtZW50SW1wbC5oIgorI2ltcG9ydCAiSFRNTEJ1dHRvbkVsZW1l
bnRJbXBsLmgiCisjaW1wb3J0ICJIVE1MTGFiZWxFbGVtZW50SW1wbC5oIgorI2ltcG9ydCAiSFRN
TExlZ2VuZEVsZW1lbnRJbXBsLmgiCisjaW1wb3J0ICJIVE1MRmllbGRTZXRFbGVtZW50SW1wbC5o
IgorI2ltcG9ydCAiSFRNTE9wdEdyb3VwRWxlbWVudEltcGwuaCIKICNpbXBvcnQgImh0bWxfaGVh
ZGltcGwuaCIKICNpbXBvcnQgImh0bWxfaW1hZ2VpbXBsLmgiCiAjaW1wb3J0ICJodG1sX2lubGlu
ZWltcGwuaCIKSW5kZXg6IGt3cS9NYWNGcmFtZS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrd3EvTWFjRnJh
bWUubW0JKHJldmlzaW9uIDExOTc4KQorKysga3dxL01hY0ZyYW1lLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC01Niw3ICs1Niw4IEBACiAjaW1wb3J0ICJkb21fdGV4dGltcGwuaCIKICNpbXBvcnQgIkV2
ZW50TmFtZXMuaCIKICNpbXBvcnQgImh0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW1wb3J0ICJodG1s
X2Zvcm1pbXBsLmgiCisjaW1wb3J0ICJIVE1MRm9ybUVsZW1lbnRJbXBsLmgiCisjaW1wb3J0ICJI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50SW1wbC5oIgogI2ltcG9ydCAiaHRtbF90YWJsZWltcGwuaCIK
ICNpbXBvcnQgImtodG1scGFydF9wLmgiCiAjaW1wb3J0ICJraHRtbHZpZXcuaCIKSW5kZXg6IGt3
cS9LV1FBY2NPYmplY3QubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3dxL0tXUUFjY09iamVjdC5tbQkocmV2
aXNpb24gMTE5NzgpCisrKyBrd3EvS1dRQWNjT2JqZWN0Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC00
Miw3ICs0Miw3IEBACiAjaW1wb3J0ICJkb21fZG9jaW1wbC5oIgogI2ltcG9ydCAiZG9tX2VsZW1l
bnRpbXBsLmgiCiAjaW1wb3J0ICJodG1sX2VsZW1lbnRpbXBsLmgiCi0jaW1wb3J0ICJodG1sX2Zv
cm1pbXBsLmgiCisjaW1wb3J0ICJIVE1MSW5wdXRFbGVtZW50SW1wbC5oIgogI2ltcG9ydCAiaHRt
bF9pbmxpbmVpbXBsLmgiCiAjaW1wb3J0ICJodG1sX2ltYWdlaW1wbC5oIgogI2ltcG9ydCAiZG9t
X3N0cmluZy5oIgpJbmRleDoga3dxL1dlYkNvcmVCcmlkZ2UubW0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3dx
L1dlYkNvcmVCcmlkZ2UubW0JKHJldmlzaW9uIDExOTc4KQorKysga3dxL1dlYkNvcmVCcmlkZ2Uu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTM2LDcgKzM2LDggQEAKICNpbXBvcnQgImRvbV9ub2RlaW1w
bC5oIgogI2ltcG9ydCAiZG9tX3Bvc2l0aW9uLmgiCiAjaW1wb3J0ICJodG1sX2RvY3VtZW50aW1w
bC5oIgotI2ltcG9ydCAiaHRtbF9mb3JtaW1wbC5oIgorI2ltcG9ydCAiSFRNTElucHV0RWxlbWVu
dEltcGwuaCIKKyNpbXBvcnQgIkhUTUxGb3JtRWxlbWVudEltcGwuaCIKICNpbXBvcnQgImh0bWxf
aW1hZ2VpbXBsLmgiCiAjaW1wb3J0ICJodG1sZWRpdGluZy5oIgogI2ltcG9ydCAiTWFjRnJhbWUu
aCIK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>5594</attachid>
            <date>2006-01-10 01:01:10 -0800</date>
            <delta_ts>2006-01-10 01:01:10 -0800</delta_ts>
            <desc>split_class.pl script I used</desc>
            <filename>split_class.pl</filename>
            <type>text/x-perl-script</type>
            <size>4203</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9wZXJsIC13Cgp1c2Ugc3RyaWN0Owp1c2UgRmlsZTo6Q29weTsKdXNlIEZpbmRC
aW47CnVzZSBsaWIgJEZpbmRCaW46OkJpbjsKdXNlIFNwYWNpbmdIZXVyaXN0aWNzOwoKCmZvciBt
eSAkZmlsZW5hbWUgKEBBUkdWKSB7CgogICAgJGZpbGVuYW1lID1+IG0vXihcdyspXC5oJC8gb3Ig
ZGllICJDb21tYW5kIGxpbmUgYXJncyBtdXN0IGJlIC5oIGZpbGVzLlxuIjsKICAgIG15ICRiYXNl
bmFtZSA9ICQxOwoKICAgIG9wZW4oT0xERklMRSwgIjwiLCAkZmlsZW5hbWUpIG9yIGRpZSAiRmls
ZSBkb2VzIG5vdCBleGlzdDogJGZpbGVuYW1lXG4iOwogICAgcHJpbnQgIlNwbGl0dGluZyBjbGFz
cyAkZmlsZW5hbWUue2gsY3BwfTpcbiI7CiAgICAKICAgIG15ICRjdXJyZW50Q2xhc3NOYW1lID0g
IiI7CiAgICBteSAkY2xhc3NJbmRlbnQgPSAiIjsKICAgIG15ICRmaWxlQ29udGVudCA9ICIiOwog
ICAgbXkgJWNsYXNzRGVmcyA9ICgpOwogICAgd2hpbGUgKG15ICRsaW5lID0gPE9MREZJTEU+KSB7
CiAgICAgICAgaWYgKCRjdXJyZW50Q2xhc3NOYW1lKSB7CiAgICAgICAgICAgICRjbGFzc0RlZnN7
JGN1cnJlbnRDbGFzc05hbWV9IC49ICRsaW5lOwogICAgICAgICAgICBpZiAoJGxpbmUgPX4gL14k
Y2xhc3NJbmRlbnR9O1xzKiQvKSB7CiAgICAgICAgICAgICAgICAkY3VycmVudENsYXNzTmFtZSA9
ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRsaW5l
ID1+IC9eKFxzKiljbGFzc1xzKyhcdyspXHMrW147XSokLykgewogICAgICAgICAgICAgICAgJGNs
YXNzSW5kZW50ID0gJDE7CiAgICAgICAgICAgICAgICAkY3VycmVudENsYXNzTmFtZSA9ICQyOwog
ICAgICAgICAgICAgICAgJGNsYXNzRGVmc3skY3VycmVudENsYXNzTmFtZX0gLj0gJGxpbmU7CiAg
ICAgICAgICAgICAgICAkZmlsZUNvbnRlbnQgLj0gIiMjI0NMQVNTIyMjJGN1cnJlbnRDbGFzc05h
bWVcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZmlsZUNvbnRlbnQg
Lj0gJGxpbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjbG9zZShPTERGSUxF
KTsKICAgIAogICAgaWYgKHNjYWxhcihrZXlzKCVjbGFzc0RlZnMpKSA9PSAxKSB7ICMgZGVnZW5l
cmF0ZSBjYXNlCiAgICAgICAgbXkgKCRjbGFzc25hbWUpID0ga2V5cyglY2xhc3NEZWZzKTsKICAg
ICAgICBpZiAoISgkY2xhc3NuYW1lIGVxICRiYXNlbmFtZSkpIHsKICAgICAgICAgICAgcHJpbnQg
IlNraXBwaW5nICRmaWxlbmFtZSwgYWxyZWFkeSBjb3JyZWN0bHkgbmFtZWQuXG4iOwogICAgICAg
IH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICIkZmlsZW5hbWUgb25seSBpbmNsdWRlcyBvbmUg
Y2xhc3MsIHJlbmFtaW5nIHRvICRjbGFzc25hbWUuaFxuIjsKICAgICAgICAgICAgc3lzdGVtKCJz
dm4gcm0gLS1mb3JjZSAkY2xhc3NuYW1lLmgiKSBpZiAoLXIgIiRjbGFzc25hbWUuaCIpOwogICAg
ICAgICAgICBzeXN0ZW0gInN2biBtdiAkYmFzZW5hbWUuaCAkY2xhc3NuYW1lLmgiOwogICAgICAg
IH0KICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKG15ICgkY2xhc3NuYW1lLCAkY2xhc3NEZWYp
ID0gZWFjaCglY2xhc3NEZWZzKSkgewogICAgICAgICAgICBpZiAoKCRjbGFzc25hbWUgZXEgJGJh
c2VuYW1lKSkgewogICAgICAgICAgICAgICAgcHJpbnQgIlNraXBwaW5nICRmaWxlbmFtZSwgYWxy
ZWFkeSBjb3JyZWN0bHkgbmFtZWQuXG4iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgICAgcHJpbnQgIlVzaW5nIFNWTiB0byBjb3B5ICRiYXNlbmFtZS57aCxjcHB9IHRvICRjbGFz
c25hbWUue2gsY3BwfVxuIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3lzdGVt
KCJzdm4gcm0gLS1mb3JjZSAkY2xhc3NuYW1lLmgiKSBpZiAoLXIgIiRjbGFzc25hbWUuaCIpOwog
ICAgICAgICAgICAgICAgc3lzdGVtICJzdm4gY3AgJGJhc2VuYW1lLmggJGNsYXNzbmFtZS5oIjsK
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3lzdGVtKCJzdm4gcm0gLS1mb3JjZSAk
Y2xhc3NuYW1lLmNwcCIpIGlmICgtciAiJGNsYXNzbmFtZS5jcHAiKTsKICAgICAgICAgICAgICAg
IHN5c3RlbSAic3ZuIGNwICRiYXNlbmFtZS5jcHAgJGNsYXNzbmFtZS5jcHAiOwogICAgICAgICAg
ICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCAiRml4aW5nICRjbGFzc25hbWUuaCBh
cyBtdWNoIGFzIHBvc3NpYmxlLlxuIjsKICAgICAgICAgICAgb3BlbihORVdIRUFERVIsICI+Iiwg
IiRjbGFzc25hbWUuaCIpIG9yIGRpZSAiRmlsZSBkb2VzIG5vdCBleGlzdDogJGZpbGVuYW1lXG4i
OwogICAgICAgICAgICBteSBAbGluZXMgPSBzcGxpdCgiXG4iLCAkZmlsZUNvbnRlbnQpOwogICAg
ICAgICAgICBmb3JlYWNoIG15ICRsaW5lIChAbGluZXMpIHsKICAgICAgICAgICAgICAgIGlmICgk
bGluZSA9fiAvXiMjI0NMQVNTIyMjKFx3KykvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQx
IGVxICRjbGFzc25hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgTkVXSEVBREVS
ICRjbGFzc0RlZiAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmludCBORVdIRUFERVIgJGxpbmUgLiAiXG4i
OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKE5FV0hF
QURFUik7CiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCAiRml4aW5nICRjbGFzc25hbWUu
Y3BwIGFzIG11Y2ggYXMgcG9zc2libGUuXG4iOwogICAgICAgICAgICBjb3B5KCIkY2xhc3NuYW1l
LmNwcCIsICIkY2xhc3NuYW1lLmNwcC5vcmlnaW5hbCIpOwogICAgICAgICAgICBvcGVuKE9MRENQ
UCwgIjwiLCAiJGNsYXNzbmFtZS5jcHAub3JpZ2luYWwiKSBvciBkaWUgIkZhaWxlZCB0byBjb3B5
IGZpbGUgZm9yIHJlYWRpbmc6ICRmaWxlbmFtZVxuIjsKICAgICAgICAgICAgb3BlbihORVdDUFAs
ICI+IiwgIiRjbGFzc25hbWUuY3BwIikgb3IgZGllICJGaWxlIGRvZXMgbm90IGV4aXN0OiAkZmls
ZW5hbWVcbiI7CiAgICAgICAgICAgIG15ICRpbnNpZGVNZW1iZXJGdW5jdGlvbiA9IDA7CiAgICAg
ICAgICAgIG15ICRzaG91bGRQcmludE1lbWJlckZ1bmN0aW9uID0gMDsKICAgICAgICAgICAgd2hp
bGUgKG15ICRsaW5lID0gPE9MRENQUD4pIHsKICAgICAgICAgICAgICAgIGlmICgkaW5zaWRlTWVt
YmVyRnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBwcmludCBORVdDUFAgJGxpbmUgaWYg
KCRzaG91bGRQcmludE1lbWJlckZ1bmN0aW9uKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGxp
bmUgPX4gL159XHMqJC8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGluc2lkZU1lbWJlckZ1
bmN0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2lm
ICgkbGluZSA9fiAvJGZpbGVuYW1lLykKICAgICAgICAgICAgICAgICAgICBwcmludCAiI2luY2x1
ZGUgXCIkYmFzZW5hbWUuaFwiXG4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgICAgICAgICBpZiAoJGxpbmUgPX4gL14oLio/XHMrKT8oXCp8Jik/KFx3Kyk6Oih+KT9cdytc
cypcKC8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGluc2lkZU1lbWJlckZ1bmN0aW9uID0g
MTsKICAgICAgICAgICAgICAgICAgICAgICAgJHNob3VsZFByaW50TWVtYmVyRnVuY3Rpb24gPSAo
JGNsYXNzbmFtZSBlcSAkMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE5FV0NQUCAk
bGluZSBpZiAoJHNob3VsZFByaW50TWVtYmVyRnVuY3Rpb24pOwogICAgICAgICAgICAgICAgICAg
IH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE5FV0NQUCAkbGluZTsKICAg
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg
ICAgICAgY2xvc2UoTkVXQ1BQKTsKICAgICAgICAgICAgY2xvc2UoT0xEQ1BQKTsKICAgICAgICAg
ICAgdW5saW5rKCIkY2xhc3NuYW1lLmNwcC5vcmlnaW5hbCIpOwogICAgICAgIH0KICAgIH0KICAg
IAogICAgcHJpbnQgIk9wZW5pbmcgbmV3IGZpbGVzLi4uXG4iOwogICAgc3lzdGVtKCJvcGVuICIg
LiBqb2luKCIuKiAiLCBrZXlzKCVjbGFzc0RlZnMpKSAuICIuKiIpOwp9
</data>

          </attachment>
      

    </bug>

</bugzilla>