<?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>6543</bug_id>
          
          <creation_ts>2006-01-14 16:47:28 -0800</creation_ts>
          <short_desc>break classes in dom_nodeimpl.* into separate files (one per class)</short_desc>
          <delta_ts>2006-01-15 05:44:29 -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>28442</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-14 16:47:28 -0800</bug_when>
    <thetext>break classes in dom_nodeimpl.* into separate files (one per class)

Attached patch does that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28444</commentid>
    <comment_count>1</comment_count>
      <attachid>5682</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-14 16:52:17 -0800</bug_when>
    <thetext>Created attachment 5682
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28503</commentid>
    <comment_count>2</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2006-01-15 05:44:29 -0800</bug_when>
    <thetext>We should be doing the renamings as we split.

All the *Impl classes are supposed to be losing their &quot;Impl&quot;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5682</attachid>
            <date>2006-01-14 16:52:17 -0800</date>
            <delta_ts>2006-01-14 16:54:10 -0800</delta_ts>
            <desc>proposed patch.</desc>
            <filename>split.patch</filename>
            <type>text/plain</type>
            <size>685249</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL3htbC9Eb2N1bWVudFR5cGVJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRt
bC94bWwvRG9jdW1lbnRUeXBlSW1wbC5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwveG1s
L0RvY3VtZW50VHlwZUltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAj
aW5jbHVkZSAiRG9jdW1lbnRUeXBlSW1wbC5oIgogI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9u
SW1wbC5oIgogI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgorI2luY2x1ZGUgImRvbV9ub2RlLmgi
CiAKIG5hbWVzcGFjZSBET00gewogCkluZGV4OiBraHRtbC94bWwvTmFtZU5vZGVMaXN0SW1wbC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL05hbWVOb2RlTGlzdEltcGwuY3BwCShyZXZpc2lv
biAxMjA2MykKKysrIGtodG1sL3htbC9OYW1lTm9kZUxpc3RJbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjMsMzAyNSArMjMsMTcgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgorI2luY2x1ZGUgIk5hbWVOb2RlTGlzdEltcGwuaCIK
KyNpbmNsdWRlICJkb21fZWxlbWVudGltcGwuaCIKIAotI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0
aW9uLmgiCi0jaW5jbHVkZSAiZG9tL2RvbTJfZXZlbnRzLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9l
bGVtZW50aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKLSNpbmNsdWRlICJ4
bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCi0jaW5jbHVk
ZSAiRE9NSW1wbGVtZW50YXRpb25JbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9wb3NpdGlvbi5o
IgotI2luY2x1ZGUgInhtbC9kb20yX3JhbmdlaW1wbC5oIgotI2luY2x1ZGUgInhtbC9FdmVudE5h
bWVzLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc2hlbHBlci5oIgotI2luY2x1ZGUgImNzcy9jc3NzdHls
ZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiZWRpdGluZy9odG1sZWRpdGluZy5oIgotI2luY2x1ZGUg
ImVkaXRpbmcvaHRtbF9pbnRlcmNoYW5nZS5oIgotI2luY2x1ZGUgImVkaXRpbmcvU2VsZWN0aW9u
Q29udHJvbGxlci5oIgotCi0jaW5jbHVkZSA8a2RlYnVnLmg+Ci0KLSNpbmNsdWRlICJyZW5kZXJp
bmcvcmVuZGVyX29iamVjdC5oIgotI2luY2x1ZGUgIklubGluZVRleHRCb3guaCIKLSNpbmNsdWRl
ICJyZW5kZXJfdGhlbWUuaCIKLQotI2luY2x1ZGUgImVjbWEva2pzX2JpbmRpbmcuaCIKLSNpbmNs
dWRlICJlY21hL2tqc19wcm94eS5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUg
IkZyYW1lLmgiCi0KLS8vIEZJWE1FOiBTaG91bGQgbm90IGhhdmUgdG8gaW5jbHVkZSB0aGlzLiAg
Q3V0IHRoZSBIVE1MIGRlcGVuZGVuY3khCiAjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCiAKLSNpZm5k
ZWYgS0hUTUxfTk9fWEJMCi0jaW5jbHVkZSAieGJsL3hibF9iaW5kaW5nX21hbmFnZXIuaCIKLSNl
bmRpZgotCi0jaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgotI2luY2x1ZGUgIktXUUxv
Z2dpbmcuaCIKLQogdXNpbmcgbmFtZXNwYWNlIGtodG1sOwogCiBuYW1lc3BhY2UgRE9NIHsKIAot
dXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwog
Ci0vKioKLSAqIE5vZGVMaXN0IHdoaWNoIGxpc3RzIGFsbCBOb2RlcyBpbiBhIGRvY3VtZW50IHdp
dGggYSBnaXZlbiB0YWcgbmFtZQotICovCi1jbGFzcyBUYWdOb2RlTGlzdEltcGwgOiBwdWJsaWMg
Tm9kZUxpc3RJbXBsCi17Ci1wdWJsaWM6Ci0gICAgVGFnTm9kZUxpc3RJbXBsKE5vZGVJbXBsICpu
LCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbE5hbWUpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQg
Y2xhc3NlcwotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBOb2RlSW1wbCAqaXRlbSAodW5zaWduZWQgaW5kZXgpIGNvbnN0OwotCi0gICAgLy8gT3RoZXIg
bWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29s
IG5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3Q7Ci0KLSAgICBBdG9taWNTdHJp
bmcgbV9uYW1lc3BhY2VVUkk7Ci0gICAgQXRvbWljU3RyaW5nIG1fbG9jYWxOYW1lOwotfTsKLQot
I2lmbmRlZiBOREVCVUcKLXN0cnVjdCBOb2RlSW1wbENvdW50ZXIgeyAKLSAgICBzdGF0aWMgaW50
IGNvdW50OyAKLSAgICB+Tm9kZUltcGxDb3VudGVyKCkgeyAvKiBpZiAoY291bnQgIT0gMCkgZnBy
aW50ZihzdGRlcnIsICJMRUFLOiAlZCBOb2RlSW1wbFxuIiwgY291bnQpOyAqLyB9Ci19OwotaW50
IE5vZGVJbXBsQ291bnRlcjo6Y291bnQgPSAwOwotc3RhdGljIE5vZGVJbXBsQ291bnRlciBub2Rl
SW1wbENvdW50ZXI7Ci0KLXN0YXRpYyBpbnQgZ0V2ZW50RGlzcGF0Y2hGb3JiaWRkZW47Ci0jZGVm
aW5lIGZvcmJpZEV2ZW50RGlzcGF0Y2goKSBnRXZlbnREaXNwYXRjaEZvcmJpZGRlbiArPSAxCi0j
ZGVmaW5lIGFsbG93RXZlbnREaXNwYXRjaCgpIGFzc2VydChnRXZlbnREaXNwYXRjaEZvcmJpZGRl
biA+IDApOyBnRXZlbnREaXNwYXRjaEZvcmJpZGRlbiAtPSAxCi0jZGVmaW5lIGV2ZW50RGlzcGF0
Y2hGb3JiaWRkZW4oKSAoZ0V2ZW50RGlzcGF0Y2hGb3JiaWRkZW4gPiAwKQotI2Vsc2UKLQotI2Rl
ZmluZSBmb3JiaWRFdmVudERpc3BhdGNoKCkKLSNkZWZpbmUgYWxsb3dFdmVudERpc3BhdGNoKCkK
LSNkZWZpbmUgZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpCi0jZW5kaWYgTkRFQlVHCi0KLU5vZGVJ
bXBsOjpOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IGRvY3VtZW50KGRvYyksCi0g
ICAgICBtX3ByZXZpb3VzKDApLAotICAgICAgbV9uZXh0KDApLAotICAgICAgbV9yZW5kZXIoMCks
Ci0gICAgICBtX3JlZ2RMaXN0ZW5lcnMoMCksCi0gICAgICBtX25vZGVMaXN0cygwKSwKLSAgICAg
IG1fdGFiSW5kZXgoMCksCi0gICAgICBtX2hhc0lkKGZhbHNlKSwKLSAgICAgIG1faGFzQ2xhc3Mo
ZmFsc2UpLAotICAgICAgbV9oYXNTdHlsZShmYWxzZSksCi0gICAgICBtX2F0dGFjaGVkKGZhbHNl
KSwKLSAgICAgIG1fY2hhbmdlZChmYWxzZSksCi0gICAgICBtX2hhc0NoYW5nZWRDaGlsZChmYWxz
ZSksCi0gICAgICBtX2luRG9jdW1lbnQoZmFsc2UpLAotICAgICAgbV9pc0xpbmsoZmFsc2UpLAot
ICAgICAgbV9zcGVjaWZpZWQoZmFsc2UpLAotICAgICAgbV9mb2N1c2VkKGZhbHNlKSwKLSAgICAg
IG1fYWN0aXZlKGZhbHNlKSwKLSAgICAgIG1faG92ZXJlZChmYWxzZSksCi0gICAgICBtX2luQWN0
aXZlQ2hhaW4oZmFsc2UpLAotICAgICAgbV9zdHlsZUVsZW1lbnQoZmFsc2UpLAotICAgICAgbV9p
bXBsaWNpdChmYWxzZSksCi0gICAgICBtX2luRGV0YWNoKGZhbHNlKQotewotI2lmbmRlZiBOREVC
VUcKLSAgICArK05vZGVJbXBsQ291bnRlcjo6Y291bnQ7Ci0jZW5kaWYKLX0KLQotdm9pZCBOb2Rl
SW1wbDo6c2V0RG9jdW1lbnQoRG9jdW1lbnRJbXBsICpkb2MpCi17Ci0gICAgaWYgKGluRG9jdW1l
bnQoKSkKLQlyZXR1cm47Ci0gICAgCi0gICAgZG9jdW1lbnQgPSBkb2M7Ci19Ci0KLU5vZGVJbXBs
Ojp+Tm9kZUltcGwoKQotewotI2lmbmRlZiBOREVCVUcKLSAgICAtLU5vZGVJbXBsQ291bnRlcjo6
Y291bnQ7Ci0jZW5kaWYKLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIGRldGFjaCgpOwotICAg
IGlmIChtX3JlZ2RMaXN0ZW5lcnMgJiYgIW1fcmVnZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdl
dERvY3VtZW50KCkgJiYgIWluRG9jdW1lbnQoKSkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+dW5y
ZWdpc3RlckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnModGhpcyk7Ci0gICAgZGVs
ZXRlIG1fcmVnZExpc3RlbmVyczsKLSAgICBkZWxldGUgbV9ub2RlTGlzdHM7Ci0gICAgaWYgKG1f
cHJldmlvdXMpCi0gICAgICAgIG1fcHJldmlvdXMtPnNldE5leHRTaWJsaW5nKDApOwotICAgIGlm
IChtX25leHQpCi0gICAgICAgIG1fbmV4dC0+c2V0UHJldmlvdXNTaWJsaW5nKDApOwotfQotCi1E
T01TdHJpbmcgTm9kZUltcGw6Om5vZGVWYWx1ZSgpIGNvbnN0Ci17Ci0gIHJldHVybiBET01TdHJp
bmcoKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0Tm9kZVZhbHVlKCBjb25zdCBET01TdHJpbmcg
Ji8qX25vZGVWYWx1ZSovLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIC8vIE5PX01PRElG
SUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkKLSAg
ICBpZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRp
b246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIC8vIGJlIGRlZmF1bHQgbm9kZVZhbHVlIGlzIG51bGwsIHNvIHNldHRpbmcgaXQgaGFz
IG5vIGVmZmVjdAotfQotCi1SZWZQdHI8Tm9kZUxpc3RJbXBsPiBOb2RlSW1wbDo6Y2hpbGROb2Rl
cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxOb2RlTGlzdEltcGw+KG5ldyBDaGlsZE5vZGVMaXN0
SW1wbCh0aGlzKSk7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6Zmlyc3RDaGlsZCgpIGNvbnN0
Ci17Ci0gIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6Omxhc3RDaGlsZCgpIGNv
bnN0Ci17Ci0gIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6Omxhc3REZXNjZW5k
YW50KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4o
dGhpcyk7Ci0gICAgd2hpbGUgKG4gJiYgbi0+bGFzdENoaWxkKCkpCi0gICAgICAgIG4gPSBuLT5s
YXN0Q2hpbGQoKTsKLSAgICByZXR1cm4gbjsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjppbnNl
cnRCZWZvcmUoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKiwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICBuZXdDaGlsZC0+cmVmKCk7Ci0gICAgbmV3Q2hpbGQtPmRlcmVmKCk7Ci0g
ICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwot
ICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnJlcGxhY2VDaGlsZCggTm9k
ZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICBu
ZXdDaGlsZC0+cmVmKCk7Ci0gIG5ld0NoaWxkLT5kZXJlZigpOwotICBleGNlcHRpb25jb2RlID0g
RE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gIHJldHVybiAwOwotfQotCi1O
b2RlSW1wbCAqTm9kZUltcGw6OnJlbW92ZUNoaWxkKCBOb2RlSW1wbCAqLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKQotewotICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJS
OwotICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjphcHBlbmRDaGlsZCggTm9k
ZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIG5ld0NoaWxkLT5y
ZWYoKTsKLSAgICBuZXdDaGlsZC0+ZGVyZWYoKTsKLSAgICBleGNlcHRpb25jb2RlID0gRE9NRXhj
ZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OnJlbW92ZShpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0gICAgcmVmKCk7Ci0gICAg
aWYgKE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpKQotICAgICAgICBwLT5yZW1vdmVDaGlsZCh0
aGlzLCBleGNlcHRpb25jb2RlKTsKLSAgICBlbHNlCi0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBE
T01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICBkZXJlZigpOwotfQotCi1i
b29sIE5vZGVJbXBsOjpoYXNDaGlsZE5vZGVzKCAgKSBjb25zdAotewotICByZXR1cm4gZmFsc2U7
Ci19Ci0KLXZvaWQgTm9kZUltcGw6Om5vcm1hbGl6ZSAoKQotewotICAgIGludCBleGNlcHRpb25j
b2RlID0gMDsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0KLSAgICBpZiAo
aXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAgIC8vIE5vcm1hbGl6ZSBhbnkgYXR0cmlidXRlIGNo
aWxkcmVuIHdlIG1pZ2h0IGhhdmUgCi0gICAgICAgIEVsZW1lbnRJbXBsICplbGVtZW50ID0gc3Rh
dGljX2Nhc3Q8RWxlbWVudEltcGwgKj4odGhpcyk7Ci0gICAgICAgIE5hbWVkQXR0ck1hcEltcGwg
KmF0dHJNYXAgPSBlbGVtZW50LT5hdHRyaWJ1dGVzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAo
YXR0ck1hcCkgewotICAgICAgICAgICAgdW5zaWduZWQgbnVtQXR0cnMgPSBhdHRyTWFwLT5sZW5n
dGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG51bUF0dHJzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsICphdHRyaWJ1
dGUgPSBhdHRyTWFwLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICAgIEF0dHJJbXBs
ICphdHRyID0gYXR0cmlidXRlLT5hdHRySW1wbCgpOwotICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAgICAgICAgICBhdHRyLT5ub3JtYWxpemUo
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBSZWN1cnNp
dmVseSBnbyB0aHJvdWdoIHRoZSBzdWJ0cmVlIGJlbmVhdGggdXMsIG5vcm1hbGl6aW5nIGFsbCBu
b2Rlcy4gSW4gdGhlIGNhc2UKLSAgICAvLyB3aGVyZSB0aGVyZSBhcmUgdHdvIGFkamFjZW50IHRl
eHQgbm9kZXMsIHRoZXkgYXJlIG1lcmdlZCB0b2dldGhlcgotICAgIHdoaWxlIChjaGlsZCkgewot
ICAgICAgICBOb2RlSW1wbCAqbmV4dENoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0KLSAg
ICAgICAgaWYgKG5leHRDaGlsZCAmJiBjaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05P
REUgJiYgbmV4dENoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSkgewotICAgICAg
ICAgICAgLy8gQ3VycmVudCBjaGlsZCBhbmQgdGhlIG5leHQgb25lIGFyZSBib3RoIHRleHQgbm9k
ZXMuLi4gbWVyZ2UgdGhlbQotICAgICAgICAgICAgVGV4dEltcGwgKmN1cnJlbnRUZXh0ID0gc3Rh
dGljX2Nhc3Q8VGV4dEltcGwqPihjaGlsZCk7Ci0gICAgICAgICAgICBUZXh0SW1wbCAqbmV4dFRl
eHQgPSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KG5leHRDaGlsZCk7Ci0KLSAgICAgICAgICAgIGN1
cnJlbnRUZXh0LT5hcHBlbmREYXRhKG5leHRUZXh0LT5kYXRhKCksZXhjZXB0aW9uY29kZSk7Ci0g
ICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgICAgIG5leHRDaGlsZC0+cmVtb3ZlKGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAg
ICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9
Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2hpbGQtPm5vcm1hbGl6ZSgpOwotICAgICAg
ICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8g
Q2hlY2sgaWYgd2UgaGF2ZSBhIHNpbmdsZSBlbXB0eSB0ZXh0IG5vZGUgbGVmdCBhbmQgcmVtb3Zl
IGl0IGlmIHNvCi0gICAgY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKGNoaWxkICYmICFj
aGlsZC0+bmV4dFNpYmxpbmcoKSAmJiBjaGlsZC0+aXNUZXh0Tm9kZSgpKSB7Ci0gICAgICAgIFRl
eHRJbXBsICp0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dEltcGwqPihjaGlsZCk7Ci0gICAgICAgIGlm
ICh0ZXh0LT5kYXRhKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgY2hpbGQtPnJlbW92ZShleGNl
cHRpb25jb2RlKTsKLSAgICB9Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgTm9kZUltcGw6OnBy
ZWZpeCgpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIG5vZGVzIG90aGVyIHRoYW4gZWxlbWVudHMgYW5k
IGF0dHJpYnV0ZXMsIHRoZSBwcmVmaXggaXMgYWx3YXlzIG51bGwKLSAgICByZXR1cm4gbnVsbEF0
b207Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJi8q
X3ByZWZpeCovLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIC8vIFRoZSBzcGVjIHNheXMg
dGhhdCBmb3Igbm9kZXMgb3RoZXIgdGhhbiBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgcHJlZml4
IGlzIGFsd2F5cyBudWxsLgotICAgIC8vIEl0IGRvZXMgbm90IHNheSB3aGF0IHRvIGRvIHdoZW4g
dGhlIHVzZXIgdHJpZXMgdG8gc2V0IHRoZSBwcmVmaXggb24gYW5vdGhlciB0eXBlIG9mCi0gICAg
Ly8gbm9kZSwgaG93ZXZlciBtb3ppbGxhIHRocm93cyBhIE5BTUVTUEFDRV9FUlIgZXhjZXB0aW9u
Ci0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNFX0VSUjsKLX0KLQot
Y29uc3QgQXRvbWljU3RyaW5nJiBOb2RlSW1wbDo6bG9jYWxOYW1lKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZW1wdHlBdG9tOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIE5vZGVJbXBsOjpuYW1l
c3BhY2VVUkkoKSBjb25zdAotewotICAgIHJldHVybiBudWxsQXRvbTsKLX0KLQotdm9pZCBOb2Rl
SW1wbDo6c2V0Rmlyc3RDaGlsZChOb2RlSW1wbCAqKQotewotfQotCi12b2lkIE5vZGVJbXBsOjpz
ZXRMYXN0Q2hpbGQoTm9kZUltcGwgKikKLXsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjphZGRD
aGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpCi17Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0
TmV3Q2hpbGQobmV3Q2hpbGQpOyAvLyBtYWtlIHN1cmUgdGhlIG5ldyBjaGlsZCBpcyByZWYnZCBh
bmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wg
Tm9kZUltcGw6OmlzQ29udGVudEVkaXRhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFyZW50
KCkgJiYgcGFyZW50KCktPmlzQ29udGVudEVkaXRhYmxlKCk7Ci19Ci0KLVFSZWN0IE5vZGVJbXBs
OjpnZXRSZWN0KCkgY29uc3QKLXsKLSAgICBpbnQgX3gsIF95OwotICAgIGlmKG1fcmVuZGVyICYm
IG1fcmVuZGVyLT5hYnNvbHV0ZVBvc2l0aW9uKF94LCBfeSkpCi0gICAgICAgIHJldHVybiBRUmVj
dCggX3gsIF95LCBtX3JlbmRlci0+d2lkdGgoKSwgbV9yZW5kZXItPmhlaWdodCgpICk7Ci0KLSAg
ICByZXR1cm4gUVJlY3QoKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0Q2hhbmdlZChib29sIGIp
Ci17Ci0gICAgaWYgKGIgJiYgIWF0dGFjaGVkKCkpIC8vIGNoYW5nZWQgY29tcGFyZWQgdG8gd2hh
dD8KLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9jaGFuZ2VkID0gYjsKLSAgICBpZiAoIGIgKSB7
Ci0JTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7Ci0Jd2hpbGUgKCBwICkgewotCSAgICBwLT5z
ZXRIYXNDaGFuZ2VkQ2hpbGQoIHRydWUgKTsKLQkgICAgcCA9IHAtPnBhcmVudE5vZGUoKTsKLQl9
Ci0gICAgICAgIGdldERvY3VtZW50KCktPnNldERvY3VtZW50Q2hhbmdlZCh0cnVlKTsKLSAgICB9
Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdAot
ewotICAgIHJldHVybiBpc0ZvY3VzYWJsZSgpOwotfQotCi1ib29sIE5vZGVJbXBsOjppc01vdXNl
Rm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNGb2N1c2FibGUoKTsKLX0KLQotdW5z
aWduZWQgTm9kZUltcGw6Om5vZGVJbmRleCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKl90ZW1w
Tm9kZSA9IHByZXZpb3VzU2libGluZygpOwotICAgIHVuc2lnbmVkIGNvdW50PTA7Ci0gICAgZm9y
KCBjb3VudD0wOyBfdGVtcE5vZGU7IGNvdW50KysgKQotICAgICAgICBfdGVtcE5vZGUgPSBfdGVt
cE5vZGUtPnByZXZpb3VzU2libGluZygpOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotdm9pZCBO
b2RlSW1wbDo6YWRkRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwg
RXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGNvbnN0IGJvb2wgdXNlQ2FwdHVyZSkKLXsKLSAgICBp
ZiAoZ2V0RG9jdW1lbnQoKSAmJiAhZ2V0RG9jdW1lbnQoKS0+YXR0YWNoZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgRG9jdW1lbnRJbXBsOjpMaXN0ZW5lclR5cGUgdHlwZSA9IHN0YXRpY19j
YXN0PERvY3VtZW50SW1wbDo6TGlzdGVuZXJUeXBlPigwKTsKLSAgICBpZiAoZXZlbnRUeXBlID09
IERPTVN1YnRyZWVNb2RpZmllZEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpE
T01TVUJUUkVFTU9ESUZJRURfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERP
TU5vZGVJbnNlcnRlZEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01OT0RF
SU5TRVJURURfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERPTU5vZGVSZW1v
dmVkRXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVudEltcGw6OkRPTU5PREVSRU1PVkVEX0xJ
U1RFTkVSOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1
bWVudEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01OT0RFUkVNT1ZFREZS
T01ET0NVTUVOVF9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gRE9NTm9kZUlu
c2VydGVkSW50b0RvY3VtZW50RXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVudEltcGw6OkRP
TU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVudFR5
cGUgPT0gRE9NQXR0ck1vZGlmaWVkRXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVudEltcGw6
OkRPTUFUVFJNT0RJRklFRF9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gRE9N
Q2hhcmFjdGVyRGF0YU1vZGlmaWVkRXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVudEltcGw6
OkRPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5FUjsKLSAgICBpZiAodHlwZSkKLSAgICAg
ICAgZ2V0RG9jdW1lbnQoKS0+YWRkTGlzdGVuZXJUeXBlKHR5cGUpOwotCi0gICAgaWYgKCFtX3Jl
Z2RMaXN0ZW5lcnMpIHsKLSAgICAgICAgbV9yZWdkTGlzdGVuZXJzID0gbmV3IFFQdHJMaXN0PFJl
Z2lzdGVyZWRFdmVudExpc3RlbmVyPjsKLQltX3JlZ2RMaXN0ZW5lcnMtPnNldEF1dG9EZWxldGUo
dHJ1ZSk7Ci0gICAgfQotCi0gICAgbGlzdGVuZXItPnJlZigpOwotCi0gICAgLy8gUmVtb3ZlIGV4
aXN0aW5nIGlkZW50aWNhbCBsaXN0ZW5lciBzZXQgd2l0aCBpZGVudGljYWwgYXJndW1lbnRzLgot
ICAgIC8vIFRoZSBET00yIHNwZWMgc2F5cyB0aGF0ICJkdXBsaWNhdGUgaW5zdGFuY2VzIGFyZSBk
aXNjYXJkZWQiIGluIHRoaXMgY2FzZS4KLSAgICByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlw
ZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOwotCi0gICAgLy8gYWRkaW5nIHRoZSBmaXJzdCBvbmUK
LSAgICBpZiAobV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSAmJiAh
aW5Eb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVudCgpLT5yZWdpc3RlckRpc2Nvbm5lY3Rl
ZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnModGhpcyk7Ci0gICAgICAgIAotICAgIG1fcmVnZExpc3Rl
bmVycy0+YXBwZW5kKG5ldyBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3Rl
bmVyLCB1c2VDYXB0dXJlKSk7Ci0KLSAgICBsaXN0ZW5lci0+ZGVyZWYoKTsKLX0KLQotdm9pZCBO
b2RlSW1wbDo6cmVtb3ZlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlw
ZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSkKLXsKLSAgICBpZiAo
IW1fcmVnZExpc3RlbmVycykgLy8gbm90aGluZyB0byByZW1vdmUKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXIgcmwoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNl
Q2FwdHVyZSk7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVy
PiBpdCgqbV9yZWdkTGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQot
ICAgICAgICBpZiAoKihpdC5jdXJyZW50KCkpID09IHJsKSB7Ci0gICAgICAgICAgICBtX3JlZ2RM
aXN0ZW5lcnMtPnJlbW92ZVJlZihpdC5jdXJyZW50KCkpOwotICAgICAgICAgICAgLy8gcmVtb3Zl
ZCBsYXN0Ci0gICAgICAgICAgICBpZiAobV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0
RG9jdW1lbnQoKSAmJiAhaW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50
KCktPnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnJlbW92
ZUFsbEV2ZW50TGlzdGVuZXJzKCkKLXsKLSAgICBkZWxldGUgbV9yZWdkTGlzdGVuZXJzOwotICAg
IG1fcmVnZExpc3RlbmVycyA9IDA7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnJlbW92ZUhUTUxFdmVu
dExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKQotewotICAgIGlmICghbV9y
ZWdkTGlzdGVuZXJzKSAvLyBub3RoaW5nIHRvIHJlbW92ZQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdCgqbV9yZWdkTGlz
dGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpZiAoaXQu
Y3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldmVudFR5cGUgJiYgaXQuY3VycmVudCgpLT5saXN0
ZW5lcigpLT5ldmVudExpc3RlbmVyVHlwZSgpID09ICJfa2h0bWxfSFRNTEV2ZW50TGlzdGVuZXIi
KSB7Ci0gICAgICAgICAgICBtX3JlZ2RMaXN0ZW5lcnMtPnJlbW92ZVJlZihpdC5jdXJyZW50KCkp
OwotICAgICAgICAgICAgLy8gcmVtb3ZlZCBsYXN0Ci0gICAgICAgICAgICBpZiAobV9yZWdkTGlz
dGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSAmJiAhaW5Eb2N1bWVudCgpKQotICAg
ICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0
aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19
Ci0KLXZvaWQgTm9kZUltcGw6OnNldEhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmlu
ZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lcikKLXsKLSAgICAvLyBJbiBjYXNl
IHdlIGFyZSB0aGUgb25seSBvbmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBpdCwgd2UgZG9uJ3Qg
d2FudCByZW1vdmVIVE1MRXZlbnRMaXN0ZW5lciB0byBkZXN0cm95IGl0LgotICAgIGlmIChsaXN0
ZW5lcikKLSAgICAgICAgbGlzdGVuZXItPnJlZigpOwotICAgIHJlbW92ZUhUTUxFdmVudExpc3Rl
bmVyKGV2ZW50VHlwZSk7Ci0gICAgaWYgKGxpc3RlbmVyKSB7Ci0gICAgICAgIGFkZEV2ZW50TGlz
dGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpOwotICAgICAgICBsaXN0ZW5lci0+ZGVy
ZWYoKTsKLSAgICB9Ci19Ci0KLUV2ZW50TGlzdGVuZXIgKk5vZGVJbXBsOjpnZXRIVE1MRXZlbnRM
aXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBpZiAoIW1fcmVn
ZExpc3RlbmVycykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJl
Z2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdCgqbV9yZWdkTGlzdGVuZXJzKTsKLSAgICBmb3IgKDsg
aXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5cGUo
KSA9PSBldmVudFR5cGUgJiYgaXQuY3VycmVudCgpLT5saXN0ZW5lcigpLT5ldmVudExpc3RlbmVy
VHlwZSgpID09ICJfa2h0bWxfSFRNTEV2ZW50TGlzdGVuZXIiKQotICAgICAgICAgICAgcmV0dXJu
IGl0LmN1cnJlbnQoKS0+bGlzdGVuZXIoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1ib29sIE5v
ZGVJbXBsOjpkaXNwYXRjaEV2ZW50KEV2ZW50SW1wbCAqZXZ0LCBpbnQgJmV4Y2VwdGlvbmNvZGUs
IGJvb2wgdGVtcEV2ZW50KQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigp
KTsKLSAgICBpZiAoIWV2dCB8fCBldnQtPnR5cGUoKS5pc0VtcHR5KCkpIHsgCi0gICAgICAgIGV4
Y2VwdGlvbmNvZGUgPSBFdmVudEV4Y2VwdGlvbjo6X0VYQ0VQVElPTl9PRkZTRVQgKyBFdmVudEV4
Y2VwdGlvbjo6VU5TUEVDSUZJRURfRVZFTlRfVFlQRV9FUlI7Ci0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0KLSAgICBldnQtPnJlZigpOwotCi0gICAgZXZ0LT5zZXRUYXJnZXQodGhpcyk7
Ci0KLSAgICAvLyBXZSd2ZSBoYWQgYXQgbGVhc3Qgb25lIHJlcG9ydCBvZiBhIGNyYXNoIG9uIGEg
cGFnZSB3aGVyZSBkb2N1bWVudCBpcyBudWxsIGhlcmUuCi0gICAgLy8gVW5mb3J0dW5hdGVseSB0
aGF0IHBhZ2Ugbm8gbG9uZ2VyIGV4aXN0cywgYnV0IHdlJ2xsIG1ha2UgdGhpcyBjb2RlIHJvYnVz
dCBhZ2FpbnN0Ci0gICAgLy8gdGhhdCBhbnl3YXkuCi0gICAgLy8gRklYTUU6IE11Y2ggY29kZSBp
biB0aGlzIGNsYXNzIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm9uLW51bGw7IGl0IHdvdWxkIGJlIGJl
dHRlciB0bwotICAgIC8vIGVuc3VyZSB0aGF0IGRvY3VtZW50IGNhbiBuZXZlciBiZSBudWxsLgot
ICAgIEZyYW1lICpmcmFtZSA9IDA7Ci0gICAgS0hUTUxWaWV3ICp2aWV3ID0gMDsKLQotICAgIGlm
IChEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZnJhbWUgPSBk
b2MtPmZyYW1lKCk7Ci0gICAgICAgIHZpZXcgPSBkb2MtPnZpZXcoKTsKLSAgICAgICAgLy8gU2lu
Y2UgZXZlbnQgaGFuZGxpbmcgY29kZSBjb3VsZCBjYXVzZSB0aGlzIG9iamVjdCB0byBiZSBkZWxl
dGVkLCBncmFiIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IG5vdwotICAgICAgICBpZiAodmlldykK
LSAgICAgICAgICAgIHZpZXctPnJlZigpOwotICAgIH0gICAgCi0KLSAgICBib29sIHJldCA9IGRp
c3BhdGNoR2VuZXJpY0V2ZW50KCBldnQsIGV4Y2VwdGlvbmNvZGUgKTsKLQotICAgIC8vIElmIHRl
bXBFdmVudCBpcyB0cnVlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIERPTSBpbXBsZW1lbnRhdGlvbiB3
aWxsIG5vdCBiZSBzdG9yaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCwgaS5lLgotICAgIC8v
IHRoZXJlIGlzIG5vIHdheSB0byByZXRyaWV2ZSBpdCBmcm9tIGphdmFzY3JpcHQgaWYgYSBzY3Jp
cHQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0IGluIGEgdmFyaWFibGUu
Ci0gICAgLy8gU28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGludGVycHJldGVyIHRvIGtlZXAg
dGhlIGV2ZW50IGluIGl0J3MgY2FjaGUKLSAgICBpZiAodGVtcEV2ZW50ICYmIGZyYW1lICYmIGZy
YW1lLT5qU2NyaXB0KCkpCi0gICAgICAgIGZyYW1lLT5qU2NyaXB0KCktPmZpbmlzaGVkV2l0aEV2
ZW50KGV2dCk7Ci0KLSAgICBpZiAodmlldykKLSAgICAgICAgdmlldy0+ZGVyZWYoKTsKLQotICAg
IGV2dC0+ZGVyZWYoKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRp
c3BhdGNoR2VuZXJpY0V2ZW50KCBFdmVudEltcGwgKmV2dCwgaW50ICYvKmV4Y2VwdGlvbmNvZGUg
Ki8pCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGFzc2Vy
dChldnQtPnRhcmdldCgpKTsKLQotICAgIGV2dC0+cmVmKCk7Ci0KLSAgICAvLyAjIyMgY2hlY2sg
dGhhdCB0eXBlIHNwZWNpZmllZAotCi0gICAgLy8gd29yayBvdXQgd2hhdCBub2RlcyB0byBzZW5k
IGV2ZW50IHRvCi0gICAgUVB0ckxpc3Q8Tm9kZUltcGw+IG5vZGVDaGFpbjsKLSAgICBOb2RlSW1w
bCAqbjsKLSAgICBmb3IgKG4gPSB0aGlzOyBuOyBuID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAg
ICAgIG4tPnJlZigpOwotICAgICAgICBub2RlQ2hhaW4ucHJlcGVuZChuKTsKLSAgICB9Ci0KLSAg
ICAKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPE5vZGVJbXBsPiBpdChub2RlQ2hhaW4pOwotICAgIAot
ICAgIC8vIEJlZm9yZSB3ZSBiZWdpbiBkaXNwYXRjaGluZyBldmVudHMsIGdpdmUgdGhlIHRhcmdl
dCBub2RlIGEgY2hhbmNlIHRvIGRvIHNvbWUgd29yayBwcmlvcgotICAgIC8vIHRvIHRoZSBET00g
ZXZlbnQgaGFuZGxlcnMgZ2V0dGluZyBhIGNyYWNrLgotICAgIHZvaWQqIGRhdGEgPSBwcmVEaXNw
YXRjaEV2ZW50SGFuZGxlcihldnQpOwotCi0gICAgLy8gdHJpZ2dlciBhbnkgY2FwdHVyaW5nIGV2
ZW50IGhhbmRsZXJzIG9uIG91ciB3YXkgZG93bgotICAgIGV2dC0+c2V0RXZlbnRQaGFzZShFdmVu
dDo6Q0FQVFVSSU5HX1BIQVNFKTsKLSAgICBpdC50b0ZpcnN0KCk7Ci0gICAgZm9yICg7IGl0LmN1
cnJlbnQoKSAmJiBpdC5jdXJyZW50KCkgIT0gdGhpcyAmJiAhZXZ0LT5wcm9wYWdhdGlvblN0b3Bw
ZWQoKTsgKytpdCkgewotICAgICAgICBldnQtPnNldEN1cnJlbnRUYXJnZXQoaXQuY3VycmVudCgp
KTsKLSAgICAgICAgaXQuY3VycmVudCgpLT5oYW5kbGVMb2NhbEV2ZW50cyhldnQsdHJ1ZSk7Ci0g
ICAgfQotCi0gICAgLy8gZGlzcGF0Y2ggdG8gdGhlIGFjdHVhbCB0YXJnZXQgbm9kZQotICAgIGl0
LnRvTGFzdCgpOwotICAgIGlmICghZXZ0LT5wcm9wYWdhdGlvblN0b3BwZWQoKSkgewotICAgICAg
ICBldnQtPnNldEV2ZW50UGhhc2UoRXZlbnQ6OkFUX1RBUkdFVCk7Ci0gICAgICAgIGV2dC0+c2V0
Q3VycmVudFRhcmdldChpdC5jdXJyZW50KCkpOwotCi0JaWYgKCFldnQtPnByb3BhZ2F0aW9uU3Rv
cHBlZCgpKQotICAgICAgICAgICAgaXQuY3VycmVudCgpLT5oYW5kbGVMb2NhbEV2ZW50cyhldnQs
ZmFsc2UpOwotICAgIH0KLSAgICAtLWl0OwotCi0gICAgLy8gb2ssIG5vdyBidWJibGUgdXAgYWdh
aW4gKG9ubHkgbm9uLWNhcHR1cmluZyBldmVudCBoYW5kbGVycyB3aWxsIGJlIGNhbGxlZCkKLSAg
ICAvLyAjIyMgcmVjYWxjdWxhdGUgdGhlIG5vZGUgY2hhaW4gaGVyZT8gKGUuZy4gaWYgdGFyZ2V0
IG5vZGUgbW92ZWQgaW4gZG9jdW1lbnQgYnkgcHJldmlvdXMgZXZlbnQgaGFuZGxlcnMpCi0gICAg
Ly8gbm8uIHRoZSBET00gc3BlY3Mgc2F5czoKLSAgICAvLyBUaGUgY2hhaW4gb2YgRXZlbnRUYXJn
ZXRzIGZyb20gdGhlIGV2ZW50IHRhcmdldCB0byB0aGUgdG9wIG9mIHRoZSB0cmVlCi0gICAgLy8g
aXMgZGV0ZXJtaW5lZCBiZWZvcmUgdGhlIGluaXRpYWwgZGlzcGF0Y2ggb2YgdGhlIGV2ZW50Lgot
ICAgIC8vIElmIG1vZGlmaWNhdGlvbnMgb2NjdXIgdG8gdGhlIHRyZWUgZHVyaW5nIGV2ZW50IHBy
b2Nlc3NpbmcsCi0gICAgLy8gZXZlbnQgZmxvdyB3aWxsIHByb2NlZWQgYmFzZWQgb24gdGhlIGlu
aXRpYWwgc3RhdGUgb2YgdGhlIHRyZWUuCi0gICAgLy8KLSAgICAvLyBzaW5jZSB0aGUgaW5pdGlh
bCBkaXNwYXRjaCBpcyBiZWZvcmUgdGhlIGNhcHR1cmluZyBwaGFzZSwKLSAgICAvLyB0aGVyZSdz
IG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIG5vZGUgY2hhaW4uCi0gICAgLy8gKHRvYmlhcykK
LQotICAgIGlmIChldnQtPmJ1YmJsZXMoKSkgewotICAgICAgICBldnQtPnNldEV2ZW50UGhhc2Uo
RXZlbnQ6OkJVQkJMSU5HX1BIQVNFKTsKLSAgICAgICAgZm9yICg7IGl0LmN1cnJlbnQoKSAmJiAh
ZXZ0LT5wcm9wYWdhdGlvblN0b3BwZWQoKSAmJiAhZXZ0LT5nZXRDYW5jZWxCdWJibGUoKTsgLS1p
dCkgewotICAgICAgICAgICAgZXZ0LT5zZXRDdXJyZW50VGFyZ2V0KGl0LmN1cnJlbnQoKSk7Ci0g
ICAgICAgICAgICBpdC5jdXJyZW50KCktPmhhbmRsZUxvY2FsRXZlbnRzKGV2dCxmYWxzZSk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBldnQtPnNldEN1cnJlbnRUYXJnZXQoMCk7Ci0gICAgZXZ0
LT5zZXRFdmVudFBoYXNlKDApOyAvLyBJIGd1ZXNzIHRoaXMgaXMgY29ycmVjdCwgdGhlIHNwZWMg
ZG9lcyBub3Qgc2VlbSB0byBzYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRo
aW5nIGFib3V0IHRoZSBkZWZhdWx0IGV2ZW50IGhhbmRsZXIgcGhhc2UuCi0KLQotICAgIC8vIE5v
dyBjYWxsIHRoZSBwb3N0IGRpc3BhdGNoLgotICAgIHBvc3REaXNwYXRjaEV2ZW50SGFuZGxlcihl
dnQsIGRhdGEpOwotICAgIAotICAgIGlmIChldnQtPmJ1YmJsZXMoKSkgewotCS8vIG5vdyB3ZSBj
YWxsIGFsbCBkZWZhdWx0IGV2ZW50IGhhbmRsZXJzICh0aGlzIGlzIG5vdCBwYXJ0IG9mIERPTSAt
IGl0IGlzIGludGVybmFsIHRvIGtodG1sKQotCi0JaXQudG9MYXN0KCk7Ci0JZm9yICg7IGl0LmN1
cnJlbnQoKSAmJiAhZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgJiYgIWV2dC0+ZGVmYXVsdEhhbmRs
ZWQoKTsgLS1pdCkKLQkgICAgaXQuY3VycmVudCgpLT5kZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7
Ci0gICAgfQotICAgIAotICAgIC8vIGRlcmVmIGFsbCBub2RlcyBpbiBjaGFpbgotICAgIGl0LnRv
Rmlyc3QoKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpdC5jdXJy
ZW50KCktPmRlcmVmKCk7IC8vIHRoaXMgbWF5IGRlbGV0ZSB1cwotCi0gICAgRG9jdW1lbnRJbXBs
Ojp1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKTsKLQotICAgIGJvb2wgZGVmYXVsdFByZXZlbnRl
ZCA9IGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpOwotCi0gICAgZXZ0LT5kZXJlZigpOwotCi0gICAg
cmV0dXJuICFkZWZhdWx0UHJldmVudGVkOyAvLyAjIyMgd2hhdCBpZiBkZWZhdWx0UHJldmVudGVk
IHdhcyBjYWxsZWQgYmVmb3JlIGRpc3BhdGNoRXZlbnQ/Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRp
c3BhdGNoSFRNTEV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1
YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJnKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRj
aEZvcmJpZGRlbigpKTsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgcmV0dXJuIGRp
c3BhdGNoRXZlbnQobmV3IEV2ZW50SW1wbChldmVudFR5cGUsIGNhbkJ1YmJsZUFyZywgY2FuY2Vs
YWJsZUFyZyksIGV4Y2VwdGlvbmNvZGUsIHRydWUpOwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNw
YXRjaFdpbmRvd0V2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1
YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJnKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRj
aEZvcmJpZGRlbigpKTsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgUmVmUHRyPEV2
ZW50SW1wbD4gZXZ0ID0gbmV3IEV2ZW50SW1wbChldmVudFR5cGUsIGNhbkJ1YmJsZUFyZywgY2Fu
Y2VsYWJsZUFyZyk7Ci0gICAgUmVmUHRyPERvY3VtZW50SW1wbD4gZG9jID0gZ2V0RG9jdW1lbnQo
KTsKLSAgICBldnQtPnNldFRhcmdldChkb2MuZ2V0KCkpOwotICAgIGJvb2wgciA9IGRpc3BhdGNo
R2VuZXJpY0V2ZW50KGV2dC5nZXQoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKCFldnQtPmRl
ZmF1bHRQcmV2ZW50ZWQoKSAmJiBkb2MpCi0gCWRvYy0+ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQu
Z2V0KCkpOwotCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBsb2FkRXZlbnQgJiYgIWV2dC0+cHJvcGFn
YXRpb25TdG9wcGVkKCkgJiYgZG9jKSB7Ci0gICAgICAgIC8vIEZvciBvbmxvYWQgZXZlbnRzLCBz
ZW5kIHRoZW0gdG8gdGhlIGVuY2xvc2luZyBmcmFtZSBvbmx5LgotICAgICAgICAvLyBUaGlzIGlz
IGEgRE9NIGV4dGVuc2lvbiBhbmQgaXMgaW5kZXBlbmRlbnQgb2YgYnViYmxpbmcvY2FwdHVyaW5n
IHJ1bGVzIG9mCi0gICAgICAgIC8vIHRoZSBET00uICBZb3Ugc2VuZCB0aGUgZXZlbnQgb25seSB0
byB0aGUgZW5jbG9zaW5nIGZyYW1lLiAgSXQgZG9lcyBub3QKLSAgICAgICAgLy8gYnViYmxlIHRo
cm91Z2ggdGhlIHBhcmVudCBkb2N1bWVudC4KLSAgICAgICAgRWxlbWVudEltcGwqIGVsdCA9IGRv
Yy0+b3duZXJFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbHQgJiYgKGVsdC0+Z2V0RG9jdW1lbnQo
KS0+ZG9tYWluKCkuaXNOdWxsKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgZWx0LT5nZXREb2N1
bWVudCgpLT5kb21haW4oKSA9PSBkb2MtPmRvbWFpbigpKSkgewotICAgICAgICAgICAgLy8gV2Ug
YWxzbyBkbyBhIHNlY3VyaXR5IGNoZWNrLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGFsbG93IHRo
ZSBlbmNsb3NpbmcKLSAgICAgICAgICAgIC8vIGlmcmFtZSB0byBzZWUgbG9hZHMgb2YgY2hpbGQg
ZG9jdW1lbnRzIGluIG90aGVyIGRvbWFpbnMuCi0gICAgICAgICAgICBldnQtPnNldEN1cnJlbnRU
YXJnZXQoZWx0KTsKLQotICAgICAgICAgICAgLy8gQ2FwdHVyaW5nIGZpcnN0LgotICAgICAgICAg
ICAgZWx0LT5oYW5kbGVMb2NhbEV2ZW50cyhldnQuZ2V0KCksIHRydWUpOwotCi0gICAgICAgICAg
ICAvLyBCdWJibGluZyBzZWNvbmQuCi0gICAgICAgICAgICBpZiAoIWV2dC0+cHJvcGFnYXRpb25T
dG9wcGVkKCkpCi0gICAgICAgICAgICAgICAgZWx0LT5oYW5kbGVMb2NhbEV2ZW50cyhldnQuZ2V0
KCksIGZhbHNlKTsKLSAgICAgICAgICAgIHIgPSAhZXZ0LT5kZWZhdWx0UHJldmVudGVkKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcjsKLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlz
cGF0Y2hNb3VzZUV2ZW50KFFNb3VzZUV2ZW50ICpfbW91c2UsIGNvbnN0IEF0b21pY1N0cmluZyAm
b3ZlcnJpZGVUeXBlLCBpbnQgb3ZlcnJpZGVEZXRhaWwpCi17Ci0gICAgYXNzZXJ0KCFldmVudERp
c3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGludCBkZXRhaWwgPSBvdmVycmlkZURldGFpbDsgLy8g
ZGVmYXVsdHMgdG8gMAotICAgIEF0b21pY1N0cmluZyBldmVudFR5cGU7Ci0gICAgaWYgKCFvdmVy
cmlkZVR5cGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGV2ZW50VHlwZSA9IG92ZXJyaWRlVHlwZTsK
LSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKF9tb3VzZS0+dHlwZSgpKSB7Ci0gICAgICAg
ICAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25QcmVzczoKLSAgICAgICAgICAgICAgICBldmVu
dFR5cGUgPSBtb3VzZWRvd25FdmVudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2U6Ci0gICAgICAgICAgICAgICAgZXZl
bnRUeXBlID0gbW91c2V1cEV2ZW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uRGJsQ2xpY2s6Ci0gICAgICAgICAgICAgICAgZXZl
bnRUeXBlID0gY2xpY2tFdmVudDsKLSAgICAgICAgICAgICAgICBkZXRhaWwgPSBfbW91c2UtPmNs
aWNrQ291bnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUUV2
ZW50OjpNb3VzZU1vdmU6Ci0gICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gbW91c2Vtb3ZlRXZl
bnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGNsaWVudFggPSAw
OwotICAgIGludCBjbGllbnRZID0gMDsKLSAgICBpZiAoS0hUTUxWaWV3ICp2aWV3ID0gZ2V0RG9j
dW1lbnQoKS0+dmlldygpKQotICAgICAgICB2aWV3LT52aWV3cG9ydFRvQ29udGVudHMoX21vdXNl
LT54KCksIF9tb3VzZS0+eSgpLCBjbGllbnRYLCBjbGllbnRZKTsKLSAgICBpbnQgc2NyZWVuWCA9
IF9tb3VzZS0+Z2xvYmFsWCgpOwotICAgIGludCBzY3JlZW5ZID0gX21vdXNlLT5nbG9iYWxZKCk7
Ci0KLSAgICBpbnQgYnV0dG9uID0gLTE7Ci0gICAgc3dpdGNoIChfbW91c2UtPmJ1dHRvbigpKSB7
Ci0gICAgICAgIGNhc2UgUXQ6OkxlZnRCdXR0b246Ci0gICAgICAgICAgICBidXR0b24gPSAwOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUXQ6Ok1pZEJ1dHRvbjoKLSAgICAgICAg
ICAgIGJ1dHRvbiA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRdDo6Umln
aHRCdXR0b246Ci0gICAgICAgICAgICBidXR0b24gPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBib29sIGN0
cmxLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6OkNvbnRyb2xCdXR0b24pOwotICAgIGJvb2wg
YWx0S2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0OjpBbHRCdXR0b24pOwotICAgIGJvb2wgc2hp
ZnRLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6OlNoaWZ0QnV0dG9uKTsKLSAgICBib29sIG1l
dGFLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6Ok1ldGFCdXR0b24pOwotICAgIAotICAgIHJl
dHVybiBkaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBidXR0b24sIGRldGFpbCwKLSAgICAg
ICAgY2xpZW50WCwgY2xpZW50WSwgc2NyZWVuWCwgc2NyZWVuWSwKLSAgICAgICAgY3RybEtleSwg
YWx0S2V5LCBzaGlmdEtleSwgbWV0YUtleSk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNo
U2ltdWxhdGVkTW91c2VFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAg
ICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgLy8gTGlrZSBHZWNrbywg
d2UganVzdCBwYXNzIDAgZm9yIGV2ZXJ5dGhpbmcgd2hlbiB3ZSBtYWtlIGEgZmFrZSBtb3VzZSBl
dmVudC4KLSAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciBpbnN0ZWFkIGdpdmVzIHRoZSBjdXJyZW50
IG1vdXNlIHBvc2l0aW9uIGFuZCBzdGF0ZS4KLSAgICByZXR1cm4gZGlzcGF0Y2hNb3VzZUV2ZW50
KGV2ZW50VHlwZSwgMCwgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2Up
OwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaE1vdXNlRXZlbnQoY29uc3QgQXRvbWljU3Ry
aW5nICZldmVudFR5cGUsIGludCBidXR0b24sIGludCBkZXRhaWwsCi0gICAgaW50IGNsaWVudFgs
IGludCBjbGllbnRZLCBpbnQgc2NyZWVuWCwgaW50IHNjcmVlblksCi0gICAgYm9vbCBjdHJsS2V5
LCBib29sIGFsdEtleSwgYm9vbCBzaGlmdEtleSwgYm9vbCBtZXRhS2V5KQotewotICAgIGFzc2Vy
dCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpZiAoZGlzYWJsZWQoKSkgLy8gRG9u
J3QgZXZlbiBzZW5kIERPTSBldmVudHMgZm9yIGRpc2FibGVkIGNvbnRyb2xzLi4KLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICBpZiAoZXZlbnRUeXBlLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOyAvLyBTaG91bGRuJ3QgaGFwcGVuLgotCi0gICAgLy8gRGlzcGF0Y2hpbmcgdGhl
IGZpcnN0IGV2ZW50IGNhbiBlYXNpbHkgcmVzdWx0IGluIHRoaXMgbm9kZSBiZWluZyBkZXN0cm95
ZWQuCi0gICAgLy8gU2luY2Ugd2UgZGlzcGF0Y2ggdXAgdG8gdGhyZWUgZXZlbnRzIGhlcmUsIHdl
IG5lZWQgdG8gbWFrZSBzdXJlIHdlJ3JlIHJlZmVyZW5jZWQKLSAgICAvLyBzbyB0aGUgcG9pbnRl
ciB3aWxsIGJlIGdvb2QgZm9yIHRoZSB0d28gc3Vic2VxdWVudCBvbmVzLgotICAgIFJlZlB0cjxO
b2RlSW1wbD4gcHJvdGVjdCh0aGlzKTsKLQotICAgIGJvb2wgY2FuY2VsYWJsZSA9IGV2ZW50VHlw
ZSAhPSBtb3VzZW1vdmVFdmVudDsKLSAgICAKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0K
LSAgICBib29sIHN3YWxsb3dFdmVudCA9IGZhbHNlOwotCi0gICAgRXZlbnRJbXBsICptZSA9IG5l
dyBNb3VzZUV2ZW50SW1wbChldmVudFR5cGUsdHJ1ZSxjYW5jZWxhYmxlLGdldERvY3VtZW50KCkt
PmRlZmF1bHRWaWV3KCksCi0gICAgICAgICAgICAgICAgICAgZGV0YWlsLHNjcmVlblgsc2NyZWVu
WSxjbGllbnRYLGNsaWVudFksY3RybEtleSxhbHRLZXksc2hpZnRLZXksbWV0YUtleSwKLSAgICAg
ICAgICAgICAgICAgICBidXR0b24sMCk7Ci0gICAgbWUtPnJlZigpOwotICAgIGRpc3BhdGNoRXZl
bnQobWUsIGV4Y2VwdGlvbmNvZGUsIHRydWUpOwotICAgIGJvb2wgZGVmYXVsdEhhbmRsZWQgPSBt
ZS0+ZGVmYXVsdEhhbmRsZWQoKTsKLSAgICBib29sIGRlZmF1bHRQcmV2ZW50ZWQgPSBtZS0+ZGVm
YXVsdFByZXZlbnRlZCgpOwotICAgIGlmIChkZWZhdWx0SGFuZGxlZCB8fCBkZWZhdWx0UHJldmVu
dGVkKQotICAgICAgICBzd2FsbG93RXZlbnQgPSB0cnVlOwotICAgIG1lLT5kZXJlZigpOwotCi0g
ICAgLy8gU3BlY2lhbCBjYXNlOiBJZiBpdCdzIGEgZG91YmxlIGNsaWNrIGV2ZW50LCB3ZSBhbHNv
IHNlbmQgdGhlIEtIVE1MX0RCTENMSUNLIGV2ZW50LiBUaGlzIGlzIG5vdCBwYXJ0Ci0gICAgLy8g
b2YgdGhlIERPTSBzcGVjcywgYnV0IGlzIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUg
b25kYmxjbGljaz0iIiBhdHRyaWJ1dGUuICBUaGlzIGlzIHRyZWF0ZWQKLSAgICAvLyBhcyBhIHNl
cGFyYXRlIGV2ZW50IGluIG90aGVyIERPTS1jb21wbGlhbnQgYnJvd3NlcnMgbGlrZSBGaXJlZm94
LCBhbmQgc28gd2UgZG8gdGhlIHNhbWUuCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBjbGlja0V2ZW50
ICYmIGRldGFpbCA9PSAyKSB7Ci0gICAgICAgIG1lID0gbmV3IE1vdXNlRXZlbnRJbXBsKGtodG1s
RGJsY2xpY2tFdmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxjYW5j
ZWxhYmxlLGdldERvY3VtZW50KCktPmRlZmF1bHRWaWV3KCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRldGFpbCxzY3JlZW5YLHNjcmVlblksY2xpZW50WCxjbGllbnRZLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsS2V5LGFsdEtleSxzaGlmdEtleSxtZXRh
S2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24sMCk7Ci0gICAgICAg
IG1lLT5yZWYoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRIYW5kbGVkKQotICAgICAgICAgICAgbWUt
PnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIGRpc3BhdGNoRXZlbnQobWUsZXhjZXB0aW9u
Y29kZSx0cnVlKTsKLSAgICAgICAgaWYgKG1lLT5kZWZhdWx0SGFuZGxlZCgpIHx8IG1lLT5kZWZh
dWx0UHJldmVudGVkKCkpCi0gICAgICAgICAgICBzd2FsbG93RXZlbnQgPSB0cnVlOwotICAgICAg
ICBtZS0+ZGVyZWYoKTsKLSAgICB9Ci0KLSAgICAvLyBBbHNvIHNlbmQgYSBET01BY3RpdmF0ZSBl
dmVudCwgd2hpY2ggY2F1c2VzIHRoaW5ncyBsaWtlIGZvcm0gc3VibWlzc2lvbnMgdG8gb2NjdXIu
Ci0gICAgaWYgKGV2ZW50VHlwZSA9PSBjbGlja0V2ZW50ICYmICFkZWZhdWx0UHJldmVudGVkKQot
ICAgICAgICBkaXNwYXRjaFVJRXZlbnQoRE9NQWN0aXZhdGVFdmVudCwgZGV0YWlsKTsKLQotICAg
IHJldHVybiBzd2FsbG93RXZlbnQ7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoVUlFdmVu
dChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgaW50IGRldGFpbCkKLXsKLSAgICBhc3Nl
cnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgYXNzZXJ0ICghKCAoZXZlbnRUeXBl
ICE9IERPTUZvY3VzSW5FdmVudCAmJgotICAgICAgICAgICAgICAgIGV2ZW50VHlwZSAhPSBET01G
b2N1c091dEV2ZW50ICYmCi0gICAgICAgICAgICAgICAgZXZlbnRUeXBlICE9IERPTUFjdGl2YXRl
RXZlbnQpKSk7Ci0KLSAgICBpZiAoIWdldERvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGJvb2wgY2FuY2VsYWJsZSA9IGZhbHNlOwotICAgIGlmIChldmVudFR5cGUgPT0g
RE9NQWN0aXZhdGVFdmVudCkKLSAgICAgICAgY2FuY2VsYWJsZSA9IHRydWU7Ci0KLSAgICBpbnQg
ZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBVSUV2ZW50SW1wbCAqZXZ0ID0gbmV3IFVJRXZlbnRJ
bXBsKGV2ZW50VHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZ2V0RG9jdW1lbnQoKS0+ZGVmYXVsdFZp
ZXcoKSwgZGV0YWlsKTsKLSAgICByZXR1cm4gZGlzcGF0Y2hFdmVudChldnQsZXhjZXB0aW9uY29k
ZSx0cnVlKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6cmVnaXN0ZXJOb2RlTGlzdChOb2RlTGlzdElt
cGwgKmxpc3QpCi17Ci0gICAgaWYgKCFtX25vZGVMaXN0cykgewotICAgICAgICBtX25vZGVMaXN0
cyA9IG5ldyBRUHRyRGljdDxOb2RlTGlzdEltcGw+OwotICAgIH0KLQotICAgIG1fbm9kZUxpc3Rz
LT5pbnNlcnQobGlzdCwgbGlzdCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnVucmVnaXN0ZXJOb2Rl
TGlzdChOb2RlTGlzdEltcGwgKmxpc3QpCi17Ci0gICAgaWYgKCFtX25vZGVMaXN0cykKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgbV9ub2RlTGlzdHMtPnJlbW92ZShsaXN0KTsKLX0KLQotdm9pZCBO
b2RlSW1wbDo6bm90aWZ5TG9jYWxOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCkKLXsKLSAgICBp
ZiAoIW1fbm9kZUxpc3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9y
PE5vZGVMaXN0SW1wbD4gaSgqbV9ub2RlTGlzdHMpOwotCi0gICAgd2hpbGUgKE5vZGVMaXN0SW1w
bCAqbGlzdCA9IGkuY3VycmVudCgpKSB7Ci0gICAgICAgIGxpc3QtPnJvb3ROb2RlQXR0cmlidXRl
Q2hhbmdlZCgpOwotICAgICAgICArK2k7Ci0gICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpub3Rp
ZnlOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCkKLXsKLSAgICBmb3IgKE5vZGVJbXBsICpuID0g
dGhpczsgbjsgbiA9IG4tPnBhcmVudE5vZGUoKSkgewotICAgICAgICBuLT5ub3RpZnlMb2NhbE5v
ZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6Om5v
dGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBpZiAoIW1fbm9kZUxp
c3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9yPE5vZGVMaXN0SW1w
bD4gaSgqbV9ub2RlTGlzdHMpOwotCi0gICAgd2hpbGUgKE5vZGVMaXN0SW1wbCAqbGlzdCA9IGku
Y3VycmVudCgpKSB7Ci0gICAgICAgIGxpc3QtPnJvb3ROb2RlQ2hpbGRyZW5DaGFuZ2VkKCk7Ci0g
ICAgICAgICsraTsKLSAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6Om5vdGlmeU5vZGVMaXN0c0No
aWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9IHRoaXM7IG47IG4gPSBu
LT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgbi0+bm90aWZ5TG9jYWxOb2RlTGlzdHNDaGlsZHJl
bkNoYW5nZWQoKTsKLSAgICB9Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoU3VidHJlZU1v
ZGlmaWVkRXZlbnQoYm9vbCBzZW5kQ2hpbGRyZW5DaGFuZ2VkKQotewotICAgIGFzc2VydCghZXZl
bnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLQotICAgIC8vIEZJWE1FOiBQdWxsIHRoaXMgd2hvbGUg
aWYgY2xhdXNlIG91dCBvZiB0aGlzIGZ1bmN0aW9uLgotICAgIGlmIChzZW5kQ2hpbGRyZW5DaGFu
Z2VkKSB7Ci0gICAgICAgIG5vdGlmeU5vZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpOwotICAgICAg
ICBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbm90aWZ5Tm9kZUxpc3Rz
QXR0cmlidXRlQ2hhbmdlZCgpOyAvLyBGSVhNRTogQ2FuIGRvIGJldHRlciBzb21lIGRheS4gUmVh
bGx5IG9ubHkgY2FyZSBhYm91dCB0aGUgbmFtZSBhdHRyaWJ1dGUgY2hhbmdpbmcuCi0KLSAgICBp
ZiAoIWdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTVNVQlRS
RUVNT0RJRklFRF9MSVNURU5FUikpCi0JcmV0dXJuIGZhbHNlOwotICAgIGludCBleGNlcHRpb25j
b2RlID0gMDsKLSAgICByZXR1cm4gZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudEltcGwo
RE9NU3VidHJlZU1vZGlmaWVkRXZlbnQsCi0JCQkgdHJ1ZSxmYWxzZSwwLERPTVN0cmluZygpLERP
TVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci19Ci0KLWJvb2wg
Tm9kZUltcGw6OmRpc3BhdGNoS2V5RXZlbnQoUUtleUV2ZW50ICprZXkpCi17Ci0gICAgYXNzZXJ0
KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsK
LSAgICAvL2tkRGVidWcoNjAxMCkgPDwgIkRPTTo6Tm9kZUltcGw6IGRpc3BhdGNoaW5nIGtleWJv
YXJkIGV2ZW50IiA8PCBlbmRsOwotICAgIEtleWJvYXJkRXZlbnRJbXBsICprZXlib2FyZEV2ZW50
SW1wbCA9IG5ldyBLZXlib2FyZEV2ZW50SW1wbChrZXksIGdldERvY3VtZW50KCktPmRlZmF1bHRW
aWV3KCkpOwotICAgIGtleWJvYXJkRXZlbnRJbXBsLT5yZWYoKTsKLSAgICBib29sIHIgPSBkaXNw
YXRjaEV2ZW50KGtleWJvYXJkRXZlbnRJbXBsLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci0KLSAgICAv
LyB3ZSB3YW50IHRvIHJldHVybiBmYWxzZSBpZiBkZWZhdWx0IGlzIHByZXZlbnRlZCAoYWxyZWFk
eSB0YWtlbiBjYXJlIG9mKQotICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGlzIGRlZmF1bHQtaGFu
ZGxlZCBieSB0aGUgRE9NLiBPdGhlcndpc2Ugd2UgbGV0IGl0IGp1c3QKLSAgICAvLyBsZXQgaXQg
Z2V0IGhhbmRsZWQgYnkgQXBwS2l0IAotICAgIGlmIChrZXlib2FyZEV2ZW50SW1wbC0+ZGVmYXVs
dEhhbmRsZWQoKSkKLSAgICAgIHIgPSBmYWxzZTsKLQotICAgIGtleWJvYXJkRXZlbnRJbXBsLT5k
ZXJlZigpOwotICAgIHJldHVybiByOwotCi19Ci0KLXZvaWQgTm9kZUltcGw6OmRpc3BhdGNoV2hl
ZWxFdmVudChRV2hlZWxFdmVudCAqZSkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3Ji
aWRkZW4oKSk7Ci0gICAgaWYgKGUtPmRlbHRhKCkgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGlmICghZG9jKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBLSFRNTFZpZXcgKnZpZXcgPSBnZXREb2N1bWVudCgpLT52aWV3
KCk7Ci0gICAgaWYgKCF2aWV3KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpbnQgeDsKLSAgICBp
bnQgeTsKLSAgICB2aWV3LT52aWV3cG9ydFRvQ29udGVudHMoZS0+eCgpLCBlLT55KCksIHgsIHkp
OwotCi0gICAgaW50IHN0YXRlID0gZS0+c3RhdGUoKTsKLQotICAgIFdoZWVsRXZlbnRJbXBsICp3
ZSA9IG5ldyBXaGVlbEV2ZW50SW1wbChlLT5vcmllbnRhdGlvbigpID09IFF0OjpIb3Jpem9udGFs
LCBlLT5kZWx0YSgpLAotICAgICAgICBnZXREb2N1bWVudCgpLT5kZWZhdWx0VmlldygpLCBlLT5n
bG9iYWxYKCksIGUtPmdsb2JhbFkoKSwgeCwgeSwKLSAgICAgICAgc3RhdGUgJiBRdDo6Q29udHJv
bEJ1dHRvbiwgc3RhdGUgJiBRdDo6QWx0QnV0dG9uLCBzdGF0ZSAmIFF0OjpTaGlmdEJ1dHRvbiwg
c3RhdGUgJiBRdDo6TWV0YUJ1dHRvbik7Ci0KLSAgICBpbnQgZXhjZXB0aW9uQ29kZSA9IDA7Ci0g
ICAgaWYgKCFkaXNwYXRjaEV2ZW50KHdlLCBleGNlcHRpb25Db2RlLCB0cnVlKSkKLSAgICAgICAg
ZS0+YWNjZXB0KCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmhhbmRsZUxvY2FsRXZlbnRzKEV2ZW50
SW1wbCAqZXZ0LCBib29sIHVzZUNhcHR1cmUpCi17Ci0gICAgaWYgKCFtX3JlZ2RMaXN0ZW5lcnMp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChkaXNhYmxlZCgpICYmIGV2dC0+aXNNb3VzZUV2
ZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFQdHJMaXN0PFJlZ2lzdGVyZWRFdmVudExp
c3RlbmVyPiBsaXN0ZW5lcnNDb3B5ID0gKm1fcmVnZExpc3RlbmVyczsKLSAgICBRUHRyTGlzdEl0
ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChsaXN0ZW5lcnNDb3B5KTsKLSAgICBm
b3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpZiAoaXQuY3VycmVudCgpLT5ldmVu
dFR5cGUoKSA9PSBldnQtPnR5cGUoKSAmJiBpdC5jdXJyZW50KCktPnVzZUNhcHR1cmUoKSA9PSB1
c2VDYXB0dXJlKQotICAgICAgICAgICAgaXQuY3VycmVudCgpLT5saXN0ZW5lcigpLT5oYW5kbGVF
dmVudEltcGwoZXZ0LCBmYWxzZSk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmRlZmF1bHRFdmVudEhh
bmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci19Ci0KLXVuc2lnbmVkIE5vZGVJbXBsOjpjaGlsZE5v
ZGVDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1w
bDo6Y2hpbGROb2RlKHVuc2lnbmVkIC8qaW5kZXgqLykKLXsKLSAgICByZXR1cm4gMDsKLX0KLQot
Tm9kZUltcGwgKk5vZGVJbXBsOjp0cmF2ZXJzZU5leHROb2RlKGNvbnN0IE5vZGVJbXBsICpzdGF5
V2l0aGluKSBjb25zdAotewotICAgIGlmIChmaXJzdENoaWxkKCkpIHsKLSAgICAgICAgYXNzZXJ0
KCFzdGF5V2l0aGluIHx8IGZpcnN0Q2hpbGQoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGluKSk7Ci0J
cmV0dXJuIGZpcnN0Q2hpbGQoKTsKLSAgICB9Ci0gICAgaWYgKHRoaXMgPT0gc3RheVdpdGhpbikK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgYXNz
ZXJ0KCFzdGF5V2l0aGluIHx8IG5leHRTaWJsaW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikp
OwotCXJldHVybiBuZXh0U2libGluZygpOwotICAgIH0KLSAgICBjb25zdCBOb2RlSW1wbCAqbiA9
IHRoaXM7Ci0gICAgd2hpbGUgKG4gJiYgIW4tPm5leHRTaWJsaW5nKCkgJiYgKCFzdGF5V2l0aGlu
IHx8IG4tPnBhcmVudE5vZGUoKSAhPSBzdGF5V2l0aGluKSkKLSAgICAgICAgbiA9IG4tPnBhcmVu
dE5vZGUoKTsKLSAgICBpZiAobikgewotICAgICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgIW4t
Pm5leHRTaWJsaW5nKCkgfHwgbi0+bmV4dFNpYmxpbmcoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGlu
KSk7Ci0gICAgICAgIHJldHVybiBuLT5uZXh0U2libGluZygpOwotICAgIH0KLSAgICByZXR1cm4g
MDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjp0cmF2ZXJzZU5leHRTaWJsaW5nKGNvbnN0IE5v
ZGVJbXBsICpzdGF5V2l0aGluKSBjb25zdAotewotICAgIGlmICh0aGlzID09IHN0YXlXaXRoaW4p
Ci0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChuZXh0U2libGluZygpKSB7Ci0gICAgICAgIGFz
c2VydCghc3RheVdpdGhpbiB8fCBuZXh0U2libGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4p
KTsKLQlyZXR1cm4gbmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gICAgY29uc3QgTm9kZUltcGwgKm4g
PSB0aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5uZXh0U2libGluZygpICYmICghc3RheVdpdGhp
biB8fCBuLT5wYXJlbnROb2RlKCkgIT0gc3RheVdpdGhpbikpCi0gICAgICAgIG4gPSBuLT5wYXJl
bnROb2RlKCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8ICFu
LT5uZXh0U2libGluZygpIHx8IG4tPm5leHRTaWJsaW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhp
bikpOwotICAgICAgICByZXR1cm4gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6dHJhdmVyc2VQcmV2aW91c05vZGUoKSBjb25z
dAotewotICAgIGlmIChwcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICBOb2RlSW1wbCAqbiA9
IHByZXZpb3VzU2libGluZygpOwotICAgICAgICB3aGlsZSAobi0+bGFzdENoaWxkKCkpCi0gICAg
ICAgICAgICBuID0gbi0+bGFzdENoaWxkKCk7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAg
ICBlbHNlIGlmIChwYXJlbnROb2RlKCkpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudE5vZGUoKTsK
LSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotTm9kZUlt
cGwgKk5vZGVJbXBsOjp0cmF2ZXJzZVByZXZpb3VzTm9kZVBvc3RPcmRlcihjb25zdCBOb2RlSW1w
bCAqc3RheVdpdGhpbikgY29uc3QKLXsKLSAgICBpZiAobGFzdENoaWxkKCkpIHsKLSAgICAgICAg
YXNzZXJ0KCFzdGF5V2l0aGluIHx8IGxhc3RDaGlsZCgpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4p
KTsKLQlyZXR1cm4gbGFzdENoaWxkKCk7Ci0gICAgfQotICAgIGlmICh0aGlzID09IHN0YXlXaXRo
aW4pCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChwcmV2aW91c1NpYmxpbmcoKSkgewotICAg
ICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgcHJldmlvdXNTaWJsaW5nKCktPmlzQW5jZXN0b3Io
c3RheVdpdGhpbikpOwotCXJldHVybiBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICB9Ci0gICAgY29u
c3QgTm9kZUltcGwgKm4gPSB0aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5wcmV2aW91c1NpYmxp
bmcoKSAmJiAoIXN0YXlXaXRoaW4gfHwgbi0+cGFyZW50Tm9kZSgpICE9IHN0YXlXaXRoaW4pKQot
ICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGFzc2Vy
dCghc3RheVdpdGhpbiB8fCAhbi0+cHJldmlvdXNTaWJsaW5nKCkgfHwgbi0+cHJldmlvdXNTaWJs
aW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwotICAgICAgICByZXR1cm4gbi0+cHJldmlv
dXNTaWJsaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5vZGVJbXBsOjpj
aGVja1NldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIGludCAmZXhjZXB0aW9u
Y29kZSkKLXsKLSAgICAvLyBQZXJmb3JtIGVycm9yIGNoZWNraW5nIGFzIHJlcXVpcmVkIGJ5IHNw
ZWMgZm9yIHNldHRpbmcgTm9kZS5wcmVmaXguIFVzZWQgYnkKLSAgICAvLyBFbGVtZW50SW1wbDo6
c2V0UHJlZml4KCkgYW5kIEF0dHJJbXBsOjpzZXRQcmVmaXgoKQotCi0gICAgLy8gRklYTUU6IElt
cGxlbWVudCBzdXBwb3J0IGZvciBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUg
c3BlY2lmaWVkIHByZWZpeCBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4KLSAgICAKLSAg
ICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMg
cmVhZG9ubHkuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBleGNlcHRpb25jb2Rl
ID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IE5BTUVTUEFDRV9FUlI6IC0g
UmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcHJlZml4IGlzIG1hbGZvcm1lZAotICAgIC8vIFdlIGhh
dmUgdG8gY29tbWVudCB0aGlzIG91dCwgc2luY2UgaXQncyB1c2VkIGZvciBhdHRyaWJ1dGVzIGFu
ZCB0YWcgbmFtZXMsIGFuZCB3ZSd2ZSBvbmx5Ci0gICAgLy8gc3dpdGNoZWQgb25lIG92ZXIuCi0g
ICAgLyoKLSAgICAvLyAtIGlmIHRoZSBuYW1lc3BhY2VVUkkgb2YgdGhpcyBub2RlIGlzIG51bGws
Ci0gICAgLy8gLSBpZiB0aGUgc3BlY2lmaWVkIHByZWZpeCBpcyAieG1sIiBhbmQgdGhlIG5hbWVz
cGFjZVVSSSBvZiB0aGlzIG5vZGUgaXMgZGlmZmVyZW50IGZyb20KLSAgICAvLyAgICJodHRwOi8v
d3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAotICAgIC8vIC0gaWYgdGhpcyBub2RlIGlz
IGFuIGF0dHJpYnV0ZSBhbmQgdGhlIHNwZWNpZmllZCBwcmVmaXggaXMgInhtbG5zIiBhbmQKLSAg
ICAvLyAgIHRoZSBuYW1lc3BhY2VVUkkgb2YgdGhpcyBub2RlIGlzIGRpZmZlcmVudCBmcm9tICJo
dHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsCi0gICAgLy8gLSBvciBpZiB0aGlzIG5vZGUg
aXMgYW4gYXR0cmlidXRlIGFuZCB0aGUgcXVhbGlmaWVkTmFtZSBvZiB0aGlzIG5vZGUgaXMgInht
bG5zIiBbTmFtZXNwYWNlc10uCi0gICAgaWYgKChuYW1lc3BhY2VQYXJ0KGlkKCkpID09IG5vTmFt
ZXNwYWNlICYmIGlkKCkgPiBJRF9MQVNUX1RBRykgfHwKLSAgICAgICAgKF9wcmVmaXggPT0gInht
bCIgJiYgRE9NU3RyaW5nKGdldERvY3VtZW50KCktPm5hbWVzcGFjZVVSSShpZCgpKSkgIT0gImh0
dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIpKSB7Ci0gICAgICAgIGV4Y2VwdGlv
bmNvZGUgPSBET01FeGNlcHRpb246Ok5BTUVTUEFDRV9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ki8KLX0KLQotdm9pZCBOb2RlSW1wbDo6Y2hlY2tBZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICAvLyBQZXJmb3JtIGVycm9yIGNoZWNraW5n
IGFzIHJlcXVpcmVkIGJ5IHNwZWMgZm9yIGFkZGluZyBhIG5ldyBjaGlsZC4gVXNlZCBieQotICAg
IC8vIGFwcGVuZENoaWxkKCksIHJlcGxhY2VDaGlsZCgpIGFuZCBpbnNlcnRCZWZvcmUoKQotCi0g
ICAgLy8gTm90IG1lbnRpb25lZCBpbiBzcGVjOiB0aHJvdyBOT1RfRk9VTkRfRVJSIGlmIG5ld0No
aWxkIGlzIG51bGwKLSAgICBpZiAoIW5ld0NoaWxkKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUg
PSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUg
aXMgcmVhZG9ubHkKLSAgICBpZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNv
ZGUgPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgc2hvdWxkQWRvcHRDaGlsZCA9IGZhbHNlOwotCi0g
ICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgbmV3Q2hpbGQgd2FzIGNyZWF0ZWQg
ZnJvbSBhIGRpZmZlcmVudCBkb2N1bWVudCB0aGFuIHRoZSBvbmUgdGhhdAotICAgIC8vIGNyZWF0
ZWQgdGhpcyBub2RlLgotICAgIC8vIFdlIGFzc3VtZSB0aGF0IGlmIG5ld0NoaWxkIGlzIGEgRG9j
dW1lbnRGcmFnbWVudCwgYWxsIGNoaWxkcmVuIGFyZSBjcmVhdGVkIGZyb20gdGhlIHNhbWUgZG9j
dW1lbnQKLSAgICAvLyBhcyB0aGUgZnJhZ21lbnQgaXRzZWxmIChvdGhlcndpc2UgdGhleSBjb3Vs
ZCBub3QgaGF2ZSBiZWVuIGFkZGVkIGFzIGNoaWxkcmVuKQotICAgIGlmIChuZXdDaGlsZC0+Z2V0
RG9jdW1lbnQoKSAhPSBnZXREb2N1bWVudCgpKSB7Ci0JLy8gYnV0IGlmIHRoZSBjaGlsZCBpcyBu
b3QgaW4gYSBkb2N1bWVudCB5ZXQgdGhlbiBsb29zZW4gdGhlCi0JLy8gcmVzdHJpY3Rpb24sIHNv
IHRoYXQgZS5nLiBjcmVhdGluZyBhbiBlbGVtZW50IHdpdGggdGhlIE9wdGlvbigpCi0JLy8gY29u
c3RydWN0b3IgYW5kIHRoZW4gYWRkaW5nIGl0IHRvIGEgZGlmZmVyZW50IGRvY3VtZW50IHdvcmtz
LAotCS8vIGFzIGl0IGRvZXMgaW4gTW96aWxsYSBhbmQgTWFjIElFLgotCWlmICghbmV3Q2hpbGQt
PmluRG9jdW1lbnQoKSkgewotCSAgICBzaG91bGRBZG9wdENoaWxkID0gdHJ1ZTsKLQl9IGVsc2Ug
ewotCSAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpXUk9OR19ET0NVTUVOVF9FUlI7
Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgLy8gSElFUkFSQ0hZX1JFUVVFU1RfRVJS
OiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93IGNo
aWxkcmVuIG9mIHRoZSB0eXBlIG9mIHRoZQotICAgIC8vIG5ld0NoaWxkIG5vZGUsIG9yIGlmIHRo
ZSBub2RlIHRvIGFwcGVuZCBpcyBvbmUgb2YgdGhpcyBub2RlJ3MgYW5jZXN0b3JzLgotCi0gICAg
Ly8gY2hlY2sgZm9yIGFuY2VzdG9yL3NhbWUgbm9kZQotICAgIGlmIChuZXdDaGlsZCA9PSB0aGlz
IHx8IGlzQW5jZXN0b3IobmV3Q2hpbGQpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01F
eGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICAKLSAgICBpZiAobmV3Q2hpbGQtPm5vZGVUeXBlKCkgIT0gTm9kZTo6RE9DVU1FTlRfRlJB
R01FTlRfTk9ERSkgewotICAgICAgICBpZiAoIWNoaWxkVHlwZUFsbG93ZWQobmV3Q2hpbGQtPm5v
ZGVUeXBlKCkpKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpI
SUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKm4gPSBuZXdDaGlsZC0+Zmly
c3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKCFj
aGlsZFR5cGVBbGxvd2VkKG4tPm5vZGVUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZXhjZXB0
aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAg
ICAvLyBjaGFuZ2UgdGhlIGRvY3VtZW50IHBvaW50ZXIgb2YgbmV3Q2hpbGQgYW5kIGFsbCBvZiBp
dHMgY2hpbGRyZW4gdG8gYmUgdGhlIG5ldyBkb2N1bWVudAotICAgIGlmIChzaG91bGRBZG9wdENo
aWxkKSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwqIG5vZGUgPSBuZXdDaGlsZDsgbm9kZTsgbm9k
ZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUobmV3Q2hpbGQpKSB7Ci0gICAgICAgICAgICBLSlM6
OlNjcmlwdEludGVycHJldGVyOjp1cGRhdGVET01Ob2RlRG9jdW1lbnQobm9kZSwgbm9kZS0+Z2V0
RG9jdW1lbnQoKSwgZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBub2RlLT5zZXREb2N1bWVu
dChnZXREb2N1bWVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBOb2RlSW1wbDo6
aXNBbmNlc3Rvcihjb25zdCBOb2RlSW1wbCAqb3RoZXIpIGNvbnN0Ci17Ci0gICAgLy8gUmV0dXJu
IHRydWUgaWYgb3RoZXIgaXMgYW4gYW5jZXN0b3Igb2YgdGhpcywgb3RoZXJ3aXNlIGZhbHNlCi0g
ICAgaWYgKCFvdGhlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoY29uc3QgTm9k
ZUltcGwgKm4gPSBwYXJlbnROb2RlKCk7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKLSAgICAg
ICAgaWYgKG4gPT0gb3RoZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBsOjpjaGlsZEFsbG93ZWQoIE5vZGVJbXBs
ICpuZXdDaGlsZCApCi17Ci0gICAgcmV0dXJuIGNoaWxkVHlwZUFsbG93ZWQobmV3Q2hpbGQtPm5v
ZGVUeXBlKCkpOwotfQotCi1Ob2RlSW1wbDo6U3R5bGVDaGFuZ2UgTm9kZUltcGw6OmRpZmYoIGto
dG1sOjpSZW5kZXJTdHlsZSAqczEsIGtodG1sOjpSZW5kZXJTdHlsZSAqczIgKSBjb25zdAotewot
ICAgIC8vIEZJWE1FOiBUaGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBpcyBqdXN0IHRvdGFs
bHkgd3JvbmcuICBJdCBkb2Vzbid0IGhhbmRsZQotICAgIC8vIGV4cGxpY2l0IGluaGVyaXRhbmNl
IG9mIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcyBhbmQgc28geW91IGVuZCB1cCBub3QgcmUtcmVz
b2x2aW5nCi0gICAgLy8gc3R5bGUgaW4gY2FzZXMgd2hlcmUgeW91IG5lZWQgdG8uCi0gICAgU3R5
bGVDaGFuZ2UgY2ggPSBOb0luaGVyaXQ7Ci0gICAgRURpc3BsYXkgZGlzcGxheTEgPSBzMSA/IHMx
LT5kaXNwbGF5KCkgOiBOT05FOwotICAgIGJvb2wgZmwxID0gczEgPyBzMS0+aGFzUHNldWRvU3R5
bGUoUmVuZGVyU3R5bGU6OkZJUlNUX0xFVFRFUikgOiBmYWxzZTsKLSAgICBFRGlzcGxheSBkaXNw
bGF5MiA9IHMyID8gczItPmRpc3BsYXkoKSA6IE5PTkU7Ci0gICAgYm9vbCBmbDIgPSBzMiA/IHMy
LT5oYXNQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6RklSU1RfTEVUVEVSKSA6IGZhbHNlOwotICAg
IGlmIChkaXNwbGF5MSAhPSBkaXNwbGF5MiB8fCBmbDEgIT0gZmwyKQotICAgICAgICBjaCA9IERl
dGFjaDsKLSAgICBlbHNlIGlmICggIXMxIHx8ICFzMiApCi0JY2ggPSBJbmhlcml0OwotICAgIGVs
c2UgaWYgKCAqczEgPT0gKnMyICkKLSAJY2ggPSBOb0NoYW5nZTsKLSAgICBlbHNlIGlmICggczEt
PmluaGVyaXRlZE5vdEVxdWFsKCBzMiApICkKLQljaCA9IEluaGVyaXQ7Ci0gICAgcmV0dXJuIGNo
OwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBOb2RlSW1wbDo6ZHVtcChRVGV4dFN0cmVhbSAq
c3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICAvLyAjIyMgaW1wbGVtZW50IGR1bXAo
KSBmb3IgYWxsIGFwcHJvcHJpYXRlIHN1YmNsYXNzZXMKLQotICAgIGlmIChtX2hhc0lkKSB7ICpz
dHJlYW0gPDwgIiBoYXNJZCI7IH0KLSAgICBpZiAobV9oYXNDbGFzcykgeyAqc3RyZWFtIDw8ICIg
aGFzQ2xhc3MiOyB9Ci0gICAgaWYgKG1faGFzU3R5bGUpIHsgKnN0cmVhbSA8PCAiIGhhc1N0eWxl
IjsgfQotICAgIGlmIChtX3NwZWNpZmllZCkgeyAqc3RyZWFtIDw8ICIgc3BlY2lmaWVkIjsgfQot
ICAgIGlmIChtX2ZvY3VzZWQpIHsgKnN0cmVhbSA8PCAiIGZvY3VzZWQiOyB9Ci0gICAgaWYgKG1f
YWN0aXZlKSB7ICpzdHJlYW0gPDwgIiBhY3RpdmUiOyB9Ci0gICAgaWYgKG1fc3R5bGVFbGVtZW50
KSB7ICpzdHJlYW0gPDwgIiBzdHlsZUVsZW1lbnQiOyB9Ci0gICAgaWYgKG1faW1wbGljaXQpIHsg
KnN0cmVhbSA8PCAiIGltcGxpY2l0IjsgfQotCi0gICAgKnN0cmVhbSA8PCAiIHRhYkluZGV4PSIg
PDwgbV90YWJJbmRleDsKLSAgICBpZiAobV9yZWdkTGlzdGVuZXJzKQotCSpzdHJlYW0gPDwgIiAj
cmVnZExpc3RlbmVycz0iIDw8IG1fcmVnZExpc3RlbmVycy0+Y291bnQoKTsgLy8gIyMjIG1vcmUg
ZGV0YWlsCi0gICAgKnN0cmVhbSA8PCBlbmRsOwotCi0gICAgTm9kZUltcGwgKmNoaWxkID0gZmly
c3RDaGlsZCgpOwotICAgIHdoaWxlKGNoaWxkKSB7Ci0JKnN0cmVhbSA8PCBpbmQgPDwgY2hpbGQt
Pm5vZGVOYW1lKCkucXN0cmluZygpLmFzY2lpKCkgPDwgIjogIjsKLSAgICAgICAgY2hpbGQtPmR1
bXAoc3RyZWFtLGluZCsiICAiKTsKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmco
KTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotdm9pZCBOb2RlSW1wbDo6YXR0YWNoKCkKLXsKLSAgICBh
c3NlcnQoIWF0dGFjaGVkKCkpOwotICAgIGFzc2VydCghbV9yZW5kZXIgfHwgKG1fcmVuZGVyLT5z
dHlsZSgpICYmIG1fcmVuZGVyLT5wYXJlbnQoKSkpOwotICAgIGdldERvY3VtZW50KCktPmluY0RP
TVRyZWVWZXJzaW9uKCk7Ci0gICAgbV9hdHRhY2hlZCA9IHRydWU7Ci19Ci0KLXZvaWQgTm9kZUlt
cGw6OndpbGxSZW1vdmUoKQotewotfQotCi12b2lkIE5vZGVJbXBsOjpkZXRhY2goKQotewotICAg
IG1faW5EZXRhY2ggPSB0cnVlOwotLy8gICAgYXNzZXJ0KG1fYXR0YWNoZWQpOwotCi0gICAgaWYg
KG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+ZGVzdHJveSgpOwotICAgIG1fcmVuZGVyID0g
MDsKLQotICAgIERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9j
KQotICAgICAgICBkb2MtPmluY0RPTVRyZWVWZXJzaW9uKCk7Ci0gICAgbV9hdHRhY2hlZCA9IGZh
bHNlOwotICAgIG1faW5EZXRhY2ggPSBmYWxzZTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6bWFpbnRh
aW5zU3RhdGUoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUVN0cmluZyBOb2RlSW1wbDo6
c3RhdGUoKQotewotICAgIHJldHVybiBRU3RyaW5nOjpudWxsOwotfQotCi12b2lkIE5vZGVJbXBs
OjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJi8qc3RhdGVzKi8pCi17Ci19Ci0KLXZvaWQgTm9k
ZUltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBpZiAobV9yZWdkTGlzdGVuZXJz
ICYmICFtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAmJiBnZXREb2N1bWVudCgpKQotICAgICAg
ICBnZXREb2N1bWVudCgpLT51bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3Rl
bmVycyh0aGlzKTsKLQotICAgIHNldEluRG9jdW1lbnQodHJ1ZSk7Ci0gICAgCi0gICAgaW5zZXJ0
ZWRJbnRvVHJlZShmYWxzZSk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnJlbW92ZWRGcm9tRG9jdW1l
bnQoKQotewotICAgIGlmIChtX3JlZ2RMaXN0ZW5lcnMgJiYgIW1fcmVnZExpc3RlbmVycy0+aXNF
bXB0eSgpICYmIGdldERvY3VtZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPnJlZ2lzdGVy
RGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsKLQotICAgIHNldEluRG9j
dW1lbnQoZmFsc2UpOwotICAgIAotICAgIHJlbW92ZWRGcm9tVHJlZShmYWxzZSk7Ci19Ci0KLXZv
aWQgTm9kZUltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRp
c2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTm9kZUltcGw6
OmlzUmVhZE9ubHkoKQotewotICAgIC8vIEVudGl0eSAmIEVudGl0eSBSZWZlcmVuY2Ugbm9kZXMg
YW5kIHRoZWlyIGRlc2NlbmRhbnRzIGFyZSByZWFkLW9ubHkKLSAgICBOb2RlSW1wbCAqbiA9IHRo
aXM7Ci0gICAgd2hpbGUgKG4pIHsKLQlpZiAobi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTlRJVFlf
Tk9ERSB8fAotCSAgICBuLT5ub2RlVHlwZSgpID09IE5vZGU6OkVOVElUWV9SRUZFUkVOQ0VfTk9E
RSkKLQkgICAgcmV0dXJuIHRydWU7Ci0JbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnByZXZpb3VzRWRpdGFibGUo
KSBjb25zdAotewotICAgIE5vZGVJbXBsICpub2RlID0gcHJldmlvdXNMZWFmTm9kZSgpOwotICAg
IHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChub2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpKQot
ICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5wcmV2aW91c0xl
YWZOb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6
Om5leHRFZGl0YWJsZSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBuZXh0TGVhZk5v
ZGUoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAobm9kZS0+aXNDb250ZW50RWRp
dGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICBub2RlID0gbm9kZS0+
bmV4dExlYWZOb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1SZW5kZXJPYmplY3Qg
KiBOb2RlSW1wbDo6cHJldmlvdXNSZW5kZXJlcigpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9
IHByZXZpb3VzU2libGluZygpOyBuOyBuID0gbi0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAg
ICAgaWYgKG4tPnJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZXR1cm4gbi0+cmVuZGVyZXIoKTsK
LSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVJlbmRlck9iamVjdCAqIE5vZGVJbXBsOjpuZXh0
UmVuZGVyZXIoKQotewotICAgIC8vIEF2b2lkIGFuIE8obl4yKSBwcm9ibGVtIHdpdGggdGhpcyBm
dW5jdGlvbiBieSBub3QgY2hlY2tpbmcgZm9yIG5leHRSZW5kZXJlcigpIHdoZW4gdGhlIHBhcmVu
dCBlbGVtZW50IGhhc24ndCBldmVuIAotICAgIC8vIGJlZW4gYXR0YWNoZWQgeWV0LgotICAgIGlm
IChwYXJlbnQoKSAmJiAhcGFyZW50KCktPmF0dGFjaGVkKCkpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9IG5leHRTaWJsaW5nKCk7IG47IG4gPSBuLT5uZXh0U2li
bGluZygpKSB7Ci0gICAgICAgIGlmIChuLT5yZW5kZXJlcigpKQotICAgICAgICAgICAgcmV0dXJu
IG4tPnJlbmRlcmVyKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vLyBGSVhNRTogVGhp
cyBjb2RlIGlzIHVzZWQgYnkgZWRpdGluZy4gIFNlZW1zIGxpa2UgaXQgY291bGQgbW92ZSBvdmVy
IHRoZXJlIGFuZCBub3QgcG9sbHV0ZSBOb2RlSW1wbC4KLU5vZGVJbXBsICpOb2RlSW1wbDo6cHJl
dmlvdXNOb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpIGNvbnN0Ci17Ci0gICAgaWYgKHByZXZp
b3VzU2libGluZygpKSB7Ci0gICAgICAgIE5vZGVJbXBsICpuID0gcHJldmlvdXNTaWJsaW5nKCk7
Ci0gICAgICAgIHdoaWxlICghaXNBdG9taWNOb2RlKG4pICYmIG4tPmxhc3RDaGlsZCgpKQotICAg
ICAgICAgICAgbiA9IG4tPmxhc3RDaGlsZCgpOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0g
ICAgZWxzZSBpZiAocGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnROb2RlKCk7
Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLU5vZGVJ
bXBsICpOb2RlSW1wbDo6bmV4dE5vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCkgY29uc3QKLXsK
LSAgICBpZiAoIWlzQXRvbWljTm9kZSh0aGlzKSAmJiBmaXJzdENoaWxkKCkpCi0JcmV0dXJuIGZp
cnN0Q2hpbGQoKTsKLSAgICBpZiAobmV4dFNpYmxpbmcoKSkKLQlyZXR1cm4gbmV4dFNpYmxpbmco
KTsKLSAgICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgd2hpbGUgKG4gJiYgIW4tPm5l
eHRTaWJsaW5nKCkpCi0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKG4pCi0g
ICAgICAgIHJldHVybiBuLT5uZXh0U2libGluZygpOwotICAgIHJldHVybiAwOwotfQotCi1Ob2Rl
SW1wbCAqTm9kZUltcGw6OnByZXZpb3VzTGVhZk5vZGUoKSBjb25zdAotewotICAgIE5vZGVJbXBs
ICpub2RlID0gcHJldmlvdXNOb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpOwotICAgIHdoaWxl
IChub2RlKSB7Ci0gICAgICAgIGlmIChpc0F0b21pY05vZGUobm9kZSkpCi0gICAgICAgICAgICBy
ZXR1cm4gbm9kZTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPnByZXZpb3VzTm9kZUNvbnNpZGVyaW5n
QXRvbWljTm9kZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2Rl
SW1wbDo6bmV4dExlYWZOb2RlKCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbm9kZSA9IG5leHRO
b2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAg
IGlmIChpc0F0b21pY05vZGUobm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAg
ICAgbm9kZSA9IG5vZGUtPm5leHROb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpOwotICAgIH0K
LSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOb2RlSW1wbDo6Y3JlYXRlUmVuZGVyZXJJZk5lZWRl
ZCgpCi17Ci0KLSAgICBpZiAoIWdldERvY3VtZW50KCktPnNob3VsZENyZWF0ZVJlbmRlcmVycygp
KQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGFzc2VydCghYXR0YWNoZWQoKSk7Ci0g
ICAgYXNzZXJ0KCFtX3JlbmRlcik7Ci0gICAgCi0gICAgTm9kZUltcGwgKnBhcmVudCA9IHBhcmVu
dE5vZGUoKTsgICAgCi0gICAgYXNzZXJ0KHBhcmVudCk7Ci0gICAgICAgIAotICAgIFJlbmRlck9i
amVjdCAqcGFyZW50UmVuZGVyZXIgPSBwYXJlbnQtPnJlbmRlcmVyKCk7Ci0gICAgaWYgKHBhcmVu
dFJlbmRlcmVyICYmIHBhcmVudFJlbmRlcmVyLT5jYW5IYXZlQ2hpbGRyZW4oKQotI2lmIFNWR19T
VVBQT1JUCi0gICAgICAgICYmIHBhcmVudC0+Y2hpbGRTaG91bGRDcmVhdGVSZW5kZXJlcih0aGlz
KQotI2VuZGlmCi0gICAgICAgICkgewotICAgICAgICBSZW5kZXJTdHlsZSAqc3R5bGUgPSBzdHls
ZUZvclJlbmRlcmVyKHBhcmVudFJlbmRlcmVyKTsKLSAgICAgICAgc3R5bGUtPnJlZigpOwotI2lm
bmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgYm9vbCByZXNvbHZlU3R5bGUgPSBmYWxzZTsKLSAg
ICAgICAgaWYgKGdldERvY3VtZW50KCktPmJpbmRpbmdNYW5hZ2VyKCktPmxvYWRCaW5kaW5ncyh0
aGlzLCBzdHlsZS0+YmluZGluZ1VSSXMoKSwgdHJ1ZSwgJnJlc29sdmVTdHlsZSkgJiYgCi0gICAg
ICAgICAgICByZW5kZXJlcklzTmVlZGVkKHN0eWxlKSkgewotICAgICAgICAgICAgaWYgKHJlc29s
dmVTdHlsZSkgewotICAgICAgICAgICAgICAgIHN0eWxlLT5kZXJlZigpOwotICAgICAgICAgICAg
ICAgIHN0eWxlID0gc3R5bGVGb3JSZW5kZXJlcihwYXJlbnRSZW5kZXJlcik7Ci0gICAgICAgICAg
ICB9Ci0jZWxzZQotICAgICAgICBpZiAocmVuZGVyZXJJc05lZWRlZChzdHlsZSkpIHsKLSNlbmRp
ZgotICAgICAgICAgICAgbV9yZW5kZXIgPSBjcmVhdGVSZW5kZXJlcihnZXREb2N1bWVudCgpLT5y
ZW5kZXJBcmVuYSgpLCBzdHlsZSk7Ci0gICAgICAgICAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAg
ICAgICAgICAgICBtX3JlbmRlci0+c2V0U3R5bGUoc3R5bGUpOwotICAgICAgICAgICAgICAgIHBh
cmVudFJlbmRlcmVyLT5hZGRDaGlsZChtX3JlbmRlciwgbmV4dFJlbmRlcmVyKCkpOwotICAgICAg
ICAgICAgfQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgfSAvLyBhdm9pZCBjb25mdXNp
bmcgdGhlIGNoYW5nZSBsb2cgY29kZSBwYXJzZXIgYnkgaGF2aW5nIHR3byBjbG9zZSBicmFjZXMg
dG8gbWF0Y2ggdGhlIHR3byBvcGVuIGJyYWNlcyBhYm92ZQotI2Vsc2UKLSAgICAgICAgfQotI2Vu
ZGlmCi0gICAgICAgIHN0eWxlLT5kZXJlZihnZXREb2N1bWVudCgpLT5yZW5kZXJBcmVuYSgpKTsK
LSAgICB9Ci19Ci0KLVJlbmRlclN0eWxlICpOb2RlSW1wbDo6c3R5bGVGb3JSZW5kZXJlcihSZW5k
ZXJPYmplY3QgKnBhcmVudCkKLXsKLSAgICByZXR1cm4gcGFyZW50LT5zdHlsZSgpOwotfQotCi1i
b29sIE5vZGVJbXBsOjpyZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAg
ICByZXR1cm4gKGdldERvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IHRoaXMpIHx8IChz
dHlsZS0+ZGlzcGxheSgpICE9IE5PTkUpOwotfQotCi1SZW5kZXJPYmplY3QgKk5vZGVJbXBsOjpj
cmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsK
LSAgICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgTm9kZUltcGw6Om1h
eE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8vIEZJWE1FOiBTaG91bGRu
J3QgdGhlc2UgZnVuY3Rpb25zIGJlIGluIHRoZSBlZGl0aW5nIGNvZGU/ICBDb2RlIHRoYXQgYXNr
cyBxdWVzdGlvbnMgYWJvdXQgSFRNTCBpbiB0aGUgY29yZSBET00gY2xhc3MKLS8vIGlzIG9idmlv
dXNseSBtaXNwbGFjZWQuCi1pbnQgTm9kZUltcGw6OmNhcmV0TWluT2Zmc2V0KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPmNhcmV0TWluT2Zmc2V0KCkgOiAw
OwotfQotCi1pbnQgTm9kZUltcGw6OmNhcmV0TWF4T2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPmNhcmV0TWF4T2Zmc2V0KCkgOiAxOwotfQotCi11
bnNpZ25lZCBOb2RlSW1wbDo6Y2FyZXRNYXhSZW5kZXJlZE9mZnNldCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5jYXJldE1heFJlbmRlcmVkT2Zmc2V0KCkg
OiAxOwotfQotCi1pbnQgTm9kZUltcGw6OnByZXZpb3VzT2Zmc2V0IChpbnQgY3VycmVudCkgY29u
c3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPnByZXZpb3VzT2Zmc2V0
KGN1cnJlbnQpIDogY3VycmVudCAtIDE7Ci19Ci0KLWludCBOb2RlSW1wbDo6bmV4dE9mZnNldCAo
aW50IGN1cnJlbnQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigp
LT5uZXh0T2Zmc2V0KGN1cnJlbnQpIDogY3VycmVudCArIDE7Ci19Ci0KLWJvb2wgTm9kZUltcGw6
OmlzQmxvY2tGbG93KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSAmJiByZW5kZXJl
cigpLT5pc0Jsb2NrRmxvdygpOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0Jsb2NrRmxvd09yQmxv
Y2tUYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgJiYgKHJlbmRlcmVyKCkt
PmlzQmxvY2tGbG93KCkgfHwgcmVuZGVyZXIoKS0+aXNUYWJsZSgpICYmICFyZW5kZXJlcigpLT5p
c0lubGluZSgpKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNFZGl0YWJsZUJsb2NrKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gaXNDb250ZW50RWRpdGFibGUoKSAmJiBpc0Jsb2NrRmxvdygpOwotfQot
Ci1FbGVtZW50SW1wbCAqTm9kZUltcGw6OmVuY2xvc2luZ0Jsb2NrRmxvd09yVGFibGVFbGVtZW50
KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhp
cyk7Ci0gICAgaWYgKGlzQmxvY2tGbG93T3JCbG9ja1RhYmxlKCkpCi0gICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAg
IG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmICghbikKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBpZiAobi0+aXNCbG9ja0Zsb3dPckJsb2NrVGFibGUoKSB8fCBuLT5oYXNUYWdO
YW1lKGJvZHlUYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBs
ICo+KG4pOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotRWxlbWVudEltcGwgKk5vZGVJbXBs
OjplbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9
IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0gICAgaWYgKGlzQmxvY2tGbG93KCkpCi0g
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLQotICAgIHdoaWxl
ICgxKSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmICghbikKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAobi0+aXNCbG9ja0Zsb3coKSB8fCBuLT5oYXNU
YWdOYW1lKGJvZHlUYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJ
bXBsICo+KG4pOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotRWxlbWVudEltcGwgKk5vZGVJ
bXBsOjplbmNsb3NpbmdJbmxpbmVFbGVtZW50KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9
IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0gICAgTm9kZUltcGwgKnA7Ci0KLSAgICB3
aGlsZSAoMSkgewotICAgICAgICBwID0gbi0+cGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoIXAg
fHwgcC0+aXNCbG9ja0Zsb3coKSB8fCBwLT5oYXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwotICAgICAgICAvLyBBbHNv
IHN0b3AgaWYgYW55IHByZXZpb3VzIHNpYmxpbmcgaXMgYSBibG9jawotICAgICAgICBmb3IgKE5v
ZGVJbXBsICpzaWJsaW5nID0gbi0+cHJldmlvdXNTaWJsaW5nKCk7IHNpYmxpbmc7IHNpYmxpbmcg
PSBzaWJsaW5nLT5wcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKHNpYmxpbmct
PmlzQmxvY2tGbG93KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1l
bnRJbXBsICo+KG4pOwotICAgICAgICB9Ci0gICAgICAgIG4gPSBwOwotICAgIH0KLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotRWxlbWVudEltcGwgKk5vZGVJ
bXBsOjpyb290RWRpdGFibGVFbGVtZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIWlzQ29udGVudEVk
aXRhYmxlKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgTm9kZUltcGwgKm4gPSBjb25zdF9j
YXN0PE5vZGVJbXBsICo+KHRoaXMpOwotICAgIGlmIChuLT5oYXNUYWdOYW1lKGJvZHlUYWcpKQot
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0KLSAgICBOb2Rl
SW1wbCAqcmVzdWx0ID0gbi0+aXNFZGl0YWJsZUJsb2NrKCkgPyBuIDogMDsKLSAgICB3aGlsZSAo
MSkgewotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoIW4gfHwgIW4t
PmlzQ29udGVudEVkaXRhYmxlKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKG4t
Pmhhc1RhZ05hbWUoYm9keVRhZykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG47Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobi0+aXNCbG9ja0Zsb3coKSkKLSAg
ICAgICAgICAgIHJlc3VsdCA9IG47Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVt
ZW50SW1wbCAqPihyZXN1bHQpOwotfQotCi1ib29sIE5vZGVJbXBsOjppblNhbWVSb290RWRpdGFi
bGVFbGVtZW50KE5vZGVJbXBsICpuKQotewotICAgIHJldHVybiBuID8gcm9vdEVkaXRhYmxlRWxl
bWVudCgpID09IG4tPnJvb3RFZGl0YWJsZUVsZW1lbnQoKSA6IGZhbHNlOwotfQotCi1ib29sIE5v
ZGVJbXBsOjppblNhbWVDb250YWluaW5nQmxvY2tGbG93RWxlbWVudChOb2RlSW1wbCAqbikKLXsK
LSAgICByZXR1cm4gbiA/IGVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKSA9PSBuLT5lbmNsb3Np
bmdCbG9ja0Zsb3dFbGVtZW50KCkgOiBmYWxzZTsKLX0KLQotLy8gRklYTUU6IEVuZCBvZiBvYnZp
b3VzbHkgbWlzcGxhY2VkIEhUTUwgZWRpdGluZyBmdW5jdGlvbnMuICBUcnkgdG8gbW92ZSB0aGVz
ZSBvdXQgb2YgTm9kZUltcGwuCi0KLVJlZlB0cjxOb2RlTGlzdEltcGw+IE5vZGVJbXBsOjpnZXRF
bGVtZW50c0J5VGFnTmFtZU5TKGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBE
T01TdHJpbmcgJmxvY2FsTmFtZSkKLXsKLSAgICBpZiAobmFtZXNwYWNlVVJJLmlzTnVsbCgpIHx8
IGxvY2FsTmFtZS5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuIFJlZlB0cjxOb2RlTGlzdEltcGw+
KCk7IC8vIEZJWE1FOiBXaG8gY2FyZXMgYWJvdXQgdGhpcyBhZGRpdGlvbmFsIGNoZWNrPwotICAg
IAotICAgIERPTVN0cmluZyBuYW1lID0gbG9jYWxOYW1lOwotICAgIGlmIChnZXREb2N1bWVudCgp
LT5pc0hUTUxEb2N1bWVudCgpKQotICAgICAgICBuYW1lID0gbG9jYWxOYW1lLmxvd2VyKCk7Ci0g
ICAgcmV0dXJuIFJlZlB0cjxOb2RlTGlzdEltcGw+KG5ldyBUYWdOb2RlTGlzdEltcGwodGhpcywg
QXRvbWljU3RyaW5nKG5hbWVzcGFjZVVSSSksIEF0b21pY1N0cmluZyhuYW1lKSkpOwotfQotCi1i
b29sIE5vZGVJbXBsOjppc1N1cHBvcnRlZChjb25zdCBET01TdHJpbmcgJmZlYXR1cmUsIGNvbnN0
IERPTVN0cmluZyAmdmVyc2lvbikKLXsKLSAgICByZXR1cm4gRE9NSW1wbGVtZW50YXRpb25JbXBs
OjppbnN0YW5jZSgpLT5oYXNGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pOwotfQotCi1Eb2N1bWVu
dEltcGwgKk5vZGVJbXBsOjpvd25lckRvY3VtZW50KCkgY29uc3QKLXsKLSAgICBEb2N1bWVudElt
cGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgcmV0dXJuIGRvYyA9PSB0aGlzID8gMCA6IGRv
YzsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aGFzQXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1OYW1lZEF0dHJNYXBJbXBsICpOb2RlSW1wbDo6YXR0cmlidXRlcygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzRXF1YWxOb2Rl
KE5vZGVJbXBsICpvdGhlcikgY29uc3QKLXsKLSAgICBpZiAoIW90aGVyKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG5vZGVUeXBlKCkgIT0gb3RoZXItPm5vZGVUeXBlKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobm9kZU5hbWUoKSAhPSBvdGhl
ci0+bm9kZU5hbWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChsb2Nh
bE5hbWUoKSAhPSBvdGhlci0+bG9jYWxOYW1lKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAKLSAgICBpZiAobmFtZXNwYWNlVVJJKCkgIT0gb3RoZXItPm5hbWVzcGFjZVVSSSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKHByZWZpeCgpICE9IG90aGVyLT5wcmVm
aXgoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChub2RlVmFsdWUoKSAh
PSBvdGhlci0+bm9kZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBO
YW1lZEF0dHJNYXBJbXBsICphdHRycyA9IGF0dHJpYnV0ZXMoKTsKLSAgICBOYW1lZEF0dHJNYXBJ
bXBsICpvdGhlckF0dHJzID0gb3RoZXItPmF0dHJpYnV0ZXMoKTsKLSAgICAKLSAgICBpZiAoIWF0
dHJzICYmIG90aGVyQXR0cnMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAo
YXR0cnMgJiYgIWF0dHJzLT5tYXBzRXF1aXZhbGVudChvdGhlckF0dHJzKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIE5vZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAg
ICBOb2RlSW1wbCAqb3RoZXJDaGlsZCA9IG90aGVyLT5maXJzdENoaWxkKCk7Ci0gICAgCi0gICAg
d2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIGlmICghY2hpbGQtPmlzRXF1YWxOb2RlKG90aGVyQ2hp
bGQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgb3RoZXJDaGlsZCA9IG90aGVyQ2hpbGQt
Pm5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChvdGhlckNoaWxkKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgLy8gRklYTUU6IEZvciBEb2N1bWVudFR5cGUgbm9k
ZXMgd2Ugc2hvdWxkIGNoZWNrIGVxdWFsaXR5IG9uCi0gICAgLy8gdGhlIGVudGl0aWVzIGFuZCBu
b3RhdGlvbnMgTmFtZWROb2RlTWFwcyBhcyB3ZWxsLgotICAgIAotICAgIHJldHVybiB0cnVlOwot
fQotCi1ib29sIE5vZGVJbXBsOjppc0RlZmF1bHROYW1lc3BhY2UoY29uc3QgRE9NU3RyaW5nICZu
YW1lc3BhY2VVUkkpIGNvbnN0Ci17Ci0gICAgLy8gSW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvCi0g
ICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMtRE9NLUxldmVsLTMtQ29yZS0yMDA0
MDQwNy9uYW1lc3BhY2VzLWFsZ29yaXRobXMuaHRtbCNpc0RlZmF1bHROYW1lc3BhY2VBbGdvCi0g
ICAgCi0gICAgc3dpdGNoIChub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6RUxFTUVO
VF9OT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50SW1wbCAqZWxlbSA9IHN0YXRpY19j
YXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICBpZiAoZWxlbS0+cHJlZml4KCkuaXNOdWxsKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVs
ZW0tPm5hbWVzcGFjZVVSSSgpID09IG5hbWVzcGFjZVVSSTsKLQotICAgICAgICAgICAgaWYgKGVs
ZW0tPmhhc0F0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgICAgIE5hbWVkQXR0ck1hcEltcGwg
KmF0dHJzID0gZWxlbS0+YXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhdHRycy0+bGVuZ3RoKCk7IGkrKykgewot
ICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsICphdHRyID0gYXR0cnMtPmF0dHJpYnV0
ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAo
YXR0ci0+bG9jYWxOYW1lKCkgPT0gInhtbG5zIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBhdHRyLT52YWx1ZSgpID09IG5hbWVzcGFjZVVSSTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChFbGVtZW50SW1wbCAq
YW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
YW5jZXN0b3ItPmlzRGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2VVUkkpOwotCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9O
T0RFOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxjb25zdCBEb2N1bWVudEltcGwg
Kj4odGhpcyktPmRvY3VtZW50RWxlbWVudCgpLT5pc0RlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNl
VVJJKTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2Rl
OjpOT1RBVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToK
LSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOiB7Ci0gICAg
ICAgICAgICBjb25zdCBBdHRySW1wbCAqYXR0ciA9IHN0YXRpY19jYXN0PGNvbnN0IEF0dHJJbXBs
ICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ci0+b3duZXJFbGVt
ZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHItPm93bmVyRWxlbWVudCgpLT5pc0Rl
ZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBp
ZiAoRWxlbWVudEltcGwgKmFuY2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLT5pc0RlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJ
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQot
RE9NU3RyaW5nIE5vZGVJbXBsOjpsb29rdXBQcmVmaXgoY29uc3QgRE9NU3RyaW5nICZuYW1lc3Bh
Y2VVUkkpIGNvbnN0Ci17Ci0gICAgLy8gSW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8g
aHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMtRE9NLUxldmVsLTMtQ29yZS0yMDA0MDQwNy9u
YW1lc3BhY2VzLWFsZ29yaXRobXMuaHRtbCNsb29rdXBOYW1lc3BhY2VQcmVmaXhBbGdvCi0gICAg
Ci0gICAgaWYgKG5hbWVzcGFjZVVSSS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBET01TdHJp
bmcoKTsKLSAgICAKLSAgICBzd2l0Y2ggKG5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2Rl
OjpFTEVNRU5UX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gbG9va3VwTmFtZXNwYWNlUHJlZml4
KG5hbWVzcGFjZVVSSSwgc3RhdGljX2Nhc3Q8Y29uc3QgRWxlbWVudEltcGwgKj4odGhpcykpOwot
ICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8Y29uc3QgRG9jdW1lbnRJbXBsICo+KHRoaXMpLT5kb2N1bWVudEVsZW1lbnQoKS0+
bG9va3VwUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX05P
REU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2Rl
OjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZ
UEVfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgY2FzZSBO
b2RlOjpBVFRSSUJVVEVfTk9ERTogewotICAgICAgICAgICAgY29uc3QgQXR0ckltcGwgKmF0dHIg
PSBzdGF0aWNfY2FzdDxjb25zdCBBdHRySW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVy
biBhdHRyLT5vd25lckVsZW1lbnQoKS0+bG9va3VwUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgfQotICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKEVsZW1lbnRJbXBsICphbmNlc3RvciA9IGdl
dEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBhbmNlc3Rvci0+bG9v
a3VwUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVy
biBET01TdHJpbmcoKTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBOb2RlSW1wbDo6bG9va3VwTmFt
ZXNwYWNlVVJJKGNvbnN0IERPTVN0cmluZyAmcHJlZml4KSBjb25zdAotewotICAgIC8vIEltcGxl
bWVudGVkIGFjY29yZGluZyB0bwotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVD
LURPTS1MZXZlbC0zLUNvcmUtMjAwNDA0MDcvbmFtZXNwYWNlcy1hbGdvcml0aG1zLmh0bWwjbG9v
a3VwTmFtZXNwYWNlVVJJQWxnbwotICAgIAotICAgIGlmICghcHJlZml4LmlzTnVsbCgpICYmIHBy
ZWZpeC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAKLSAgICBz
d2l0Y2ggKG5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6IHsK
LSAgICAgICAgICAgIGNvbnN0IEVsZW1lbnRJbXBsICplbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
RWxlbWVudEltcGwgKj4odGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghZWxl
bS0+bmFtZXNwYWNlVVJJKCkuaXNOdWxsKCkgJiYgZWxlbS0+cHJlZml4KCkgPT0gcHJlZml4KQot
ICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLT5uYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAg
IAotICAgICAgICAgICAgaWYgKGVsZW0tPmhhc0F0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAg
ICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gZWxlbS0+YXR0cmlidXRlcygpOwotICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhdHRy
cy0+bGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsICph
dHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAg
ICAgICAgICAgICAgICAgICBpZiAoYXR0ci0+cHJlZml4KCkgPT0gInhtbG5zIiAmJiBhdHRyLT5s
b2NhbE5hbWUoKSA9PSBwcmVmaXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0
ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IGlmIChhdHRyLT5sb2NhbE5hbWUoKSA9PSAieG1sbnMiICYmIHByZWZpeC5pc051bGwoKSkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPTVN0cmlu
ZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoRWxlbWVudEltcGwgKmFuY2VzdG9y
ID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9y
LT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
cmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1F
TlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBEb2N1bWVudElt
cGwgKj4odGhpcyktPmRvY3VtZW50RWxlbWVudCgpLT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4
KTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpO
T1RBVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAg
ICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICAgICAgcmV0
dXJuIERPTVN0cmluZygpOwotICAgICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOiB7Ci0g
ICAgICAgICAgICBjb25zdCBBdHRySW1wbCAqYXR0ciA9IHN0YXRpY19jYXN0PGNvbnN0IEF0dHJJ
bXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ci0+b3duZXJF
bGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHItPm93bmVyRWxlbWVudCgpLT5s
b29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAg
ICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgIGlmIChFbGVtZW50SW1wbCAqYW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQo
KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3ItPmxvb2t1cE5hbWVzcGFjZVVSSShw
cmVmaXgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0g
ICAgfQotfQotCi1ET01TdHJpbmcgTm9kZUltcGw6Omxvb2t1cE5hbWVzcGFjZVByZWZpeChjb25z
dCBET01TdHJpbmcgJl9uYW1lc3BhY2VVUkksIGNvbnN0IEVsZW1lbnRJbXBsICpvcmlnaW5hbEVs
ZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKF9uYW1lc3BhY2VVUkkuaXNOdWxsKCkpCi0gICAgICAg
IHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgICAgIAotICAgIGlmIChvcmlnaW5hbEVsZW1l
bnQtPmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgoKSkgPT0gX25hbWVzcGFjZVVSSSkKLSAgICAg
ICAgcmV0dXJuIHByZWZpeCgpOwotICAgIAotICAgIGlmIChoYXNBdHRyaWJ1dGVzKCkpIHsKLSAg
ICAgICAgTmFtZWRBdHRyTWFwSW1wbCAqYXR0cnMgPSBhdHRyaWJ1dGVzKCk7Ci0gICAgICAgIAot
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0cnMtPmxlbmd0aCgpOyBpKyspIHsK
LSAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgKmF0dHIgPSBhdHRycy0+YXR0cmlidXRlSXRlbShp
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGF0dHItPnByZWZpeCgpID09ICJ4bWxu
cyIgJiYKLSAgICAgICAgICAgICAgICBhdHRyLT52YWx1ZSgpID09IF9uYW1lc3BhY2VVUkkgJiYK
LSAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnQtPmxvb2t1cE5hbWVzcGFjZVVSSShhdHRy
LT5sb2NhbE5hbWUoKSkgPT0gX25hbWVzcGFjZVVSSSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
YXR0ci0+bG9jYWxOYW1lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKEVsZW1l
bnRJbXBsICphbmNlc3RvciA9IGdldEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAgICByZXR1cm4g
YW5jZXN0b3ItPmxvb2t1cE5hbWVzcGFjZVByZWZpeChfbmFtZXNwYWNlVVJJLCBvcmlnaW5hbEVs
ZW1lbnQpOwotICAgIAotICAgIHJldHVybiBET01TdHJpbmcoKTsKLX0KLQotRE9NU3RyaW5nIE5v
ZGVJbXBsOjp0ZXh0Q29udGVudCgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChub2RlVHlwZSgpKSB7
Ci0gICAgICAgIGNhc2UgTm9kZTo6VEVYVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNEQVRB
X1NFQ1RJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6Ci0gICAgICAg
IGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAgcmV0
dXJuIG5vZGVWYWx1ZSgpOwotICAgICAgICAKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05P
REU6Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6Ci0gICAgICAgIGNhc2UgTm9k
ZTo6RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX1JFRkVSRU5DRV9OT0RF
OgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IHsKLSAgICAgICAg
ICAgIERPTVN0cmluZyBzID0gIiI7Ci0gICAgICAgIAotICAgICAgICAgICAgZm9yIChOb2RlSW1w
bCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OkNP
TU1FTlRfTk9ERSB8fCAKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQtPm5vZGVUeXBlKCkgPT0g
Tm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHMgKz0gY2hpbGQtPnRleHRD
b250ZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHM7
Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERToK
LSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgIGNhc2UgTm9k
ZTo6Tk9UQVRJT05fTk9ERToKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBE
T01TdHJpbmcoKTsgICAgICAgICAgICAKLSAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldFRl
eHRDb250ZW50KGNvbnN0IERPTVN0cmluZyAmdGV4dCwgaW50ICZleGNlcHRpb24pCi17ICAgICAg
ICAgICAKLSAgICBzd2l0Y2ggKG5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpURVhU
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBj
YXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lO
U1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICBzZXROb2RlVmFsdWUodGV4dCwgZXhjZXB0aW9u
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERToK
LSAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpF
TlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0g
ICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERTogewotICAgICAgICAgICAg
Q29udGFpbmVyTm9kZUltcGwgKmNvbnRhaW5lciA9IHN0YXRpY19jYXN0PENvbnRhaW5lck5vZGVJ
bXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250YWluZXItPnJlbW92
ZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghdGV4dC5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGQoZ2V0RG9jdW1lbnQoKS0+Y3JlYXRlVGV4
dE5vZGUodGV4dCksIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9D
VU1FTlRfVFlQRV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAg
ICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgICAgICAgICBicmVh
azsKLSAgICB9Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2RlSW1wbDo6Z2V0QW5jZXN0b3JFbGVtZW50
KCkgY29uc3QKLXsKLSAgICAvLyBJbiB0aGVvcnksIHRoZXJlIGNhbiBiZSBFbnRpdHlSZWZlcmVu
Y2Ugbm9kZXMgYmV0d2VlbiBlbGVtZW50cwotICAgIC8vIGJ1dCB0aGlzIGlzIGN1cnJlbnRseSBu
b3Qgc3VwcG9ydGVkLgotICAgIGZvciAoTm9kZUltcGwgKm4gPSBwYXJlbnROb2RlKCk7IG47IG4g
PSBuLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSkKLSAg
ICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLSAgICB9Ci0g
ICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi0KLXN0YXRpYyB2b2lkIGFw
cGVuZEF0dHJpYnV0ZURlc2MoY29uc3QgTm9kZUltcGwgKm5vZGUsIERPTVN0cmluZyAmc3RyaW5n
LCBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBRU3RyaW5nIGF0dHJEZXNjKQotewotICAgIGlm
IChub2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKLSAgICAgICAgRE9NU3RyaW5nIGF0dHIgPSBzdGF0
aWNfY2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPihub2RlKS0+Z2V0QXR0cmlidXRlKG5hbWUpOwot
ICAgICAgICBpZiAoIWF0dHIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJpbmcgKz0gYXR0
ckRlc2M7Ci0gICAgICAgICAgICBzdHJpbmcgKz0gYXR0cjsKLSAgICAgICAgfQotICAgIH0KLX0K
LQotdm9pZCBOb2RlSW1wbDo6c2hvd05vZGUoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdAotewot
ICAgIGlmICghcHJlZml4KQotICAgICAgICBwcmVmaXggPSAiIjsKLSAgICBpZiAoaXNUZXh0Tm9k
ZSgpKSB7Ci0gICAgICAgIFFTdHJpbmcgdmFsdWUgPSBub2RlVmFsdWUoKS5xc3RyaW5nKCk7Ci0g
ICAgICAgIHZhbHVlLnJlcGxhY2UoJ1xcJywgIlxcXFwiKTsKLSAgICAgICAgdmFsdWUucmVwbGFj
ZSgnXG4nLCAiXFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMlc1x0JXAgXCIlc1wi
XG4iLCBwcmVmaXgsIG5vZGVOYW1lKCkucXN0cmluZygpLnV0ZjgoKS5kYXRhKCksIHRoaXMsIHZh
bHVlLnV0ZjgoKS5kYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERPTVN0cmluZyBhdHRy
cyA9ICIiOwotICAgICAgICBhcHBlbmRBdHRyaWJ1dGVEZXNjKHRoaXMsIGF0dHJzLCBjbGFzc0F0
dHIsICIgQ0xBU1M9Iik7Ci0gICAgICAgIGFwcGVuZEF0dHJpYnV0ZURlc2ModGhpcywgYXR0cnMs
IHN0eWxlQXR0ciwgIiBTVFlMRT0iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVzXHQl
cCVzXG4iLCBwcmVmaXgsIG5vZGVOYW1lKCkucXN0cmluZygpLnV0ZjgoKS5kYXRhKCksIHRoaXMs
IGF0dHJzLnFzdHJpbmcoKS5hc2NpaSgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNo
b3dUcmVlKCkgY29uc3QKLXsKLSAgICBzaG93VHJlZUFuZE1hcmsoKE5vZGVJbXBsICopdGhpcywg
IioiLCBOVUxMLCBOVUxMKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2hvd1RyZWVBbmRNYXJrKE5v
ZGVJbXBsICogbWFya2VkTm9kZTEsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJlbDEsIE5vZGVJbXBs
ICogbWFya2VkTm9kZTIsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJlbDIpIGNvbnN0Ci17Ci0gICAg
Tm9kZUltcGwgKnJvb3ROb2RlOwotICAgIE5vZGVJbXBsICpub2RlID0gKE5vZGVJbXBsICopdGhp
czsKLSAgICB3aGlsZSAobm9kZS0+cGFyZW50Tm9kZSgpICYmICFub2RlLT5oYXNUYWdOYW1lKGJv
ZHlUYWcpKQotICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOwotICAgIHJvb3ROb2Rl
ID0gbm9kZTsKLQkKLSAgICBmb3IgKG5vZGUgPSByb290Tm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUt
PnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICBOb2RlSW1wbCAqdG1wTm9kZTsKLQkJCi0g
ICAgICAgIGlmIChub2RlID09IG1hcmtlZE5vZGUxKQotICAgICAgICAgICAgZnByaW50ZihzdGRl
cnIsICIlcyIsIG1hcmtlZExhYmVsMSk7Ci0gICAgICAgIGlmIChub2RlID09IG1hcmtlZE5vZGUy
KQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1hcmtlZExhYmVsMik7Ci0JCQkK
LSAgICAgICAgZm9yICh0bXBOb2RlID0gbm9kZTsgdG1wTm9kZSAmJiB0bXBOb2RlICE9IHJvb3RO
b2RlOyB0bXBOb2RlID0gdG1wTm9kZS0+cGFyZW50Tm9kZSgpKQotICAgICAgICAgICAgZnByaW50
ZihzdGRlcnIsICJcdCIpOwotICAgICAgICBub2RlLT5zaG93Tm9kZSgwKTsKLSAgICB9Ci19Ci0K
LXZvaWQgTm9kZUltcGw6OmZvcm1hdEZvckRlYnVnZ2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQg
bGVuZ3RoKSBjb25zdAotewotICAgIERPTVN0cmluZyByZXN1bHQ7Ci0gICAgRE9NU3RyaW5nIHM7
Ci0gICAgCi0gICAgcyA9IG5vZGVOYW1lKCk7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkKLSAg
ICAgICAgcmVzdWx0ICs9ICI8bm9uZT4iOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ICs9IHM7
Ci0gICAgICAgICAgCi0gICAgc3RybmNweShidWZmZXIsIHJlc3VsdC5xc3RyaW5nKCkubGF0aW4x
KCksIGxlbmd0aCAtIDEpOwotfQotCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNv
bnRhaW5lck5vZGVJbXBsOjpDb250YWluZXJOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAg
ICA6IE5vZGVJbXBsKGRvYykKLXsKLSAgICBfZmlyc3QgPSBfbGFzdCA9IDA7Ci19Ci0KLXZvaWQg
Q29udGFpbmVyTm9kZUltcGw6OnJlbW92ZUFsbENoaWxkcmVuKCkKLXsKLSAgICAvL2tkRGVidWco
IDYwMjAgKSA8PCAiQ29udGFpbmVyTm9kZUltcGwgZGVzdHJ1Y3RvciIgPDwgZW5kbDsKLQotICAg
IC8vIEF2b2lkIGRlZXAgcmVjdXJzaW9uIHdoZW4gZGVzdHJveWluZyB0aGUgbm9kZSB0cmVlLgot
ICAgIHN0YXRpYyBib29sIGFscmVhZHlJbnNpZGVEZXN0cnVjdG9yOyAKLSAgICBib29sIHRvcExl
dmVsID0gIWFscmVhZHlJbnNpZGVEZXN0cnVjdG9yOwotICAgIGlmICh0b3BMZXZlbCkKLSAgICAg
ICAgYWxyZWFkeUluc2lkZURlc3RydWN0b3IgPSB0cnVlOwotICAgIAotICAgIC8vIExpc3Qgb2Yg
bm9kZXMgdG8gYmUgZGVsZXRlZC4KLSAgICBzdGF0aWMgTm9kZUltcGwgKmhlYWQ7Ci0gICAgc3Rh
dGljIE5vZGVJbXBsICp0YWlsOwotICAgIAotICAgIC8vIFdlIGhhdmUgdG8gdGVsbCBhbGwgY2hp
bGRyZW4gdGhhdCB0aGVpciBwYXJlbnQgaGFzIGRpZWQuCi0gICAgTm9kZUltcGwgKm47Ci0gICAg
Tm9kZUltcGwgKm5leHQ7Ci0KLSAgICBmb3IoIG4gPSBfZmlyc3Q7IG4gIT0gMDsgbiA9IG5leHQg
KSB7Ci0gICAgICAgIG5leHQgPSBuLT5uZXh0U2libGluZygpOwotICAgICAgICBuLT5zZXRQcmV2
aW91c1NpYmxpbmcoMCk7Ci0gICAgICAgIG4tPnNldE5leHRTaWJsaW5nKDApOwotICAgICAgICBu
LT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIAotCWlmICggIW4tPnJlZkNvdW50KCkgKSB7Ci0gICAg
ICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gYmUgZGVsZXRl
ZC4KLSAgICAgICAgICAgIC8vIFJldXNlIHRoZSBuZXh0U2libGluZyBwb2ludGVyIGZvciB0aGlz
IHB1cnBvc2UuCi0gICAgICAgICAgICBpZiAodGFpbCkKLSAgICAgICAgICAgICAgICB0YWlsLT5z
ZXROZXh0U2libGluZyhuKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBoZWFk
ID0gbjsKLSAgICAgICAgICAgIHRhaWwgPSBuOwotICAgICAgICB9IGVsc2UgaWYgKG4tPmluRG9j
dW1lbnQoKSkKLSAgICAgICAgICAgIG4tPnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLSAgICB9Ci0g
ICAgCi0gICAgLy8gT25seSBmb3IgdGhlIHRvcCBsZXZlbCBjYWxsLCBkbyB0aGUgYWN0dWFsIGRl
bGV0aW5nLgotICAgIGlmICh0b3BMZXZlbCkgewotICAgICAgICB3aGlsZSAoKG4gPSBoZWFkKSAh
PSAwKSB7Ci0gICAgICAgICAgICBuZXh0ID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAg
IG4tPnNldE5leHRTaWJsaW5nKDApOwotCi0gICAgICAgICAgICBoZWFkID0gbmV4dDsKLSAgICAg
ICAgICAgIGlmIChuZXh0ID09IDApCi0gICAgICAgICAgICAgICAgdGFpbCA9IDA7Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIGRlbGV0ZSBuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAg
ICBhbHJlYWR5SW5zaWRlRGVzdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICBfZmlyc3QgPSAwOwot
ICAgICAgICBfbGFzdCA9IDA7Ci0gICAgfQotfQotCi1Db250YWluZXJOb2RlSW1wbDo6fkNvbnRh
aW5lck5vZGVJbXBsKCkKLXsKLSAgICByZW1vdmVBbGxDaGlsZHJlbigpOwotfQotCi0KLU5vZGVJ
bXBsICpDb250YWluZXJOb2RlSW1wbDo6Zmlyc3RDaGlsZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IF9maXJzdDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpsYXN0Q2hpbGQoKSBj
b25zdAotewotICAgIHJldHVybiBfbGFzdDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJ
bXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBleGNlcHRpb25jb2RlID0gMDsKLQotICAg
IC8vIGluc2VydEJlZm9yZSguLi4sbnVsbCkgaXMgZXF1aXZhbGVudCB0byBhcHBlbmRDaGlsZCgp
Ci0gICAgaWYoIXJlZkNoaWxkKQotICAgICAgICByZXR1cm4gYXBwZW5kQ2hpbGQobmV3Q2hpbGQs
IGV4Y2VwdGlvbmNvZGUpOwotCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0TmV3Q2hpbGQo
bmV3Q2hpbGQpOyAvLyBtYWtlIHN1cmUgdGhlIG5ldyBjaGlsZCBpcyByZWYnZCBhbmQgZGVyZWYn
ZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICAvLyBNYWtlIHN1cmUgYWRkaW5nIHRoZSBuZXcg
Y2hpbGQgaXMgb2sKLSAgICBjaGVja0FkZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsK
LSAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBOT1Rf
Rk9VTkRfRVJSOiBSYWlzZWQgaWYgcmVmQ2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2Rl
Ci0gICAgaWYgKHJlZkNoaWxkLT5wYXJlbnROb2RlKCkgIT0gdGhpcykgewotICAgICAgICBleGNl
cHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0KLSAgICBib29sIGlzRnJhZ21lbnQgPSBuZXdDaGlsZC0+bm9kZVR5cGUoKSA9
PSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwotCi0gICAgLy8gSWYgbmV3Q2hpbGQgaXMg
YSBEb2N1bWVudEZyYWdtZW50IHdpdGggbm8gY2hpbGRyZW4uLi4uIHRoZXJlJ3Mgbm90aGluZyB0
byBkby4KLSAgICAvLyBKdXN0IHJldHVybiB0aGUgZG9jdW1lbnQgZnJhZ21lbnQKLSAgICBpZiAo
aXNGcmFnbWVudCAmJiAhbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIChu
ZXdDaGlsZC0+aGFzT25lUmVmKCkgJiYgIW5ld0NoaWxkLT5wYXJlbnQoKSkgPyAwIDogbmV3Q2hp
bGQ7Ci0KLSAgICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRoZSBjaGlsZChyZW4pCi0gICAgTm9kZUlt
cGwgKm5leHRDaGlsZDsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBpc0ZyYWdtZW50ID8gbmV3Q2hp
bGQtPmZpcnN0Q2hpbGQoKSA6IG5ld0NoaWxkOwotCi0gICAgTm9kZUltcGwgKnByZXYgPSByZWZD
aGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYgKCBwcmV2ID09IG5ld0NoaWxkIHx8IHJl
ZkNoaWxkID09IG5ld0NoaWxkICkgLy8gbm90aGluZyB0byBkbwotCXJldHVybiBuZXdDaGlsZDsK
LSAgICAKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgICAgbmV4dENoaWxkID0gaXNGcmFnbWVu
dCA/IGNoaWxkLT5uZXh0U2libGluZygpIDogMDsKLQotICAgICAgICAvLyBJZiBjaGlsZCBpcyBh
bHJlYWR5IHByZXNlbnQgaW4gdGhlIHRyZWUsIGZpcnN0IHJlbW92ZSBpdAotICAgICAgICBOb2Rl
SW1wbCAqbmV3UGFyZW50ID0gY2hpbGQtPnBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKG5ld1Bh
cmVudCkKLSAgICAgICAgICAgIG5ld1BhcmVudC0+cmVtb3ZlQ2hpbGQoIGNoaWxkLCBleGNlcHRp
b25jb2RlICk7Ci0gICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxkIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uCi0gICAg
ICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLSAgICAgICAgaWYgKHByZXYpCi0gICAgICAgICAg
ICBwcmV2LT5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IF9maXJzdCA9IGNoaWxkOwotICAgICAgICByZWZDaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKGNo
aWxkKTsKLSAgICAgICAgY2hpbGQtPnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgY2hpbGQtPnNl
dFByZXZpb3VzU2libGluZyhwcmV2KTsKLSAgICAgICAgY2hpbGQtPnNldE5leHRTaWJsaW5nKHJl
ZkNoaWxkKTsKLSAgICAgICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICAgICAgLy8gQWRk
IGNoaWxkIHRvIHRoZSByZW5kZXJpbmcgdHJlZQotICAgICAgICAvLyAjIyMgc2hvdWxkIHdlIGRl
dGFjaCgpIGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFkeSBhdHRhY2hlZD8KLSAgICAgICAgaWYgKGF0
dGFjaGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICAgICAgY2hpbGQtPmF0dGFj
aCgpOwotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIG11dGF0aW9uIGV2ZW50cwot
ICAgICAgICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoY2hpbGQsZXhjZXB0aW9uY29kZSk7
Ci0KLSAgICAgICAgcHJldiA9IGNoaWxkOwotICAgICAgICBjaGlsZCA9IG5leHRDaGlsZDsKLSAg
ICB9Ci0KLSAgICBnZXREb2N1bWVudCgpLT5zZXREb2N1bWVudENoYW5nZWQodHJ1ZSk7Ci0gICAg
ZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwotICAgIHJldHVybiBuZXdDaGlsZDsKLX0K
LQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAq
bmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAg
ICBleGNlcHRpb25jb2RlID0gMDsKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVjdE5ld0No
aWxkKG5ld0NoaWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVmJ2QgYW5kIGRl
cmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYgKCBvbGRDaGlsZCA9PSBuZXdDaGls
ZCApIC8vIG5vdGhpbmcgdG8gZG8KLQlyZXR1cm4gb2xkQ2hpbGQ7Ci0gICAgCi0gICAgLy8gTWFr
ZSBzdXJlIGFkZGluZyB0aGUgbmV3IGNoaWxkIGlzIG9rCi0gICAgY2hlY2tBZGRDaGlsZChuZXdD
aGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgLy8gTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIG9sZENoaWxkIGlzIG5v
dCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLSAgICBpZiAoIW9sZENoaWxkIHx8IG9sZENoaWxkLT5w
YXJlbnROb2RlKCkgIT0gdGhpcykgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0
aW9uOjpOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29s
IGlzRnJhZ21lbnQgPSBuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpET0NVTUVOVF9GUkFH
TUVOVF9OT0RFOwotICAgIE5vZGVJbXBsICpuZXh0Q2hpbGQ7Ci0gICAgTm9kZUltcGwgKmNoaWxk
ID0gaXNGcmFnbWVudCA/IG5ld0NoaWxkLT5maXJzdENoaWxkKCkgOiBuZXdDaGlsZDsKLQotICAg
IC8vIFJlbW92ZSB0aGUgb2xkIGNoaWxkCi0gICAgTm9kZUltcGwgKnByZXYgPSBvbGRDaGlsZC0+
cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgTm9kZUltcGwgKm5leHQgPSBvbGRDaGlsZC0+bmV4dFNp
YmxpbmcoKTsKLQotICAgIHJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAg
ICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJZiB0aGUg
bmV3IGNoaWxkIHdhcyByaWdodCBiZWZvcmUgb3IgcmlnaHQgYWZ0ZXIgdGhlIG9sZCBjaGlsZCwg
bm90aGluZyBlbHNlIG5lZWRzIHRvIGNoYW5nZQotICAgIGlmIChwcmV2ID09IGNoaWxkIHx8IG5l
eHQgPT0gY2hpbGQpCi0gICAgICAgIGNoaWxkID0gMDsKLSAgICAvLyBBZGQgdGhlIG5ldyBjaGls
ZChyZW4pCi0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIG5leHRDaGlsZCA9IGlzRnJhZ21l
bnQgPyBjaGlsZC0+bmV4dFNpYmxpbmcoKSA6IDA7Ci0KLSAgICAgICAgLy8gSWYgY2hpbGQgaXMg
YWxyZWFkeSBwcmVzZW50IGluIHRoZSB0cmVlLCBmaXJzdCByZW1vdmUgaXQKLSAgICAgICAgTm9k
ZUltcGwgKm5ld1BhcmVudCA9IGNoaWxkLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChuZXdQ
YXJlbnQpCi0gICAgICAgICAgICBuZXdQYXJlbnQtPnJlbW92ZUNoaWxkKCBjaGlsZCwgZXhjZXB0
aW9uY29kZSApOwotICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgICAgIHJldHVy
biAwOwotCi0gICAgICAgIC8vIEFkZCBjaGlsZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbgotICAg
ICAgICBmb3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAgICAgIGlmIChwcmV2KSBwcmV2LT5zZXRO
ZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICAgIGlmIChuZXh0KSBuZXh0LT5zZXRQcmV2aW91c1Np
YmxpbmcoY2hpbGQpOwotICAgICAgICBpZighcHJldikgX2ZpcnN0ID0gY2hpbGQ7Ci0gICAgICAg
IGlmKCFuZXh0KSBfbGFzdCA9IGNoaWxkOwotICAgICAgICBjaGlsZC0+c2V0UGFyZW50KHRoaXMp
OwotICAgICAgICBjaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotICAgICAgICBjaGls
ZC0+c2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0gICAgICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwot
Ci0gICAgICAgIC8vIEFkZCBjaGlsZCB0byB0aGUgcmVuZGVyaW5nIHRyZWUKLSAgICAgICAgLy8g
IyMjIHNob3VsZCB3ZSBkZXRhY2goKSBpdCBmaXJzdCBpZiBpdCdzIGFscmVhZHkgYXR0YWNoZWQ/
Ci0gICAgICAgIGlmIChhdHRhY2hlZCgpICYmICFjaGlsZC0+YXR0YWNoZWQoKSkKLSAgICAgICAg
ICAgIGNoaWxkLT5hdHRhY2goKTsKLQotICAgICAgICAvLyBEaXNwYXRjaCB0aGUgbXV0YXRpb24g
ZXZlbnRzCi0gICAgICAgIGRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyhjaGlsZCxleGNlcHRp
b25jb2RlKTsKLQotICAgICAgICBwcmV2ID0gY2hpbGQ7Ci0gICAgICAgIGNoaWxkID0gbmV4dENo
aWxkOwotICAgIH0KLQotICAgIC8vICMjIyBzZXQgc3R5bGUgaW4gY2FzZSBpdCdzIGF0dGFjaGVk
Ci0gICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwotICAgIGRpc3Bh
dGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoKTsKLSAgICByZXR1cm4gb2xkQ2hpbGQ7Ci19Ci0KLXZv
aWQgQ29udGFpbmVyTm9kZUltcGw6OndpbGxSZW1vdmUoKQotewotICAgIGZvciAoTm9kZUltcGwg
Km4gPSBfZmlyc3Q7IG4gIT0gMDsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgbi0+
d2lsbFJlbW92ZSgpOwotICAgIH0KLX0KLQotaW50IENvbnRhaW5lck5vZGVJbXBsOjp3aWxsUmVt
b3ZlQ2hpbGQoTm9kZUltcGwgKmNoaWxkKQotewotICAgIGludCBleGNlcHRpb25Db2RlID0gMDsK
LQotICAgIC8vIGZpcmUgcmVtb3ZlZCBmcm9tIGRvY3VtZW50IG11dGF0aW9uIGV2ZW50cy4KLSAg
ICBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2ZW50cyhjaGlsZCwgZXhjZXB0aW9uQ29kZSk7Ci0gICAg
aWYgKGV4Y2VwdGlvbkNvZGUpCi0gICAgICAgIHJldHVybiBleGNlcHRpb25Db2RlOwotCi0gICAg
aWYgKGNoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICBjaGlsZC0+d2lsbFJlbW92ZSgpOwotICAg
IAotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OnJlbW92
ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJS
OiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgIGlmIChpc1JlYWRPbmx5KCkp
IHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9O
X0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOT1RfRk9V
TkRfRVJSOiBSYWlzZWQgaWYgb2xkQ2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLgot
ICAgIGlmICghb2xkQ2hpbGQgfHwgb2xkQ2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0g
ICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvLyB1cGRhdGUgYXV4aWxpYXJ5IGRvYyBp
bmZvIChlLmcuIGl0ZXJhdG9ycykgdG8gbm90ZSB0aGF0IG5vZGUgaXMgYmVpbmcgcmVtb3ZlZAot
ICAgIC8vIEZJWDogVGhpcyBsb29rcyByZWR1bmRhbnQgd2l0aCBzYW1lIGNhbGwgZnJvbSBkaXNw
YXRjaENoaWxkUmVtb3ZhbEV2ZW50cyBpbiB3aWxsUmVtb3ZlQ2hpbGQKLS8vICBnZXREb2N1bWVu
dCgpLT5ub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChvbGRDaGlsZCk7IC8vICMjIyB1c2UgZXZlbnRz
IGluc3RlYWQKLQotICAgIC8vIGRpc3BhdGNoIHByZS1yZW1vdmFsIG11dGF0aW9uIGV2ZW50cwot
ICAgIGlmIChnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJbXBsOjpET01O
T0RFUkVNT1ZFRF9MSVNURU5FUikpIHsKLQlvbGRDaGlsZC0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0
YXRpb25FdmVudEltcGwoRE9NTm9kZVJlbW92ZWRFdmVudCwKLQkJCSAgICAgdHJ1ZSxmYWxzZSx0
aGlzLERPTVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlvbmNvZGUs
dHJ1ZSk7Ci0JaWYgKGV4Y2VwdGlvbmNvZGUpCi0JICAgIHJldHVybiAwOwotICAgIH0KLQotICAg
IGV4Y2VwdGlvbmNvZGUgPSB3aWxsUmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotICAgIGlmIChleGNl
cHRpb25jb2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2go
KTsKLQotICAgIC8vIFJlbW92ZSBmcm9tIHJlbmRlcmluZyB0cmVlCi0gICAgaWYgKG9sZENoaWxk
LT5hdHRhY2hlZCgpKQotICAgICAgICBvbGRDaGlsZC0+ZGV0YWNoKCk7Ci0KLSAgICAvLyBSZW1v
dmUgdGhlIGNoaWxkCi0gICAgTm9kZUltcGwgKnByZXYsICpuZXh0OwotICAgIHByZXYgPSBvbGRD
aGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGlu
ZygpOwotCi0gICAgaWYobmV4dCkgbmV4dC0+c2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotICAg
IGlmKHByZXYpIHByZXYtPnNldE5leHRTaWJsaW5nKG5leHQpOwotICAgIGlmKF9maXJzdCA9PSBv
bGRDaGlsZCkgX2ZpcnN0ID0gbmV4dDsKLSAgICBpZihfbGFzdCA9PSBvbGRDaGlsZCkgX2xhc3Qg
PSBwcmV2OwotCi0gICAgb2xkQ2hpbGQtPnNldFByZXZpb3VzU2libGluZygwKTsKLSAgICBvbGRD
aGlsZC0+c2V0TmV4dFNpYmxpbmcoMCk7Ci0gICAgb2xkQ2hpbGQtPnNldFBhcmVudCgwKTsKLQot
ICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1l
bnRDaGFuZ2VkKHRydWUpOwotCi0gICAgLy8gRGlzcGF0Y2ggcG9zdC1yZW1vdmFsIG11dGF0aW9u
IGV2ZW50cwotICAgIGRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoKTsKLQotICAgIGlmIChv
bGRDaGlsZC0+aW5Eb2N1bWVudCgpKQotICAgICAgICBvbGRDaGlsZC0+cmVtb3ZlZEZyb21Eb2N1
bWVudCgpOwotICAgIGVsc2UKLSAgICAgICAgb2xkQ2hpbGQtPnJlbW92ZWRGcm9tVHJlZSh0cnVl
KTsKLQotICAgIHJldHVybiBvbGRDaGlsZDsKLX0KLQotLy8gdGhpcyBkaWZmZXJzIGZyb20gb3Ro
ZXIgcmVtb3ZlIGZ1bmN0aW9ucyBiZWNhdXNlIGl0IGZvcmNpYmx5IHJlbW92ZXMgYWxsIHRoZSBj
aGlsZHJlbiwKLS8vIHJlZ2FyZGxlc3Mgb2YgcmVhZC1vbmx5IHN0YXR1cyBvciBldmVudCBleGNl
cHRpb25zLCBlLmcuCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpyZW1vdmVDaGlsZHJlbigpCi17
Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgCi0gICAgaWYgKCFfZmlyc3QpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIC8vIGRvIGFueSBwcmVwIHdvcmsgbmVlZGVkIGJlZm9yZSBhY3R1YWxseSBzdGFy
dGluZyB0byBkZXRhY2gKLSAgICAvLyBhbmQgcmVtb3ZlLi4uIGUuZy4gc3RvcCBsb2FkaW5nIGZy
YW1lcywgZmlyZSB1bmxvYWQgZXZlbnRzCi0gICAgZm9yIChuID0gX2ZpcnN0OyBuICE9IDA7IG4g
PSBuLT5uZXh0U2libGluZygpKQotICAgICAgICB3aWxsUmVtb3ZlQ2hpbGQobik7Ci0gICAgCi0g
ICAgZm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgIHdoaWxlICgobiA9IF9maXJzdCkgIT0gMCkg
ewotICAgICAgICBOb2RlSW1wbCAqbmV4dCA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIAot
ICAgICAgICBuLT5yZWYoKTsKLQotICAgICAgICBpZiAobi0+YXR0YWNoZWQoKSkKLSAgICAgICAg
ICAgIG4tPmRldGFjaCgpOwotICAgICAgICBuLT5zZXRQcmV2aW91c1NpYmxpbmcoMCk7Ci0gICAg
ICAgIG4tPnNldE5leHRTaWJsaW5nKDApOwotICAgICAgICBuLT5zZXRQYXJlbnQoMCk7Ci0gICAg
ICAgIAotICAgICAgICBpZiAobi0+aW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgbi0+cmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotCi0gICAgICAgIG4tPmRlcmVmKCk7Ci0KLSAgICAgICAgX2ZpcnN0
ID0gbmV4dDsKLSAgICB9Ci0gICAgX2xhc3QgPSAwOwotICAgIGFsbG93RXZlbnREaXNwYXRjaCgp
OwotICAgIAotICAgIC8vIERpc3BhdGNoIGEgc2luZ2xlIHBvc3QtcmVtb3ZhbCBtdXRhdGlvbiBl
dmVudCBkZW5vdGluZyBhIG1vZGlmaWVkIHN1YnRyZWUuCi0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9k
aWZpZWRFdmVudCgpOwotfQotCi0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6YXBwZW5k
Q2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAg
ZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3ROZXdDaGls
ZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidkIGFuZCBkZXJl
ZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLQotICAgIC8vIE1ha2Ugc3VyZSBhZGRpbmcgdGhlIG5l
dyBjaGlsZCBpcyBvawotICAgIGNoZWNrQWRkQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUp
OwotICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBp
ZiAoIG5ld0NoaWxkID09IF9sYXN0ICkgLy8gbm90aGluZyB0byBkbwotCXJldHVybiBuZXdDaGls
ZDsKLQotICAgIGJvb2wgaXNGcmFnbWVudCA9IG5ld0NoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6
OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU7Ci0KLSAgICAvLyBJZiBuZXdDaGlsZCBpcyBhIERvY3Vt
ZW50RnJhZ21lbnQgd2l0aCBubyBjaGlsZHJlbi4uLi4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgot
ICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBkb2N1bWVudCBmcmFnbWVudAotICAgIGlmIChpc0ZyYWdt
ZW50ICYmICFuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV3Q2hpbGQ7
Ci0KLSAgICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRoZSBjaGlsZChyZW4pCi0gICAgTm9kZUltcGwg
Km5leHRDaGlsZDsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBpc0ZyYWdtZW50ID8gbmV3Q2hpbGQt
PmZpcnN0Q2hpbGQoKSA6IG5ld0NoaWxkOwotCi0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAg
IG5leHRDaGlsZCA9IGlzRnJhZ21lbnQgPyBjaGlsZC0+bmV4dFNpYmxpbmcoKSA6IDA7Ci0KLSAg
ICAgICAgLy8gSWYgY2hpbGQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSB0cmVlLCBmaXJzdCBy
ZW1vdmUgaXQKLSAgICAgICAgTm9kZUltcGwgKm9sZFBhcmVudCA9IGNoaWxkLT5wYXJlbnROb2Rl
KCk7Ci0gICAgICAgIGlmKG9sZFBhcmVudCkgewotICAgICAgICAgICAgb2xkUGFyZW50LT5yZW1v
dmVDaGlsZCggY2hpbGQsIGV4Y2VwdGlvbmNvZGUgKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRp
b25jb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gQXBwZW5kIGNoaWxkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLSAgICAgICAgZm9yYmlkRXZl
bnREaXNwYXRjaCgpOwotICAgICAgICBjaGlsZC0+c2V0UGFyZW50KHRoaXMpOwotICAgICAgICBp
ZiAoX2xhc3QpIHsKLSAgICAgICAgICAgIGNoaWxkLT5zZXRQcmV2aW91c1NpYmxpbmcoX2xhc3Qp
OwotICAgICAgICAgICAgX2xhc3QtPnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgICAgICAg
IF9sYXN0ID0gY2hpbGQ7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgX2ZpcnN0ID0gX2xh
c3QgPSBjaGlsZDsKLSAgICAgICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICAgICAgLy8g
QWRkIGNoaWxkIHRvIHRoZSByZW5kZXJpbmcgdHJlZQotICAgICAgICAvLyAjIyMgc2hvdWxkIHdl
IGRldGFjaCgpIGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFkeSBhdHRhY2hlZD8KLSAgICAgICAgaWYg
KGF0dGFjaGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICAgICAgY2hpbGQtPmF0
dGFjaCgpOwotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIG11dGF0aW9uIGV2ZW50
cwotICAgICAgICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoY2hpbGQsZXhjZXB0aW9uY29k
ZSk7Ci0KLSAgICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0gICAgfQotCi0gICAgZ2V0RG9jdW1l
bnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwotICAgIC8vICMjIyBzZXQgc3R5bGUgaW4g
Y2FzZSBpdCdzIGF0dGFjaGVkCi0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwot
ICAgIHJldHVybiBuZXdDaGlsZDsKLX0KLQotYm9vbCBDb250YWluZXJOb2RlSW1wbDo6aGFzQ2hp
bGROb2RlcyAoICApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIF9maXJzdCAhPSAwOwotfQotCi0vLyBu
b3QgcGFydCBvZiB0aGUgRE9NCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpzZXRGaXJzdENoaWxk
KE5vZGVJbXBsICpjaGlsZCkKLXsKLSAgICBfZmlyc3QgPSBjaGlsZDsKLX0KLQotdm9pZCBDb250
YWluZXJOb2RlSW1wbDo6c2V0TGFzdENoaWxkKE5vZGVJbXBsICpjaGlsZCkKLXsKLSAgICBfbGFz
dCA9IGNoaWxkOwotfQotCi0vLyBjaGVjayBmb3Igc2FtZSBzb3VyY2UgZG9jdW1lbnQ6Ci1ib29s
IENvbnRhaW5lck5vZGVJbXBsOjpjaGVja1NhbWVEb2N1bWVudCggTm9kZUltcGwgKm5ld0NoaWxk
LCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIERv
Y3VtZW50SW1wbCAqb3duZXJEb2NUaGlzID0gZ2V0RG9jdW1lbnQoKTsKLSAgICAvLyBGSVhNRTog
RG9oISBUaGlzIG5leHQgbGluZSBpc24ndCBnZXR0aW5nIG5ld0NoaWxkLCBzbyBpdCdzIG5ldmVy
IGdvaW5nIHRvIHdvcmshCi0gICAgRG9jdW1lbnRJbXBsICpvd25lckRvY05ldyA9IGdldERvY3Vt
ZW50KCk7Ci0gICAgaWYob3duZXJEb2NUaGlzICE9IG93bmVyRG9jTmV3KSB7Ci0gICAgICAgIGtk
RGVidWcoNjAxMCk8PCAibm90IHNhbWUgZG9jdW1lbnQsIG5ld0NoaWxkID0gIiA8PCBuZXdDaGls
ZCA8PCAiZG9jdW1lbnQgPSAiIDw8IGdldERvY3VtZW50KCkgPDwgZW5kbDsKLSAgICAgICAgZXhj
ZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6V1JPTkdfRE9DVU1FTlRfRVJSOwotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBjaGVjayBmb3Ig
YmVpbmcgY2hpbGQ6Ci1ib29sIENvbnRhaW5lck5vZGVJbXBsOjpjaGVja0lzQ2hpbGQoIE5vZGVJ
bXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBpZighb2xkQ2hpbGQg
fHwgb2xkQ2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNv
ZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1w
bDo6YWRkQ2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkKQotewotICAgIC8vIGRvIG5vdCBhZGQgYXBw
bHlDaGFuZ2VzIGhlcmUhIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGR1cmluZyBwYXJzaW5n
Ci0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3ROZXdDaGlsZChuZXdDaGlsZCk7IC8vIG1h
a2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidkIGFuZCBkZXJlZidkIHNvIHdlIGRvbid0IGxl
YWsgaXQKLQotICAgIC8vIHNob3J0IGNoZWNrIGZvciBjb25zaXN0ZW5jeSB3aXRoIERURAotICAg
IGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpICYmICFjaGlsZEFsbG93ZWQobmV3
Q2hpbGQpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIGp1c3QgYWRkIGl0Li4uCi0gICAg
Zm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgIG5ld0NoaWxkLT5zZXRQYXJlbnQodGhpcyk7Ci0g
ICAgaWYoX2xhc3QpIHsKLSAgICAgICAgbmV3Q2hpbGQtPnNldFByZXZpb3VzU2libGluZyhfbGFz
dCk7Ci0gICAgICAgIF9sYXN0LT5zZXROZXh0U2libGluZyhuZXdDaGlsZCk7Ci0gICAgICAgIF9s
YXN0ID0gbmV3Q2hpbGQ7Ci0gICAgfSBlbHNlCi0gICAgICAgIF9maXJzdCA9IF9sYXN0ID0gbmV3
Q2hpbGQ7Ci0gICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICBpZiAoaW5Eb2N1bWVudCgp
KQotICAgICAgICBuZXdDaGlsZC0+aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICBjaGlsZHJl
bkNoYW5nZWQoKTsKLSAgICAKLSAgICBpZihuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpF
TEVNRU5UX05PREUpCi0gICAgICAgIHJldHVybiBuZXdDaGlsZDsKLSAgICByZXR1cm4gdGhpczsK
LX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6YXR0YWNoKCkKLXsKLSAgICBOb2RlSW1wbCAq
Y2hpbGQgPSBfZmlyc3Q7Ci0gICAgd2hpbGUoY2hpbGQgIT0gMCkKLSAgICB7Ci0gICAgICAgIGNo
aWxkLT5hdHRhY2goKTsKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAg
ICB9Ci0gICAgTm9kZUltcGw6OmF0dGFjaCgpOwotfQotCi12b2lkIENvbnRhaW5lck5vZGVJbXBs
OjpkZXRhY2goKQotewotICAgIE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsKLSAgICB3aGlsZShj
aGlsZCAhPSAwKQotICAgIHsKLSAgICAgICAgTm9kZUltcGwqIHByZXYgPSBjaGlsZDsKLSAgICAg
ICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgcHJldi0+ZGV0YWNoKCk7
Ci0gICAgfQotICAgIE5vZGVJbXBsOjpkZXRhY2goKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2Rl
SW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIE5vZGVJbXBsOjppbnNlcnRlZElu
dG9Eb2N1bWVudCgpOwotICAgIGZvciAoTm9kZUltcGwgKmNoaWxkID0gX2ZpcnN0OyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgY2hpbGQtPmluc2VydGVkSW50
b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZWRGcm9tRG9j
dW1lbnQoKQotewotICAgIE5vZGVJbXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gICAgZm9y
IChOb2RlSW1wbCAqY2hpbGQgPSBfZmlyc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2li
bGluZygpKQotICAgICAgICBjaGlsZC0+cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotfQotCi12b2lk
IENvbnRhaW5lck5vZGVJbXBsOjppbnNlcnRlZEludG9UcmVlKGJvb2wgZGVlcCkKLXsKLSAgICBO
b2RlSW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsKLSAgICBpZiAoZGVlcCkgewotICAgICAg
ICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5l
eHRTaWJsaW5nKCkpCi0gICAgICAgICAgICBjaGlsZC0+aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsK
LSAgICB9Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZWRGcm9tVHJlZShib29s
IGRlZXApCi17Ci0gICAgTm9kZUltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsKLSAgICBpZiAo
ZGVlcCkgewotICAgICAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsgY2hpbGQ7IGNo
aWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICBjaGlsZC0+cmVtb3ZlZEZy
b21UcmVlKGRlZXApOwotICAgIH0KLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6Y2xvbmVD
aGlsZE5vZGVzKE5vZGVJbXBsICpjbG9uZSkKLXsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7
Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSBmaXJzdENoaWxkKCk7IG4gJiYgIWV4Y2Vw
dGlvbmNvZGU7IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgIHsKLSAgICAgICAgY2xvbmUtPmFw
cGVuZENoaWxkKG4tPmNsb25lTm9kZSh0cnVlKSxleGNlcHRpb25jb2RlKTsKLSAgICB9Ci19Ci0K
LWJvb2wgQ29udGFpbmVyTm9kZUltcGw6OmdldFVwcGVyTGVmdENvcm5lcihpbnQgJnhQb3MsIGlu
dCAmeVBvcykgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVuZGVyKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgUmVuZGVyT2JqZWN0ICpvID0gbV9yZW5kZXI7Ci0gICAgUmVuZGVyT2JqZWN0ICpw
ID0gbzsKLQotICAgIHhQb3MgPSB5UG9zID0gMDsKLSAgICBpZiAoIW8tPmlzSW5saW5lKCkgfHwg
by0+aXNSZXBsYWNlZCgpKSB7Ci0gICAgICAgIG8tPmFic29sdXRlUG9zaXRpb24oIHhQb3MsIHlQ
b3MgKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gZmluZCB0aGUgbmV4
dCB0ZXh0L2ltYWdlIGNoaWxkLCB0byBnZXQgYSBwb3NpdGlvbgotICAgIHdoaWxlKG8pIHsKLSAg
ICAgICAgcCA9IG87Ci0gICAgICAgIGlmKG8tPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIG8g
PSBvLT5maXJzdENoaWxkKCk7Ci0gICAgICAgIGVsc2UgaWYoby0+bmV4dFNpYmxpbmcoKSkKLSAg
ICAgICAgICAgIG8gPSBvLT5uZXh0U2libGluZygpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgIG8gPSBvLT5wYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChvKSAKLSAgICAgICAgICAgICAg
ICBvID0gby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGlmICghbykKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghby0+aXNJbmxpbmUoKSB8fCBv
LT5pc1JlcGxhY2VkKCkpIHsKLSAgICAgICAgICAgIG8tPmFic29sdXRlUG9zaXRpb24oIHhQb3Ms
IHlQb3MgKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKHAtPmVsZW1lbnQoKSAmJiBwLT5lbGVtZW50KCkgPT0gdGhpcyAmJiBvLT5pc1RleHQoKSAm
JiAhby0+aXNCUigpICYmICFzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Kj4obyktPmZpcnN0VGV4dEJv
eCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyAtIHNraXAgdW5yZW5kZXJlZCB3
aGl0ZXNwYWNlIHRoYXQgaXMgYSBjaGlsZCBvciBuZXh0IHNpYmxpbmcgb2YgdGhlIGFuY2hvcgot
ICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoKG8tPmlzVGV4dCgpICYmICFvLT5pc0JSKCkpIHx8
IG8tPmlzUmVwbGFjZWQoKSkgewotICAgICAgICAgICAgby0+Y29udGFpbmVyKCktPmFic29sdXRl
UG9zaXRpb24oIHhQb3MsIHlQb3MgKTsKLSAgICAgICAgICAgIGlmIChvLT5pc1RleHQoKSAmJiBz
dGF0aWNfY2FzdDxSZW5kZXJUZXh0ICo+KG8pLT5maXJzdFRleHRCb3goKSkgewotICAgICAgICAg
ICAgICAgIHhQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+bWluWFBvcygpOwot
ICAgICAgICAgICAgICAgIHlQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+Zmly
c3RUZXh0Qm94KCktPnJvb3QoKS0+dG9wT3ZlcmZsb3coKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHhQb3MgKz0gby0+eFBvcygpOwotICAgICAg
ICAgICAgICAgIHlQb3MgKz0gby0+eVBvcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgdGhlIHRhcmdl
dCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuIG9yIHNpYmxpbmdzIHRoYXQgY291bGQgYmUgdXNl
ZCB0byBjYWxjdWxhdGUgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2UgbXVzdCBiZQotICAgIC8vIGF0
IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiAgU2Nyb2xsIHRvIHRoZSBib3R0b20uCi0gICAgaWYg
KCFvKSB7Ci0gICAgICAgIHlQb3MgKz0gZ2V0RG9jdW1lbnQoKS0+dmlldygpLT5jb250ZW50c0hl
aWdodCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1ib29sIENvbnRhaW5lck5vZGVJbXBsOjpnZXRMb3dlclJpZ2h0Q29ybmVyKGludCAmeFBv
cywgaW50ICZ5UG9zKSBjb25zdAotewotICAgIGlmICghbV9yZW5kZXIpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIFJlbmRlck9iamVjdCAqbyA9IG1fcmVuZGVyOwotICAgIHhQb3MgPSB5
UG9zID0gMDsKLSAgICBpZiAoIW8tPmlzSW5saW5lKCkgfHwgby0+aXNSZXBsYWNlZCgpKQotICAg
IHsKLSAgICAgICAgby0+YWJzb2x1dGVQb3NpdGlvbiggeFBvcywgeVBvcyApOwotICAgICAgICB4
UG9zICs9IG8tPndpZHRoKCk7Ci0gICAgICAgIHlQb3MgKz0gby0+aGVpZ2h0KCk7Ci0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBmaW5kIHRoZSBsYXN0IHRleHQvaW1hZ2UgY2hp
bGQsIHRvIGdldCBhIHBvc2l0aW9uCi0gICAgd2hpbGUobykgewotICAgICAgICBpZihvLT5sYXN0
Q2hpbGQoKSkKLSAgICAgICAgICAgIG8gPSBvLT5sYXN0Q2hpbGQoKTsKLSAgICAgICAgZWxzZSBp
ZihvLT5wcmV2aW91c1NpYmxpbmcoKSkKLSAgICAgICAgICAgIG8gPSBvLT5wcmV2aW91c1NpYmxp
bmcoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QgKnByZXYgPSAw
OwotICAgICAgICAgICAgd2hpbGUoIXByZXYpIHsKLSAgICAgICAgICAgICAgICBvID0gby0+cGFy
ZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYoIW8pIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAg
ICAgICBwcmV2ID0gby0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBvID0gcHJldjsKLSAgICAgICAgfQotICAgICAgICBpZihvLT5pc1RleHQoKSB8fCBvLT5p
c1JlcGxhY2VkKCkpIHsKLSAgICAgICAgICAgIG8tPmNvbnRhaW5lcigpLT5hYnNvbHV0ZVBvc2l0
aW9uKHhQb3MsIHlQb3MpOwotICAgICAgICAgICAgaWYgKG8tPmlzVGV4dCgpKQotICAgICAgICAg
ICAgICAgIHhQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+bWluWFBvcygpICsg
by0+d2lkdGgoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB4UG9zICs9IG8t
PnhQb3MoKStvLT53aWR0aCgpOwotICAgICAgICAgICAgeVBvcyArPSBvLT55UG9zKCkrby0+aGVp
Z2h0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotUVJlY3QgQ29udGFpbmVyTm9kZUltcGw6OmdldFJlY3QoKSBjb25z
dAotewotICAgIGludCB4UG9zID0gMCwgeVBvcyA9IDAsIHhFbmQgPSAwLCB5RW5kID0gMDsKLSAg
ICBib29sIGZvdW5kVXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0Q29ybmVyKHhQb3MseVBvcyk7Ci0g
ICAgYm9vbCBmb3VuZExvd2VyUmlnaHQgPSBnZXRMb3dlclJpZ2h0Q29ybmVyKHhFbmQseUVuZCk7
Ci0gICAgCi0gICAgLy8gSWYgd2UndmUgZm91bmQgb25lIGNvcm5lciwgYnV0IG5vdCB0aGUgb3Ro
ZXIsCi0gICAgLy8gdGhlbiB3ZSBzaG91bGQganVzdCByZXR1cm4gYSBwb2ludCBhdCB0aGUgY29y
bmVyIHRoYXQgd2UgZGlkIGZpbmQuCi0gICAgaWYgKGZvdW5kVXBwZXJMZWZ0ICE9IGZvdW5kTG93
ZXJSaWdodCkKLSAgICB7Ci0gICAgICAgIGlmIChmb3VuZFVwcGVyTGVmdCkgewotICAgICAgICAg
ICAgeEVuZCA9IHhQb3M7Ci0gICAgICAgICAgICB5RW5kID0geVBvczsKLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIHhQb3MgPSB4RW5kOwotICAgICAgICAgICAgeVBvcyA9IHlFbmQ7Ci0g
ICAgICAgIH0KLSAgICB9IAotCi0gICAgaWYgKHhFbmQgPCB4UG9zKQotICAgICAgICB4RW5kID0g
eFBvczsKLSAgICBpZiAoeUVuZCA8IHlQb3MpCi0gICAgICAgIHlFbmQgPSB5UG9zOwotICAgICAg
ICAKLSAgICByZXR1cm4gUVJlY3QoeFBvcywgeVBvcywgeEVuZCAtIHhQb3MsIHlFbmQgLSB5UG9z
KTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0Rm9jdXMoYm9vbCByZWNlaXZlZCkK
LXsKLSAgICBpZiAobV9mb2N1c2VkID09IHJlY2VpdmVkKSByZXR1cm47Ci0KLSAgICBOb2RlSW1w
bDo6c2V0Rm9jdXMocmVjZWl2ZWQpOwotCi0gICAgLy8gbm90ZSB0aGF0IHdlIG5lZWQgdG8gcmVj
YWxjIHRoZSBzdHlsZQotICAgIHNldENoYW5nZWQoKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2Rl
SW1wbDo6c2V0QWN0aXZlKGJvb2wgZG93biwgYm9vbCBwYXVzZSkKLXsKLSAgICBpZiAoZG93biA9
PSBhY3RpdmUoKSkgcmV0dXJuOwotCi0gICAgTm9kZUltcGw6OnNldEFjdGl2ZShkb3duKTsKLQot
ICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2FsYyB0aGUgc3R5bGUKLSAgICAvLyBGSVhN
RTogTW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlmIChtX3JlbmRlcikgewotICAgICAgICBib29s
IHJlYWN0c1RvUHJlc3MgPSBtX3JlbmRlci0+c3R5bGUoKS0+YWZmZWN0ZWRCeUFjdGl2ZVJ1bGVz
KCk7Ci0gICAgICAgIGlmIChyZWFjdHNUb1ByZXNzKQotICAgICAgICAgICAgc2V0Q2hhbmdlZCgp
OwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBl
YXJhbmNlKCkpIHsKLSAgICAgICAgICAgIGlmICh0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVy
ZXIoKSwgUHJlc3NlZFN0YXRlKSkKLSAgICAgICAgICAgICAgICByZWFjdHNUb1ByZXNzID0gdHJ1
ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhY3RzVG9QcmVzcyAmJiBwYXVzZSkgewotICAg
ICAgICAgICAgLy8gVGhlIGRlbGF5IGhlcmUgaXMgc3VidGxlLiAgSXQgcmVsaWVzIG9uIGFuIGFz
c3VtcHRpb24sIG5hbWVseSB0aGF0IHRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcwotICAgICAg
ICAgICAgLy8gdG8gcmVwYWludCB0aGUgImRvd24iIHN0YXRlIG9mIHRoZSBjb250cm9sIGlzIGFi
b3V0IHRoZSBzYW1lIHRpbWUgYXMgaXQgd291bGQgdGFrZSB0byByZXBhaW50IHRoZQotICAgICAg
ICAgICAgLy8gInVwIiBzdGF0ZS4gIE9uY2UgeW91IGFzc3VtZSB0aGlzLCB5b3UgY2FuIGp1c3Qg
ZGVsYXkgZm9yIDEwMG1zIC0gdGhhdCB0aW1lIChhc3N1bWluZyB0aGF0IGFmdGVyIHlvdQotICAg
ICAgICAgICAgLy8gbGVhdmUgdGhpcyBtZXRob2QsIGl0IHdpbGwgYmUgYWJvdXQgdGhhdCBsb25n
IGJlZm9yZSB0aGUgZmx1c2ggb2YgdGhlIHVwIHN0YXRlIGhhcHBlbnMgYWdhaW4pLgotICAgICAg
ICAgICAgUVRpbWUgc3RhcnRUaW1lOwotICAgICAgICAgICAgc3RhcnRUaW1lLnJlc3RhcnQoKTsK
LQotICAgICAgICAgICAgLy8gRG8gYW4gaW1tZWRpYXRlIHJlcGFpbnQuCi0gICAgICAgICAgICBt
X3JlbmRlci0+cmVwYWludCh0cnVlKTsKLSAgICAgICAgICAgIAotI2lmICFXSU4zMgotICAgICAg
ICAgICAgLy8gRklYTUU6IEZpbmQgYSBzdWJzdGl0dXRlIGZvciB1c2xlZXAuICBCZXR0ZXIgeWV0
LCBjb21lIHVwIHdpdGggYSB3YXkgb2YgZG9pbmcgdGhpcyB0aGF0IAotICAgICAgICAgICAgLy8g
ZG9lc24ndCB1c2UgdXNsZWVwIGF0IGFsbC4KLSAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1l
ID0gMTAwIC0gc3RhcnRUaW1lLmVsYXBzZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
Ly8gTm93IHBhdXNlIGZvciBhIHNtYWxsIGFtb3VudCBvZiB0aW1lICgxLzEwdGggb2YgYSBzZWNv
bmQgZnJvbSBiZWZvcmUgd2UgcmVwYWludGVkIGluIHRoZSBwcmVzc2VkIHN0YXRlKQotICAgICAg
ICAgICAgaWYgKHJlbWFpbmluZ1RpbWUgPiAwKQotICAgICAgICAgICAgICAgIHVzbGVlcChyZW1h
aW5pbmdUaW1lICogMTAwMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBD
b250YWluZXJOb2RlSW1wbDo6c2V0SG92ZXJlZChib29sIG92ZXIpCi17Ci0gICAgaWYgKG92ZXIg
PT0gaG92ZXJlZCgpKSByZXR1cm47Ci0KLSAgICBOb2RlSW1wbDo6c2V0SG92ZXJlZChvdmVyKTsK
LQotICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2FsYyB0aGUgc3R5bGUKLSAgICAvLyBG
SVhNRTogTW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlmIChtX3JlbmRlcikgewotICAgICAgICBp
ZiAobV9yZW5kZXItPnN0eWxlKCktPmFmZmVjdGVkQnlIb3ZlclJ1bGVzKCkpCi0gICAgICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0
eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdl
ZChyZW5kZXJlcigpLCBIb3ZlclN0YXRlKTsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIENvbnRhaW5l
ck5vZGVJbXBsOjpjaGlsZE5vZGVDb3VudCgpIGNvbnN0Ci17Ci0gICAgdW5zaWduZWQgY291bnQg
PSAwOwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9
IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGNvdW50Kys7Ci0gICAgcmV0dXJuIGNvdW50Owot
fQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRl
eCkKLXsKLSAgICB1bnNpZ25lZCBpOwotICAgIE5vZGVJbXBsICpuID0gZmlyc3RDaGlsZCgpOwot
ICAgIGZvciAoaSA9IDA7IG4gIT0gMCAmJiBpIDwgaW5kZXg7IGkrKykKLSAgICAgICAgbiA9IG4t
Pm5leHRTaWJsaW5nKCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUlt
cGw6OmRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyggTm9kZUltcGwgKmNoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsK
LSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBjaGlsZC0+aW5zZXJ0ZWRJbnRvRG9jdW1l
bnQoKTsKLSAgICBlbHNlCi0gICAgICAgIGNoaWxkLT5pbnNlcnRlZEludG9UcmVlKHRydWUpOwot
Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRP
TU5PREVJTlNFUlRFRF9MSVNURU5FUikpIHsKLSAgICAgICAgY2hpbGQtPmRpc3BhdGNoRXZlbnQo
bmV3IE11dGF0aW9uRXZlbnRJbXBsKERPTU5vZGVJbnNlcnRlZEV2ZW50LAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxmYWxzZSx0aGlzLERP
TVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7
Ci0gICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnQgZXZlbnQg
dG8gYWxsIGRlc2NlbmRhbnRzCi0gICAgYm9vbCBoYXNJbnNlcnRlZExpc3RlbmVycyA9IGdldERv
Y3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVJTlNFUlRFRElO
VE9ET0NVTUVOVF9MSVNURU5FUik7Ci0KLSAgICBpZiAoaGFzSW5zZXJ0ZWRMaXN0ZW5lcnMgJiYg
aW5Eb2N1bWVudCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKmMgPSBjaGlsZDsgYzsgYyA9
IGMtPnRyYXZlcnNlTmV4dE5vZGUoY2hpbGQpKSB7Ci0gICAgICAgICAgICBjLT5kaXNwYXRjaEV2
ZW50KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnRFdmVu
dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZh
bHNlLGZhbHNlLDAsRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0
aW9uY29kZSx0cnVlKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gYmFzZSBjbGFzcyBmb3Ig
bm9kZXMgdGhhdCBtYXkgaGF2ZSBjaGlsZHJlbgotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6ZGlz
cGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwgaW50ICZleGNlcHRpb25j
b2RlICkKLXsKLSAgICAvLyB1cGRhdGUgYXV4aWxpYXJ5IGRvYyBpbmZvIChlLmcuIGl0ZXJhdG9y
cykgdG8gbm90ZSB0aGF0IG5vZGUgaXMgYmVpbmcgcmVtb3ZlZAotICAgIGdldERvY3VtZW50KCkt
Pm5vdGlmeUJlZm9yZU5vZGVSZW1vdmFsKGNoaWxkKTsgLy8gIyMjIHVzZSBldmVudHMgaW5zdGVh
ZAotCi0gICAgLy8gZGlzcGF0Y2ggcHJlLXJlbW92YWwgbXV0YXRpb24gZXZlbnRzCi0gICAgaWYg
KGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVSRU1P
VkVEX0xJU1RFTkVSKSkgewotCWNoaWxkLT5kaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50
SW1wbChET01Ob2RlUmVtb3ZlZEV2ZW50LAotCQkJICAgICB0cnVlLGZhbHNlLHRoaXMsRE9NU3Ry
aW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9uY29kZSx0cnVlKTsKLQlp
ZiAoZXhjZXB0aW9uY29kZSkKLQkgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgaGFzUmVt
b3ZhbExpc3RlbmVycyA9IGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudElt
cGw6OkRPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsKLQotICAgIC8vIGRpc3Bh
dGNoIHRoZSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCBldmVudCB0byBhbGwgZGVzY2VuZGFu
dHMKLSAgICBpZiAoaW5Eb2N1bWVudCgpKSB7Ci0JZm9yIChOb2RlSW1wbCAqYyA9IGNoaWxkOyBj
OyBjID0gYy0+dHJhdmVyc2VOZXh0Tm9kZShjaGlsZCkpIHsKLQkgICAgaWYgKGhhc1JlbW92YWxM
aXN0ZW5lcnMpIHsKLQkJYy0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudEltcGwoRE9N
Tm9kZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCwKLQkJCQkgZmFsc2UsZmFsc2UsMCxET01TdHJp
bmcoKSxET01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNlcHRpb25jb2RlLHRydWUpOwotCQlp
ZiAoZXhjZXB0aW9uY29kZSkKLQkJICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLU5vZGVMaXN0SW1wbDo6Tm9kZUxpc3RJbXBsKE5v
ZGVJbXBsICpfcm9vdE5vZGUpCi0gICAgOiByb290Tm9kZShfcm9vdE5vZGUpLAotICAgICAgaXNM
ZW5ndGhDYWNoZVZhbGlkKGZhbHNlKSwKLSAgICAgIGlzSXRlbUNhY2hlVmFsaWQoZmFsc2UpCi17
Ci0gICAgcm9vdE5vZGUtPnJlZigpOwotICAgIHJvb3ROb2RlLT5yZWdpc3Rlck5vZGVMaXN0KHRo
aXMpOwotfSAgICAKLQotTm9kZUxpc3RJbXBsOjp+Tm9kZUxpc3RJbXBsKCkKLXsKLSAgICByb290
Tm9kZS0+dW5yZWdpc3Rlck5vZGVMaXN0KHRoaXMpOwotICAgIHJvb3ROb2RlLT5kZXJlZigpOwot
fQotCi11bnNpZ25lZCBOb2RlTGlzdEltcGw6OnJlY3Vyc2l2ZUxlbmd0aCggTm9kZUltcGwgKnN0
YXJ0ICkgY29uc3QKLXsKLSAgICBpZiAoIXN0YXJ0KQotCXN0YXJ0ID0gcm9vdE5vZGU7Ci0KLSAg
ICBpZiAoaXNMZW5ndGhDYWNoZVZhbGlkICYmIHN0YXJ0ID09IHJvb3ROb2RlKSB7Ci0gICAgICAg
IHJldHVybiBjYWNoZWRMZW5ndGg7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbGVuID0gMDsKLQot
ICAgIGZvcihOb2RlSW1wbCAqbiA9IHN0YXJ0LT5maXJzdENoaWxkKCk7IG4gIT0gMDsgbiA9IG4t
Pm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCBuLT5ub2RlVHlwZSgpID09IE5vZGU6OkVM
RU1FTlRfTk9ERSApIHsKLSAgICAgICAgICAgIGlmIChub2RlTWF0Y2hlcyhuKSkKLSAgICAgICAg
ICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgIGxlbis9IHJlY3Vyc2l2ZUxlbmd0aChuKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdGFydCA9PSByb290Tm9kZSkgewotICAgICAgICBj
YWNoZWRMZW5ndGggPSBsZW47Ci0gICAgICAgIGlzTGVuZ3RoQ2FjaGVWYWxpZCA9IHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotTm9kZUltcGwgKk5vZGVMaXN0SW1wbDo6cmVj
dXJzaXZlSXRlbSAoIHVuc2lnbmVkIG9mZnNldCwgTm9kZUltcGwgKnN0YXJ0KSBjb25zdAotewot
ICAgIGludCByZW1haW5pbmdPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgaWYgKCFzdGFydCkgewotICAg
ICAgICBzdGFydCA9IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7Ci0gICAgICAgIGlmIChpc0l0ZW1D
YWNoZVZhbGlkKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID09IGxhc3RJdGVtT2Zmc2V0KSB7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RJdGVtOwotICAgICAgICAgICAgfSBlbHNlIGlm
IChvZmZzZXQgPiBsYXN0SXRlbU9mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFz
dEl0ZW07Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nT2Zmc2V0IC09IGxhc3RJdGVtT2Zmc2V0
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTm9kZUltcGwgKm4gPSBz
dGFydDsKLQotICAgIHdoaWxlIChuKSB7Ci0gICAgICAgIGlmICggbi0+bm9kZVR5cGUoKSA9PSBO
b2RlOjpFTEVNRU5UX05PREUgKSB7Ci0gICAgICAgICAgICBpZiAobm9kZU1hdGNoZXMobikpIHsK
LSAgICAgICAgICAgICAgICBpZiAoIXJlbWFpbmluZ09mZnNldCkgewotICAgICAgICAgICAgICAg
ICAgICBsYXN0SXRlbSA9IG47Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RJdGVtT2Zmc2V0ID0g
b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBpc0l0ZW1DYWNoZVZhbGlkID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIHJlbWFpbmluZ09mZnNldC0tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUocm9vdE5vZGUpOwotICAgIH0KLQotICAgIHJl
dHVybiAwOyAvLyBubyBtYXRjaGluZyBub2RlIGluIHRoaXMgc3VidHJlZQotfQotCi1Ob2RlSW1w
bCAqTm9kZUxpc3RJbXBsOjppdGVtQnlJZCAoY29uc3QgRE9NU3RyaW5nJiBlbGVtZW50SWQpIGNv
bnN0Ci17Ci0gICAgaWYgKHJvb3ROb2RlLT5pc0RvY3VtZW50Tm9kZSgpIHx8IHJvb3ROb2RlLT5p
bkRvY3VtZW50KCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSByb290Tm9kZS0+Z2V0RG9j
dW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKLQotICAgICAgICBpZiAobm9kZSA9
PSBOVUxMIHx8ICFub2RlTWF0Y2hlcyhub2RlKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0g
ICAgICAgIGZvciAoTm9kZUltcGwgKnAgPSBub2RlLT5wYXJlbnROb2RlKCk7IHA7IHAgPSBwLT5w
YXJlbnROb2RlKCkpIHsKLSAgICAgICAgICAgIGlmIChwID09IHJvb3ROb2RlKQotICAgICAgICAg
ICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotCi0gICAgdW5zaWduZWQgbCA9IGxlbmd0aCgpOwotCi0gICAgZm9yICggdW5zaWduZWQgaSA9
IDA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgIE5vZGVJbXBsICpub2RlID0gaXRlbShpKTsKLSAg
ICAgICAgCi0gICAgICAgIGlmICggc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obm9kZSktPmdl
dElEQXR0cmlidXRlKCkgPT0gZWxlbWVudElkICkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGU7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi12b2lkIE5vZGVMaXN0
SW1wbDo6cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKQotewotICAgIGlzTGVuZ3RoQ2FjaGVWYWxp
ZCA9IGZhbHNlOwotICAgIGlzSXRlbUNhY2hlVmFsaWQgPSBmYWxzZTsgICAgIAotICAgIGxhc3RJ
dGVtID0gMDsKLX0KLQotQ2hpbGROb2RlTGlzdEltcGw6OkNoaWxkTm9kZUxpc3RJbXBsKCBOb2Rl
SW1wbCAqbiApCi0gICAgOiBOb2RlTGlzdEltcGwobikKLXsKLX0KLQotdW5zaWduZWQgQ2hpbGRO
b2RlTGlzdEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaWYgKGlzTGVuZ3RoQ2FjaGVWYWxp
ZCkKLSAgICAgICAgcmV0dXJuIGNhY2hlZExlbmd0aDsKLQotICAgIHVuc2lnbmVkIGxlbiA9IDA7
Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSByb290Tm9kZS0+Zmlyc3RDaGlsZCgpOyBu
ICE9IDA7IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBsZW4rKzsKLQotICAgIGNhY2hl
ZExlbmd0aCA9IGxlbjsKLSAgICBpc0xlbmd0aENhY2hlVmFsaWQgPSB0cnVlOwotCi0gICAgcmV0
dXJuIGxlbjsKLX0KLQotTm9kZUltcGwgKkNoaWxkTm9kZUxpc3RJbXBsOjppdGVtICggdW5zaWdu
ZWQgaW5kZXggKSBjb25zdAotewotICAgIHVuc2lnbmVkIGludCBwb3MgPSAwOwotICAgIE5vZGVJ
bXBsICpuID0gcm9vdE5vZGUtPmZpcnN0Q2hpbGQoKTsKLQotICAgIGlmIChpc0l0ZW1DYWNoZVZh
bGlkKSB7Ci0gICAgICAgIGlmIChpbmRleCA9PSBsYXN0SXRlbU9mZnNldCkgewotICAgICAgICAg
ICAgcmV0dXJuIGxhc3RJdGVtOwotICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID4gbGFzdEl0ZW1P
ZmZzZXQpIHsKLSAgICAgICAgICAgIG4gPSBsYXN0SXRlbTsKLSAgICAgICAgICAgIHBvcyA9IGxh
c3RJdGVtT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKG4gJiYgcG9zIDwg
aW5kZXgpIHsKLSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHBvcysrOwot
ICAgIH0KLQotICAgIGlmIChuKSB7Ci0gICAgICAgIGxhc3RJdGVtID0gbjsKLSAgICAgICAgbGFz
dEl0ZW1PZmZzZXQgPSBwb3M7Ci0gICAgICAgIGlzSXRlbUNhY2hlVmFsaWQgPSB0cnVlOwotICAg
ICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBDaGlsZE5v
ZGVMaXN0SW1wbDo6bm9kZU1hdGNoZXMoTm9kZUltcGwgKnRlc3ROb2RlKSBjb25zdAotewotICAg
IHJldHVybiB0ZXN0Tm9kZS0+cGFyZW50Tm9kZSgpID09IHJvb3ROb2RlOwotfQotCi1UYWdOb2Rl
TGlzdEltcGw6OlRhZ05vZGVMaXN0SW1wbChOb2RlSW1wbCAqbiwgY29uc3QgQXRvbWljU3RyaW5n
JiBuYW1lc3BhY2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKQotICAgIDogTm9k
ZUxpc3RJbXBsKG4pLCAKLSAgICAgIG1fbmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSksIAotICAg
ICAgbV9sb2NhbE5hbWUobG9jYWxOYW1lKQotewotfQotCi11bnNpZ25lZCBUYWdOb2RlTGlzdElt
cGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlY3Vyc2l2ZUxlbmd0aCgpOwotfQot
Ci1Ob2RlSW1wbCAqVGFnTm9kZUxpc3RJbXBsOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAot
ewotICAgIHJldHVybiByZWN1cnNpdmVJdGVtKGluZGV4KTsKLX0KLQotYm9vbCBUYWdOb2RlTGlz
dEltcGw6Om5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3QKLXsKLSAgICBpZiAo
IXRlc3ROb2RlLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChtX25hbWVzcGFjZVVSSSAhPSBzdGFyQXRvbSAmJiBtX25hbWVzcGFjZVVSSSAhPSB0ZXN0
Tm9kZS0+bmFtZXNwYWNlVVJJKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBy
ZXR1cm4gbV9sb2NhbE5hbWUgPT0gc3RhckF0b20gfHwgbV9sb2NhbE5hbWUgPT0gdGVzdE5vZGUt
PmxvY2FsTmFtZSgpOwotfQotCiBOYW1lTm9kZUxpc3RJbXBsOjpOYW1lTm9kZUxpc3RJbXBsKE5v
ZGVJbXBsICpuLCBjb25zdCBET01TdHJpbmcgJnQgKQogICA6IE5vZGVMaXN0SW1wbChuKSwgbm9k
ZU5hbWUodCkKIHsKSW5kZXg6IGtodG1sL3htbC9Eb2N1bWVudEltcGwuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBraHRtbC94bWwvRG9jdW1lbnRJbXBsLmgJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwveG1s
L0RvY3VtZW50SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVk
ZSA8cXB0cmRpY3QuaD4KICNpbmNsdWRlIDxxbWFwLmg+CiAjaW5jbHVkZSA8cWRhdGV0aW1lLmg+
CisjaW5jbHVkZSA8cWNvbG9yLmg+CiAKICNpbmNsdWRlIDxrdXJsLmg+CiAKQEAgLTk4LDYgKzk5
LDcgQEAgbmFtZXNwYWNlIERPTSB7CiAgICAgY2xhc3MgU3R5bGVTaGVldExpc3RJbXBsOwogICAg
IGNsYXNzIFRleHRJbXBsOwogICAgIGNsYXNzIFRyZWVXYWxrZXJJbXBsOworICAgIGNsYXNzIE5h
bWVOb2RlTGlzdEltcGw7CiAKICAgICAvLyBBIHJhbmdlIG9mIGEgbm9kZSB3aXRoaW4gYSBkb2N1
bWVudCB0aGF0IGlzICJtYXJrZWQiLCBzdWNoIGFzIGJlaW5nIG1pc3NwZWxsZWQKICAgICBzdHJ1
Y3QgRG9jdW1lbnRNYXJrZXIKQEAgLTM0Miw3ICszNDQsNyBAQCBwdWJsaWM6CiAgICAgYm9vbCBz
aG91bGRTY2hlZHVsZUxheW91dCgpOwogICAgIGludCBlbGFwc2VkVGltZSgpIGNvbnN0OwogICAg
IAotICAgIHZvaWQgc2V0VGV4dENvbG9yKCBRQ29sb3IgY29sb3IgKSB7IG1fdGV4dENvbG9yID0g
Y29sb3I7IH0KKyAgICB2b2lkIHNldFRleHRDb2xvcihjb25zdCBRQ29sb3ImIGNvbG9yKSB7IG1f
dGV4dENvbG9yID0gY29sb3I7IH0KICAgICBRQ29sb3IgdGV4dENvbG9yKCkgY29uc3QgeyByZXR1
cm4gbV90ZXh0Q29sb3I7IH0KIAogICAgIGNvbnN0IFFDb2xvciYgbGlua0NvbG9yKCkgY29uc3Qg
eyByZXR1cm4gbV9saW5rQ29sb3I7IH0KSW5kZXg6IGtodG1sL3htbC9DaGlsZE5vZGVMaXN0SW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL0NoaWxkTm9kZUxpc3RJbXBsLmNwcAkocmV2
aXNpb24gMTIwNjMpCisrKyBraHRtbC94bWwvQ2hpbGROb2RlTGlzdEltcGwuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yMywyOTQxICsyMywxMiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCi0KLSNpbmNsdWRlICJkb20vZG9tX2V4Y2Vw
dGlvbi5oIgotI2luY2x1ZGUgImRvbS9kb20yX2V2ZW50cy5oIgotI2luY2x1ZGUgInhtbC9kb21f
ZWxlbWVudGltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAi
eG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgotI2luY2x1
ZGUgIkRPTUltcGxlbWVudGF0aW9uSW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21fcG9zaXRpb24u
aCIKLSNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwuaCIKLSNpbmNsdWRlICJ4bWwvRXZlbnRO
YW1lcy5oIgotI2luY2x1ZGUgImNzcy9jc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJjc3MvY3Nzc3R5
bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImVkaXRpbmcvaHRtbGVkaXRpbmcuaCIKLSNpbmNsdWRl
ICJlZGl0aW5nL2h0bWxfaW50ZXJjaGFuZ2UuaCIKLSNpbmNsdWRlICJlZGl0aW5nL1NlbGVjdGlv
bkNvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotCi0jaW5jbHVkZSAicmVuZGVy
aW5nL3JlbmRlcl9vYmplY3QuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVk
ZSAicmVuZGVyX3RoZW1lLmgiCi0KLSNpbmNsdWRlICJlY21hL2tqc19iaW5kaW5nLmgiCi0jaW5j
bHVkZSAiZWNtYS9ranNfcHJveHkuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRl
ICJGcmFtZS5oIgotCi0vLyBGSVhNRTogU2hvdWxkIG5vdCBoYXZlIHRvIGluY2x1ZGUgdGhpcy4g
IEN1dCB0aGUgSFRNTCBkZXBlbmRlbmN5IQotI2luY2x1ZGUgImh0bWxuYW1lcy5oIgotCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotI2luY2x1ZGUgInhibC94YmxfYmluZGluZ19tYW5hZ2VyLmgiCi0j
ZW5kaWYKLQotI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KLSNpbmNsdWRlICJLV1FM
b2dnaW5nLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBraHRtbDsKLQotbmFtZXNwYWNlIERPTSB7Ci0K
LXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsK
LQotLyoqCi0gKiBOb2RlTGlzdCB3aGljaCBsaXN0cyBhbGwgTm9kZXMgaW4gYSBkb2N1bWVudCB3
aXRoIGEgZ2l2ZW4gdGFnIG5hbWUKLSAqLwotY2xhc3MgVGFnTm9kZUxpc3RJbXBsIDogcHVibGlj
IE5vZGVMaXN0SW1wbAotewotcHVibGljOgotICAgIFRhZ05vZGVMaXN0SW1wbChOb2RlSW1wbCAq
biwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYg
bG9jYWxOYW1lKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50
IGNsYXNzZXMKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZpcnR1
YWwgTm9kZUltcGwgKml0ZW0gKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKLQotICAgIC8vIE90aGVy
IG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9v
bCBub2RlTWF0Y2hlcyhOb2RlSW1wbCAqdGVzdE5vZGUpIGNvbnN0OwotCi0gICAgQXRvbWljU3Ry
aW5nIG1fbmFtZXNwYWNlVVJJOwotICAgIEF0b21pY1N0cmluZyBtX2xvY2FsTmFtZTsKLX07Ci0K
LSNpZm5kZWYgTkRFQlVHCi1zdHJ1Y3QgTm9kZUltcGxDb3VudGVyIHsgCi0gICAgc3RhdGljIGlu
dCBjb3VudDsgCi0gICAgfk5vZGVJbXBsQ291bnRlcigpIHsgLyogaWYgKGNvdW50ICE9IDApIGZw
cmludGYoc3RkZXJyLCAiTEVBSzogJWQgTm9kZUltcGxcbiIsIGNvdW50KTsgKi8gfQotfTsKLWlu
dCBOb2RlSW1wbENvdW50ZXI6OmNvdW50ID0gMDsKLXN0YXRpYyBOb2RlSW1wbENvdW50ZXIgbm9k
ZUltcGxDb3VudGVyOwotCi1zdGF0aWMgaW50IGdFdmVudERpc3BhdGNoRm9yYmlkZGVuOwotI2Rl
ZmluZSBmb3JiaWRFdmVudERpc3BhdGNoKCkgZ0V2ZW50RGlzcGF0Y2hGb3JiaWRkZW4gKz0gMQot
I2RlZmluZSBhbGxvd0V2ZW50RGlzcGF0Y2goKSBhc3NlcnQoZ0V2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW4gPiAwKTsgZ0V2ZW50RGlzcGF0Y2hGb3JiaWRkZW4gLT0gMQotI2RlZmluZSBldmVudERpc3Bh
dGNoRm9yYmlkZGVuKCkgKGdFdmVudERpc3BhdGNoRm9yYmlkZGVuID4gMCkKLSNlbHNlCi0KLSNk
ZWZpbmUgZm9yYmlkRXZlbnREaXNwYXRjaCgpCi0jZGVmaW5lIGFsbG93RXZlbnREaXNwYXRjaCgp
Ci0jZGVmaW5lIGV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKQotI2VuZGlmIE5ERUJVRwotCi1Ob2Rl
SW1wbDo6Tm9kZUltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0gICAgOiBkb2N1bWVudChkb2MpLAot
ICAgICAgbV9wcmV2aW91cygwKSwKLSAgICAgIG1fbmV4dCgwKSwKLSAgICAgIG1fcmVuZGVyKDAp
LAotICAgICAgbV9yZWdkTGlzdGVuZXJzKDApLAotICAgICAgbV9ub2RlTGlzdHMoMCksCi0gICAg
ICBtX3RhYkluZGV4KDApLAotICAgICAgbV9oYXNJZChmYWxzZSksCi0gICAgICBtX2hhc0NsYXNz
KGZhbHNlKSwKLSAgICAgIG1faGFzU3R5bGUoZmFsc2UpLAotICAgICAgbV9hdHRhY2hlZChmYWxz
ZSksCi0gICAgICBtX2NoYW5nZWQoZmFsc2UpLAotICAgICAgbV9oYXNDaGFuZ2VkQ2hpbGQoZmFs
c2UpLAotICAgICAgbV9pbkRvY3VtZW50KGZhbHNlKSwKLSAgICAgIG1faXNMaW5rKGZhbHNlKSwK
LSAgICAgIG1fc3BlY2lmaWVkKGZhbHNlKSwKLSAgICAgIG1fZm9jdXNlZChmYWxzZSksCi0gICAg
ICBtX2FjdGl2ZShmYWxzZSksCi0gICAgICBtX2hvdmVyZWQoZmFsc2UpLAotICAgICAgbV9pbkFj
dGl2ZUNoYWluKGZhbHNlKSwKLSAgICAgIG1fc3R5bGVFbGVtZW50KGZhbHNlKSwKLSAgICAgIG1f
aW1wbGljaXQoZmFsc2UpLAotICAgICAgbV9pbkRldGFjaChmYWxzZSkKLXsKLSNpZm5kZWYgTkRF
QlVHCi0gICAgKytOb2RlSW1wbENvdW50ZXI6OmNvdW50OwotI2VuZGlmCi19Ci0KLXZvaWQgTm9k
ZUltcGw6OnNldERvY3VtZW50KERvY3VtZW50SW1wbCAqZG9jKQotewotICAgIGlmIChpbkRvY3Vt
ZW50KCkpCi0JcmV0dXJuOwotICAgIAotICAgIGRvY3VtZW50ID0gZG9jOwotfQotCi1Ob2RlSW1w
bDo6fk5vZGVJbXBsKCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgLS1Ob2RlSW1wbENvdW50ZXI6
OmNvdW50OwotI2VuZGlmCi0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBkZXRhY2goKTsKLSAg
ICBpZiAobV9yZWdkTGlzdGVuZXJzICYmICFtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAmJiBn
ZXREb2N1bWVudCgpICYmICFpbkRvY3VtZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPnVu
cmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotICAgIGRl
bGV0ZSBtX3JlZ2RMaXN0ZW5lcnM7Ci0gICAgZGVsZXRlIG1fbm9kZUxpc3RzOwotICAgIGlmICht
X3ByZXZpb3VzKQotICAgICAgICBtX3ByZXZpb3VzLT5zZXROZXh0U2libGluZygwKTsKLSAgICBp
ZiAobV9uZXh0KQotICAgICAgICBtX25leHQtPnNldFByZXZpb3VzU2libGluZygwKTsKLX0KLQot
RE9NU3RyaW5nIE5vZGVJbXBsOjpub2RlVmFsdWUoKSBjb25zdAotewotICByZXR1cm4gRE9NU3Ry
aW5nKCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldE5vZGVWYWx1ZSggY29uc3QgRE9NU3RyaW5n
ICYvKl9ub2RlVmFsdWUqLywgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICAvLyBOT19NT0RJ
RklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0g
ICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0
aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICAvLyBiZSBkZWZhdWx0IG5vZGVWYWx1ZSBpcyBudWxsLCBzbyBzZXR0aW5nIGl0IGhh
cyBubyBlZmZlY3QKLX0KLQotUmVmUHRyPE5vZGVMaXN0SW1wbD4gTm9kZUltcGw6OmNoaWxkTm9k
ZXMoKQotewotICAgIHJldHVybiBSZWZQdHI8Tm9kZUxpc3RJbXBsPihuZXcgQ2hpbGROb2RlTGlz
dEltcGwodGhpcykpOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OmZpcnN0Q2hpbGQoKSBjb25z
dAotewotICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpsYXN0Q2hpbGQoKSBj
b25zdAotewotICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpsYXN0RGVzY2Vu
ZGFudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4gPSBjb25zdF9jYXN0PE5vZGVJbXBsICo+
KHRoaXMpOwotICAgIHdoaWxlIChuICYmIG4tPmxhc3RDaGlsZCgpKQotICAgICAgICBuID0gbi0+
bGFzdENoaWxkKCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6aW5z
ZXJ0QmVmb3JlKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICosIGludCAmZXhjZXB0aW9u
Y29kZSApCi17Ci0gICAgbmV3Q2hpbGQtPnJlZigpOwotICAgIG5ld0NoaWxkLT5kZXJlZigpOwot
ICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsK
LSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpyZXBsYWNlQ2hpbGQoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKiwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAg
bmV3Q2hpbGQtPnJlZigpOwotICBuZXdDaGlsZC0+ZGVyZWYoKTsKLSAgZXhjZXB0aW9uY29kZSA9
IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICByZXR1cm4gMDsKLX0KLQot
Tm9kZUltcGwgKk5vZGVJbXBsOjpyZW1vdmVDaGlsZCggTm9kZUltcGwgKiwgaW50ICZleGNlcHRp
b25jb2RlICkKLXsKLSAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VS
UjsKLSAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6YXBwZW5kQ2hpbGQoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBuZXdDaGlsZC0+
cmVmKCk7Ci0gICAgbmV3Q2hpbGQtPmRlcmVmKCk7Ci0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4
Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgIHJldHVybiAwOwotfQotCi12b2lk
IE5vZGVJbXBsOjpyZW1vdmUoaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIHJlZigpOwotICAg
IGlmIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKSkKLSAgICAgICAgcC0+cmVtb3ZlQ2hpbGQo
dGhpcywgZXhjZXB0aW9uY29kZSk7Ci0gICAgZWxzZQotICAgICAgICBleGNlcHRpb25jb2RlID0g
RE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgZGVyZWYoKTsKLX0KLQot
Ym9vbCBOb2RlSW1wbDo6aGFzQ2hpbGROb2RlcyggICkgY29uc3QKLXsKLSAgcmV0dXJuIGZhbHNl
OwotfQotCi12b2lkIE5vZGVJbXBsOjpub3JtYWxpemUgKCkKLXsKLSAgICBpbnQgZXhjZXB0aW9u
Y29kZSA9IDA7Ci0gICAgTm9kZUltcGwgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotCi0gICAgaWYg
KGlzRWxlbWVudE5vZGUoKSkgewotICAgICAgICAvLyBOb3JtYWxpemUgYW55IGF0dHJpYnV0ZSBj
aGlsZHJlbiB3ZSBtaWdodCBoYXZlIAotICAgICAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0
YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KHRoaXMpOwotICAgICAgICBOYW1lZEF0dHJNYXBJbXBs
ICphdHRyTWFwID0gZWxlbWVudC0+YXR0cmlidXRlcygpOwotICAgICAgICAKLSAgICAgICAgaWYg
KGF0dHJNYXApIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG51bUF0dHJzID0gYXR0ck1hcC0+bGVu
Z3RoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBudW1BdHRyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAqYXR0cmli
dXRlID0gYXR0ck1hcC0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgICAgICBBdHRySW1w
bCAqYXR0ciA9IGF0dHJpYnV0ZS0+YXR0ckltcGwoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICBpZiAoYXR0cikKLSAgICAgICAgICAgICAgICAgICAgYXR0ci0+bm9ybWFsaXpl
KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gUmVjdXJz
aXZlbHkgZ28gdGhyb3VnaCB0aGUgc3VidHJlZSBiZW5lYXRoIHVzLCBub3JtYWxpemluZyBhbGwg
bm9kZXMuIEluIHRoZSBjYXNlCi0gICAgLy8gd2hlcmUgdGhlcmUgYXJlIHR3byBhZGphY2VudCB0
ZXh0IG5vZGVzLCB0aGV5IGFyZSBtZXJnZWQgdG9nZXRoZXIKLSAgICB3aGlsZSAoY2hpbGQpIHsK
LSAgICAgICAgTm9kZUltcGwgKm5leHRDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotCi0g
ICAgICAgIGlmIChuZXh0Q2hpbGQgJiYgY2hpbGQtPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9O
T0RFICYmIG5leHRDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUpIHsKLSAgICAg
ICAgICAgIC8vIEN1cnJlbnQgY2hpbGQgYW5kIHRoZSBuZXh0IG9uZSBhcmUgYm90aCB0ZXh0IG5v
ZGVzLi4uIG1lcmdlIHRoZW0KLSAgICAgICAgICAgIFRleHRJbXBsICpjdXJyZW50VGV4dCA9IHN0
YXRpY19jYXN0PFRleHRJbXBsKj4oY2hpbGQpOwotICAgICAgICAgICAgVGV4dEltcGwgKm5leHRU
ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dEltcGwqPihuZXh0Q2hpbGQpOwotCi0gICAgICAgICAgICBj
dXJyZW50VGV4dC0+YXBwZW5kRGF0YShuZXh0VGV4dC0+ZGF0YSgpLGV4Y2VwdGlvbmNvZGUpOwot
ICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwot
Ci0gICAgICAgICAgICBuZXh0Q2hpbGQtPnJlbW92ZShleGNlcHRpb25jb2RlKTsKLSAgICAgICAg
ICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoaWxkLT5ub3JtYWxpemUoKTsKLSAgICAg
ICAgICAgIGNoaWxkID0gbmV4dENoaWxkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8v
IENoZWNrIGlmIHdlIGhhdmUgYSBzaW5nbGUgZW1wdHkgdGV4dCBub2RlIGxlZnQgYW5kIHJlbW92
ZSBpdCBpZiBzbwotICAgIGNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIGlmIChjaGlsZCAmJiAh
Y2hpbGQtPm5leHRTaWJsaW5nKCkgJiYgY2hpbGQtPmlzVGV4dE5vZGUoKSkgewotICAgICAgICBU
ZXh0SW1wbCAqdGV4dCA9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4oY2hpbGQpOwotICAgICAgICBp
ZiAodGV4dC0+ZGF0YSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNoaWxkLT5yZW1vdmUoZXhj
ZXB0aW9uY29kZSk7Ci0gICAgfQotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIE5vZGVJbXBsOjpw
cmVmaXgoKSBjb25zdAotewotICAgIC8vIEZvciBub2RlcyBvdGhlciB0aGFuIGVsZW1lbnRzIGFu
ZCBhdHRyaWJ1dGVzLCB0aGUgcHJlZml4IGlzIGFsd2F5cyBudWxsCi0gICAgcmV0dXJuIG51bGxB
dG9tOwotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICYv
Kl9wcmVmaXgqLywgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICAvLyBUaGUgc3BlYyBzYXlz
IHRoYXQgZm9yIG5vZGVzIG90aGVyIHRoYW4gZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIHByZWZp
eCBpcyBhbHdheXMgbnVsbC4KLSAgICAvLyBJdCBkb2VzIG5vdCBzYXkgd2hhdCB0byBkbyB3aGVu
IHRoZSB1c2VyIHRyaWVzIHRvIHNldCB0aGUgcHJlZml4IG9uIGFub3RoZXIgdHlwZSBvZgotICAg
IC8vIG5vZGUsIGhvd2V2ZXIgbW96aWxsYSB0aHJvd3MgYSBOQU1FU1BBQ0VfRVJSIGV4Y2VwdGlv
bgotICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5BTUVTUEFDRV9FUlI7Ci19Ci0K
LWNvbnN0IEF0b21pY1N0cmluZyYgTm9kZUltcGw6OmxvY2FsTmFtZSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGVtcHR5QXRvbTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBOb2RlSW1wbDo6bmFt
ZXNwYWNlVVJJKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVsbEF0b207Ci19Ci0KLXZvaWQgTm9k
ZUltcGw6OnNldEZpcnN0Q2hpbGQoTm9kZUltcGwgKikKLXsKLX0KLQotdm9pZCBOb2RlSW1wbDo6
c2V0TGFzdENoaWxkKE5vZGVJbXBsICopCi17Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6YWRk
Q2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkKQotewotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVj
dE5ld0NoaWxkKG5ld0NoaWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVmJ2Qg
YW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotICAgIHJldHVybiAwOwotfQotCi1ib29s
IE5vZGVJbXBsOjppc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBhcmVu
dCgpICYmIHBhcmVudCgpLT5pc0NvbnRlbnRFZGl0YWJsZSgpOwotfQotCi1RUmVjdCBOb2RlSW1w
bDo6Z2V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgaW50IF94LCBfeTsKLSAgICBpZihtX3JlbmRlciAm
JiBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlvbihfeCwgX3kpKQotICAgICAgICByZXR1cm4gUVJl
Y3QoIF94LCBfeSwgbV9yZW5kZXItPndpZHRoKCksIG1fcmVuZGVyLT5oZWlnaHQoKSApOwotCi0g
ICAgcmV0dXJuIFFSZWN0KCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldENoYW5nZWQoYm9vbCBi
KQotewotICAgIGlmIChiICYmICFhdHRhY2hlZCgpKSAvLyBjaGFuZ2VkIGNvbXBhcmVkIHRvIHdo
YXQ/Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1fY2hhbmdlZCA9IGI7Ci0gICAgaWYgKCBiICkg
ewotCU5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpOwotCXdoaWxlICggcCApIHsKLQkgICAgcC0+
c2V0SGFzQ2hhbmdlZENoaWxkKCB0cnVlICk7Ci0JICAgIHAgPSBwLT5wYXJlbnROb2RlKCk7Ci0J
fQotICAgICAgICBnZXREb2N1bWVudCgpLT5zZXREb2N1bWVudENoYW5nZWQodHJ1ZSk7Ci0gICAg
fQotfQotCi1ib29sIE5vZGVJbXBsOjppc0ZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gaXNGb2N1c2FibGUoKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNNb3Vz
ZUZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzRm9jdXNhYmxlKCk7Ci19Ci0KLXVu
c2lnbmVkIE5vZGVJbXBsOjpub2RlSW5kZXgoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpfdGVt
cE5vZGUgPSBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICB1bnNpZ25lZCBjb3VudD0wOwotICAgIGZv
ciggY291bnQ9MDsgX3RlbXBOb2RlOyBjb3VudCsrICkKLSAgICAgICAgX3RlbXBOb2RlID0gX3Rl
bXBOb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OmFkZEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUs
IEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyLCBjb25zdCBib29sIHVzZUNhcHR1cmUpCi17Ci0gICAg
aWYgKGdldERvY3VtZW50KCkgJiYgIWdldERvY3VtZW50KCktPmF0dGFjaGVkKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIERvY3VtZW50SW1wbDo6TGlzdGVuZXJUeXBlIHR5cGUgPSBzdGF0aWNf
Y2FzdDxEb2N1bWVudEltcGw6Okxpc3RlbmVyVHlwZT4oMCk7Ci0gICAgaWYgKGV2ZW50VHlwZSA9
PSBET01TdWJ0cmVlTW9kaWZpZWRFdmVudCkKLSAgICAgICAgdHlwZSA9IERvY3VtZW50SW1wbDo6
RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBE
T01Ob2RlSW5zZXJ0ZWRFdmVudCkKLSAgICAgICAgdHlwZSA9IERvY3VtZW50SW1wbDo6RE9NTk9E
RUlOU0VSVEVEX0xJU1RFTkVSOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBET01Ob2RlUmVt
b3ZlZEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01OT0RFUkVNT1ZFRF9M
SVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gRE9NTm9kZVJlbW92ZWRGcm9tRG9j
dW1lbnRFdmVudCkKLSAgICAgICAgdHlwZSA9IERvY3VtZW50SW1wbDo6RE9NTk9ERVJFTU9WRURG
Uk9NRE9DVU1FTlRfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERPTU5vZGVJ
bnNlcnRlZEludG9Eb2N1bWVudEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpE
T01OT0RFSU5TRVJURURJTlRPRE9DVU1FTlRfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRU
eXBlID09IERPTUF0dHJNb2RpZmllZEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBs
OjpET01BVFRSTU9ESUZJRURfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERP
TUNoYXJhY3RlckRhdGFNb2RpZmllZEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBs
OjpET01DSEFSQUNURVJEQVRBTU9ESUZJRURfTElTVEVORVI7Ci0gICAgaWYgKHR5cGUpCi0gICAg
ICAgIGdldERvY3VtZW50KCktPmFkZExpc3RlbmVyVHlwZSh0eXBlKTsKLQotICAgIGlmICghbV9y
ZWdkTGlzdGVuZXJzKSB7Ci0gICAgICAgIG1fcmVnZExpc3RlbmVycyA9IG5ldyBRUHRyTGlzdDxS
ZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj47Ci0JbV9yZWdkTGlzdGVuZXJzLT5zZXRBdXRvRGVsZXRl
KHRydWUpOwotICAgIH0KLQotICAgIGxpc3RlbmVyLT5yZWYoKTsKLQotICAgIC8vIFJlbW92ZSBl
eGlzdGluZyBpZGVudGljYWwgbGlzdGVuZXIgc2V0IHdpdGggaWRlbnRpY2FsIGFyZ3VtZW50cy4K
LSAgICAvLyBUaGUgRE9NMiBzcGVjIHNheXMgdGhhdCAiZHVwbGljYXRlIGluc3RhbmNlcyBhcmUg
ZGlzY2FyZGVkIiBpbiB0aGlzIGNhc2UuCi0gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5
cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKLQotICAgIC8vIGFkZGluZyB0aGUgZmlyc3Qgb25l
Ci0gICAgaWYgKG1fcmVnZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3VtZW50KCkgJiYg
IWluRG9jdW1lbnQoKSkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+cmVnaXN0ZXJEaXNjb25uZWN0
ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotICAgICAgICAKLSAgICBtX3JlZ2RMaXN0
ZW5lcnMtPmFwcGVuZChuZXcgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0
ZW5lciwgdXNlQ2FwdHVyZSkpOwotCi0gICAgbGlzdGVuZXItPmRlcmVmKCk7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OnJlbW92ZUV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5
cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUpCi17Ci0gICAgaWYg
KCFtX3JlZ2RMaXN0ZW5lcnMpIC8vIG5vdGhpbmcgdG8gcmVtb3ZlCi0gICAgICAgIHJldHVybjsK
LQotICAgIFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyIHJsKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVz
ZUNhcHR1cmUpOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5l
cj4gaXQoKm1fcmVnZExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkK
LSAgICAgICAgaWYgKCooaXQuY3VycmVudCgpKSA9PSBybCkgewotICAgICAgICAgICAgbV9yZWdk
TGlzdGVuZXJzLT5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsKLSAgICAgICAgICAgIC8vIHJlbW92
ZWQgbGFzdAotICAgICAgICAgICAgaWYgKG1fcmVnZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdl
dERvY3VtZW50KCkgJiYgIWluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVu
dCgpLT51bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpyZW1v
dmVBbGxFdmVudExpc3RlbmVycygpCi17Ci0gICAgZGVsZXRlIG1fcmVnZExpc3RlbmVyczsKLSAg
ICBtX3JlZ2RMaXN0ZW5lcnMgPSAwOwotfQotCi12b2lkIE5vZGVJbXBsOjpyZW1vdmVIVE1MRXZl
bnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBpZiAoIW1f
cmVnZExpc3RlbmVycykgLy8gbm90aGluZyB0byByZW1vdmUKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQoKm1fcmVnZExp
c3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaWYgKGl0
LmN1cnJlbnQoKS0+ZXZlbnRUeXBlKCkgPT0gZXZlbnRUeXBlICYmIGl0LmN1cnJlbnQoKS0+bGlz
dGVuZXIoKS0+ZXZlbnRMaXN0ZW5lclR5cGUoKSA9PSAiX2todG1sX0hUTUxFdmVudExpc3RlbmVy
IikgewotICAgICAgICAgICAgbV9yZWdkTGlzdGVuZXJzLT5yZW1vdmVSZWYoaXQuY3VycmVudCgp
KTsKLSAgICAgICAgICAgIC8vIHJlbW92ZWQgbGFzdAotICAgICAgICAgICAgaWYgKG1fcmVnZExp
c3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3VtZW50KCkgJiYgIWluRG9jdW1lbnQoKSkKLSAg
ICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT51bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdp
dGhFdmVudExpc3RlbmVycyh0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
fQotCi12b2lkIE5vZGVJbXBsOjpzZXRIVE1MRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJp
bmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpCi17Ci0gICAgLy8gSW4gY2Fz
ZSB3ZSBhcmUgdGhlIG9ubHkgb25lIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gaXQsIHdlIGRvbid0
IHdhbnQgcmVtb3ZlSFRNTEV2ZW50TGlzdGVuZXIgdG8gZGVzdHJveSBpdC4KLSAgICBpZiAobGlz
dGVuZXIpCi0gICAgICAgIGxpc3RlbmVyLT5yZWYoKTsKLSAgICByZW1vdmVIVE1MRXZlbnRMaXN0
ZW5lcihldmVudFR5cGUpOwotICAgIGlmIChsaXN0ZW5lcikgewotICAgICAgICBhZGRFdmVudExp
c3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTsKLSAgICAgICAgbGlzdGVuZXItPmRl
cmVmKCk7Ci0gICAgfQotfQotCi1FdmVudExpc3RlbmVyICpOb2RlSW1wbDo6Z2V0SFRNTEV2ZW50
TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0gICAgaWYgKCFtX3Jl
Z2RMaXN0ZW5lcnMpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxS
ZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQoKm1fcmVnZExpc3RlbmVycyk7Ci0gICAgZm9yICg7
IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaWYgKGl0LmN1cnJlbnQoKS0+ZXZlbnRUeXBl
KCkgPT0gZXZlbnRUeXBlICYmIGl0LmN1cnJlbnQoKS0+bGlzdGVuZXIoKS0+ZXZlbnRMaXN0ZW5l
clR5cGUoKSA9PSAiX2todG1sX0hUTUxFdmVudExpc3RlbmVyIikKLSAgICAgICAgICAgIHJldHVy
biBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotYm9vbCBO
b2RlSW1wbDo6ZGlzcGF0Y2hFdmVudChFdmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2Rl
LCBib29sIHRlbXBFdmVudCkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4o
KSk7Ci0gICAgaWYgKCFldnQgfHwgZXZ0LT50eXBlKCkuaXNFbXB0eSgpKSB7IAotICAgICAgICBl
eGNlcHRpb25jb2RlID0gRXZlbnRFeGNlcHRpb246Ol9FWENFUFRJT05fT0ZGU0VUICsgRXZlbnRF
eGNlcHRpb246OlVOU1BFQ0lGSUVEX0VWRU5UX1RZUEVfRVJSOwotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotCi0gICAgZXZ0LT5yZWYoKTsKLQotICAgIGV2dC0+c2V0VGFyZ2V0KHRoaXMp
OwotCi0gICAgLy8gV2UndmUgaGFkIGF0IGxlYXN0IG9uZSByZXBvcnQgb2YgYSBjcmFzaCBvbiBh
IHBhZ2Ugd2hlcmUgZG9jdW1lbnQgaXMgbnVsbCBoZXJlLgotICAgIC8vIFVuZm9ydHVuYXRlbHkg
dGhhdCBwYWdlIG5vIGxvbmdlciBleGlzdHMsIGJ1dCB3ZSdsbCBtYWtlIHRoaXMgY29kZSByb2J1
c3QgYWdhaW5zdAotICAgIC8vIHRoYXQgYW55d2F5LgotICAgIC8vIEZJWE1FOiBNdWNoIGNvZGUg
aW4gdGhpcyBjbGFzcyBhc3N1bWVzIGRvY3VtZW50IGlzIG5vbi1udWxsOyBpdCB3b3VsZCBiZSBi
ZXR0ZXIgdG8KLSAgICAvLyBlbnN1cmUgdGhhdCBkb2N1bWVudCBjYW4gbmV2ZXIgYmUgbnVsbC4K
LSAgICBGcmFtZSAqZnJhbWUgPSAwOwotICAgIEtIVE1MVmlldyAqdmlldyA9IDA7Ci0KLSAgICBp
ZiAoRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpKSB7Ci0gICAgICAgIGZyYW1lID0g
ZG9jLT5mcmFtZSgpOwotICAgICAgICB2aWV3ID0gZG9jLT52aWV3KCk7Ci0gICAgICAgIC8vIFNp
bmNlIGV2ZW50IGhhbmRsaW5nIGNvZGUgY291bGQgY2F1c2UgdGhpcyBvYmplY3QgdG8gYmUgZGVs
ZXRlZCwgZ3JhYiBhIHJlZmVyZW5jZSB0byB0aGUgdmlldyBub3cKLSAgICAgICAgaWYgKHZpZXcp
Ci0gICAgICAgICAgICB2aWV3LT5yZWYoKTsKLSAgICB9ICAgIAotCi0gICAgYm9vbCByZXQgPSBk
aXNwYXRjaEdlbmVyaWNFdmVudCggZXZ0LCBleGNlcHRpb25jb2RlICk7Ci0KLSAgICAvLyBJZiB0
ZW1wRXZlbnQgaXMgdHJ1ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBET00gaW1wbGVtZW50YXRpb24g
d2lsbCBub3QgYmUgc3RvcmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQsIGkuZS4KLSAgICAv
LyB0aGVyZSBpcyBubyB3YXkgdG8gcmV0cmlldmUgaXQgZnJvbSBqYXZhc2NyaXB0IGlmIGEgc2Ny
aXB0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdCBpbiBhIHZhcmlhYmxl
LgotICAgIC8vIFNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBrZWVw
IHRoZSBldmVudCBpbiBpdCdzIGNhY2hlCi0gICAgaWYgKHRlbXBFdmVudCAmJiBmcmFtZSAmJiBm
cmFtZS0+alNjcmlwdCgpKQotICAgICAgICBmcmFtZS0+alNjcmlwdCgpLT5maW5pc2hlZFdpdGhF
dmVudChldnQpOwotCi0gICAgaWYgKHZpZXcpCi0gICAgICAgIHZpZXctPmRlcmVmKCk7Ci0KLSAg
ICBldnQtPmRlcmVmKCk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1ib29sIE5vZGVJbXBsOjpk
aXNwYXRjaEdlbmVyaWNFdmVudCggRXZlbnRJbXBsICpldnQsIGludCAmLypleGNlcHRpb25jb2Rl
ICovKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBhc3Nl
cnQoZXZ0LT50YXJnZXQoKSk7Ci0KLSAgICBldnQtPnJlZigpOwotCi0gICAgLy8gIyMjIGNoZWNr
IHRoYXQgdHlwZSBzcGVjaWZpZWQKLQotICAgIC8vIHdvcmsgb3V0IHdoYXQgbm9kZXMgdG8gc2Vu
ZCBldmVudCB0bwotICAgIFFQdHJMaXN0PE5vZGVJbXBsPiBub2RlQ2hhaW47Ci0gICAgTm9kZUlt
cGwgKm47Ci0gICAgZm9yIChuID0gdGhpczsgbjsgbiA9IG4tPnBhcmVudE5vZGUoKSkgewotICAg
ICAgICBuLT5yZWYoKTsKLSAgICAgICAgbm9kZUNoYWluLnByZXBlbmQobik7Ci0gICAgfQotCi0g
ICAgCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxOb2RlSW1wbD4gaXQobm9kZUNoYWluKTsKLSAgICAK
LSAgICAvLyBCZWZvcmUgd2UgYmVnaW4gZGlzcGF0Y2hpbmcgZXZlbnRzLCBnaXZlIHRoZSB0YXJn
ZXQgbm9kZSBhIGNoYW5jZSB0byBkbyBzb21lIHdvcmsgcHJpb3IKLSAgICAvLyB0byB0aGUgRE9N
IGV2ZW50IGhhbmRsZXJzIGdldHRpbmcgYSBjcmFjay4KLSAgICB2b2lkKiBkYXRhID0gcHJlRGlz
cGF0Y2hFdmVudEhhbmRsZXIoZXZ0KTsKLQotICAgIC8vIHRyaWdnZXIgYW55IGNhcHR1cmluZyBl
dmVudCBoYW5kbGVycyBvbiBvdXIgd2F5IGRvd24KLSAgICBldnQtPnNldEV2ZW50UGhhc2UoRXZl
bnQ6OkNBUFRVUklOR19QSEFTRSk7Ci0gICAgaXQudG9GaXJzdCgpOwotICAgIGZvciAoOyBpdC5j
dXJyZW50KCkgJiYgaXQuY3VycmVudCgpICE9IHRoaXMgJiYgIWV2dC0+cHJvcGFnYXRpb25TdG9w
cGVkKCk7ICsraXQpIHsKLSAgICAgICAgZXZ0LT5zZXRDdXJyZW50VGFyZ2V0KGl0LmN1cnJlbnQo
KSk7Ci0gICAgICAgIGl0LmN1cnJlbnQoKS0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0LHRydWUpOwot
ICAgIH0KLQotICAgIC8vIGRpc3BhdGNoIHRvIHRoZSBhY3R1YWwgdGFyZ2V0IG5vZGUKLSAgICBp
dC50b0xhc3QoKTsKLSAgICBpZiAoIWV2dC0+cHJvcGFnYXRpb25TdG9wcGVkKCkpIHsKLSAgICAg
ICAgZXZ0LT5zZXRFdmVudFBoYXNlKEV2ZW50OjpBVF9UQVJHRVQpOwotICAgICAgICBldnQtPnNl
dEN1cnJlbnRUYXJnZXQoaXQuY3VycmVudCgpKTsKLQotCWlmICghZXZ0LT5wcm9wYWdhdGlvblN0
b3BwZWQoKSkKLSAgICAgICAgICAgIGl0LmN1cnJlbnQoKS0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0
LGZhbHNlKTsKLSAgICB9Ci0gICAgLS1pdDsKLQotICAgIC8vIG9rLCBub3cgYnViYmxlIHVwIGFn
YWluIChvbmx5IG5vbi1jYXB0dXJpbmcgZXZlbnQgaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQpCi0g
ICAgLy8gIyMjIHJlY2FsY3VsYXRlIHRoZSBub2RlIGNoYWluIGhlcmU/IChlLmcuIGlmIHRhcmdl
dCBub2RlIG1vdmVkIGluIGRvY3VtZW50IGJ5IHByZXZpb3VzIGV2ZW50IGhhbmRsZXJzKQotICAg
IC8vIG5vLiB0aGUgRE9NIHNwZWNzIHNheXM6Ci0gICAgLy8gVGhlIGNoYWluIG9mIEV2ZW50VGFy
Z2V0cyBmcm9tIHRoZSBldmVudCB0YXJnZXQgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZQotICAgIC8v
IGlzIGRldGVybWluZWQgYmVmb3JlIHRoZSBpbml0aWFsIGRpc3BhdGNoIG9mIHRoZSBldmVudC4K
LSAgICAvLyBJZiBtb2RpZmljYXRpb25zIG9jY3VyIHRvIHRoZSB0cmVlIGR1cmluZyBldmVudCBw
cm9jZXNzaW5nLAotICAgIC8vIGV2ZW50IGZsb3cgd2lsbCBwcm9jZWVkIGJhc2VkIG9uIHRoZSBp
bml0aWFsIHN0YXRlIG9mIHRoZSB0cmVlLgotICAgIC8vCi0gICAgLy8gc2luY2UgdGhlIGluaXRp
YWwgZGlzcGF0Y2ggaXMgYmVmb3JlIHRoZSBjYXB0dXJpbmcgcGhhc2UsCi0gICAgLy8gdGhlcmUn
cyBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBub2RlIGNoYWluLgotICAgIC8vICh0b2JpYXMp
Ci0KLSAgICBpZiAoZXZ0LT5idWJibGVzKCkpIHsKLSAgICAgICAgZXZ0LT5zZXRFdmVudFBoYXNl
KEV2ZW50OjpCVUJCTElOR19QSEFTRSk7Ci0gICAgICAgIGZvciAoOyBpdC5jdXJyZW50KCkgJiYg
IWV2dC0+cHJvcGFnYXRpb25TdG9wcGVkKCkgJiYgIWV2dC0+Z2V0Q2FuY2VsQnViYmxlKCk7IC0t
aXQpIHsKLSAgICAgICAgICAgIGV2dC0+c2V0Q3VycmVudFRhcmdldChpdC5jdXJyZW50KCkpOwot
ICAgICAgICAgICAgaXQuY3VycmVudCgpLT5oYW5kbGVMb2NhbEV2ZW50cyhldnQsZmFsc2UpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgZXZ0LT5zZXRDdXJyZW50VGFyZ2V0KDApOwotICAgIGV2
dC0+c2V0RXZlbnRQaGFzZSgwKTsgLy8gSSBndWVzcyB0aGlzIGlzIGNvcnJlY3QsIHRoZSBzcGVj
IGRvZXMgbm90IHNlZW0gdG8gc2F5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0
aGluZyBhYm91dCB0aGUgZGVmYXVsdCBldmVudCBoYW5kbGVyIHBoYXNlLgotCi0KLSAgICAvLyBO
b3cgY2FsbCB0aGUgcG9zdCBkaXNwYXRjaC4KLSAgICBwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIo
ZXZ0LCBkYXRhKTsKLSAgICAKLSAgICBpZiAoZXZ0LT5idWJibGVzKCkpIHsKLQkvLyBub3cgd2Ug
Y2FsbCBhbGwgZGVmYXVsdCBldmVudCBoYW5kbGVycyAodGhpcyBpcyBub3QgcGFydCBvZiBET00g
LSBpdCBpcyBpbnRlcm5hbCB0byBraHRtbCkKLQotCWl0LnRvTGFzdCgpOwotCWZvciAoOyBpdC5j
dXJyZW50KCkgJiYgIWV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpICYmICFldnQtPmRlZmF1bHRIYW5k
bGVkKCk7IC0taXQpCi0JICAgIGl0LmN1cnJlbnQoKS0+ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQp
OwotICAgIH0KLSAgICAKLSAgICAvLyBkZXJlZiBhbGwgbm9kZXMgaW4gY2hhaW4KLSAgICBpdC50
b0ZpcnN0KCk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaXQuY3Vy
cmVudCgpLT5kZXJlZigpOyAvLyB0aGlzIG1heSBkZWxldGUgdXMKLQotICAgIERvY3VtZW50SW1w
bDo6dXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nKCk7Ci0KLSAgICBib29sIGRlZmF1bHRQcmV2ZW50
ZWQgPSBldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKTsKLQotICAgIGV2dC0+ZGVyZWYoKTsKLQotICAg
IHJldHVybiAhZGVmYXVsdFByZXZlbnRlZDsgLy8gIyMjIHdoYXQgaWYgZGVmYXVsdFByZXZlbnRl
ZCB3YXMgY2FsbGVkIGJlZm9yZSBkaXNwYXRjaEV2ZW50PwotfQotCi1ib29sIE5vZGVJbXBsOjpk
aXNwYXRjaEhUTUxFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgYm9vbCBjYW5C
dWJibGVBcmcsIGJvb2wgY2FuY2VsYWJsZUFyZykKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0
Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIHJldHVybiBk
aXNwYXRjaEV2ZW50KG5ldyBFdmVudEltcGwoZXZlbnRUeXBlLCBjYW5CdWJibGVBcmcsIGNhbmNl
bGFibGVBcmcpLCBleGNlcHRpb25jb2RlLCB0cnVlKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlz
cGF0Y2hXaW5kb3dFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgYm9vbCBjYW5C
dWJibGVBcmcsIGJvb2wgY2FuY2VsYWJsZUFyZykKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0
Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIFJlZlB0cjxF
dmVudEltcGw+IGV2dCA9IG5ldyBFdmVudEltcGwoZXZlbnRUeXBlLCBjYW5CdWJibGVBcmcsIGNh
bmNlbGFibGVBcmcpOwotICAgIFJlZlB0cjxEb2N1bWVudEltcGw+IGRvYyA9IGdldERvY3VtZW50
KCk7Ci0gICAgZXZ0LT5zZXRUYXJnZXQoZG9jLmdldCgpKTsKLSAgICBib29sIHIgPSBkaXNwYXRj
aEdlbmVyaWNFdmVudChldnQuZ2V0KCksIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmICghZXZ0LT5k
ZWZhdWx0UHJldmVudGVkKCkgJiYgZG9jKQotIAlkb2MtPmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0
LmdldCgpKTsKLQotICAgIGlmIChldmVudFR5cGUgPT0gbG9hZEV2ZW50ICYmICFldnQtPnByb3Bh
Z2F0aW9uU3RvcHBlZCgpICYmIGRvYykgewotICAgICAgICAvLyBGb3Igb25sb2FkIGV2ZW50cywg
c2VuZCB0aGVtIHRvIHRoZSBlbmNsb3NpbmcgZnJhbWUgb25seS4KLSAgICAgICAgLy8gVGhpcyBp
cyBhIERPTSBleHRlbnNpb24gYW5kIGlzIGluZGVwZW5kZW50IG9mIGJ1YmJsaW5nL2NhcHR1cmlu
ZyBydWxlcyBvZgotICAgICAgICAvLyB0aGUgRE9NLiAgWW91IHNlbmQgdGhlIGV2ZW50IG9ubHkg
dG8gdGhlIGVuY2xvc2luZyBmcmFtZS4gIEl0IGRvZXMgbm90Ci0gICAgICAgIC8vIGJ1YmJsZSB0
aHJvdWdoIHRoZSBwYXJlbnQgZG9jdW1lbnQuCi0gICAgICAgIEVsZW1lbnRJbXBsKiBlbHQgPSBk
b2MtPm93bmVyRWxlbWVudCgpOwotICAgICAgICBpZiAoZWx0ICYmIChlbHQtPmdldERvY3VtZW50
KCktPmRvbWFpbigpLmlzTnVsbCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGVsdC0+Z2V0RG9j
dW1lbnQoKS0+ZG9tYWluKCkgPT0gZG9jLT5kb21haW4oKSkpIHsKLSAgICAgICAgICAgIC8vIFdl
IGFsc28gZG8gYSBzZWN1cml0eSBjaGVjaywgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyB0
aGUgZW5jbG9zaW5nCi0gICAgICAgICAgICAvLyBpZnJhbWUgdG8gc2VlIGxvYWRzIG9mIGNoaWxk
IGRvY3VtZW50cyBpbiBvdGhlciBkb21haW5zLgotICAgICAgICAgICAgZXZ0LT5zZXRDdXJyZW50
VGFyZ2V0KGVsdCk7Ci0KLSAgICAgICAgICAgIC8vIENhcHR1cmluZyBmaXJzdC4KLSAgICAgICAg
ICAgIGVsdC0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0LmdldCgpLCB0cnVlKTsKLQotICAgICAgICAg
ICAgLy8gQnViYmxpbmcgc2Vjb25kLgotICAgICAgICAgICAgaWYgKCFldnQtPnByb3BhZ2F0aW9u
U3RvcHBlZCgpKQotICAgICAgICAgICAgICAgIGVsdC0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0Lmdl
dCgpLCBmYWxzZSk7Ci0gICAgICAgICAgICByID0gIWV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHI7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRp
c3BhdGNoTW91c2VFdmVudChRTW91c2VFdmVudCAqX21vdXNlLCBjb25zdCBBdG9taWNTdHJpbmcg
Jm92ZXJyaWRlVHlwZSwgaW50IG92ZXJyaWRlRGV0YWlsKQotewotICAgIGFzc2VydCghZXZlbnRE
aXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpbnQgZGV0YWlsID0gb3ZlcnJpZGVEZXRhaWw7IC8v
IGRlZmF1bHRzIHRvIDAKLSAgICBBdG9taWNTdHJpbmcgZXZlbnRUeXBlOwotICAgIGlmICghb3Zl
cnJpZGVUeXBlLmlzRW1wdHkoKSkgewotICAgICAgICBldmVudFR5cGUgPSBvdmVycmlkZVR5cGU7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChfbW91c2UtPnR5cGUoKSkgewotICAgICAg
ICAgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3M6Ci0gICAgICAgICAgICAgICAgZXZl
bnRUeXBlID0gbW91c2Vkb3duRXZlbnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25SZWxlYXNlOgotICAgICAgICAgICAgICAgIGV2
ZW50VHlwZSA9IG1vdXNldXBFdmVudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrOgotICAgICAgICAgICAgICAgIGV2
ZW50VHlwZSA9IGNsaWNrRXZlbnQ7Ci0gICAgICAgICAgICAgICAgZGV0YWlsID0gX21vdXNlLT5j
bGlja0NvdW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFFF
dmVudDo6TW91c2VNb3ZlOgotICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IG1vdXNlbW92ZUV2
ZW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBjbGllbnRYID0g
MDsKLSAgICBpbnQgY2xpZW50WSA9IDA7Ci0gICAgaWYgKEtIVE1MVmlldyAqdmlldyA9IGdldERv
Y3VtZW50KCktPnZpZXcoKSkKLSAgICAgICAgdmlldy0+dmlld3BvcnRUb0NvbnRlbnRzKF9tb3Vz
ZS0+eCgpLCBfbW91c2UtPnkoKSwgY2xpZW50WCwgY2xpZW50WSk7Ci0gICAgaW50IHNjcmVlblgg
PSBfbW91c2UtPmdsb2JhbFgoKTsKLSAgICBpbnQgc2NyZWVuWSA9IF9tb3VzZS0+Z2xvYmFsWSgp
OwotCi0gICAgaW50IGJ1dHRvbiA9IC0xOwotICAgIHN3aXRjaCAoX21vdXNlLT5idXR0b24oKSkg
ewotICAgICAgICBjYXNlIFF0OjpMZWZ0QnV0dG9uOgotICAgICAgICAgICAgYnV0dG9uID0gMDsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFF0OjpNaWRCdXR0b246Ci0gICAgICAg
ICAgICBidXR0b24gPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUXQ6OlJp
Z2h0QnV0dG9uOgotICAgICAgICAgICAgYnV0dG9uID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgYm9vbCBj
dHJsS2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0OjpDb250cm9sQnV0dG9uKTsKLSAgICBib29s
IGFsdEtleSA9IChfbW91c2UtPnN0YXRlKCkgJiBRdDo6QWx0QnV0dG9uKTsKLSAgICBib29sIHNo
aWZ0S2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0OjpTaGlmdEJ1dHRvbik7Ci0gICAgYm9vbCBt
ZXRhS2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0OjpNZXRhQnV0dG9uKTsKLSAgICAKLSAgICBy
ZXR1cm4gZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50VHlwZSwgYnV0dG9uLCBkZXRhaWwsCi0gICAg
ICAgIGNsaWVudFgsIGNsaWVudFksIHNjcmVlblgsIHNjcmVlblksCi0gICAgICAgIGN0cmxLZXks
IGFsdEtleSwgc2hpZnRLZXksIG1ldGFLZXkpOwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRj
aFNpbXVsYXRlZE1vdXNlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0g
ICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIC8vIExpa2UgR2Vja28s
IHdlIGp1c3QgcGFzcyAwIGZvciBldmVyeXRoaW5nIHdoZW4gd2UgbWFrZSBhIGZha2UgbW91c2Ug
ZXZlbnQuCi0gICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgaW5zdGVhZCBnaXZlcyB0aGUgY3VycmVu
dCBtb3VzZSBwb3NpdGlvbiBhbmQgc3RhdGUuCi0gICAgcmV0dXJuIGRpc3BhdGNoTW91c2VFdmVu
dChldmVudFR5cGUsIDAsIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNl
KTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0Y2hNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0
cmluZyAmZXZlbnRUeXBlLCBpbnQgYnV0dG9uLCBpbnQgZGV0YWlsLAotICAgIGludCBjbGllbnRY
LCBpbnQgY2xpZW50WSwgaW50IHNjcmVlblgsIGludCBzY3JlZW5ZLAotICAgIGJvb2wgY3RybEtl
eSwgYm9vbCBhbHRLZXksIGJvb2wgc2hpZnRLZXksIGJvb2wgbWV0YUtleSkKLXsKLSAgICBhc3Nl
cnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaWYgKGRpc2FibGVkKCkpIC8vIERv
bid0IGV2ZW4gc2VuZCBET00gZXZlbnRzIGZvciBkaXNhYmxlZCBjb250cm9scy4uCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgaWYgKGV2ZW50VHlwZS5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsgLy8gU2hvdWxkbid0IGhhcHBlbi4KLQotICAgIC8vIERpc3BhdGNoaW5nIHRo
ZSBmaXJzdCBldmVudCBjYW4gZWFzaWx5IHJlc3VsdCBpbiB0aGlzIG5vZGUgYmVpbmcgZGVzdHJv
eWVkLgotICAgIC8vIFNpbmNlIHdlIGRpc3BhdGNoIHVwIHRvIHRocmVlIGV2ZW50cyBoZXJlLCB3
ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSByZWZlcmVuY2VkCi0gICAgLy8gc28gdGhlIHBvaW50
ZXIgd2lsbCBiZSBnb29kIGZvciB0aGUgdHdvIHN1YnNlcXVlbnQgb25lcy4KLSAgICBSZWZQdHI8
Tm9kZUltcGw+IHByb3RlY3QodGhpcyk7Ci0KLSAgICBib29sIGNhbmNlbGFibGUgPSBldmVudFR5
cGUgIT0gbW91c2Vtb3ZlRXZlbnQ7Ci0gICAgCi0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwot
Ci0gICAgYm9vbCBzd2FsbG93RXZlbnQgPSBmYWxzZTsKLQotICAgIEV2ZW50SW1wbCAqbWUgPSBu
ZXcgTW91c2VFdmVudEltcGwoZXZlbnRUeXBlLHRydWUsY2FuY2VsYWJsZSxnZXREb2N1bWVudCgp
LT5kZWZhdWx0VmlldygpLAotICAgICAgICAgICAgICAgICAgIGRldGFpbCxzY3JlZW5YLHNjcmVl
blksY2xpZW50WCxjbGllbnRZLGN0cmxLZXksYWx0S2V5LHNoaWZ0S2V5LG1ldGFLZXksCi0gICAg
ICAgICAgICAgICAgICAgYnV0dG9uLDApOwotICAgIG1lLT5yZWYoKTsKLSAgICBkaXNwYXRjaEV2
ZW50KG1lLCBleGNlcHRpb25jb2RlLCB0cnVlKTsKLSAgICBib29sIGRlZmF1bHRIYW5kbGVkID0g
bWUtPmRlZmF1bHRIYW5kbGVkKCk7Ci0gICAgYm9vbCBkZWZhdWx0UHJldmVudGVkID0gbWUtPmRl
ZmF1bHRQcmV2ZW50ZWQoKTsKLSAgICBpZiAoZGVmYXVsdEhhbmRsZWQgfHwgZGVmYXVsdFByZXZl
bnRlZCkKLSAgICAgICAgc3dhbGxvd0V2ZW50ID0gdHJ1ZTsKLSAgICBtZS0+ZGVyZWYoKTsKLQot
ICAgIC8vIFNwZWNpYWwgY2FzZTogSWYgaXQncyBhIGRvdWJsZSBjbGljayBldmVudCwgd2UgYWxz
byBzZW5kIHRoZSBLSFRNTF9EQkxDTElDSyBldmVudC4gVGhpcyBpcyBub3QgcGFydAotICAgIC8v
IG9mIHRoZSBET00gc3BlY3MsIGJ1dCBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhl
IG9uZGJsY2xpY2s9IiIgYXR0cmlidXRlLiAgVGhpcyBpcyB0cmVhdGVkCi0gICAgLy8gYXMgYSBz
ZXBhcmF0ZSBldmVudCBpbiBvdGhlciBET00tY29tcGxpYW50IGJyb3dzZXJzIGxpa2UgRmlyZWZv
eCwgYW5kIHNvIHdlIGRvIHRoZSBzYW1lLgotICAgIGlmIChldmVudFR5cGUgPT0gY2xpY2tFdmVu
dCAmJiBkZXRhaWwgPT0gMikgewotICAgICAgICBtZSA9IG5ldyBNb3VzZUV2ZW50SW1wbChraHRt
bERibGNsaWNrRXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsY2Fu
Y2VsYWJsZSxnZXREb2N1bWVudCgpLT5kZWZhdWx0VmlldygpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkZXRhaWwsc2NyZWVuWCxzY3JlZW5ZLGNsaWVudFgsY2xpZW50WSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybEtleSxhbHRLZXksc2hpZnRLZXksbWV0
YUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLDApOwotICAgICAg
ICBtZS0+cmVmKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0SGFuZGxlZCkKLSAgICAgICAgICAgIG1l
LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICBkaXNwYXRjaEV2ZW50KG1lLGV4Y2VwdGlv
bmNvZGUsdHJ1ZSk7Ci0gICAgICAgIGlmIChtZS0+ZGVmYXVsdEhhbmRsZWQoKSB8fCBtZS0+ZGVm
YXVsdFByZXZlbnRlZCgpKQotICAgICAgICAgICAgc3dhbGxvd0V2ZW50ID0gdHJ1ZTsKLSAgICAg
ICAgbWUtPmRlcmVmKCk7Ci0gICAgfQotCi0gICAgLy8gQWxzbyBzZW5kIGEgRE9NQWN0aXZhdGUg
ZXZlbnQsIHdoaWNoIGNhdXNlcyB0aGluZ3MgbGlrZSBmb3JtIHN1Ym1pc3Npb25zIHRvIG9jY3Vy
LgotICAgIGlmIChldmVudFR5cGUgPT0gY2xpY2tFdmVudCAmJiAhZGVmYXVsdFByZXZlbnRlZCkK
LSAgICAgICAgZGlzcGF0Y2hVSUV2ZW50KERPTUFjdGl2YXRlRXZlbnQsIGRldGFpbCk7Ci0KLSAg
ICByZXR1cm4gc3dhbGxvd0V2ZW50OwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaFVJRXZl
bnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIGludCBkZXRhaWwpCi17Ci0gICAgYXNz
ZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGFzc2VydCAoISggKGV2ZW50VHlw
ZSAhPSBET01Gb2N1c0luRXZlbnQgJiYKLSAgICAgICAgICAgICAgICBldmVudFR5cGUgIT0gRE9N
Rm9jdXNPdXRFdmVudCAmJgotICAgICAgICAgICAgICAgIGV2ZW50VHlwZSAhPSBET01BY3RpdmF0
ZUV2ZW50KSkpOwotCi0gICAgaWYgKCFnZXREb2N1bWVudCgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBib29sIGNhbmNlbGFibGUgPSBmYWxzZTsKLSAgICBpZiAoZXZlbnRUeXBlID09
IERPTUFjdGl2YXRlRXZlbnQpCi0gICAgICAgIGNhbmNlbGFibGUgPSB0cnVlOwotCi0gICAgaW50
IGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgVUlFdmVudEltcGwgKmV2dCA9IG5ldyBVSUV2ZW50
SW1wbChldmVudFR5cGUsIHRydWUsIGNhbmNlbGFibGUsIGdldERvY3VtZW50KCktPmRlZmF1bHRW
aWV3KCksIGRldGFpbCk7Ci0gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQoZXZ0LGV4Y2VwdGlvbmNv
ZGUsdHJ1ZSk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnJlZ2lzdGVyTm9kZUxpc3QoTm9kZUxpc3RJ
bXBsICpsaXN0KQotewotICAgIGlmICghbV9ub2RlTGlzdHMpIHsKLSAgICAgICAgbV9ub2RlTGlz
dHMgPSBuZXcgUVB0ckRpY3Q8Tm9kZUxpc3RJbXBsPjsKLSAgICB9Ci0KLSAgICBtX25vZGVMaXN0
cy0+aW5zZXJ0KGxpc3QsIGxpc3QpOwotfQotCi12b2lkIE5vZGVJbXBsOjp1bnJlZ2lzdGVyTm9k
ZUxpc3QoTm9kZUxpc3RJbXBsICpsaXN0KQotewotICAgIGlmICghbV9ub2RlTGlzdHMpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fbm9kZUxpc3RzLT5yZW1vdmUobGlzdCk7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6Om5vdGlmeUxvY2FsTm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpCi17Ci0gICAg
aWYgKCFtX25vZGVMaXN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVB0ckRpY3RJdGVyYXRv
cjxOb2RlTGlzdEltcGw+IGkoKm1fbm9kZUxpc3RzKTsKLQotICAgIHdoaWxlIChOb2RlTGlzdElt
cGwgKmxpc3QgPSBpLmN1cnJlbnQoKSkgewotICAgICAgICBsaXN0LT5yb290Tm9kZUF0dHJpYnV0
ZUNoYW5nZWQoKTsKLSAgICAgICAgKytpOwotICAgIH0KLX0KLQotdm9pZCBOb2RlSW1wbDo6bm90
aWZ5Tm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpCi17Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9
IHRoaXM7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgbi0+bm90aWZ5TG9jYWxO
b2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0gICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpu
b3RpZnlMb2NhbE5vZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgaWYgKCFtX25vZGVM
aXN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVB0ckRpY3RJdGVyYXRvcjxOb2RlTGlzdElt
cGw+IGkoKm1fbm9kZUxpc3RzKTsKLQotICAgIHdoaWxlIChOb2RlTGlzdEltcGwgKmxpc3QgPSBp
LmN1cnJlbnQoKSkgewotICAgICAgICBsaXN0LT5yb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpOwot
ICAgICAgICArK2k7Ci0gICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpub3RpZnlOb2RlTGlzdHND
aGlsZHJlbkNoYW5nZWQoKQotewotICAgIGZvciAoTm9kZUltcGwgKm4gPSB0aGlzOyBuOyBuID0g
bi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIG4tPm5vdGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRy
ZW5DaGFuZ2VkKCk7Ci0gICAgfQotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaFN1YnRyZWVN
b2RpZmllZEV2ZW50KGJvb2wgc2VuZENoaWxkcmVuQ2hhbmdlZCkKLXsKLSAgICBhc3NlcnQoIWV2
ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0KLSAgICAvLyBGSVhNRTogUHVsbCB0aGlzIHdob2xl
IGlmIGNsYXVzZSBvdXQgb2YgdGhpcyBmdW5jdGlvbi4KLSAgICBpZiAoc2VuZENoaWxkcmVuQ2hh
bmdlZCkgewotICAgICAgICBub3RpZnlOb2RlTGlzdHNDaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAg
ICAgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG5vdGlmeU5vZGVMaXN0
c0F0dHJpYnV0ZUNoYW5nZWQoKTsgLy8gRklYTUU6IENhbiBkbyBiZXR0ZXIgc29tZSBkYXkuIFJl
YWxseSBvbmx5IGNhcmUgYWJvdXQgdGhlIG5hbWUgYXR0cmlidXRlIGNoYW5naW5nLgotCi0gICAg
aWYgKCFnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJbXBsOjpET01TVUJU
UkVFTU9ESUZJRURfTElTVEVORVIpKQotCXJldHVybiBmYWxzZTsKLSAgICBpbnQgZXhjZXB0aW9u
Y29kZSA9IDA7Ci0gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQobmV3IE11dGF0aW9uRXZlbnRJbXBs
KERPTVN1YnRyZWVNb2RpZmllZEV2ZW50LAotCQkJIHRydWUsZmFsc2UsMCxET01TdHJpbmcoKSxE
T01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNlcHRpb25jb2RlLHRydWUpOwotfQotCi1ib29s
IE5vZGVJbXBsOjpkaXNwYXRjaEtleUV2ZW50KFFLZXlFdmVudCAqa2V5KQotewotICAgIGFzc2Vy
dCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7
Ci0gICAgLy9rZERlYnVnKDYwMTApIDw8ICJET006Ok5vZGVJbXBsOiBkaXNwYXRjaGluZyBrZXli
b2FyZCBldmVudCIgPDwgZW5kbDsKLSAgICBLZXlib2FyZEV2ZW50SW1wbCAqa2V5Ym9hcmRFdmVu
dEltcGwgPSBuZXcgS2V5Ym9hcmRFdmVudEltcGwoa2V5LCBnZXREb2N1bWVudCgpLT5kZWZhdWx0
VmlldygpKTsKLSAgICBrZXlib2FyZEV2ZW50SW1wbC0+cmVmKCk7Ci0gICAgYm9vbCByID0gZGlz
cGF0Y2hFdmVudChrZXlib2FyZEV2ZW50SW1wbCxleGNlcHRpb25jb2RlLHRydWUpOwotCi0gICAg
Ly8gd2Ugd2FudCB0byByZXR1cm4gZmFsc2UgaWYgZGVmYXVsdCBpcyBwcmV2ZW50ZWQgKGFscmVh
ZHkgdGFrZW4gY2FyZSBvZikKLSAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBpcyBkZWZhdWx0LWhh
bmRsZWQgYnkgdGhlIERPTS4gT3RoZXJ3aXNlIHdlIGxldCBpdCBqdXN0Ci0gICAgLy8gbGV0IGl0
IGdldCBoYW5kbGVkIGJ5IEFwcEtpdCAKLSAgICBpZiAoa2V5Ym9hcmRFdmVudEltcGwtPmRlZmF1
bHRIYW5kbGVkKCkpCi0gICAgICByID0gZmFsc2U7Ci0KLSAgICBrZXlib2FyZEV2ZW50SW1wbC0+
ZGVyZWYoKTsKLSAgICByZXR1cm4gcjsKLQotfQotCi12b2lkIE5vZGVJbXBsOjpkaXNwYXRjaFdo
ZWVsRXZlbnQoUVdoZWVsRXZlbnQgKmUpCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9y
YmlkZGVuKCkpOwotICAgIGlmIChlLT5kZWx0YSgpID09IDApCi0gICAgICAgIHJldHVybjsKLQot
ICAgIERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoIWRvYykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgS0hUTUxWaWV3ICp2aWV3ID0gZ2V0RG9jdW1lbnQoKS0+dmll
dygpOwotICAgIGlmICghdmlldykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IHg7Ci0gICAg
aW50IHk7Ci0gICAgdmlldy0+dmlld3BvcnRUb0NvbnRlbnRzKGUtPngoKSwgZS0+eSgpLCB4LCB5
KTsKLQotICAgIGludCBzdGF0ZSA9IGUtPnN0YXRlKCk7Ci0KLSAgICBXaGVlbEV2ZW50SW1wbCAq
d2UgPSBuZXcgV2hlZWxFdmVudEltcGwoZS0+b3JpZW50YXRpb24oKSA9PSBRdDo6SG9yaXpvbnRh
bCwgZS0+ZGVsdGEoKSwKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwgZS0+
Z2xvYmFsWCgpLCBlLT5nbG9iYWxZKCksIHgsIHksCi0gICAgICAgIHN0YXRlICYgUXQ6OkNvbnRy
b2xCdXR0b24sIHN0YXRlICYgUXQ6OkFsdEJ1dHRvbiwgc3RhdGUgJiBRdDo6U2hpZnRCdXR0b24s
IHN0YXRlICYgUXQ6Ok1ldGFCdXR0b24pOwotCi0gICAgaW50IGV4Y2VwdGlvbkNvZGUgPSAwOwot
ICAgIGlmICghZGlzcGF0Y2hFdmVudCh3ZSwgZXhjZXB0aW9uQ29kZSwgdHJ1ZSkpCi0gICAgICAg
IGUtPmFjY2VwdCgpOwotfQotCi12b2lkIE5vZGVJbXBsOjpoYW5kbGVMb2NhbEV2ZW50cyhFdmVu
dEltcGwgKmV2dCwgYm9vbCB1c2VDYXB0dXJlKQotewotICAgIGlmICghbV9yZWdkTGlzdGVuZXJz
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoZGlzYWJsZWQoKSAmJiBldnQtPmlzTW91c2VF
dmVudCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBRUHRyTGlzdDxSZWdpc3RlcmVkRXZlbnRM
aXN0ZW5lcj4gbGlzdGVuZXJzQ29weSA9ICptX3JlZ2RMaXN0ZW5lcnM7Ci0gICAgUVB0ckxpc3RJ
dGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQobGlzdGVuZXJzQ29weSk7Ci0gICAg
Zm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaWYgKGl0LmN1cnJlbnQoKS0+ZXZl
bnRUeXBlKCkgPT0gZXZ0LT50eXBlKCkgJiYgaXQuY3VycmVudCgpLT51c2VDYXB0dXJlKCkgPT0g
dXNlQ2FwdHVyZSkKLSAgICAgICAgICAgIGl0LmN1cnJlbnQoKS0+bGlzdGVuZXIoKS0+aGFuZGxl
RXZlbnRJbXBsKGV2dCwgZmFsc2UpOwotfQotCi12b2lkIE5vZGVJbXBsOjpkZWZhdWx0RXZlbnRI
YW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotfQotCi11bnNpZ25lZCBOb2RlSW1wbDo6Y2hpbGRO
b2RlQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUlt
cGw6OmNoaWxkTm9kZSh1bnNpZ25lZCAvKmluZGV4Ki8pCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0K
LU5vZGVJbXBsICpOb2RlSW1wbDo6dHJhdmVyc2VOZXh0Tm9kZShjb25zdCBOb2RlSW1wbCAqc3Rh
eVdpdGhpbikgY29uc3QKLXsKLSAgICBpZiAoZmlyc3RDaGlsZCgpKSB7Ci0gICAgICAgIGFzc2Vy
dCghc3RheVdpdGhpbiB8fCBmaXJzdENoaWxkKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwot
CXJldHVybiBmaXJzdENoaWxkKCk7Ci0gICAgfQotICAgIGlmICh0aGlzID09IHN0YXlXaXRoaW4p
Ci0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChuZXh0U2libGluZygpKSB7Ci0gICAgICAgIGFz
c2VydCghc3RheVdpdGhpbiB8fCBuZXh0U2libGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4p
KTsKLQlyZXR1cm4gbmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gICAgY29uc3QgTm9kZUltcGwgKm4g
PSB0aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5uZXh0U2libGluZygpICYmICghc3RheVdpdGhp
biB8fCBuLT5wYXJlbnROb2RlKCkgIT0gc3RheVdpdGhpbikpCi0gICAgICAgIG4gPSBuLT5wYXJl
bnROb2RlKCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8ICFu
LT5uZXh0U2libGluZygpIHx8IG4tPm5leHRTaWJsaW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhp
bikpOwotICAgICAgICByZXR1cm4gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6dHJhdmVyc2VOZXh0U2libGluZyhjb25zdCBO
b2RlSW1wbCAqc3RheVdpdGhpbikgY29uc3QKLXsKLSAgICBpZiAodGhpcyA9PSBzdGF5V2l0aGlu
KQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAobmV4dFNpYmxpbmcoKSkgewotICAgICAgICBh
c3NlcnQoIXN0YXlXaXRoaW4gfHwgbmV4dFNpYmxpbmcoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGlu
KSk7Ci0JcmV0dXJuIG5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIGNvbnN0IE5vZGVJbXBsICpu
ID0gdGhpczsKLSAgICB3aGlsZSAobiAmJiAhbi0+bmV4dFNpYmxpbmcoKSAmJiAoIXN0YXlXaXRo
aW4gfHwgbi0+cGFyZW50Tm9kZSgpICE9IHN0YXlXaXRoaW4pKQotICAgICAgICBuID0gbi0+cGFy
ZW50Tm9kZSgpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCAh
bi0+bmV4dFNpYmxpbmcoKSB8fCBuLT5uZXh0U2libGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRo
aW4pKTsKLSAgICAgICAgcmV0dXJuIG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIHJldHVy
biAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnRyYXZlcnNlUHJldmlvdXNOb2RlKCkgY29u
c3QKLXsKLSAgICBpZiAocHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm4g
PSBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgd2hpbGUgKG4tPmxhc3RDaGlsZCgpKQotICAg
ICAgICAgICAgbiA9IG4tPmxhc3RDaGlsZCgpOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0g
ICAgZWxzZSBpZiAocGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnROb2RlKCk7
Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLU5vZGVJ
bXBsICpOb2RlSW1wbDo6dHJhdmVyc2VQcmV2aW91c05vZGVQb3N0T3JkZXIoY29uc3QgTm9kZUlt
cGwgKnN0YXlXaXRoaW4pIGNvbnN0Ci17Ci0gICAgaWYgKGxhc3RDaGlsZCgpKSB7Ci0gICAgICAg
IGFzc2VydCghc3RheVdpdGhpbiB8fCBsYXN0Q2hpbGQoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGlu
KSk7Ci0JcmV0dXJuIGxhc3RDaGlsZCgpOwotICAgIH0KLSAgICBpZiAodGhpcyA9PSBzdGF5V2l0
aGluKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAocHJldmlvdXNTaWJsaW5nKCkpIHsKLSAg
ICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8IHByZXZpb3VzU2libGluZygpLT5pc0FuY2VzdG9y
KHN0YXlXaXRoaW4pKTsKLQlyZXR1cm4gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgfQotICAgIGNv
bnN0IE5vZGVJbXBsICpuID0gdGhpczsKLSAgICB3aGlsZSAobiAmJiAhbi0+cHJldmlvdXNTaWJs
aW5nKCkgJiYgKCFzdGF5V2l0aGluIHx8IG4tPnBhcmVudE5vZGUoKSAhPSBzdGF5V2l0aGluKSkK
LSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICBpZiAobikgewotICAgICAgICBhc3Nl
cnQoIXN0YXlXaXRoaW4gfHwgIW4tPnByZXZpb3VzU2libGluZygpIHx8IG4tPnByZXZpb3VzU2li
bGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4pKTsKLSAgICAgICAgcmV0dXJuIG4tPnByZXZp
b3VzU2libGluZygpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOb2RlSW1wbDo6
Y2hlY2tTZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBpbnQgJmV4Y2VwdGlv
bmNvZGUpCi17Ci0gICAgLy8gUGVyZm9ybSBlcnJvciBjaGVja2luZyBhcyByZXF1aXJlZCBieSBz
cGVjIGZvciBzZXR0aW5nIE5vZGUucHJlZml4LiBVc2VkIGJ5Ci0gICAgLy8gRWxlbWVudEltcGw6
OnNldFByZWZpeCgpIGFuZCBBdHRySW1wbDo6c2V0UHJlZml4KCkKLQotICAgIC8vIEZJWE1FOiBJ
bXBsZW1lbnQgc3VwcG9ydCBmb3IgSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhl
IHNwZWNpZmllZCBwcmVmaXggY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuCi0gICAgCi0g
ICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlz
IHJlYWRvbmx5LgotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29k
ZSA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IEltcGxlbWVudCBOQU1FU1BBQ0VfRVJSOiAt
IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHByZWZpeCBpcyBtYWxmb3JtZWQKLSAgICAvLyBXZSBo
YXZlIHRvIGNvbW1lbnQgdGhpcyBvdXQsIHNpbmNlIGl0J3MgdXNlZCBmb3IgYXR0cmlidXRlcyBh
bmQgdGFnIG5hbWVzLCBhbmQgd2UndmUgb25seQotICAgIC8vIHN3aXRjaGVkIG9uZSBvdmVyLgot
ICAgIC8qCi0gICAgLy8gLSBpZiB0aGUgbmFtZXNwYWNlVVJJIG9mIHRoaXMgbm9kZSBpcyBudWxs
LAotICAgIC8vIC0gaWYgdGhlIHNwZWNpZmllZCBwcmVmaXggaXMgInhtbCIgYW5kIHRoZSBuYW1l
c3BhY2VVUkkgb2YgdGhpcyBub2RlIGlzIGRpZmZlcmVudCBmcm9tCi0gICAgLy8gICAiaHR0cDov
L3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKLSAgICAvLyAtIGlmIHRoaXMgbm9kZSBp
cyBhbiBhdHRyaWJ1dGUgYW5kIHRoZSBzcGVjaWZpZWQgcHJlZml4IGlzICJ4bWxucyIgYW5kCi0g
ICAgLy8gICB0aGUgbmFtZXNwYWNlVVJJIG9mIHRoaXMgbm9kZSBpcyBkaWZmZXJlbnQgZnJvbSAi
aHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLAotICAgIC8vIC0gb3IgaWYgdGhpcyBub2Rl
IGlzIGFuIGF0dHJpYnV0ZSBhbmQgdGhlIHF1YWxpZmllZE5hbWUgb2YgdGhpcyBub2RlIGlzICJ4
bWxucyIgW05hbWVzcGFjZXNdLgotICAgIGlmICgobmFtZXNwYWNlUGFydChpZCgpKSA9PSBub05h
bWVzcGFjZSAmJiBpZCgpID4gSURfTEFTVF9UQUcpIHx8Ci0gICAgICAgIChfcHJlZml4ID09ICJ4
bWwiICYmIERPTVN0cmluZyhnZXREb2N1bWVudCgpLT5uYW1lc3BhY2VVUkkoaWQoKSkpICE9ICJo
dHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKSkgewotICAgICAgICBleGNlcHRp
b25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwotICAgICAgICByZXR1cm47Ci0g
ICAgfSovCi19Ci0KLXZvaWQgTm9kZUltcGw6OmNoZWNrQWRkQ2hpbGQoTm9kZUltcGwgKm5ld0No
aWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0gICAgLy8gUGVyZm9ybSBlcnJvciBjaGVja2lu
ZyBhcyByZXF1aXJlZCBieSBzcGVjIGZvciBhZGRpbmcgYSBuZXcgY2hpbGQuIFVzZWQgYnkKLSAg
ICAvLyBhcHBlbmRDaGlsZCgpLCByZXBsYWNlQ2hpbGQoKSBhbmQgaW5zZXJ0QmVmb3JlKCkKLQot
ICAgIC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhyb3cgTk9UX0ZPVU5EX0VSUiBpZiBuZXdD
aGlsZCBpcyBudWxsCi0gICAgaWYgKCFuZXdDaGlsZCkgewotICAgICAgICBleGNlcHRpb25jb2Rl
ID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2Rl
IGlzIHJlYWRvbmx5Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBleGNlcHRpb25j
b2RlID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHNob3VsZEFkb3B0Q2hpbGQgPSBmYWxzZTsKLQot
ICAgIC8vIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIG5ld0NoaWxkIHdhcyBjcmVhdGVk
IGZyb20gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQKLSAgICAvLyBjcmVh
dGVkIHRoaXMgbm9kZS4KLSAgICAvLyBXZSBhc3N1bWUgdGhhdCBpZiBuZXdDaGlsZCBpcyBhIERv
Y3VtZW50RnJhZ21lbnQsIGFsbCBjaGlsZHJlbiBhcmUgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGRv
Y3VtZW50Ci0gICAgLy8gYXMgdGhlIGZyYWdtZW50IGl0c2VsZiAob3RoZXJ3aXNlIHRoZXkgY291
bGQgbm90IGhhdmUgYmVlbiBhZGRlZCBhcyBjaGlsZHJlbikKLSAgICBpZiAobmV3Q2hpbGQtPmdl
dERvY3VtZW50KCkgIT0gZ2V0RG9jdW1lbnQoKSkgewotCS8vIGJ1dCBpZiB0aGUgY2hpbGQgaXMg
bm90IGluIGEgZG9jdW1lbnQgeWV0IHRoZW4gbG9vc2VuIHRoZQotCS8vIHJlc3RyaWN0aW9uLCBz
byB0aGF0IGUuZy4gY3JlYXRpbmcgYW4gZWxlbWVudCB3aXRoIHRoZSBPcHRpb24oKQotCS8vIGNv
bnN0cnVjdG9yIGFuZCB0aGVuIGFkZGluZyBpdCB0byBhIGRpZmZlcmVudCBkb2N1bWVudCB3b3Jr
cywKLQkvLyBhcyBpdCBkb2VzIGluIE1vemlsbGEgYW5kIE1hYyBJRS4KLQlpZiAoIW5ld0NoaWxk
LT5pbkRvY3VtZW50KCkpIHsKLQkgICAgc2hvdWxkQWRvcHRDaGlsZCA9IHRydWU7Ci0JfSBlbHNl
IHsKLQkgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6V1JPTkdfRE9DVU1FTlRfRVJS
OwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICAgIC8vIEhJRVJBUkNIWV9SRVFVRVNUX0VS
UjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdyBj
aGlsZHJlbiBvZiB0aGUgdHlwZSBvZiB0aGUKLSAgICAvLyBuZXdDaGlsZCBub2RlLCBvciBpZiB0
aGUgbm9kZSB0byBhcHBlbmQgaXMgb25lIG9mIHRoaXMgbm9kZSdzIGFuY2VzdG9ycy4KLQotICAg
IC8vIGNoZWNrIGZvciBhbmNlc3Rvci9zYW1lIG5vZGUKLSAgICBpZiAobmV3Q2hpbGQgPT0gdGhp
cyB8fCBpc0FuY2VzdG9yKG5ld0NoaWxkKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9N
RXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgCi0gICAgaWYgKG5ld0NoaWxkLT5ub2RlVHlwZSgpICE9IE5vZGU6OkRPQ1VNRU5UX0ZS
QUdNRU5UX05PREUpIHsKLSAgICAgICAgaWYgKCFjaGlsZFR5cGVBbGxvd2VkKG5ld0NoaWxkLT5u
b2RlVHlwZSgpKSkgewotICAgICAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6
SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0g
ICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKE5vZGVJbXBsICpuID0gbmV3Q2hpbGQtPmZp
cnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmICgh
Y2hpbGRUeXBlQWxsb3dlZChuLT5ub2RlVHlwZSgpKSkgewotICAgICAgICAgICAgICAgIGV4Y2Vw
dGlvbmNvZGUgPSBET01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0g
ICAgLy8gY2hhbmdlIHRoZSBkb2N1bWVudCBwb2ludGVyIG9mIG5ld0NoaWxkIGFuZCBhbGwgb2Yg
aXRzIGNoaWxkcmVuIHRvIGJlIHRoZSBuZXcgZG9jdW1lbnQKLSAgICBpZiAoc2hvdWxkQWRvcHRD
aGlsZCkgewotICAgICAgICBmb3IgKE5vZGVJbXBsKiBub2RlID0gbmV3Q2hpbGQ7IG5vZGU7IG5v
ZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKG5ld0NoaWxkKSkgewotICAgICAgICAgICAgS0pT
OjpTY3JpcHRJbnRlcnByZXRlcjo6dXBkYXRlRE9NTm9kZURvY3VtZW50KG5vZGUsIG5vZGUtPmdl
dERvY3VtZW50KCksIGdldERvY3VtZW50KCkpOwotICAgICAgICAgICAgbm9kZS0+c2V0RG9jdW1l
bnQoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgTm9kZUltcGw6
OmlzQW5jZXN0b3IoY29uc3QgTm9kZUltcGwgKm90aGVyKSBjb25zdAotewotICAgIC8vIFJldHVy
biB0cnVlIGlmIG90aGVyIGlzIGFuIGFuY2VzdG9yIG9mIHRoaXMsIG90aGVyd2lzZSBmYWxzZQot
ICAgIGlmICghb3RoZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGNvbnN0IE5v
ZGVJbXBsICpuID0gcGFyZW50Tm9kZSgpOyBuOyBuID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAg
ICAgIGlmIChuID09IG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6Y2hpbGRBbGxvd2VkKCBOb2RlSW1w
bCAqbmV3Q2hpbGQgKQotewotICAgIHJldHVybiBjaGlsZFR5cGVBbGxvd2VkKG5ld0NoaWxkLT5u
b2RlVHlwZSgpKTsKLX0KLQotTm9kZUltcGw6OlN0eWxlQ2hhbmdlIE5vZGVJbXBsOjpkaWZmKCBr
aHRtbDo6UmVuZGVyU3R5bGUgKnMxLCBraHRtbDo6UmVuZGVyU3R5bGUgKnMyICkgY29uc3QKLXsK
LSAgICAvLyBGSVhNRTogVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMganVzdCB0b3Rh
bGx5IHdyb25nLiAgSXQgZG9lc24ndCBoYW5kbGUKLSAgICAvLyBleHBsaWNpdCBpbmhlcml0YW5j
ZSBvZiBub24taW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIHNvIHlvdSBlbmQgdXAgbm90IHJlLXJl
c29sdmluZwotICAgIC8vIHN0eWxlIGluIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRvLgotICAgIFN0
eWxlQ2hhbmdlIGNoID0gTm9Jbmhlcml0OwotICAgIEVEaXNwbGF5IGRpc3BsYXkxID0gczEgPyBz
MS0+ZGlzcGxheSgpIDogTk9ORTsKLSAgICBib29sIGZsMSA9IHMxID8gczEtPmhhc1BzZXVkb1N0
eWxlKFJlbmRlclN0eWxlOjpGSVJTVF9MRVRURVIpIDogZmFsc2U7Ci0gICAgRURpc3BsYXkgZGlz
cGxheTIgPSBzMiA/IHMyLT5kaXNwbGF5KCkgOiBOT05FOwotICAgIGJvb2wgZmwyID0gczIgPyBz
Mi0+aGFzUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OkZJUlNUX0xFVFRFUikgOiBmYWxzZTsKLSAg
ICBpZiAoZGlzcGxheTEgIT0gZGlzcGxheTIgfHwgZmwxICE9IGZsMikKLSAgICAgICAgY2ggPSBE
ZXRhY2g7Ci0gICAgZWxzZSBpZiAoICFzMSB8fCAhczIgKQotCWNoID0gSW5oZXJpdDsKLSAgICBl
bHNlIGlmICggKnMxID09ICpzMiApCi0gCWNoID0gTm9DaGFuZ2U7Ci0gICAgZWxzZSBpZiAoIHMx
LT5pbmhlcml0ZWROb3RFcXVhbCggczIgKSApCi0JY2ggPSBJbmhlcml0OwotICAgIHJldHVybiBj
aDsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgTm9kZUltcGw6OmR1bXAoUVRleHRTdHJlYW0g
KnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgLy8gIyMjIGltcGxlbWVudCBkdW1w
KCkgZm9yIGFsbCBhcHByb3ByaWF0ZSBzdWJjbGFzc2VzCi0KLSAgICBpZiAobV9oYXNJZCkgeyAq
c3RyZWFtIDw8ICIgaGFzSWQiOyB9Ci0gICAgaWYgKG1faGFzQ2xhc3MpIHsgKnN0cmVhbSA8PCAi
IGhhc0NsYXNzIjsgfQotICAgIGlmIChtX2hhc1N0eWxlKSB7ICpzdHJlYW0gPDwgIiBoYXNTdHls
ZSI7IH0KLSAgICBpZiAobV9zcGVjaWZpZWQpIHsgKnN0cmVhbSA8PCAiIHNwZWNpZmllZCI7IH0K
LSAgICBpZiAobV9mb2N1c2VkKSB7ICpzdHJlYW0gPDwgIiBmb2N1c2VkIjsgfQotICAgIGlmICht
X2FjdGl2ZSkgeyAqc3RyZWFtIDw8ICIgYWN0aXZlIjsgfQotICAgIGlmIChtX3N0eWxlRWxlbWVu
dCkgeyAqc3RyZWFtIDw8ICIgc3R5bGVFbGVtZW50IjsgfQotICAgIGlmIChtX2ltcGxpY2l0KSB7
ICpzdHJlYW0gPDwgIiBpbXBsaWNpdCI7IH0KLQotICAgICpzdHJlYW0gPDwgIiB0YWJJbmRleD0i
IDw8IG1fdGFiSW5kZXg7Ci0gICAgaWYgKG1fcmVnZExpc3RlbmVycykKLQkqc3RyZWFtIDw8ICIg
I3JlZ2RMaXN0ZW5lcnM9IiA8PCBtX3JlZ2RMaXN0ZW5lcnMtPmNvdW50KCk7IC8vICMjIyBtb3Jl
IGRldGFpbAotICAgICpzdHJlYW0gPDwgZW5kbDsKLQotICAgIE5vZGVJbXBsICpjaGlsZCA9IGZp
cnN0Q2hpbGQoKTsKLSAgICB3aGlsZShjaGlsZCkgewotCSpzdHJlYW0gPDwgaW5kIDw8IGNoaWxk
LT5ub2RlTmFtZSgpLnFzdHJpbmcoKS5hc2NpaSgpIDw8ICI6ICI7Ci0gICAgICAgIGNoaWxkLT5k
dW1wKHN0cmVhbSxpbmQrIiAgIik7Ci0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5n
KCk7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQgTm9kZUltcGw6OmF0dGFjaCgpCi17Ci0gICAg
YXNzZXJ0KCFhdHRhY2hlZCgpKTsKLSAgICBhc3NlcnQoIW1fcmVuZGVyIHx8IChtX3JlbmRlci0+
c3R5bGUoKSAmJiBtX3JlbmRlci0+cGFyZW50KCkpKTsKLSAgICBnZXREb2N1bWVudCgpLT5pbmNE
T01UcmVlVmVyc2lvbigpOwotICAgIG1fYXR0YWNoZWQgPSB0cnVlOwotfQotCi12b2lkIE5vZGVJ
bXBsOjp3aWxsUmVtb3ZlKCkKLXsKLX0KLQotdm9pZCBOb2RlSW1wbDo6ZGV0YWNoKCkKLXsKLSAg
ICBtX2luRGV0YWNoID0gdHJ1ZTsKLS8vICAgIGFzc2VydChtX2F0dGFjaGVkKTsKLQotICAgIGlm
IChtX3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXItPmRlc3Ryb3koKTsKLSAgICBtX3JlbmRlciA9
IDA7Ci0KLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRv
YykKLSAgICAgICAgZG9jLT5pbmNET01UcmVlVmVyc2lvbigpOwotICAgIG1fYXR0YWNoZWQgPSBm
YWxzZTsKLSAgICBtX2luRGV0YWNoID0gZmFsc2U7Ci19Ci0KLWJvb2wgTm9kZUltcGw6Om1haW50
YWluc1N0YXRlKCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVFTdHJpbmcgTm9kZUltcGw6
OnN0YXRlKCkKLXsKLSAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKLX0KLQotdm9pZCBOb2RlSW1w
bDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYvKnN0YXRlcyovKQotewotfQotCi12b2lkIE5v
ZGVJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fcmVnZExpc3RlbmVy
cyAmJiAhbV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSkKLSAgICAg
ICAgZ2V0RG9jdW1lbnQoKS0+dW5yZWdpc3RlckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0
ZW5lcnModGhpcyk7Ci0KLSAgICBzZXRJbkRvY3VtZW50KHRydWUpOwotICAgIAotICAgIGluc2Vy
dGVkSW50b1RyZWUoZmFsc2UpOwotfQotCi12b2lkIE5vZGVJbXBsOjpyZW1vdmVkRnJvbURvY3Vt
ZW50KCkKLXsKLSAgICBpZiAobV9yZWdkTGlzdGVuZXJzICYmICFtX3JlZ2RMaXN0ZW5lcnMtPmlz
RW1wdHkoKSAmJiBnZXREb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVudCgpLT5yZWdpc3Rl
ckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnModGhpcyk7Ci0KLSAgICBzZXRJbkRv
Y3VtZW50KGZhbHNlKTsKLSAgICAKLSAgICByZW1vdmVkRnJvbVRyZWUoZmFsc2UpOwotfQotCi12
b2lkIE5vZGVJbXBsOjpjaGlsZHJlbkNoYW5nZWQoKQotewotfQotCi1ib29sIE5vZGVJbXBsOjpk
aXNhYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBs
Ojppc1JlYWRPbmx5KCkKLXsKLSAgICAvLyBFbnRpdHkgJiBFbnRpdHkgUmVmZXJlbmNlIG5vZGVz
IGFuZCB0aGVpciBkZXNjZW5kYW50cyBhcmUgcmVhZC1vbmx5Ci0gICAgTm9kZUltcGwgKm4gPSB0
aGlzOwotICAgIHdoaWxlIChuKSB7Ci0JaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6RU5USVRZ
X05PREUgfHwKLQkgICAgbi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05P
REUpCi0JICAgIHJldHVybiB0cnVlOwotCW4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgfQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpwcmV2aW91c0VkaXRhYmxl
KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbm9kZSA9IHByZXZpb3VzTGVhZk5vZGUoKTsKLSAg
ICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAobm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSkK
LSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICBub2RlID0gbm9kZS0+cHJldmlvdXNM
ZWFmTm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBs
OjpuZXh0RWRpdGFibGUoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpub2RlID0gbmV4dExlYWZO
b2RlKCk7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKG5vZGUtPmlzQ29udGVudEVk
aXRhYmxlKCkpCi0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgbm9kZSA9IG5vZGUt
Pm5leHRMZWFmTm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotUmVuZGVyT2JqZWN0
ICogTm9kZUltcGw6OnByZXZpb3VzUmVuZGVyZXIoKQotewotICAgIGZvciAoTm9kZUltcGwgKm4g
PSBwcmV2aW91c1NpYmxpbmcoKTsgbjsgbiA9IG4tPnByZXZpb3VzU2libGluZygpKSB7Ci0gICAg
ICAgIGlmIChuLT5yZW5kZXJlcigpKQotICAgICAgICAgICAgcmV0dXJuIG4tPnJlbmRlcmVyKCk7
Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1SZW5kZXJPYmplY3QgKiBOb2RlSW1wbDo6bmV4
dFJlbmRlcmVyKCkKLXsKLSAgICAvLyBBdm9pZCBhbiBPKG5eMikgcHJvYmxlbSB3aXRoIHRoaXMg
ZnVuY3Rpb24gYnkgbm90IGNoZWNraW5nIGZvciBuZXh0UmVuZGVyZXIoKSB3aGVuIHRoZSBwYXJl
bnQgZWxlbWVudCBoYXNuJ3QgZXZlbiAKLSAgICAvLyBiZWVuIGF0dGFjaGVkIHlldC4KLSAgICBp
ZiAocGFyZW50KCkgJiYgIXBhcmVudCgpLT5hdHRhY2hlZCgpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIGZvciAoTm9kZUltcGwgKm4gPSBuZXh0U2libGluZygpOyBuOyBuID0gbi0+bmV4dFNp
YmxpbmcoKSkgewotICAgICAgICBpZiAobi0+cmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJldHVy
biBuLT5yZW5kZXJlcigpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gRklYTUU6IFRo
aXMgY29kZSBpcyB1c2VkIGJ5IGVkaXRpbmcuICBTZWVtcyBsaWtlIGl0IGNvdWxkIG1vdmUgb3Zl
ciB0aGVyZSBhbmQgbm90IHBvbGx1dGUgTm9kZUltcGwuCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnBy
ZXZpb3VzTm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKSBjb25zdAotewotICAgIGlmIChwcmV2
aW91c1NpYmxpbmcoKSkgewotICAgICAgICBOb2RlSW1wbCAqbiA9IHByZXZpb3VzU2libGluZygp
OwotICAgICAgICB3aGlsZSAoIWlzQXRvbWljTm9kZShuKSAmJiBuLT5sYXN0Q2hpbGQoKSkKLSAg
ICAgICAgICAgIG4gPSBuLT5sYXN0Q2hpbGQoKTsKLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQot
ICAgIGVsc2UgaWYgKHBhcmVudE5vZGUoKSkgewotICAgICAgICByZXR1cm4gcGFyZW50Tm9kZSgp
OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1Ob2Rl
SW1wbCAqTm9kZUltcGw6Om5leHROb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpIGNvbnN0Ci17
Ci0gICAgaWYgKCFpc0F0b21pY05vZGUodGhpcykgJiYgZmlyc3RDaGlsZCgpKQotCXJldHVybiBm
aXJzdENoaWxkKCk7Ci0gICAgaWYgKG5leHRTaWJsaW5nKCkpCi0JcmV0dXJuIG5leHRTaWJsaW5n
KCk7Ci0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5u
ZXh0U2libGluZygpKQotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgIGlmIChuKQot
ICAgICAgICByZXR1cm4gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotTm9k
ZUltcGwgKk5vZGVJbXBsOjpwcmV2aW91c0xlYWZOb2RlKCkgY29uc3QKLXsKLSAgICBOb2RlSW1w
bCAqbm9kZSA9IHByZXZpb3VzTm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKTsKLSAgICB3aGls
ZSAobm9kZSkgewotICAgICAgICBpZiAoaXNBdG9taWNOb2RlKG5vZGUpKQotICAgICAgICAgICAg
cmV0dXJuIG5vZGU7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5wcmV2aW91c05vZGVDb25zaWRlcmlu
Z0F0b21pY05vZGVzKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9k
ZUltcGw6Om5leHRMZWFmTm9kZSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBuZXh0
Tm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAg
ICBpZiAoaXNBdG9taWNOb2RlKG5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAg
ICAgIG5vZGUgPSBub2RlLT5uZXh0Tm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKTsKLSAgICB9
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmNyZWF0ZVJlbmRlcmVySWZOZWVk
ZWQoKQotewotCi0gICAgaWYgKCFnZXREb2N1bWVudCgpLT5zaG91bGRDcmVhdGVSZW5kZXJlcnMo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwot
ICAgIGFzc2VydCghbV9yZW5kZXIpOwotICAgIAotICAgIE5vZGVJbXBsICpwYXJlbnQgPSBwYXJl
bnROb2RlKCk7ICAgIAotICAgIGFzc2VydChwYXJlbnQpOwotICAgICAgICAKLSAgICBSZW5kZXJP
YmplY3QgKnBhcmVudFJlbmRlcmVyID0gcGFyZW50LT5yZW5kZXJlcigpOwotICAgIGlmIChwYXJl
bnRSZW5kZXJlciAmJiBwYXJlbnRSZW5kZXJlci0+Y2FuSGF2ZUNoaWxkcmVuKCkKLSNpZiBTVkdf
U1VQUE9SVAotICAgICAgICAmJiBwYXJlbnQtPmNoaWxkU2hvdWxkQ3JlYXRlUmVuZGVyZXIodGhp
cykKLSNlbmRpZgotICAgICAgICApIHsKLSAgICAgICAgUmVuZGVyU3R5bGUgKnN0eWxlID0gc3R5
bGVGb3JSZW5kZXJlcihwYXJlbnRSZW5kZXJlcik7Ci0gICAgICAgIHN0eWxlLT5yZWYoKTsKLSNp
Zm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIGJvb2wgcmVzb2x2ZVN0eWxlID0gZmFsc2U7Ci0g
ICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5iaW5kaW5nTWFuYWdlcigpLT5sb2FkQmluZGluZ3Mo
dGhpcywgc3R5bGUtPmJpbmRpbmdVUklzKCksIHRydWUsICZyZXNvbHZlU3R5bGUpICYmIAotICAg
ICAgICAgICAgcmVuZGVyZXJJc05lZWRlZChzdHlsZSkpIHsKLSAgICAgICAgICAgIGlmIChyZXNv
bHZlU3R5bGUpIHsKLSAgICAgICAgICAgICAgICBzdHlsZS0+ZGVyZWYoKTsKLSAgICAgICAgICAg
ICAgICBzdHlsZSA9IHN0eWxlRm9yUmVuZGVyZXIocGFyZW50UmVuZGVyZXIpOwotICAgICAgICAg
ICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKHJlbmRlcmVySXNOZWVkZWQoc3R5bGUpKSB7Ci0jZW5k
aWYKLSAgICAgICAgICAgIG1fcmVuZGVyID0gY3JlYXRlUmVuZGVyZXIoZ2V0RG9jdW1lbnQoKS0+
cmVuZGVyQXJlbmEoKSwgc3R5bGUpOwotICAgICAgICAgICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAg
ICAgICAgICAgICAgbV9yZW5kZXItPnNldFN0eWxlKHN0eWxlKTsKLSAgICAgICAgICAgICAgICBw
YXJlbnRSZW5kZXJlci0+YWRkQ2hpbGQobV9yZW5kZXIsIG5leHRSZW5kZXJlcigpKTsKLSAgICAg
ICAgICAgIH0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIH0gLy8gYXZvaWQgY29uZnVz
aW5nIHRoZSBjaGFuZ2UgbG9nIGNvZGUgcGFyc2VyIGJ5IGhhdmluZyB0d28gY2xvc2UgYnJhY2Vz
IHRvIG1hdGNoIHRoZSB0d28gb3BlbiBicmFjZXMgYWJvdmUKLSNlbHNlCi0gICAgICAgIH0KLSNl
bmRpZgotICAgICAgICBzdHlsZS0+ZGVyZWYoZ2V0RG9jdW1lbnQoKS0+cmVuZGVyQXJlbmEoKSk7
Ci0gICAgfQotfQotCi1SZW5kZXJTdHlsZSAqTm9kZUltcGw6OnN0eWxlRm9yUmVuZGVyZXIoUmVu
ZGVyT2JqZWN0ICpwYXJlbnQpCi17Ci0gICAgcmV0dXJuIHBhcmVudC0+c3R5bGUoKTsKLX0KLQot
Ym9vbCBOb2RlSW1wbDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0g
ICAgcmV0dXJuIChnZXREb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSB0aGlzKSB8fCAo
c3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpOb2RlSW1wbDo6
Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17
Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IE5vZGVJbXBsOjpt
YXhPZmZzZXQoKSBjb25zdAotewotICAgIHJldHVybiAxOwotfQotCi0vLyBGSVhNRTogU2hvdWxk
bid0IHRoZXNlIGZ1bmN0aW9ucyBiZSBpbiB0aGUgZWRpdGluZyBjb2RlPyAgQ29kZSB0aGF0IGFz
a3MgcXVlc3Rpb25zIGFib3V0IEhUTUwgaW4gdGhlIGNvcmUgRE9NIGNsYXNzCi0vLyBpcyBvYnZp
b3VzbHkgbWlzcGxhY2VkLgotaW50IE5vZGVJbXBsOjpjYXJldE1pbk9mZnNldCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5jYXJldE1pbk9mZnNldCgpIDog
MDsKLX0KLQotaW50IE5vZGVJbXBsOjpjYXJldE1heE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5jYXJldE1heE9mZnNldCgpIDogMTsKLX0KLQot
dW5zaWduZWQgTm9kZUltcGw6OmNhcmV0TWF4UmVuZGVyZWRPZmZzZXQoKSBjb25zdAotewotICAg
IHJldHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIoKS0+Y2FyZXRNYXhSZW5kZXJlZE9mZnNldCgp
IDogMTsKLX0KLQotaW50IE5vZGVJbXBsOjpwcmV2aW91c09mZnNldCAoaW50IGN1cnJlbnQpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5wcmV2aW91c09mZnNl
dChjdXJyZW50KSA6IGN1cnJlbnQgLSAxOwotfQotCi1pbnQgTm9kZUltcGw6Om5leHRPZmZzZXQg
KGludCBjdXJyZW50KSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIo
KS0+bmV4dE9mZnNldChjdXJyZW50KSA6IGN1cnJlbnQgKyAxOwotfQotCi1ib29sIE5vZGVJbXBs
Ojppc0Jsb2NrRmxvdygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgJiYgcmVuZGVy
ZXIoKS0+aXNCbG9ja0Zsb3coKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNCbG9ja0Zsb3dPckJs
b2NrVGFibGUoKSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigpICYmIChyZW5kZXJlcigp
LT5pc0Jsb2NrRmxvdygpIHx8IHJlbmRlcmVyKCktPmlzVGFibGUoKSAmJiAhcmVuZGVyZXIoKS0+
aXNJbmxpbmUoKSk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzRWRpdGFibGVCbG9jaygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGlzQ29udGVudEVkaXRhYmxlKCkgJiYgaXNCbG9ja0Zsb3coKTsKLX0K
LQotRWxlbWVudEltcGwgKk5vZGVJbXBsOjplbmNsb3NpbmdCbG9ja0Zsb3dPclRhYmxlRWxlbWVu
dCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4gPSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRo
aXMpOwotICAgIGlmIChpc0Jsb2NrRmxvd09yQmxvY2tUYWJsZSgpKQotICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAg
ICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoIW4pCi0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgaWYgKG4tPmlzQmxvY2tGbG93T3JCbG9ja1RhYmxlKCkgfHwgbi0+aGFzVGFn
TmFtZShib2R5VGFnKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1w
bCAqPihuKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2RlSW1w
bDo6ZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4g
PSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMpOwotICAgIGlmIChpc0Jsb2NrRmxvdygpKQot
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0KLSAgICB3aGls
ZSAoMSkgewotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoIW4pCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKG4tPmlzQmxvY2tGbG93KCkgfHwgbi0+aGFz
VGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50
SW1wbCAqPihuKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2Rl
SW1wbDo6ZW5jbG9zaW5nSW5saW5lRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4g
PSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMpOwotICAgIE5vZGVJbXBsICpwOwotCi0gICAg
d2hpbGUgKDEpIHsKLSAgICAgICAgcCA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKCFw
IHx8IHAtPmlzQmxvY2tGbG93KCkgfHwgcC0+aGFzVGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLSAgICAgICAgLy8gQWxz
byBzdG9wIGlmIGFueSBwcmV2aW91cyBzaWJsaW5nIGlzIGEgYmxvY2sKLSAgICAgICAgZm9yIChO
b2RlSW1wbCAqc2libGluZyA9IG4tPnByZXZpb3VzU2libGluZygpOyBzaWJsaW5nOyBzaWJsaW5n
ID0gc2libGluZy0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChzaWJsaW5n
LT5pc0Jsb2NrRmxvdygpKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVt
ZW50SW1wbCAqPihuKTsKLSAgICAgICAgfQotICAgICAgICBuID0gcDsKLSAgICB9Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2Rl
SW1wbDo6cm9vdEVkaXRhYmxlRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFpc0NvbnRlbnRF
ZGl0YWJsZSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIE5vZGVJbXBsICpuID0gY29uc3Rf
Y2FzdDxOb2RlSW1wbCAqPih0aGlzKTsKLSAgICBpZiAobi0+aGFzVGFnTmFtZShib2R5VGFnKSkK
LSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwotCi0gICAgTm9k
ZUltcGwgKnJlc3VsdCA9IG4tPmlzRWRpdGFibGVCbG9jaygpID8gbiA6IDA7Ci0gICAgd2hpbGUg
KDEpIHsKLSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKCFuIHx8ICFu
LT5pc0NvbnRlbnRFZGl0YWJsZSgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChu
LT5oYXNUYWdOYW1lKGJvZHlUYWcpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG4tPmlzQmxvY2tGbG93KCkpCi0g
ICAgICAgICAgICByZXN1bHQgPSBuOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwgKj4ocmVzdWx0KTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aW5TYW1lUm9vdEVkaXRh
YmxlRWxlbWVudChOb2RlSW1wbCAqbikKLXsKLSAgICByZXR1cm4gbiA/IHJvb3RFZGl0YWJsZUVs
ZW1lbnQoKSA9PSBuLT5yb290RWRpdGFibGVFbGVtZW50KCkgOiBmYWxzZTsKLX0KLQotYm9vbCBO
b2RlSW1wbDo6aW5TYW1lQ29udGFpbmluZ0Jsb2NrRmxvd0VsZW1lbnQoTm9kZUltcGwgKm4pCi17
Ci0gICAgcmV0dXJuIG4gPyBlbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KCkgPT0gbi0+ZW5jbG9z
aW5nQmxvY2tGbG93RWxlbWVudCgpIDogZmFsc2U7Ci19Ci0KLS8vIEZJWE1FOiBFbmQgb2Ygb2J2
aW91c2x5IG1pc3BsYWNlZCBIVE1MIGVkaXRpbmcgZnVuY3Rpb25zLiAgVHJ5IHRvIG1vdmUgdGhl
c2Ugb3V0IG9mIE5vZGVJbXBsLgotCi1SZWZQdHI8Tm9kZUxpc3RJbXBsPiBOb2RlSW1wbDo6Z2V0
RWxlbWVudHNCeVRhZ05hbWVOUyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3Qg
RE9NU3RyaW5nICZsb2NhbE5hbWUpCi17Ci0gICAgaWYgKG5hbWVzcGFjZVVSSS5pc051bGwoKSB8
fCBsb2NhbE5hbWUuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBSZWZQdHI8Tm9kZUxpc3RJbXBs
PigpOyAvLyBGSVhNRTogV2hvIGNhcmVzIGFib3V0IHRoaXMgYWRkaXRpb25hbCBjaGVjaz8KLSAg
ICAKLSAgICBET01TdHJpbmcgbmFtZSA9IGxvY2FsTmFtZTsKLSAgICBpZiAoZ2V0RG9jdW1lbnQo
KS0+aXNIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAgbmFtZSA9IGxvY2FsTmFtZS5sb3dlcigpOwot
ICAgIHJldHVybiBSZWZQdHI8Tm9kZUxpc3RJbXBsPihuZXcgVGFnTm9kZUxpc3RJbXBsKHRoaXMs
IEF0b21pY1N0cmluZyhuYW1lc3BhY2VVUkkpLCBBdG9taWNTdHJpbmcobmFtZSkpKTsKLX0KLQot
Ym9vbCBOb2RlSW1wbDo6aXNTdXBwb3J0ZWQoY29uc3QgRE9NU3RyaW5nICZmZWF0dXJlLCBjb25z
dCBET01TdHJpbmcgJnZlcnNpb24pCi17Ci0gICAgcmV0dXJuIERPTUltcGxlbWVudGF0aW9uSW1w
bDo6aW5zdGFuY2UoKS0+aGFzRmVhdHVyZShmZWF0dXJlLCB2ZXJzaW9uKTsKLX0KLQotRG9jdW1l
bnRJbXBsICpOb2RlSW1wbDo6b3duZXJEb2N1bWVudCgpIGNvbnN0Ci17Ci0gICAgRG9jdW1lbnRJ
bXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIHJldHVybiBkb2MgPT0gdGhpcyA/IDAgOiBk
b2M7Ci19Ci0KLWJvb2wgTm9kZUltcGw6Omhhc0F0dHJpYnV0ZXMoKSBjb25zdAotewotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotTmFtZWRBdHRyTWFwSW1wbCAqTm9kZUltcGw6OmF0dHJpYnV0ZXMo
KSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0VxdWFsTm9k
ZShOb2RlSW1wbCAqb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKCFvdGhlcikKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChub2RlVHlwZSgpICE9IG90aGVyLT5ub2RlVHlwZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG5vZGVOYW1lKCkgIT0gb3Ro
ZXItPm5vZGVOYW1lKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobG9j
YWxOYW1lKCkgIT0gb3RoZXItPmxvY2FsTmFtZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgCi0gICAgaWYgKG5hbWVzcGFjZVVSSSgpICE9IG90aGVyLT5uYW1lc3BhY2VVUkkoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChwcmVmaXgoKSAhPSBvdGhlci0+cHJl
Zml4KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobm9kZVZhbHVlKCkg
IT0gb3RoZXItPm5vZGVWYWx1ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAg
TmFtZWRBdHRyTWFwSW1wbCAqYXR0cnMgPSBhdHRyaWJ1dGVzKCk7Ci0gICAgTmFtZWRBdHRyTWFw
SW1wbCAqb3RoZXJBdHRycyA9IG90aGVyLT5hdHRyaWJ1dGVzKCk7Ci0gICAgCi0gICAgaWYgKCFh
dHRycyAmJiBvdGhlckF0dHJzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYg
KGF0dHJzICYmICFhdHRycy0+bWFwc0VxdWl2YWxlbnQob3RoZXJBdHRycykpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0g
ICAgTm9kZUltcGwgKm90aGVyQ2hpbGQgPSBvdGhlci0+Zmlyc3RDaGlsZCgpOwotICAgIAotICAg
IHdoaWxlIChjaGlsZCkgewotICAgICAgICBpZiAoIWNoaWxkLT5pc0VxdWFsTm9kZShvdGhlckNo
aWxkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIGNoaWxk
ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIG90aGVyQ2hpbGQgPSBvdGhlckNoaWxk
LT5uZXh0U2libGluZygpOwotICAgIH0KLSAgICAKLSAgICBpZiAob3RoZXJDaGlsZCkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIC8vIEZJWE1FOiBGb3IgRG9jdW1lbnRUeXBlIG5v
ZGVzIHdlIHNob3VsZCBjaGVjayBlcXVhbGl0eSBvbgotICAgIC8vIHRoZSBlbnRpdGllcyBhbmQg
bm90YXRpb25zIE5hbWVkTm9kZU1hcHMgYXMgd2VsbC4KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotYm9vbCBOb2RlSW1wbDo6aXNEZWZhdWx0TmFtZXNwYWNlKGNvbnN0IERPTVN0cmluZyAm
bmFtZXNwYWNlVVJJKSBjb25zdAotewotICAgIC8vIEltcGxlbWVudGVkIGFjY29yZGluZyB0bwot
ICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLURPTS1MZXZlbC0zLUNvcmUtMjAw
NDA0MDcvbmFtZXNwYWNlcy1hbGdvcml0aG1zLmh0bWwjaXNEZWZhdWx0TmFtZXNwYWNlQWxnbwot
ICAgIAotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkgewotICAgICAgICBjYXNlIE5vZGU6OkVMRU1F
TlRfTk9ERTogewotICAgICAgICAgICAgY29uc3QgRWxlbWVudEltcGwgKmVsZW0gPSBzdGF0aWNf
Y2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgaWYgKGVsZW0tPnByZWZpeCgpLmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBl
bGVtLT5uYW1lc3BhY2VVUkkoKSA9PSBuYW1lc3BhY2VVUkk7Ci0KLSAgICAgICAgICAgIGlmIChl
bGVtLT5oYXNBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAgICAgICBOYW1lZEF0dHJNYXBJbXBs
ICphdHRycyA9IGVsZW0tPmF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0cnMtPmxlbmd0aCgpOyBpKyspIHsK
LSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAqYXR0ciA9IGF0dHJzLT5hdHRyaWJ1
dGVJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGF0dHItPmxvY2FsTmFtZSgpID09ICJ4bWxucyIpCi0gICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gYXR0ci0+dmFsdWUoKSA9PSBuYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoRWxlbWVudEltcGwg
KmFuY2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGFuY2VzdG9yLT5pc0RlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRf
Tk9ERToKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8Y29uc3QgRG9jdW1lbnRJbXBs
ICo+KHRoaXMpLT5kb2N1bWVudEVsZW1lbnQoKS0+aXNEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFj
ZVVSSSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9k
ZTo6Tk9UQVRJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6
Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERTogewotICAg
ICAgICAgICAgY29uc3QgQXR0ckltcGwgKmF0dHIgPSBzdGF0aWNfY2FzdDxjb25zdCBBdHRySW1w
bCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGF0dHItPm93bmVyRWxl
bWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT5vd25lckVsZW1lbnQoKS0+aXNE
ZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
aWYgKEVsZW1lbnRJbXBsICphbmNlc3RvciA9IGdldEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBhbmNlc3Rvci0+aXNEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVS
SSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0K
LURPTVN0cmluZyBOb2RlSW1wbDo6bG9va3VwUHJlZml4KGNvbnN0IERPTVN0cmluZyAmbmFtZXNw
YWNlVVJJKSBjb25zdAotewotICAgIC8vIEltcGxlbWVudGVkIGFjY29yZGluZyB0bwotICAgIC8v
IGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLURPTS1MZXZlbC0zLUNvcmUtMjAwNDA0MDcv
bmFtZXNwYWNlcy1hbGdvcml0aG1zLmh0bWwjbG9va3VwTmFtZXNwYWNlUHJlZml4QWxnbwotICAg
IAotICAgIGlmIChuYW1lc3BhY2VVUkkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gRE9NU3Ry
aW5nKCk7Ci0gICAgCi0gICAgc3dpdGNoIChub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9k
ZTo6RUxFTUVOVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGxvb2t1cE5hbWVzcGFjZVByZWZp
eChuYW1lc3BhY2VVUkksIHN0YXRpY19jYXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KHRoaXMpKTsK
LSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGNvbnN0IERvY3VtZW50SW1wbCAqPih0aGlzKS0+ZG9jdW1lbnRFbGVtZW50KCkt
Pmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9O
T0RFOgotICAgICAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9k
ZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9U
WVBFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgIGNhc2Ug
Tm9kZTo6QVRUUklCVVRFX05PREU6IHsKLSAgICAgICAgICAgIGNvbnN0IEF0dHJJbXBsICphdHRy
ID0gc3RhdGljX2Nhc3Q8Y29uc3QgQXR0ckltcGwgKj4odGhpcyk7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIGlmIChhdHRyLT5vd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gYXR0ci0+b3duZXJFbGVtZW50KCktPmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChFbGVtZW50SW1wbCAqYW5jZXN0b3IgPSBn
ZXRBbmNlc3RvckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3ItPmxv
b2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1
cm4gRE9NU3RyaW5nKCk7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgTm9kZUltcGw6Omxvb2t1cE5h
bWVzcGFjZVVSSShjb25zdCBET01TdHJpbmcgJnByZWZpeCkgY29uc3QKLXsKLSAgICAvLyBJbXBs
ZW1lbnRlZCBhY2NvcmRpbmcgdG8KLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JF
Qy1ET00tTGV2ZWwtMy1Db3JlLTIwMDQwNDA3L25hbWVzcGFjZXMtYWxnb3JpdGhtcy5odG1sI2xv
b2t1cE5hbWVzcGFjZVVSSUFsZ28KLSAgICAKLSAgICBpZiAoIXByZWZpeC5pc051bGwoKSAmJiBw
cmVmaXguaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgCi0gICAg
c3dpdGNoIChub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOiB7
Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50SW1wbCAqZWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0
IEVsZW1lbnRJbXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWVs
ZW0tPm5hbWVzcGFjZVVSSSgpLmlzTnVsbCgpICYmIGVsZW0tPnByZWZpeCgpID09IHByZWZpeCkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS0+bmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIGlmIChlbGVtLT5oYXNBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAg
ICAgICBOYW1lZEF0dHJNYXBJbXBsICphdHRycyA9IGVsZW0tPmF0dHJpYnV0ZXMoKTsKLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0
cnMtPmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAq
YXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICAKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGF0dHItPnByZWZpeCgpID09ICJ4bWxucyIgJiYgYXR0ci0+
bG9jYWxOYW1lKCkgPT0gcHJlZml4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0
dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBhdHRyLT52YWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bG9jYWxOYW1lKCkgPT0gInhtbG5zIiAmJiBwcmVmaXguaXNOdWxsKCkpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHItPnZhbHVlKCk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBET01TdHJp
bmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKEVsZW1lbnRJbXBsICphbmNlc3Rv
ciA9IGdldEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBhbmNlc3Rv
ci0+bG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VN
RU5UX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRG9jdW1lbnRJ
bXBsICo+KHRoaXMpLT5kb2N1bWVudEVsZW1lbnQoKS0+bG9va3VwTmFtZXNwYWNlVVJJKHByZWZp
eCk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6
Tk9UQVRJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0g
ICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLSAgICAgICAgICAgIHJl
dHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERTogewot
ICAgICAgICAgICAgY29uc3QgQXR0ckltcGwgKmF0dHIgPSBzdGF0aWNfY2FzdDxjb25zdCBBdHRy
SW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGF0dHItPm93bmVy
RWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT5vd25lckVsZW1lbnQoKS0+
bG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICBpZiAoRWxlbWVudEltcGwgKmFuY2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50
KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLT5sb29rdXBOYW1lc3BhY2VVUkko
cHJlZml4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwot
ICAgIH0KLX0KLQotRE9NU3RyaW5nIE5vZGVJbXBsOjpsb29rdXBOYW1lc3BhY2VQcmVmaXgoY29u
c3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBjb25zdCBFbGVtZW50SW1wbCAqb3JpZ2luYWxF
bGVtZW50KSBjb25zdAotewotICAgIGlmIChfbmFtZXNwYWNlVVJJLmlzTnVsbCgpKQotICAgICAg
ICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICAKLSAgICBpZiAob3JpZ2luYWxFbGVt
ZW50LT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KCkpID09IF9uYW1lc3BhY2VVUkkpCi0gICAg
ICAgIHJldHVybiBwcmVmaXgoKTsKLSAgICAKLSAgICBpZiAoaGFzQXR0cmlidXRlcygpKSB7Ci0g
ICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gYXR0cmlidXRlcygpOwotICAgICAgICAK
LSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGF0dHJzLT5sZW5ndGgoKTsgaSsrKSB7
Ci0gICAgICAgICAgICBBdHRyaWJ1dGVJbXBsICphdHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0o
aSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhdHRyLT5wcmVmaXgoKSA9PSAieG1s
bnMiICYmCi0gICAgICAgICAgICAgICAgYXR0ci0+dmFsdWUoKSA9PSBfbmFtZXNwYWNlVVJJICYm
Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxFbGVtZW50LT5sb29rdXBOYW1lc3BhY2VVUkkoYXR0
ci0+bG9jYWxOYW1lKCkpID09IF9uYW1lc3BhY2VVUkkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGF0dHItPmxvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChFbGVt
ZW50SW1wbCAqYW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJu
IGFuY2VzdG9yLT5sb29rdXBOYW1lc3BhY2VQcmVmaXgoX25hbWVzcGFjZVVSSSwgb3JpZ2luYWxF
bGVtZW50KTsKLSAgICAKLSAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci19Ci0KLURPTVN0cmluZyBO
b2RlSW1wbDo6dGV4dENvbnRlbnQoKSBjb25zdAotewotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkg
ewotICAgICAgICBjYXNlIE5vZGU6OlRFWFRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpDREFU
QV9TRUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Q09NTUVOVF9OT0RFOgotICAgICAg
ICBjYXNlIE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgICAgIHJl
dHVybiBub2RlVmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9O
T0RFOgotICAgICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOgotICAgICAgICBjYXNlIE5v
ZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9SRUZFUkVOQ0VfTk9E
RToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiB7Ci0gICAgICAg
ICAgICBET01TdHJpbmcgcyA9ICIiOwotICAgICAgICAKLSAgICAgICAgICAgIGZvciAoTm9kZUlt
cGwgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxp
bmcoKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpD
T01NRU5UX05PREUgfHwgCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLT5ub2RlVHlwZSgpID09
IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLSAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzICs9IGNoaWxkLT50ZXh0
Q29udGVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBz
OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6
Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICBjYXNlIE5v
ZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4g
RE9NU3RyaW5nKCk7ICAgICAgICAgICAgCi0gICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRU
ZXh0Q29udGVudChjb25zdCBET01TdHJpbmcgJnRleHQsIGludCAmZXhjZXB0aW9uKQoteyAgICAg
ICAgICAgCi0gICAgc3dpdGNoIChub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6VEVY
VF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAg
Y2FzZSBOb2RlOjpDT01NRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19J
TlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAgc2V0Tm9kZVZhbHVlKHRleHQsIGV4Y2VwdGlv
bik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6
Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6
RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX1JFRkVSRU5DRV9OT0RFOgot
ICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IHsKLSAgICAgICAgICAg
IENvbnRhaW5lck5vZGVJbXBsICpjb250YWluZXIgPSBzdGF0aWNfY2FzdDxDb250YWluZXJOb2Rl
SW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGFpbmVyLT5yZW1v
dmVDaGlsZHJlbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXRleHQuaXNFbXB0
eSgpKQotICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkKGdldERvY3VtZW50KCktPmNyZWF0ZVRl
eHROb2RlKHRleHQpLCBleGNlcHRpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRP
Q1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpOT1RBVElPTl9OT0RFOgotICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gRG8gbm90aGluZwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgfQotfQotCi1FbGVtZW50SW1wbCAqTm9kZUltcGw6OmdldEFuY2VzdG9yRWxlbWVu
dCgpIGNvbnN0Ci17Ci0gICAgLy8gSW4gdGhlb3J5LCB0aGVyZSBjYW4gYmUgRW50aXR5UmVmZXJl
bmNlIG5vZGVzIGJldHdlZW4gZWxlbWVudHMKLSAgICAvLyBidXQgdGhpcyBpcyBjdXJyZW50bHkg
bm90IHN1cHBvcnRlZC4KLSAgICBmb3IgKE5vZGVJbXBsICpuID0gcGFyZW50Tm9kZSgpOyBuOyBu
ID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkpCi0g
ICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0gICAgfQot
ICAgIAotICAgIHJldHVybiAwOwotfQotCi0jaWZuZGVmIE5ERUJVRwotCi1zdGF0aWMgdm9pZCBh
cHBlbmRBdHRyaWJ1dGVEZXNjKGNvbnN0IE5vZGVJbXBsICpub2RlLCBET01TdHJpbmcgJnN0cmlu
ZywgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgUVN0cmluZyBhdHRyRGVzYykKLXsKLSAgICBp
ZiAobm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAgIERPTVN0cmluZyBhdHRyID0gc3Rh
dGljX2Nhc3Q8Y29uc3QgRWxlbWVudEltcGwgKj4obm9kZSktPmdldEF0dHJpYnV0ZShuYW1lKTsK
LSAgICAgICAgaWYgKCFhdHRyLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RyaW5nICs9IGF0
dHJEZXNjOwotICAgICAgICAgICAgc3RyaW5nICs9IGF0dHI7Ci0gICAgICAgIH0KLSAgICB9Ci19
Ci0KLXZvaWQgTm9kZUltcGw6OnNob3dOb2RlKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKLXsK
LSAgICBpZiAoIXByZWZpeCkKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgaWYgKGlzVGV4dE5v
ZGUoKSkgewotICAgICAgICBRU3RyaW5nIHZhbHVlID0gbm9kZVZhbHVlKCkucXN0cmluZygpOwot
ICAgICAgICB2YWx1ZS5yZXBsYWNlKCdcXCcsICJcXFxcIik7Ci0gICAgICAgIHZhbHVlLnJlcGxh
Y2UoJ1xuJywgIlxcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzJXNcdCVwIFwiJXNc
IlxuIiwgcHJlZml4LCBub2RlTmFtZSgpLnFzdHJpbmcoKS51dGY4KCkuZGF0YSgpLCB0aGlzLCB2
YWx1ZS51dGY4KCkuZGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBET01TdHJpbmcgYXR0
cnMgPSAiIjsKLSAgICAgICAgYXBwZW5kQXR0cmlidXRlRGVzYyh0aGlzLCBhdHRycywgY2xhc3NB
dHRyLCAiIENMQVNTPSIpOwotICAgICAgICBhcHBlbmRBdHRyaWJ1dGVEZXNjKHRoaXMsIGF0dHJz
LCBzdHlsZUF0dHIsICIgU1RZTEU9Iik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMlc1x0
JXAlc1xuIiwgcHJlZml4LCBub2RlTmFtZSgpLnFzdHJpbmcoKS51dGY4KCkuZGF0YSgpLCB0aGlz
LCBhdHRycy5xc3RyaW5nKCkuYXNjaWkoKSk7Ci0gICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpz
aG93VHJlZSgpIGNvbnN0Ci17Ci0gICAgc2hvd1RyZWVBbmRNYXJrKChOb2RlSW1wbCAqKXRoaXMs
ICIqIiwgTlVMTCwgTlVMTCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNob3dUcmVlQW5kTWFyayhO
b2RlSW1wbCAqIG1hcmtlZE5vZGUxLCBjb25zdCBjaGFyICogbWFya2VkTGFiZWwxLCBOb2RlSW1w
bCAqIG1hcmtlZE5vZGUyLCBjb25zdCBjaGFyICogbWFya2VkTGFiZWwyKSBjb25zdAotewotICAg
IE5vZGVJbXBsICpyb290Tm9kZTsKLSAgICBOb2RlSW1wbCAqbm9kZSA9IChOb2RlSW1wbCAqKXRo
aXM7Ci0gICAgd2hpbGUgKG5vZGUtPnBhcmVudE5vZGUoKSAmJiAhbm9kZS0+aGFzVGFnTmFtZShi
b2R5VGFnKSkKLSAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKLSAgICByb290Tm9k
ZSA9IG5vZGU7Ci0JCi0gICAgZm9yIChub2RlID0gcm9vdE5vZGU7IG5vZGU7IG5vZGUgPSBub2Rl
LT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAgICAgICAgTm9kZUltcGwgKnRtcE5vZGU7Ci0JCQot
ICAgICAgICBpZiAobm9kZSA9PSBtYXJrZWROb2RlMSkKLSAgICAgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiJXMiLCBtYXJrZWRMYWJlbDEpOwotICAgICAgICBpZiAobm9kZSA9PSBtYXJrZWROb2Rl
MikKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBtYXJrZWRMYWJlbDIpOwotCQkJ
Ci0gICAgICAgIGZvciAodG1wTm9kZSA9IG5vZGU7IHRtcE5vZGUgJiYgdG1wTm9kZSAhPSByb290
Tm9kZTsgdG1wTm9kZSA9IHRtcE5vZGUtPnBhcmVudE5vZGUoKSkKLSAgICAgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiXHQiKTsKLSAgICAgICAgbm9kZS0+c2hvd05vZGUoMCk7Ci0gICAgfQotfQot
Ci12b2lkIE5vZGVJbXBsOjpmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVk
IGxlbmd0aCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgcmVzdWx0OwotICAgIERPTVN0cmluZyBz
OwotICAgIAotICAgIHMgPSBub2RlTmFtZSgpOwotICAgIGlmIChzLmxlbmd0aCgpID09IDApCi0g
ICAgICAgIHJlc3VsdCArPSAiPG5vbmU+IjsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCArPSBz
OwotICAgICAgICAgIAotICAgIHN0cm5jcHkoYnVmZmVyLCByZXN1bHQucXN0cmluZygpLmxhdGlu
MSgpLCBsZW5ndGggLSAxKTsKLX0KLQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1D
b250YWluZXJOb2RlSW1wbDo6Q29udGFpbmVyTm9kZUltcGwoRG9jdW1lbnRJbXBsICpkb2MpCi0g
ICAgOiBOb2RlSW1wbChkb2MpCi17Ci0gICAgX2ZpcnN0ID0gX2xhc3QgPSAwOwotfQotCi12b2lk
IENvbnRhaW5lck5vZGVJbXBsOjpyZW1vdmVBbGxDaGlsZHJlbigpCi17Ci0gICAgLy9rZERlYnVn
KCA2MDIwICkgPDwgIkNvbnRhaW5lck5vZGVJbXBsIGRlc3RydWN0b3IiIDw8IGVuZGw7Ci0KLSAg
ICAvLyBBdm9pZCBkZWVwIHJlY3Vyc2lvbiB3aGVuIGRlc3Ryb3lpbmcgdGhlIG5vZGUgdHJlZS4K
LSAgICBzdGF0aWMgYm9vbCBhbHJlYWR5SW5zaWRlRGVzdHJ1Y3RvcjsgCi0gICAgYm9vbCB0b3BM
ZXZlbCA9ICFhbHJlYWR5SW5zaWRlRGVzdHJ1Y3RvcjsKLSAgICBpZiAodG9wTGV2ZWwpCi0gICAg
ICAgIGFscmVhZHlJbnNpZGVEZXN0cnVjdG9yID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBMaXN0IG9m
IG5vZGVzIHRvIGJlIGRlbGV0ZWQuCi0gICAgc3RhdGljIE5vZGVJbXBsICpoZWFkOwotICAgIHN0
YXRpYyBOb2RlSW1wbCAqdGFpbDsKLSAgICAKLSAgICAvLyBXZSBoYXZlIHRvIHRlbGwgYWxsIGNo
aWxkcmVuIHRoYXQgdGhlaXIgcGFyZW50IGhhcyBkaWVkLgotICAgIE5vZGVJbXBsICpuOwotICAg
IE5vZGVJbXBsICpuZXh0OwotCi0gICAgZm9yKCBuID0gX2ZpcnN0OyBuICE9IDA7IG4gPSBuZXh0
ICkgewotICAgICAgICBuZXh0ID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgbi0+c2V0UHJl
dmlvdXNTaWJsaW5nKDApOwotICAgICAgICBuLT5zZXROZXh0U2libGluZygwKTsKLSAgICAgICAg
bi0+c2V0UGFyZW50KDApOwotICAgICAgICAKLQlpZiAoICFuLT5yZWZDb3VudCgpICkgewotICAg
ICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBsaXN0IG9mIG5vZGVzIHRvIGJlIGRlbGV0
ZWQuCi0gICAgICAgICAgICAvLyBSZXVzZSB0aGUgbmV4dFNpYmxpbmcgcG9pbnRlciBmb3IgdGhp
cyBwdXJwb3NlLgotICAgICAgICAgICAgaWYgKHRhaWwpCi0gICAgICAgICAgICAgICAgdGFpbC0+
c2V0TmV4dFNpYmxpbmcobik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaGVh
ZCA9IG47Ci0gICAgICAgICAgICB0YWlsID0gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuLT5pbkRv
Y3VtZW50KCkpCi0gICAgICAgICAgICBuLT5yZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gICAgfQot
ICAgIAotICAgIC8vIE9ubHkgZm9yIHRoZSB0b3AgbGV2ZWwgY2FsbCwgZG8gdGhlIGFjdHVhbCBk
ZWxldGluZy4KLSAgICBpZiAodG9wTGV2ZWwpIHsKLSAgICAgICAgd2hpbGUgKChuID0gaGVhZCkg
IT0gMCkgewotICAgICAgICAgICAgbmV4dCA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAg
ICBuLT5zZXROZXh0U2libGluZygwKTsKLQotICAgICAgICAgICAgaGVhZCA9IG5leHQ7Ci0gICAg
ICAgICAgICBpZiAobmV4dCA9PSAwKQotICAgICAgICAgICAgICAgIHRhaWwgPSAwOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBkZWxldGUgbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgYWxyZWFkeUluc2lkZURlc3RydWN0b3IgPSBmYWxzZTsKLSAgICAgICAgX2ZpcnN0ID0gMDsK
LSAgICAgICAgX2xhc3QgPSAwOwotICAgIH0KLX0KLQotQ29udGFpbmVyTm9kZUltcGw6On5Db250
YWluZXJOb2RlSW1wbCgpCi17Ci0gICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsKLX0KLQotCi1Ob2Rl
SW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OmZpcnN0Q2hpbGQoKSBjb25zdAotewotICAgIHJldHVy
biBfZmlyc3Q7Ci19Ci0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6bGFzdENoaWxkKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gX2xhc3Q7Ci19Ci0KLU5vZGVJbXBsICpDb250YWluZXJOb2Rl
SW1wbDo6aW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAg
ICAvLyBpbnNlcnRCZWZvcmUoLi4uLG51bGwpIGlzIGVxdWl2YWxlbnQgdG8gYXBwZW5kQ2hpbGQo
KQotICAgIGlmKCFyZWZDaGlsZCkKLSAgICAgICAgcmV0dXJuIGFwcGVuZENoaWxkKG5ld0NoaWxk
LCBleGNlcHRpb25jb2RlKTsKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVjdE5ld0NoaWxk
KG5ld0NoaWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVmJ2QgYW5kIGRlcmVm
J2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgLy8gTWFrZSBzdXJlIGFkZGluZyB0aGUgbmV3
IGNoaWxkIGlzIG9rCi0gICAgY2hlY2tBZGRDaGlsZChuZXdDaGlsZCwgZXhjZXB0aW9uY29kZSk7
Ci0gICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gTk9U
X0ZPVU5EX0VSUjogUmFpc2VkIGlmIHJlZkNoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9k
ZQotICAgIGlmIChyZWZDaGlsZC0+cGFyZW50Tm9kZSgpICE9IHRoaXMpIHsKLSAgICAgICAgZXhj
ZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgfQotCi0gICAgYm9vbCBpc0ZyYWdtZW50ID0gbmV3Q2hpbGQtPm5vZGVUeXBlKCkg
PT0gTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQotICAgIC8vIElmIG5ld0NoaWxkIGlz
IGEgRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGNoaWxkcmVuLi4uLiB0aGVyZSdzIG5vdGhpbmcg
dG8gZG8uCi0gICAgLy8gSnVzdCByZXR1cm4gdGhlIGRvY3VtZW50IGZyYWdtZW50Ci0gICAgaWYg
KGlzRnJhZ21lbnQgJiYgIW5ld0NoaWxkLT5maXJzdENoaWxkKCkpCi0gICAgICAgIHJldHVybiAo
bmV3Q2hpbGQtPmhhc09uZVJlZigpICYmICFuZXdDaGlsZC0+cGFyZW50KCkpID8gMCA6IG5ld0No
aWxkOwotCi0gICAgLy8gTm93IGFjdHVhbGx5IGFkZCB0aGUgY2hpbGQocmVuKQotICAgIE5vZGVJ
bXBsICpuZXh0Q2hpbGQ7Ci0gICAgTm9kZUltcGwgKmNoaWxkID0gaXNGcmFnbWVudCA/IG5ld0No
aWxkLT5maXJzdENoaWxkKCkgOiBuZXdDaGlsZDsKLQotICAgIE5vZGVJbXBsICpwcmV2ID0gcmVm
Q2hpbGQtPnByZXZpb3VzU2libGluZygpOwotICAgIGlmICggcHJldiA9PSBuZXdDaGlsZCB8fCBy
ZWZDaGlsZCA9PSBuZXdDaGlsZCApIC8vIG5vdGhpbmcgdG8gZG8KLQlyZXR1cm4gbmV3Q2hpbGQ7
Ci0gICAgCi0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIG5leHRDaGlsZCA9IGlzRnJhZ21l
bnQgPyBjaGlsZC0+bmV4dFNpYmxpbmcoKSA6IDA7Ci0KLSAgICAgICAgLy8gSWYgY2hpbGQgaXMg
YWxyZWFkeSBwcmVzZW50IGluIHRoZSB0cmVlLCBmaXJzdCByZW1vdmUgaXQKLSAgICAgICAgTm9k
ZUltcGwgKm5ld1BhcmVudCA9IGNoaWxkLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChuZXdQ
YXJlbnQpCi0gICAgICAgICAgICBuZXdQYXJlbnQtPnJlbW92ZUNoaWxkKCBjaGlsZCwgZXhjZXB0
aW9uY29kZSApOwotICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgICAgIHJldHVy
biAwOwotCi0gICAgICAgIC8vIEFkZCBjaGlsZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbgotICAg
ICAgICBmb3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAgICAgIGlmIChwcmV2KQotICAgICAgICAg
ICAgcHJldi0+c2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBfZmlyc3QgPSBjaGlsZDsKLSAgICAgICAgcmVmQ2hpbGQtPnNldFByZXZpb3VzU2libGluZyhj
aGlsZCk7Ci0gICAgICAgIGNoaWxkLT5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGNoaWxkLT5z
ZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0gICAgICAgIGNoaWxkLT5zZXROZXh0U2libGluZyhy
ZWZDaGlsZCk7Ci0gICAgICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAgICAgIC8vIEFk
ZCBjaGlsZCB0byB0aGUgcmVuZGVyaW5nIHRyZWUKLSAgICAgICAgLy8gIyMjIHNob3VsZCB3ZSBk
ZXRhY2goKSBpdCBmaXJzdCBpZiBpdCdzIGFscmVhZHkgYXR0YWNoZWQ/Ci0gICAgICAgIGlmIChh
dHRhY2hlZCgpICYmICFjaGlsZC0+YXR0YWNoZWQoKSkKLSAgICAgICAgICAgIGNoaWxkLT5hdHRh
Y2goKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERpc3BhdGNoIHRoZSBtdXRhdGlvbiBldmVudHMK
LSAgICAgICAgZGlzcGF0Y2hDaGlsZEluc2VydGVkRXZlbnRzKGNoaWxkLGV4Y2VwdGlvbmNvZGUp
OwotCi0gICAgICAgIHByZXYgPSBjaGlsZDsKLSAgICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0g
ICAgfQotCi0gICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwotICAg
IGRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoKTsKLSAgICByZXR1cm4gbmV3Q2hpbGQ7Ci19
Ci0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6cmVwbGFjZUNoaWxkICggTm9kZUltcGwg
Km5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0g
ICAgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3ROZXdD
aGlsZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidkIGFuZCBk
ZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLQotICAgIGlmICggb2xkQ2hpbGQgPT0gbmV3Q2hp
bGQgKSAvLyBub3RoaW5nIHRvIGRvCi0JcmV0dXJuIG9sZENoaWxkOwotICAgIAotICAgIC8vIE1h
a2Ugc3VyZSBhZGRpbmcgdGhlIG5ldyBjaGlsZCBpcyBvawotICAgIGNoZWNrQWRkQ2hpbGQobmV3
Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIC8vIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiBvbGRDaGlsZCBpcyBu
b3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCi0gICAgaWYgKCFvbGRDaGlsZCB8fCBvbGRDaGlsZC0+
cGFyZW50Tm9kZSgpICE9IHRoaXMpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2Vw
dGlvbjo6Tk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYm9v
bCBpc0ZyYWdtZW50ID0gbmV3Q2hpbGQtPm5vZGVUeXBlKCkgPT0gTm9kZTo6RE9DVU1FTlRfRlJB
R01FTlRfTk9ERTsKLSAgICBOb2RlSW1wbCAqbmV4dENoaWxkOwotICAgIE5vZGVJbXBsICpjaGls
ZCA9IGlzRnJhZ21lbnQgPyBuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpIDogbmV3Q2hpbGQ7Ci0KLSAg
ICAvLyBSZW1vdmUgdGhlIG9sZCBjaGlsZAotICAgIE5vZGVJbXBsICpwcmV2ID0gb2xkQ2hpbGQt
PnByZXZpb3VzU2libGluZygpOwotICAgIE5vZGVJbXBsICpuZXh0ID0gb2xkQ2hpbGQtPm5leHRT
aWJsaW5nKCk7Ci0KLSAgICByZW1vdmVDaGlsZChvbGRDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0g
ICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gSWYgdGhl
IG5ldyBjaGlsZCB3YXMgcmlnaHQgYmVmb3JlIG9yIHJpZ2h0IGFmdGVyIHRoZSBvbGQgY2hpbGQs
IG5vdGhpbmcgZWxzZSBuZWVkcyB0byBjaGFuZ2UKLSAgICBpZiAocHJldiA9PSBjaGlsZCB8fCBu
ZXh0ID09IGNoaWxkKQotICAgICAgICBjaGlsZCA9IDA7Ci0gICAgLy8gQWRkIHRoZSBuZXcgY2hp
bGQocmVuKQotICAgIHdoaWxlIChjaGlsZCkgewotICAgICAgICBuZXh0Q2hpbGQgPSBpc0ZyYWdt
ZW50ID8gY2hpbGQtPm5leHRTaWJsaW5nKCkgOiAwOwotCi0gICAgICAgIC8vIElmIGNoaWxkIGlz
IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgdHJlZSwgZmlyc3QgcmVtb3ZlIGl0Ci0gICAgICAgIE5v
ZGVJbXBsICpuZXdQYXJlbnQgPSBjaGlsZC0+cGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAobmV3
UGFyZW50KQotICAgICAgICAgICAgbmV3UGFyZW50LT5yZW1vdmVDaGlsZCggY2hpbGQsIGV4Y2Vw
dGlvbmNvZGUgKTsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgICAgICByZXR1
cm4gMDsKLQotICAgICAgICAvLyBBZGQgY2hpbGQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24KLSAg
ICAgICAgZm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgICAgICBpZiAocHJldikgcHJldi0+c2V0
TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgICAgICBpZiAobmV4dCkgbmV4dC0+c2V0UHJldmlvdXNT
aWJsaW5nKGNoaWxkKTsKLSAgICAgICAgaWYoIXByZXYpIF9maXJzdCA9IGNoaWxkOwotICAgICAg
ICBpZighbmV4dCkgX2xhc3QgPSBjaGlsZDsKLSAgICAgICAgY2hpbGQtPnNldFBhcmVudCh0aGlz
KTsKLSAgICAgICAgY2hpbGQtPnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLSAgICAgICAgY2hp
bGQtPnNldE5leHRTaWJsaW5nKG5leHQpOwotICAgICAgICBhbGxvd0V2ZW50RGlzcGF0Y2goKTsK
LQotICAgICAgICAvLyBBZGQgY2hpbGQgdG8gdGhlIHJlbmRlcmluZyB0cmVlCi0gICAgICAgIC8v
ICMjIyBzaG91bGQgd2UgZGV0YWNoKCkgaXQgZmlyc3QgaWYgaXQncyBhbHJlYWR5IGF0dGFjaGVk
PwotICAgICAgICBpZiAoYXR0YWNoZWQoKSAmJiAhY2hpbGQtPmF0dGFjaGVkKCkpCi0gICAgICAg
ICAgICBjaGlsZC0+YXR0YWNoKCk7Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIG11dGF0aW9u
IGV2ZW50cwotICAgICAgICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoY2hpbGQsZXhjZXB0
aW9uY29kZSk7Ci0KLSAgICAgICAgcHJldiA9IGNoaWxkOwotICAgICAgICBjaGlsZCA9IG5leHRD
aGlsZDsKLSAgICB9Ci0KLSAgICAvLyAjIyMgc2V0IHN0eWxlIGluIGNhc2UgaXQncyBhdHRhY2hl
ZAotICAgIGdldERvY3VtZW50KCktPnNldERvY3VtZW50Q2hhbmdlZCh0cnVlKTsKLSAgICBkaXNw
YXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KCk7Ci0gICAgcmV0dXJuIG9sZENoaWxkOwotfQotCi12
b2lkIENvbnRhaW5lck5vZGVJbXBsOjp3aWxsUmVtb3ZlKCkKLXsKLSAgICBmb3IgKE5vZGVJbXBs
ICpuID0gX2ZpcnN0OyBuICE9IDA7IG4gPSBuLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIG4t
PndpbGxSZW1vdmUoKTsKLSAgICB9Ci19Ci0KLWludCBDb250YWluZXJOb2RlSW1wbDo6d2lsbFJl
bW92ZUNoaWxkKE5vZGVJbXBsICpjaGlsZCkKLXsKLSAgICBpbnQgZXhjZXB0aW9uQ29kZSA9IDA7
Ci0KLSAgICAvLyBmaXJlIHJlbW92ZWQgZnJvbSBkb2N1bWVudCBtdXRhdGlvbiBldmVudHMuCi0g
ICAgZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoY2hpbGQsIGV4Y2VwdGlvbkNvZGUpOwotICAg
IGlmIChleGNlcHRpb25Db2RlKQotICAgICAgICByZXR1cm4gZXhjZXB0aW9uQ29kZTsKLQotICAg
IGlmIChjaGlsZC0+YXR0YWNoZWQoKSkKLSAgICAgICAgY2hpbGQtPndpbGxSZW1vdmUoKTsKLSAg
ICAKLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpyZW1v
dmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAg
ICBleGNlcHRpb25jb2RlID0gMDsKLQotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VS
UjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICBpZiAoaXNSZWFkT25seSgp
KSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElP
Tl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gTk9UX0ZP
VU5EX0VSUjogUmFpc2VkIGlmIG9sZENoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4K
LSAgICBpZiAoIW9sZENoaWxkIHx8IG9sZENoaWxkLT5wYXJlbnROb2RlKCkgIT0gdGhpcykgewot
ICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICAg
ICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgLy8gdXBkYXRlIGF1eGlsaWFyeSBkb2Mg
aW5mbyAoZS5nLiBpdGVyYXRvcnMpIHRvIG5vdGUgdGhhdCBub2RlIGlzIGJlaW5nIHJlbW92ZWQK
LSAgICAvLyBGSVg6IFRoaXMgbG9va3MgcmVkdW5kYW50IHdpdGggc2FtZSBjYWxsIGZyb20gZGlz
cGF0Y2hDaGlsZFJlbW92YWxFdmVudHMgaW4gd2lsbFJlbW92ZUNoaWxkCi0vLyAgZ2V0RG9jdW1l
bnQoKS0+bm90aWZ5QmVmb3JlTm9kZVJlbW92YWwob2xkQ2hpbGQpOyAvLyAjIyMgdXNlIGV2ZW50
cyBpbnN0ZWFkCi0KLSAgICAvLyBkaXNwYXRjaCBwcmUtcmVtb3ZhbCBtdXRhdGlvbiBldmVudHMK
LSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50SW1wbDo6RE9N
Tk9ERVJFTU9WRURfTElTVEVORVIpKSB7Ci0Jb2xkQ2hpbGQtPmRpc3BhdGNoRXZlbnQobmV3IE11
dGF0aW9uRXZlbnRJbXBsKERPTU5vZGVSZW1vdmVkRXZlbnQsCi0JCQkgICAgIHRydWUsZmFsc2Us
dGhpcyxET01TdHJpbmcoKSxET01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNlcHRpb25jb2Rl
LHRydWUpOwotCWlmIChleGNlcHRpb25jb2RlKQotCSAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAg
ICBleGNlcHRpb25jb2RlID0gd2lsbFJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLSAgICBpZiAoZXhj
ZXB0aW9uY29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3JiaWRFdmVudERpc3BhdGNo
KCk7Ci0KLSAgICAvLyBSZW1vdmUgZnJvbSByZW5kZXJpbmcgdHJlZQotICAgIGlmIChvbGRDaGls
ZC0+YXR0YWNoZWQoKSkKLSAgICAgICAgb2xkQ2hpbGQtPmRldGFjaCgpOwotCi0gICAgLy8gUmVt
b3ZlIHRoZSBjaGlsZAotICAgIE5vZGVJbXBsICpwcmV2LCAqbmV4dDsKLSAgICBwcmV2ID0gb2xk
Q2hpbGQtPnByZXZpb3VzU2libGluZygpOwotICAgIG5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxp
bmcoKTsKLQotICAgIGlmKG5leHQpIG5leHQtPnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLSAg
ICBpZihwcmV2KSBwcmV2LT5zZXROZXh0U2libGluZyhuZXh0KTsKLSAgICBpZihfZmlyc3QgPT0g
b2xkQ2hpbGQpIF9maXJzdCA9IG5leHQ7Ci0gICAgaWYoX2xhc3QgPT0gb2xkQ2hpbGQpIF9sYXN0
ID0gcHJldjsKLQotICAgIG9sZENoaWxkLT5zZXRQcmV2aW91c1NpYmxpbmcoMCk7Ci0gICAgb2xk
Q2hpbGQtPnNldE5leHRTaWJsaW5nKDApOwotICAgIG9sZENoaWxkLT5zZXRQYXJlbnQoMCk7Ci0K
LSAgICBhbGxvd0V2ZW50RGlzcGF0Y2goKTsKLQotICAgIGdldERvY3VtZW50KCktPnNldERvY3Vt
ZW50Q2hhbmdlZCh0cnVlKTsKLQotICAgIC8vIERpc3BhdGNoIHBvc3QtcmVtb3ZhbCBtdXRhdGlv
biBldmVudHMKLSAgICBkaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KCk7Ci0KLSAgICBpZiAo
b2xkQ2hpbGQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgb2xkQ2hpbGQtPnJlbW92ZWRGcm9tRG9j
dW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICAgIG9sZENoaWxkLT5yZW1vdmVkRnJvbVRyZWUodHJ1
ZSk7Ci0KLSAgICByZXR1cm4gb2xkQ2hpbGQ7Ci19Ci0KLS8vIHRoaXMgZGlmZmVycyBmcm9tIG90
aGVyIHJlbW92ZSBmdW5jdGlvbnMgYmVjYXVzZSBpdCBmb3JjaWJseSByZW1vdmVzIGFsbCB0aGUg
Y2hpbGRyZW4sCi0vLyByZWdhcmRsZXNzIG9mIHJlYWQtb25seSBzdGF0dXMgb3IgZXZlbnQgZXhj
ZXB0aW9ucywgZS5nLgotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6cmVtb3ZlQ2hpbGRyZW4oKQot
ewotICAgIE5vZGVJbXBsICpuOwotICAgIAotICAgIGlmICghX2ZpcnN0KQotICAgICAgICByZXR1
cm47Ci0KLSAgICAvLyBkbyBhbnkgcHJlcCB3b3JrIG5lZWRlZCBiZWZvcmUgYWN0dWFsbHkgc3Rh
cnRpbmcgdG8gZGV0YWNoCi0gICAgLy8gYW5kIHJlbW92ZS4uLiBlLmcuIHN0b3AgbG9hZGluZyBm
cmFtZXMsIGZpcmUgdW5sb2FkIGV2ZW50cwotICAgIGZvciAobiA9IF9maXJzdDsgbiAhPSAwOyBu
ID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgd2lsbFJlbW92ZUNoaWxkKG4pOwotICAgIAot
ICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLSAgICB3aGlsZSAoKG4gPSBfZmlyc3QpICE9IDAp
IHsKLSAgICAgICAgTm9kZUltcGwgKm5leHQgPSBuLT5uZXh0U2libGluZygpOwotICAgICAgICAK
LSAgICAgICAgbi0+cmVmKCk7Ci0KLSAgICAgICAgaWYgKG4tPmF0dGFjaGVkKCkpCi0gICAgICAg
ICAgICBuLT5kZXRhY2goKTsKLSAgICAgICAgbi0+c2V0UHJldmlvdXNTaWJsaW5nKDApOwotICAg
ICAgICBuLT5zZXROZXh0U2libGluZygwKTsKLSAgICAgICAgbi0+c2V0UGFyZW50KDApOwotICAg
ICAgICAKLSAgICAgICAgaWYgKG4tPmluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgIG4tPnJlbW92
ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAgICAgICBuLT5kZXJlZigpOwotCi0gICAgICAgIF9maXJz
dCA9IG5leHQ7Ci0gICAgfQotICAgIF9sYXN0ID0gMDsKLSAgICBhbGxvd0V2ZW50RGlzcGF0Y2go
KTsKLSAgICAKLSAgICAvLyBEaXNwYXRjaCBhIHNpbmdsZSBwb3N0LXJlbW92YWwgbXV0YXRpb24g
ZXZlbnQgZGVub3RpbmcgYSBtb2RpZmllZCBzdWJ0cmVlLgotICAgIGRpc3BhdGNoU3VidHJlZU1v
ZGlmaWVkRXZlbnQoKTsKLX0KLQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OmFwcGVu
ZENoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0TmV3Q2hp
bGQobmV3Q2hpbGQpOyAvLyBtYWtlIHN1cmUgdGhlIG5ldyBjaGlsZCBpcyByZWYnZCBhbmQgZGVy
ZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICAvLyBNYWtlIHN1cmUgYWRkaW5nIHRoZSBu
ZXcgY2hpbGQgaXMgb2sKLSAgICBjaGVja0FkZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2Rl
KTsKLSAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAg
aWYgKCBuZXdDaGlsZCA9PSBfbGFzdCApIC8vIG5vdGhpbmcgdG8gZG8KLQlyZXR1cm4gbmV3Q2hp
bGQ7Ci0KLSAgICBib29sIGlzRnJhZ21lbnQgPSBuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2Rl
OjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwotCi0gICAgLy8gSWYgbmV3Q2hpbGQgaXMgYSBEb2N1
bWVudEZyYWdtZW50IHdpdGggbm8gY2hpbGRyZW4uLi4uIHRoZXJlJ3Mgbm90aGluZyB0byBkby4K
LSAgICAvLyBKdXN0IHJldHVybiB0aGUgZG9jdW1lbnQgZnJhZ21lbnQKLSAgICBpZiAoaXNGcmFn
bWVudCAmJiAhbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIG5ld0NoaWxk
OwotCi0gICAgLy8gTm93IGFjdHVhbGx5IGFkZCB0aGUgY2hpbGQocmVuKQotICAgIE5vZGVJbXBs
ICpuZXh0Q2hpbGQ7Ci0gICAgTm9kZUltcGwgKmNoaWxkID0gaXNGcmFnbWVudCA/IG5ld0NoaWxk
LT5maXJzdENoaWxkKCkgOiBuZXdDaGlsZDsKLQotICAgIHdoaWxlIChjaGlsZCkgewotICAgICAg
ICBuZXh0Q2hpbGQgPSBpc0ZyYWdtZW50ID8gY2hpbGQtPm5leHRTaWJsaW5nKCkgOiAwOwotCi0g
ICAgICAgIC8vIElmIGNoaWxkIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgdHJlZSwgZmlyc3Qg
cmVtb3ZlIGl0Ci0gICAgICAgIE5vZGVJbXBsICpvbGRQYXJlbnQgPSBjaGlsZC0+cGFyZW50Tm9k
ZSgpOwotICAgICAgICBpZihvbGRQYXJlbnQpIHsKLSAgICAgICAgICAgIG9sZFBhcmVudC0+cmVt
b3ZlQ2hpbGQoIGNoaWxkLCBleGNlcHRpb25jb2RlICk7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0
aW9uY29kZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIEFwcGVuZCBjaGlsZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0gICAgICAgIGZvcmJpZEV2
ZW50RGlzcGF0Y2goKTsKLSAgICAgICAgY2hpbGQtPnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAg
aWYgKF9sYXN0KSB7Ci0gICAgICAgICAgICBjaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKF9sYXN0
KTsKLSAgICAgICAgICAgIF9sYXN0LT5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICAgICAg
ICBfbGFzdCA9IGNoaWxkOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIF9maXJzdCA9IF9s
YXN0ID0gY2hpbGQ7Ci0gICAgICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAgICAgIC8v
IEFkZCBjaGlsZCB0byB0aGUgcmVuZGVyaW5nIHRyZWUKLSAgICAgICAgLy8gIyMjIHNob3VsZCB3
ZSBkZXRhY2goKSBpdCBmaXJzdCBpZiBpdCdzIGFscmVhZHkgYXR0YWNoZWQ/Ci0gICAgICAgIGlm
IChhdHRhY2hlZCgpICYmICFjaGlsZC0+YXR0YWNoZWQoKSkKLSAgICAgICAgICAgIGNoaWxkLT5h
dHRhY2goKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERpc3BhdGNoIHRoZSBtdXRhdGlvbiBldmVu
dHMKLSAgICAgICAgZGlzcGF0Y2hDaGlsZEluc2VydGVkRXZlbnRzKGNoaWxkLGV4Y2VwdGlvbmNv
ZGUpOwotCi0gICAgICAgIGNoaWxkID0gbmV4dENoaWxkOwotICAgIH0KLQotICAgIGdldERvY3Vt
ZW50KCktPnNldERvY3VtZW50Q2hhbmdlZCh0cnVlKTsKLSAgICAvLyAjIyMgc2V0IHN0eWxlIGlu
IGNhc2UgaXQncyBhdHRhY2hlZAotICAgIGRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoKTsK
LSAgICByZXR1cm4gbmV3Q2hpbGQ7Ci19Ci0KLWJvb2wgQ29udGFpbmVyTm9kZUltcGw6Omhhc0No
aWxkTm9kZXMgKCAgKSBjb25zdAotewotICAgIHJldHVybiBfZmlyc3QgIT0gMDsKLX0KLQotLy8g
bm90IHBhcnQgb2YgdGhlIERPTQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0Rmlyc3RDaGls
ZChOb2RlSW1wbCAqY2hpbGQpCi17Ci0gICAgX2ZpcnN0ID0gY2hpbGQ7Ci19Ci0KLXZvaWQgQ29u
dGFpbmVyTm9kZUltcGw6OnNldExhc3RDaGlsZChOb2RlSW1wbCAqY2hpbGQpCi17Ci0gICAgX2xh
c3QgPSBjaGlsZDsKLX0KLQotLy8gY2hlY2sgZm9yIHNhbWUgc291cmNlIGRvY3VtZW50OgotYm9v
bCBDb250YWluZXJOb2RlSW1wbDo6Y2hlY2tTYW1lRG9jdW1lbnQoIE5vZGVJbXBsICpuZXdDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBleGNlcHRpb25jb2RlID0gMDsKLSAgICBE
b2N1bWVudEltcGwgKm93bmVyRG9jVGhpcyA9IGdldERvY3VtZW50KCk7Ci0gICAgLy8gRklYTUU6
IERvaCEgVGhpcyBuZXh0IGxpbmUgaXNuJ3QgZ2V0dGluZyBuZXdDaGlsZCwgc28gaXQncyBuZXZl
ciBnb2luZyB0byB3b3JrIQotICAgIERvY3VtZW50SW1wbCAqb3duZXJEb2NOZXcgPSBnZXREb2N1
bWVudCgpOwotICAgIGlmKG93bmVyRG9jVGhpcyAhPSBvd25lckRvY05ldykgewotICAgICAgICBr
ZERlYnVnKDYwMTApPDwgIm5vdCBzYW1lIGRvY3VtZW50LCBuZXdDaGlsZCA9ICIgPDwgbmV3Q2hp
bGQgPDwgImRvY3VtZW50ID0gIiA8PCBnZXREb2N1bWVudCgpIDw8IGVuZGw7Ci0gICAgICAgIGV4
Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OldST05HX0RPQ1VNRU5UX0VSUjsKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gY2hlY2sgZm9y
IGJlaW5nIGNoaWxkOgotYm9vbCBDb250YWluZXJOb2RlSW1wbDo6Y2hlY2tJc0NoaWxkKCBOb2Rl
SW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgaWYoIW9sZENoaWxk
IHx8IG9sZENoaWxkLT5wYXJlbnROb2RlKCkgIT0gdGhpcykgewotICAgICAgICBleGNlcHRpb25j
b2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUlt
cGw6OmFkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCkKLXsKLSAgICAvLyBkbyBub3QgYWRkIGFw
cGx5Q2hhbmdlcyBoZXJlISBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBkdXJpbmcgcGFyc2lu
ZwotCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0TmV3Q2hpbGQobmV3Q2hpbGQpOyAvLyBt
YWtlIHN1cmUgdGhlIG5ldyBjaGlsZCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBs
ZWFrIGl0Ci0KLSAgICAvLyBzaG9ydCBjaGVjayBmb3IgY29uc2lzdGVuY3kgd2l0aCBEVEQKLSAg
ICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSAmJiAhY2hpbGRBbGxvd2VkKG5l
d0NoaWxkKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBqdXN0IGFkZCBpdC4uLgotICAg
IGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLSAgICBuZXdDaGlsZC0+c2V0UGFyZW50KHRoaXMpOwot
ICAgIGlmKF9sYXN0KSB7Ci0gICAgICAgIG5ld0NoaWxkLT5zZXRQcmV2aW91c1NpYmxpbmcoX2xh
c3QpOwotICAgICAgICBfbGFzdC0+c2V0TmV4dFNpYmxpbmcobmV3Q2hpbGQpOwotICAgICAgICBf
bGFzdCA9IG5ld0NoaWxkOwotICAgIH0gZWxzZQotICAgICAgICBfZmlyc3QgPSBfbGFzdCA9IG5l
d0NoaWxkOwotICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAgaWYgKGluRG9jdW1lbnQo
KSkKLSAgICAgICAgbmV3Q2hpbGQtPmluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgY2hpbGRy
ZW5DaGFuZ2VkKCk7Ci0gICAgCi0gICAgaWYobmV3Q2hpbGQtPm5vZGVUeXBlKCkgPT0gTm9kZTo6
RUxFTUVOVF9OT0RFKQotICAgICAgICByZXR1cm4gbmV3Q2hpbGQ7Ci0gICAgcmV0dXJuIHRoaXM7
Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OmF0dGFjaCgpCi17Ci0gICAgTm9kZUltcGwg
KmNoaWxkID0gX2ZpcnN0OwotICAgIHdoaWxlKGNoaWxkICE9IDApCi0gICAgewotICAgICAgICBj
aGlsZC0+YXR0YWNoKCk7Ci0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0g
ICAgfQotICAgIE5vZGVJbXBsOjphdHRhY2goKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1w
bDo6ZGV0YWNoKCkKLXsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBfZmlyc3Q7Ci0gICAgd2hpbGUo
Y2hpbGQgIT0gMCkKLSAgICB7Ci0gICAgICAgIE5vZGVJbXBsKiBwcmV2ID0gY2hpbGQ7Ci0gICAg
ICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHByZXYtPmRldGFjaCgp
OwotICAgIH0KLSAgICBOb2RlSW1wbDo6ZGV0YWNoKCk7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9k
ZUltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBOb2RlSW1wbDo6aW5zZXJ0ZWRJ
bnRvRG9jdW1lbnQoKTsKLSAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsgY2hpbGQ7
IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGNoaWxkLT5pbnNlcnRlZElu
dG9Eb2N1bWVudCgpOwotfQotCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpyZW1vdmVkRnJvbURv
Y3VtZW50KCkKLXsKLSAgICBOb2RlSW1wbDo6cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotICAgIGZv
ciAoTm9kZUltcGwgKmNoaWxkID0gX2ZpcnN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNp
YmxpbmcoKSkKLSAgICAgICAgY2hpbGQtPnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLX0KLQotdm9p
ZCBDb250YWluZXJOb2RlSW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApCi17Ci0gICAg
Tm9kZUltcGw6Omluc2VydGVkSW50b1RyZWUoZGVlcCk7Ci0gICAgaWYgKGRlZXApIHsKLSAgICAg
ICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBfZmlyc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5u
ZXh0U2libGluZygpKQotICAgICAgICAgICAgY2hpbGQtPmluc2VydGVkSW50b1RyZWUoZGVlcCk7
Ci0gICAgfQotfQotCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpyZW1vdmVkRnJvbVRyZWUoYm9v
bCBkZWVwKQotewotICAgIE5vZGVJbXBsOjpyZW1vdmVkRnJvbVRyZWUoZGVlcCk7Ci0gICAgaWYg
KGRlZXApIHsKLSAgICAgICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBfZmlyc3Q7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgY2hpbGQtPnJlbW92ZWRG
cm9tVHJlZShkZWVwKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OmNsb25l
Q2hpbGROb2RlcyhOb2RlSW1wbCAqY2xvbmUpCi17Ci0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAw
OwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvcihuID0gZmlyc3RDaGlsZCgpOyBuICYmICFleGNl
cHRpb25jb2RlOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICAgIGNsb25lLT5h
cHBlbmRDaGlsZChuLT5jbG9uZU5vZGUodHJ1ZSksZXhjZXB0aW9uY29kZSk7Ci0gICAgfQotfQot
Ci1ib29sIENvbnRhaW5lck5vZGVJbXBsOjpnZXRVcHBlckxlZnRDb3JuZXIoaW50ICZ4UG9zLCBp
bnQgJnlQb3MpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3JlbmRlcikKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIFJlbmRlck9iamVjdCAqbyA9IG1fcmVuZGVyOwotICAgIFJlbmRlck9iamVjdCAq
cCA9IG87Ci0KLSAgICB4UG9zID0geVBvcyA9IDA7Ci0gICAgaWYgKCFvLT5pc0lubGluZSgpIHx8
IG8tPmlzUmVwbGFjZWQoKSkgewotICAgICAgICBvLT5hYnNvbHV0ZVBvc2l0aW9uKCB4UG9zLCB5
UG9zICk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIGZpbmQgdGhlIG5l
eHQgdGV4dC9pbWFnZSBjaGlsZCwgdG8gZ2V0IGEgcG9zaXRpb24KLSAgICB3aGlsZShvKSB7Ci0g
ICAgICAgIHAgPSBvOwotICAgICAgICBpZihvLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICBv
ID0gby0+Zmlyc3RDaGlsZCgpOwotICAgICAgICBlbHNlIGlmKG8tPm5leHRTaWJsaW5nKCkpCi0g
ICAgICAgICAgICBvID0gby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAg
ICAgICBvID0gby0+cGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAobykgCi0gICAgICAgICAgICAg
ICAgbyA9IG8tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBpZiAoIW8pCi0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW8tPmlzSW5saW5lKCkgfHwg
by0+aXNSZXBsYWNlZCgpKSB7Ci0gICAgICAgICAgICBvLT5hYnNvbHV0ZVBvc2l0aW9uKCB4UG9z
LCB5UG9zICk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChwLT5lbGVtZW50KCkgJiYgcC0+ZWxlbWVudCgpID09IHRoaXMgJiYgby0+aXNUZXh0KCkg
JiYgIW8tPmlzQlIoKSAmJiAhc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCo+KG8pLT5maXJzdFRleHRC
b3goKSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgLSBza2lwIHVucmVuZGVyZWQg
d2hpdGVzcGFjZSB0aGF0IGlzIGEgY2hpbGQgb3IgbmV4dCBzaWJsaW5nIG9mIHRoZSBhbmNob3IK
LSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKChvLT5pc1RleHQoKSAmJiAhby0+aXNCUigpKSB8
fCBvLT5pc1JlcGxhY2VkKCkpIHsKLSAgICAgICAgICAgIG8tPmNvbnRhaW5lcigpLT5hYnNvbHV0
ZVBvc2l0aW9uKCB4UG9zLCB5UG9zICk7Ci0gICAgICAgICAgICBpZiAoby0+aXNUZXh0KCkgJiYg
c3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+Zmlyc3RUZXh0Qm94KCkpIHsKLSAgICAgICAg
ICAgICAgICB4UG9zICs9IHN0YXRpY19jYXN0PFJlbmRlclRleHQgKj4obyktPm1pblhQb3MoKTsK
LSAgICAgICAgICAgICAgICB5UG9zICs9IHN0YXRpY19jYXN0PFJlbmRlclRleHQgKj4obyktPmZp
cnN0VGV4dEJveCgpLT5yb290KCktPnRvcE92ZXJmbG93KCk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB4UG9zICs9IG8tPnhQb3MoKTsKLSAgICAg
ICAgICAgICAgICB5UG9zICs9IG8tPnlQb3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIElmIHRoZSB0YXJn
ZXQgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiBvciBzaWJsaW5ncyB0aGF0IGNvdWxkIGJlIHVz
ZWQgdG8gY2FsY3VsYXRlIHRoZSBzY3JvbGwgcG9zaXRpb24sIHdlIG11c3QgYmUKLSAgICAvLyBh
dCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gIFNjcm9sbCB0byB0aGUgYm90dG9tLgotICAgIGlm
ICghbykgewotICAgICAgICB5UG9zICs9IGdldERvY3VtZW50KCktPnZpZXcoKS0+Y29udGVudHNI
ZWlnaHQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotYm9vbCBDb250YWluZXJOb2RlSW1wbDo6Z2V0TG93ZXJSaWdodENvcm5lcihpbnQgJnhQ
b3MsIGludCAmeVBvcykgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVuZGVyKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBSZW5kZXJPYmplY3QgKm8gPSBtX3JlbmRlcjsKLSAgICB4UG9zID0g
eVBvcyA9IDA7Ci0gICAgaWYgKCFvLT5pc0lubGluZSgpIHx8IG8tPmlzUmVwbGFjZWQoKSkKLSAg
ICB7Ci0gICAgICAgIG8tPmFic29sdXRlUG9zaXRpb24oIHhQb3MsIHlQb3MgKTsKLSAgICAgICAg
eFBvcyArPSBvLT53aWR0aCgpOwotICAgICAgICB5UG9zICs9IG8tPmhlaWdodCgpOwotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gZmluZCB0aGUgbGFzdCB0ZXh0L2ltYWdlIGNo
aWxkLCB0byBnZXQgYSBwb3NpdGlvbgotICAgIHdoaWxlKG8pIHsKLSAgICAgICAgaWYoby0+bGFz
dENoaWxkKCkpCi0gICAgICAgICAgICBvID0gby0+bGFzdENoaWxkKCk7Ci0gICAgICAgIGVsc2Ug
aWYoby0+cHJldmlvdXNTaWJsaW5nKCkpCi0gICAgICAgICAgICBvID0gby0+cHJldmlvdXNTaWJs
aW5nKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0ICpwcmV2ID0g
MDsKLSAgICAgICAgICAgIHdoaWxlKCFwcmV2KSB7Ci0gICAgICAgICAgICAgICAgbyA9IG8tPnBh
cmVudCgpOwotICAgICAgICAgICAgICAgIGlmKCFvKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgcHJldiA9IG8tPnByZXZpb3VzU2libGluZygpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgbyA9IHByZXY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoby0+aXNUZXh0KCkgfHwgby0+
aXNSZXBsYWNlZCgpKSB7Ci0gICAgICAgICAgICBvLT5jb250YWluZXIoKS0+YWJzb2x1dGVQb3Np
dGlvbih4UG9zLCB5UG9zKTsKLSAgICAgICAgICAgIGlmIChvLT5pc1RleHQoKSkKLSAgICAgICAg
ICAgICAgICB4UG9zICs9IHN0YXRpY19jYXN0PFJlbmRlclRleHQgKj4obyktPm1pblhQb3MoKSAr
IG8tPndpZHRoKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeFBvcyArPSBv
LT54UG9zKCkrby0+d2lkdGgoKTsKLSAgICAgICAgICAgIHlQb3MgKz0gby0+eVBvcygpK28tPmhl
aWdodCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLVFSZWN0IENvbnRhaW5lck5vZGVJbXBsOjpnZXRSZWN0KCkgY29u
c3QKLXsKLSAgICBpbnQgeFBvcyA9IDAsIHlQb3MgPSAwLCB4RW5kID0gMCwgeUVuZCA9IDA7Ci0g
ICAgYm9vbCBmb3VuZFVwcGVyTGVmdCA9IGdldFVwcGVyTGVmdENvcm5lcih4UG9zLHlQb3MpOwot
ICAgIGJvb2wgZm91bmRMb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodENvcm5lcih4RW5kLHlFbmQp
OwotICAgIAotICAgIC8vIElmIHdlJ3ZlIGZvdW5kIG9uZSBjb3JuZXIsIGJ1dCBub3QgdGhlIG90
aGVyLAotICAgIC8vIHRoZW4gd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIGEgcG9pbnQgYXQgdGhlIGNv
cm5lciB0aGF0IHdlIGRpZCBmaW5kLgotICAgIGlmIChmb3VuZFVwcGVyTGVmdCAhPSBmb3VuZExv
d2VyUmlnaHQpCi0gICAgewotICAgICAgICBpZiAoZm91bmRVcHBlckxlZnQpIHsKLSAgICAgICAg
ICAgIHhFbmQgPSB4UG9zOwotICAgICAgICAgICAgeUVuZCA9IHlQb3M7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICB4UG9zID0geEVuZDsKLSAgICAgICAgICAgIHlQb3MgPSB5RW5kOwot
ICAgICAgICB9Ci0gICAgfSAKLQotICAgIGlmICh4RW5kIDwgeFBvcykKLSAgICAgICAgeEVuZCA9
IHhQb3M7Ci0gICAgaWYgKHlFbmQgPCB5UG9zKQotICAgICAgICB5RW5kID0geVBvczsKLSAgICAg
ICAgCi0gICAgcmV0dXJuIFFSZWN0KHhQb3MsIHlQb3MsIHhFbmQgLSB4UG9zLCB5RW5kIC0geVBv
cyk7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnNldEZvY3VzKGJvb2wgcmVjZWl2ZWQp
Ci17Ci0gICAgaWYgKG1fZm9jdXNlZCA9PSByZWNlaXZlZCkgcmV0dXJuOwotCi0gICAgTm9kZUlt
cGw6OnNldEZvY3VzKHJlY2VpdmVkKTsKLQotICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJl
Y2FsYyB0aGUgc3R5bGUKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9k
ZUltcGw6OnNldEFjdGl2ZShib29sIGRvd24sIGJvb2wgcGF1c2UpCi17Ci0gICAgaWYgKGRvd24g
PT0gYWN0aXZlKCkpIHJldHVybjsKLQotICAgIE5vZGVJbXBsOjpzZXRBY3RpdmUoZG93bik7Ci0K
LSAgICAvLyBub3RlIHRoYXQgd2UgbmVlZCB0byByZWNhbGMgdGhlIHN0eWxlCi0gICAgLy8gRklY
TUU6IE1vdmUgdG8gRWxlbWVudEltcGwKLSAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAgYm9v
bCByZWFjdHNUb1ByZXNzID0gbV9yZW5kZXItPnN0eWxlKCktPmFmZmVjdGVkQnlBY3RpdmVSdWxl
cygpOwotICAgICAgICBpZiAocmVhY3RzVG9QcmVzcykKLSAgICAgICAgICAgIHNldENoYW5nZWQo
KTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+c3R5bGUoKS0+aGFzQXBw
ZWFyYW5jZSgpKSB7Ci0gICAgICAgICAgICBpZiAodGhlbWUoKS0+c3RhdGVDaGFuZ2VkKHJlbmRl
cmVyKCksIFByZXNzZWRTdGF0ZSkpCi0gICAgICAgICAgICAgICAgcmVhY3RzVG9QcmVzcyA9IHRy
dWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWN0c1RvUHJlc3MgJiYgcGF1c2UpIHsKLSAg
ICAgICAgICAgIC8vIFRoZSBkZWxheSBoZXJlIGlzIHN1YnRsZS4gIEl0IHJlbGllcyBvbiBhbiBh
c3N1bXB0aW9uLCBuYW1lbHkgdGhhdCB0aGUgYW1vdW50IG9mIHRpbWUgaXQgdGFrZXMKLSAgICAg
ICAgICAgIC8vIHRvIHJlcGFpbnQgdGhlICJkb3duIiBzdGF0ZSBvZiB0aGUgY29udHJvbCBpcyBh
Ym91dCB0aGUgc2FtZSB0aW1lIGFzIGl0IHdvdWxkIHRha2UgdG8gcmVwYWludCB0aGUKLSAgICAg
ICAgICAgIC8vICJ1cCIgc3RhdGUuICBPbmNlIHlvdSBhc3N1bWUgdGhpcywgeW91IGNhbiBqdXN0
IGRlbGF5IGZvciAxMDBtcyAtIHRoYXQgdGltZSAoYXNzdW1pbmcgdGhhdCBhZnRlciB5b3UKLSAg
ICAgICAgICAgIC8vIGxlYXZlIHRoaXMgbWV0aG9kLCBpdCB3aWxsIGJlIGFib3V0IHRoYXQgbG9u
ZyBiZWZvcmUgdGhlIGZsdXNoIG9mIHRoZSB1cCBzdGF0ZSBoYXBwZW5zIGFnYWluKS4KLSAgICAg
ICAgICAgIFFUaW1lIHN0YXJ0VGltZTsKLSAgICAgICAgICAgIHN0YXJ0VGltZS5yZXN0YXJ0KCk7
Ci0KLSAgICAgICAgICAgIC8vIERvIGFuIGltbWVkaWF0ZSByZXBhaW50LgotICAgICAgICAgICAg
bV9yZW5kZXItPnJlcGFpbnQodHJ1ZSk7Ci0gICAgICAgICAgICAKLSNpZiAhV0lOMzIKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBGaW5kIGEgc3Vic3RpdHV0ZSBmb3IgdXNsZWVwLiAgQmV0dGVyIHll
dCwgY29tZSB1cCB3aXRoIGEgd2F5IG9mIGRvaW5nIHRoaXMgdGhhdCAKLSAgICAgICAgICAgIC8v
IGRvZXNuJ3QgdXNlIHVzbGVlcCBhdCBhbGwuCi0gICAgICAgICAgICBpbnQgcmVtYWluaW5nVGlt
ZSA9IDEwMCAtIHN0YXJ0VGltZS5lbGFwc2VkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IC8vIE5vdyBwYXVzZSBmb3IgYSBzbWFsbCBhbW91bnQgb2YgdGltZSAoMS8xMHRoIG9mIGEgc2Vj
b25kIGZyb20gYmVmb3JlIHdlIHJlcGFpbnRlZCBpbiB0aGUgcHJlc3NlZCBzdGF0ZSkKLSAgICAg
ICAgICAgIGlmIChyZW1haW5pbmdUaW1lID4gMCkKLSAgICAgICAgICAgICAgICB1c2xlZXAocmVt
YWluaW5nVGltZSAqIDEwMDApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQg
Q29udGFpbmVyTm9kZUltcGw6OnNldEhvdmVyZWQoYm9vbCBvdmVyKQotewotICAgIGlmIChvdmVy
ID09IGhvdmVyZWQoKSkgcmV0dXJuOwotCi0gICAgTm9kZUltcGw6OnNldEhvdmVyZWQob3Zlcik7
Ci0KLSAgICAvLyBub3RlIHRoYXQgd2UgbmVlZCB0byByZWNhbGMgdGhlIHN0eWxlCi0gICAgLy8g
RklYTUU6IE1vdmUgdG8gRWxlbWVudEltcGwKLSAgICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAg
aWYgKG1fcmVuZGVyLT5zdHlsZSgpLT5hZmZlY3RlZEJ5SG92ZXJSdWxlcygpKQotICAgICAgICAg
ICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5z
dHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgICAgICB0aGVtZSgpLT5zdGF0ZUNoYW5n
ZWQocmVuZGVyZXIoKSwgSG92ZXJTdGF0ZSk7Ci0gICAgfQotfQotCi11bnNpZ25lZCBDb250YWlu
ZXJOb2RlSW1wbDo6Y2hpbGROb2RlQ291bnQoKSBjb25zdAotewotICAgIHVuc2lnbmVkIGNvdW50
ID0gMDsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSBmaXJzdENoaWxkKCk7IG47IG4g
PSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBjb3VudCsrOwotICAgIHJldHVybiBjb3VudDsK
LX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpjaGlsZE5vZGUodW5zaWduZWQgaW5k
ZXgpCi17Ci0gICAgdW5zaWduZWQgaTsKLSAgICBOb2RlSW1wbCAqbiA9IGZpcnN0Q2hpbGQoKTsK
LSAgICBmb3IgKGkgPSAwOyBuICE9IDAgJiYgaSA8IGluZGV4OyBpKyspCi0gICAgICAgIG4gPSBu
LT5uZXh0U2libGluZygpOwotICAgIHJldHVybiBuOwotfQotCi12b2lkIENvbnRhaW5lck5vZGVJ
bXBsOjpkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwgaW50ICZl
eGNlcHRpb25jb2RlICkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7
Ci0gICAgaWYgKGluRG9jdW1lbnQoKSkKLSAgICAgICAgY2hpbGQtPmluc2VydGVkSW50b0RvY3Vt
ZW50KCk7Ci0gICAgZWxzZQotICAgICAgICBjaGlsZC0+aW5zZXJ0ZWRJbnRvVHJlZSh0cnVlKTsK
LQotICAgIGlmIChnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJbXBsOjpE
T01OT0RFSU5TRVJURURfTElTVEVORVIpKSB7Ci0gICAgICAgIGNoaWxkLT5kaXNwYXRjaEV2ZW50
KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlSW5zZXJ0ZWRFdmVudCwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsZmFsc2UsdGhpcyxE
T01TdHJpbmcoKSxET01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNlcHRpb25jb2RlLHRydWUp
OwotICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICAvLyBkaXNwYXRjaCB0aGUgRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50IGV2ZW50
IHRvIGFsbCBkZXNjZW5kYW50cwotICAgIGJvb2wgaGFzSW5zZXJ0ZWRMaXN0ZW5lcnMgPSBnZXRE
b2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJbXBsOjpET01OT0RFSU5TRVJURURJ
TlRPRE9DVU1FTlRfTElTVEVORVIpOwotCi0gICAgaWYgKGhhc0luc2VydGVkTGlzdGVuZXJzICYm
IGluRG9jdW1lbnQoKSkgewotICAgICAgICBmb3IgKE5vZGVJbXBsICpjID0gY2hpbGQ7IGM7IGMg
PSBjLT50cmF2ZXJzZU5leHROb2RlKGNoaWxkKSkgewotICAgICAgICAgICAgYy0+ZGlzcGF0Y2hF
dmVudChuZXcgTXV0YXRpb25FdmVudEltcGwoRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50RXZl
bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
YWxzZSxmYWxzZSwwLERPTVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2Vw
dGlvbmNvZGUsdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGJhc2UgY2xhc3MgZm9y
IG5vZGVzIHRoYXQgbWF5IGhhdmUgY2hpbGRyZW4KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OmRp
c3BhdGNoQ2hpbGRSZW1vdmFsRXZlbnRzKCBOb2RlSW1wbCAqY2hpbGQsIGludCAmZXhjZXB0aW9u
Y29kZSApCi17Ci0gICAgLy8gdXBkYXRlIGF1eGlsaWFyeSBkb2MgaW5mbyAoZS5nLiBpdGVyYXRv
cnMpIHRvIG5vdGUgdGhhdCBub2RlIGlzIGJlaW5nIHJlbW92ZWQKLSAgICBnZXREb2N1bWVudCgp
LT5ub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChjaGlsZCk7IC8vICMjIyB1c2UgZXZlbnRzIGluc3Rl
YWQKLQotICAgIC8vIGRpc3BhdGNoIHByZS1yZW1vdmFsIG11dGF0aW9uIGV2ZW50cwotICAgIGlm
IChnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJbXBsOjpET01OT0RFUkVN
T1ZFRF9MSVNURU5FUikpIHsKLQljaGlsZC0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVu
dEltcGwoRE9NTm9kZVJlbW92ZWRFdmVudCwKLQkJCSAgICAgdHJ1ZSxmYWxzZSx0aGlzLERPTVN0
cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci0J
aWYgKGV4Y2VwdGlvbmNvZGUpCi0JICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIGhhc1Jl
bW92YWxMaXN0ZW5lcnMgPSBnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJ
bXBsOjpET01OT0RFUkVNT1ZFREZST01ET0NVTUVOVF9MSVNURU5FUik7Ci0KLSAgICAvLyBkaXNw
YXRjaCB0aGUgRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQgZXZlbnQgdG8gYWxsIGRlc2NlbmRh
bnRzCi0gICAgaWYgKGluRG9jdW1lbnQoKSkgewotCWZvciAoTm9kZUltcGwgKmMgPSBjaGlsZDsg
YzsgYyA9IGMtPnRyYXZlcnNlTmV4dE5vZGUoY2hpbGQpKSB7Ci0JICAgIGlmIChoYXNSZW1vdmFs
TGlzdGVuZXJzKSB7Ci0JCWMtPmRpc3BhdGNoRXZlbnQobmV3IE11dGF0aW9uRXZlbnRJbXBsKERP
TU5vZGVSZW1vdmVkRnJvbURvY3VtZW50RXZlbnQsCi0JCQkJIGZhbHNlLGZhbHNlLDAsRE9NU3Ry
aW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9uY29kZSx0cnVlKTsKLQkJ
aWYgKGV4Y2VwdGlvbmNvZGUpCi0JCSAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1Ob2RlTGlzdEltcGw6Ok5vZGVMaXN0SW1wbChO
b2RlSW1wbCAqX3Jvb3ROb2RlKQotICAgIDogcm9vdE5vZGUoX3Jvb3ROb2RlKSwKLSAgICAgIGlz
TGVuZ3RoQ2FjaGVWYWxpZChmYWxzZSksCi0gICAgICBpc0l0ZW1DYWNoZVZhbGlkKGZhbHNlKQot
ewotICAgIHJvb3ROb2RlLT5yZWYoKTsKLSAgICByb290Tm9kZS0+cmVnaXN0ZXJOb2RlTGlzdCh0
aGlzKTsKLX0gICAgCi0KLU5vZGVMaXN0SW1wbDo6fk5vZGVMaXN0SW1wbCgpCi17Ci0gICAgcm9v
dE5vZGUtPnVucmVnaXN0ZXJOb2RlTGlzdCh0aGlzKTsKLSAgICByb290Tm9kZS0+ZGVyZWYoKTsK
LX0KLQotdW5zaWduZWQgTm9kZUxpc3RJbXBsOjpyZWN1cnNpdmVMZW5ndGgoIE5vZGVJbXBsICpz
dGFydCApIGNvbnN0Ci17Ci0gICAgaWYgKCFzdGFydCkKLQlzdGFydCA9IHJvb3ROb2RlOwotCi0g
ICAgaWYgKGlzTGVuZ3RoQ2FjaGVWYWxpZCAmJiBzdGFydCA9PSByb290Tm9kZSkgewotICAgICAg
ICByZXR1cm4gY2FjaGVkTGVuZ3RoOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGxlbiA9IDA7Ci0K
LSAgICBmb3IoTm9kZUltcGwgKm4gPSBzdGFydC0+Zmlyc3RDaGlsZCgpOyBuICE9IDA7IG4gPSBu
LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlmICggbi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpF
TEVNRU5UX05PREUgKSB7Ci0gICAgICAgICAgICBpZiAobm9kZU1hdGNoZXMobikpCi0gICAgICAg
ICAgICAgICAgbGVuKys7Ci0gICAgICAgICAgICBsZW4rPSByZWN1cnNpdmVMZW5ndGgobik7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhcnQgPT0gcm9vdE5vZGUpIHsKLSAgICAgICAg
Y2FjaGVkTGVuZ3RoID0gbGVuOwotICAgICAgICBpc0xlbmd0aENhY2hlVmFsaWQgPSB0cnVlOwot
ICAgIH0KLQotICAgIHJldHVybiBsZW47Ci19Ci0KLU5vZGVJbXBsICpOb2RlTGlzdEltcGw6OnJl
Y3Vyc2l2ZUl0ZW0gKCB1bnNpZ25lZCBvZmZzZXQsIE5vZGVJbXBsICpzdGFydCkgY29uc3QKLXsK
LSAgICBpbnQgcmVtYWluaW5nT2Zmc2V0ID0gb2Zmc2V0OwotICAgIGlmICghc3RhcnQpIHsKLSAg
ICAgICAgc3RhcnQgPSByb290Tm9kZS0+Zmlyc3RDaGlsZCgpOwotICAgICAgICBpZiAoaXNJdGVt
Q2FjaGVWYWxpZCkgewotICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBsYXN0SXRlbU9mZnNldCkg
ewotICAgICAgICAgICAgICAgIHJldHVybiBsYXN0SXRlbTsKLSAgICAgICAgICAgIH0gZWxzZSBp
ZiAob2Zmc2V0ID4gbGFzdEl0ZW1PZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGxh
c3RJdGVtOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZ09mZnNldCAtPSBsYXN0SXRlbU9mZnNl
dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIE5vZGVJbXBsICpuID0g
c3RhcnQ7Ci0KLSAgICB3aGlsZSAobikgewotICAgICAgICBpZiAoIG4tPm5vZGVUeXBlKCkgPT0g
Tm9kZTo6RUxFTUVOVF9OT0RFICkgewotICAgICAgICAgICAgaWYgKG5vZGVNYXRjaGVzKG4pKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdPZmZzZXQpIHsKLSAgICAgICAgICAgICAg
ICAgICAgbGFzdEl0ZW0gPSBuOwotICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbU9mZnNldCA9
IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgaXNJdGVtQ2FjaGVWYWxpZCA9IHRydWU7Ci0g
ICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICByZW1haW5pbmdPZmZzZXQtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKHJvb3ROb2RlKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gMDsgLy8gbm8gbWF0Y2hpbmcgbm9kZSBpbiB0aGlzIHN1YnRyZWUKLX0KLQotTm9kZUlt
cGwgKk5vZGVMaXN0SW1wbDo6aXRlbUJ5SWQgKGNvbnN0IERPTVN0cmluZyYgZWxlbWVudElkKSBj
b25zdAotewotICAgIGlmIChyb290Tm9kZS0+aXNEb2N1bWVudE5vZGUoKSB8fCByb290Tm9kZS0+
aW5Eb2N1bWVudCgpKSB7Ci0gICAgICAgIE5vZGVJbXBsICpub2RlID0gcm9vdE5vZGUtPmdldERv
Y3VtZW50KCktPmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7Ci0KLSAgICAgICAgaWYgKG5vZGUg
PT0gTlVMTCB8fCAhbm9kZU1hdGNoZXMobm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQot
ICAgICAgICBmb3IgKE5vZGVJbXBsICpwID0gbm9kZS0+cGFyZW50Tm9kZSgpOyBwOyBwID0gcC0+
cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgICAgICBpZiAocCA9PSByb290Tm9kZSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLQotICAgIHVuc2lnbmVkIGwgPSBsZW5ndGgoKTsKLQotICAgIGZvciAoIHVuc2lnbmVkIGkg
PSAwOyBpIDwgbDsgaSsrICkgewotICAgICAgICBOb2RlSW1wbCAqbm9kZSA9IGl0ZW0oaSk7Ci0g
ICAgICAgIAotICAgICAgICBpZiAoIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG5vZGUpLT5n
ZXRJREF0dHJpYnV0ZSgpID09IGVsZW1lbnRJZCApIHsKLSAgICAgICAgICAgIHJldHVybiBub2Rl
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19CisjaW5jbHVkZSAiQ2hpbGRO
b2RlTGlzdEltcGwuaCIKKyNpbmNsdWRlICJOb2RlSW1wbC5oIgogCit1c2luZyBuYW1lc3BhY2Ug
a2h0bWw7CiAKLXZvaWQgTm9kZUxpc3RJbXBsOjpyb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpCi17
Ci0gICAgaXNMZW5ndGhDYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgaXNJdGVtQ2FjaGVWYWxpZCA9
IGZhbHNlOyAgICAgCi0gICAgbGFzdEl0ZW0gPSAwOwotfQorbmFtZXNwYWNlIERPTSB7CiAKIENo
aWxkTm9kZUxpc3RJbXBsOjpDaGlsZE5vZGVMaXN0SW1wbCggTm9kZUltcGwgKm4gKQogICAgIDog
Tm9kZUxpc3RJbXBsKG4pCkBAIC0zMDE0LDUyICs4NSw0IEBAIGJvb2wgQ2hpbGROb2RlTGlzdElt
cGw6Om5vZGVNYXRjaGVzKE5vZGUKICAgICByZXR1cm4gdGVzdE5vZGUtPnBhcmVudE5vZGUoKSA9
PSByb290Tm9kZTsKIH0KIAotVGFnTm9kZUxpc3RJbXBsOjpUYWdOb2RlTGlzdEltcGwoTm9kZUlt
cGwgKm4sIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBBdG9taWNTdHJp
bmcmIGxvY2FsTmFtZSkKLSAgICA6IE5vZGVMaXN0SW1wbChuKSwgCi0gICAgICBtX25hbWVzcGFj
ZVVSSShuYW1lc3BhY2VVUkkpLCAKLSAgICAgIG1fbG9jYWxOYW1lKGxvY2FsTmFtZSkKLXsKLX0K
LQotdW5zaWduZWQgVGFnTm9kZUxpc3RJbXBsOjpsZW5ndGgoKSBjb25zdAotewotICAgIHJldHVy
biByZWN1cnNpdmVMZW5ndGgoKTsKLX0KLQotTm9kZUltcGwgKlRhZ05vZGVMaXN0SW1wbDo6aXRl
bSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVjdXJzaXZlSXRlbShpbmRl
eCk7Ci19Ci0KLWJvb2wgVGFnTm9kZUxpc3RJbXBsOjpub2RlTWF0Y2hlcyhOb2RlSW1wbCAqdGVz
dE5vZGUpIGNvbnN0Ci17Ci0gICAgaWYgKCF0ZXN0Tm9kZS0+aXNFbGVtZW50Tm9kZSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV9uYW1lc3BhY2VVUkkgIT0gc3RhckF0b20g
JiYgbV9uYW1lc3BhY2VVUkkgIT0gdGVzdE5vZGUtPm5hbWVzcGFjZVVSSSgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgcmV0dXJuIG1fbG9jYWxOYW1lID09IHN0YXJBdG9tIHx8
IG1fbG9jYWxOYW1lID09IHRlc3ROb2RlLT5sb2NhbE5hbWUoKTsKLX0KLQotTmFtZU5vZGVMaXN0
SW1wbDo6TmFtZU5vZGVMaXN0SW1wbChOb2RlSW1wbCAqbiwgY29uc3QgRE9NU3RyaW5nICZ0ICkK
LSAgOiBOb2RlTGlzdEltcGwobiksIG5vZGVOYW1lKHQpCi17Ci19Ci0KLXVuc2lnbmVkIE5hbWVO
b2RlTGlzdEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlY3Vyc2l2ZUxlbmd0
aCgpOwotfQotCi1Ob2RlSW1wbCAqTmFtZU5vZGVMaXN0SW1wbDo6aXRlbSAoIHVuc2lnbmVkIGlu
ZGV4ICkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVjdXJzaXZlSXRlbSggaW5kZXggKTsKLX0KLQot
Ym9vbCBOYW1lTm9kZUxpc3RJbXBsOjpub2RlTWF0Y2hlcyhOb2RlSW1wbCAqdGVzdE5vZGUpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KHRlc3ROb2RlKS0+
Z2V0QXR0cmlidXRlKG5hbWVBdHRyKSA9PSBub2RlTmFtZTsKLX0KLQogfQpJbmRleDoga2h0bWwv
eG1sL05vZGVMaXN0SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9Ob2RlTGlzdEltcGwu
aAkocmV2aXNpb24gMTIwNjMpCisrKyBraHRtbC94bWwvTm9kZUxpc3RJbXBsLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTIyLDU1MSArMjIsMTUgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNB
LgogICoKICAqLwotI2lmbmRlZiBfRE9NX05vZGVJbXBsX2hfCi0jZGVmaW5lIF9ET01fTm9kZUlt
cGxfaF8KKyNpZm5kZWYgRE9NX05vZGVMaXN0SW1wbF9oCisjZGVmaW5lIERPTV9Ob2RlTGlzdElt
cGxfaAogCi0jaW5jbHVkZSAiZG9tL2RvbV9zdHJpbmcuaCIKLSNpbmNsdWRlICJkb20vZG9tX25v
ZGUuaCIKLSNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgogI2luY2x1ZGUgIm1pc2Mvc2hhcmVkLmgi
Ci0jaW5jbHVkZSAiZG9tX2F0b21pY3N0cmluZy5oIgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1j
bGFzcyBRUGFpbnRlcjsKLXRlbXBsYXRlIDxjbGFzcyB0eXBlPiBjbGFzcyBRUHRyTGlzdDsKLXRl
bXBsYXRlIDxjbGFzcyB0eXBlPiBjbGFzcyBRUHRyRGljdDsKLWNsYXNzIEtIVE1MVmlldzsKLWNs
YXNzIFJlbmRlckFyZW5hOwotY2xhc3MgUVJlY3Q7Ci1jbGFzcyBRTW91c2VFdmVudDsKLWNsYXNz
IFFLZXlFdmVudDsKLWNsYXNzIFFUZXh0U3RyZWFtOwotY2xhc3MgUVN0cmluZ0xpc3Q7Ci1jbGFz
cyBRV2hlZWxFdmVudDsKLQotbmFtZXNwYWNlIGtodG1sIHsKLSAgICBjbGFzcyBSZW5kZXJPYmpl
Y3Q7Ci0gICAgY2xhc3MgUmVuZGVyU3R5bGU7Ci19OwogCiBuYW1lc3BhY2UgRE9NIHsKIAotY2xh
c3MgQXRvbWljU3RyaW5nOwotY2xhc3MgRG9jdW1lbnRJbXBsOwotY2xhc3MgRWxlbWVudEltcGw7
Ci1jbGFzcyBFdmVudEltcGw7Ci1jbGFzcyBFdmVudExpc3RlbmVyOwotY2xhc3MgTm9kZUxpc3RJ
bXBsOwotY2xhc3MgTmFtZWRBdHRyTWFwSW1wbDsKLWNsYXNzIFF1YWxpZmllZE5hbWU7Ci1jbGFz
cyBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcjsKLQotLy8gdGhpcyBjbGFzcyBpbXBsZW1lbnRzIG5v
ZGVzLCB3aGljaCBjYW4gaGF2ZSBhIHBhcmVudCBidXQgbm8gY2hpbGRyZW46Ci1jbGFzcyBOb2Rl
SW1wbCA6IHB1YmxpYyBraHRtbDo6VHJlZVNoYXJlZDxOb2RlSW1wbD4KLXsKLSAgICBmcmllbmQg
Y2xhc3MgRG9jdW1lbnRJbXBsOwotcHVibGljOgotICAgIE5vZGVJbXBsKERvY3VtZW50SW1wbCAq
ZG9jKTsKLSAgICB2aXJ0dWFsIH5Ob2RlSW1wbCgpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBh
dHRyaWJ1dGVzIGZvciBOb2RlCi0gICAgdmlydHVhbCBib29sIGhhc1RhZ05hbWUoY29uc3QgUXVh
bGlmaWVkTmFtZSYgdGFnTmFtZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFs
IERPTVN0cmluZyBub2RlTmFtZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIERPTVN0cmluZyBu
b2RlVmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Tm9kZVZhbHVlKCBjb25zdCBE
T01TdHJpbmcgJl9ub2RlVmFsdWUsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwg
dW5zaWduZWQgc2hvcnQgbm9kZVR5cGUoKSBjb25zdCA9IDA7Ci0gICAgTm9kZUltcGwgKnBhcmVu
dE5vZGUoKSBjb25zdCB7IHJldHVybiBwYXJlbnQoKTsgfQotICAgIE5vZGVJbXBsICpwcmV2aW91
c1NpYmxpbmcoKSBjb25zdCB7IHJldHVybiBtX3ByZXZpb3VzOyB9Ci0gICAgTm9kZUltcGwgKm5l
eHRTaWJsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9uZXh0OyB9Ci0gICAgdmlydHVhbCBSZWZQdHI8
Tm9kZUxpc3RJbXBsPiBjaGlsZE5vZGVzKCk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqZmlyc3RD
aGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmxhc3RDaGlsZCgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgYm9vbCBoYXNBdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOYW1l
ZEF0dHJNYXBJbXBsICphdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBEb2N1bWVudElt
cGwgKm93bmVyRG9jdW1lbnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRC
ZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNl
cHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUlt
cGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAo
IE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCB2
b2lkIHJlbW92ZShpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIHZpcnR1YWwgYm9vbCBoYXNDaGls
ZE5vZGVzICggICkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xvbmVOb2RlICggYm9v
bCBkZWVwICkgPSAwOwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUo
KSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBp
bnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIHZvaWQgbm9ybWFsaXplICgpOwotICAgIHN0YXRpYyBi
b29sIGlzU3VwcG9ydGVkKGNvbnN0IERPTVN0cmluZyAmZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5n
ICZ2ZXJzaW9uKTsKLQotICAgIGJvb2wgaXNTYW1lTm9kZShOb2RlSW1wbCAqb3RoZXIpIGNvbnN0
IHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH0KLSAgICBib29sIGlzRXF1YWxOb2RlKE5vZGVJbXBs
ICpvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc0RlZmF1bHROYW1lc3BhY2UoY29uc3QgRE9NU3Ry
aW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0OwotICAgIERPTVN0cmluZyBsb29rdXBQcmVmaXgoY29u
c3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0OwotICAgIERPTVN0cmluZyBsb29rdXBO
YW1lc3BhY2VVUkkoY29uc3QgRE9NU3RyaW5nICZwcmVmaXgpIGNvbnN0OwotICAgIAotICAgIERP
TVN0cmluZyB0ZXh0Q29udGVudCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGV4dENvbnRlbnQoY29u
c3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4Y2VwdGlvbik7Ci0gICAgCi0gICAgTm9kZUltcGwg
Kmxhc3REZXNjZW5kYW50KCkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFy
dCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlzRWxlbWVudE5vZGUoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0hUTUxFbGVtZW50KCkgY29uc3QgeyByZXR1
cm4gZmFsc2U7IH0KLSNpZiBTVkdfU1VQUE9SVAotICAgIHZpcnR1YWwgYm9vbCBpc1NWR0VsZW1l
bnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotI2VuZGlmCi0gICAgdmlydHVhbCBib29sIGlz
U3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29s
IGlzQXR0cmlidXRlTm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBi
b29sIGlzVGV4dE5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9v
bCBpc0NvbW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgaXNEb2N1bWVudE5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIGJvb2wgaXNC
bG9ja0Zsb3coKSBjb25zdDsKLSAgICBib29sIGlzQmxvY2tGbG93T3JCbG9ja1RhYmxlKCkgY29u
c3Q7Ci0gICAgCi0gICAgLy8gVXNlZCBieSA8Zm9ybT4gZWxlbWVudHMgdG8gaW5kaWNhdGUgYSBt
YWxmb3JtZWQgc3RhdGUgb2Ygc29tZSBraW5kLCB0eXBpY2FsbHkKLSAgICAvLyB1c2VkIHRvIGtl
ZXAgZnJvbSBhcHBseWluZyB0aGUgYm90dG9tIG1hcmdpbiBvZiB0aGUgZm9ybS4KLSAgICB2aXJ0
dWFsIGJvb2wgaXNNYWxmb3JtZWQoKSB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9p
ZCBzZXRNYWxmb3JtZWQoYm9vbCBtYWxmb3JtZWQpIHt9OwotICAgIAotICAgIC8vIGhlbHBlciBm
dW5jdGlvbnMgbm90IGJlaW5nIHBhcnQgb2YgdGhlIERPTQotICAgIC8vIEF0dGVudGlvbjogdGhl
eSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGRpZCB0aGUgY29uc2lzdGVuY3kgY2hlY2tpbmchCi0g
ICAgdm9pZCBzZXRQcmV2aW91c1NpYmxpbmcoTm9kZUltcGwgKnByZXZpb3VzKSB7IG1fcHJldmlv
dXMgPSBwcmV2aW91czsgfQotICAgIHZvaWQgc2V0TmV4dFNpYmxpbmcoTm9kZUltcGwgKm5leHQp
IHsgbV9uZXh0ID0gbmV4dDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEZpcnN0Q2hpbGQoTm9k
ZUltcGwgKmNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0TGFzdENoaWxkKE5vZGVJbXBsICpj
aGlsZCk7Ci0KLSAgICBOb2RlSW1wbCAqcHJldmlvdXNOb2RlQ29uc2lkZXJpbmdBdG9taWNOb2Rl
cygpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuZXh0Tm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMo
KSBjb25zdDsKLSAgICAKLSAgICBFbGVtZW50SW1wbCAqZ2V0QW5jZXN0b3JFbGVtZW50KCkgY29u
c3Q7Ci0gICAgRE9NU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVByZWZpeChjb25zdCBET01TdHJpbmcg
Jl9uYW1lc3BhY2VVUkksIGNvbnN0IEVsZW1lbnRJbXBsICpvcmlnaW5hbEVsZW1lbnQpIGNvbnN0
OwotICAgIAotICAgIC8qKiAoTm90IHBhcnQgb2YgdGhlIG9mZmljaWFsIERPTSkKLSAgICAgKiBS
ZXR1cm5zIHRoZSBuZXh0IGxlYWYgbm9kZS4KLSAgICAgKgotICAgICAqIFVzaW5nIHRoaXMgZnVu
Y3Rpb24gZGVsaXZlcnMgbGVhZiBub2RlcyBhcyBpZiB0aGUgd2hvbGUgRE9NIHRyZWUKLSAgICAg
KiB3ZXJlIGEgbGluZWFyIGNoYWluIG9mIGl0cyBsZWFmIG5vZGVzLgotICAgICAqIEByZXR1cm4g
bmV4dCBsZWFmIG5vZGUgb3IgMCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4KLSAgICAgKi8KLSAgICBO
b2RlSW1wbCAqbmV4dExlYWZOb2RlKCkgY29uc3Q7Ci0KLSAgICAvKiogKE5vdCBwYXJ0IG9mIHRo
ZSBvZmZpY2lhbCBET00pCi0gICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgbGVhZiBub2RlLgot
ICAgICAqCi0gICAgICogVXNpbmcgdGhpcyBmdW5jdGlvbiBkZWxpdmVycyBsZWFmIG5vZGVzIGFz
IGlmIHRoZSB3aG9sZSBET00gdHJlZQotICAgICAqIHdlcmUgYSBsaW5lYXIgY2hhaW4gb2YgaXRz
IGxlYWYgbm9kZXMuCi0gICAgICogQHJldHVybiBwcmV2aW91cyBsZWFmIG5vZGUgb3IgMCBpZiB0
aGVyZSBhcmUgbm8gbW9yZS4KLSAgICAgKi8KLSAgICBOb2RlSW1wbCAqcHJldmlvdXNMZWFmTm9k
ZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc0VkaXRhYmxlQmxvY2soKSBjb25zdDsKLSAgICBFbGVt
ZW50SW1wbCAqZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgpIGNvbnN0OwotICAgIEVsZW1lbnRJ
bXBsICplbmNsb3NpbmdCbG9ja0Zsb3dPclRhYmxlRWxlbWVudCgpIGNvbnN0OwotICAgIEVsZW1l
bnRJbXBsICplbmNsb3NpbmdJbmxpbmVFbGVtZW50KCkgY29uc3Q7Ci0gICAgRWxlbWVudEltcGwg
KnJvb3RFZGl0YWJsZUVsZW1lbnQoKSBjb25zdDsKLSAgICAKLSAgICBib29sIGluU2FtZVJvb3RF
ZGl0YWJsZUVsZW1lbnQoTm9kZUltcGwgKik7Ci0gICAgYm9vbCBpblNhbWVDb250YWluaW5nQmxv
Y2tGbG93RWxlbWVudChOb2RlSW1wbCAqKTsKLSAgICAKLSAgICAvLyB1c2VkIGJ5IHRoZSBwYXJz
ZXIuIENoZWNrcyBhZ2FpbnN0IHRoZSBEVEQsIHVubGlrZSBET00gb3BlcmF0aW9ucyBsaWtlCi0g
ICAgLy8gYXBwZW5kQ2hpbGQoKSwgYW5kIHJldHVybnMgdGhlIG5ldyBjb250YWluZXIgbm9kZSBm
b3IgZnV0dXJlIGluc2VydGlvbnMgYXMgeW91IHBhcnNlLgotICAgIHZpcnR1YWwgTm9kZUltcGwg
KmFkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCk7Ci0gICAgCi0gICAgLy8gY2FsbGVkIGJ5IHRo
ZSBwYXJzZXIgd2hlbiB0aGlzIGVsZW1lbnQncyBjbG9zZSB0YWcgaXMgcmVhY2hlZCwKLSAgICAv
LyBzaWduYWxsaW5nIHRoYXQgYWxsIGNoaWxkIHRhZ3MgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWRk
ZWQuCi0gICAgLy8gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgPGFwcGxldD4gYW5kIDxvYmplY3Q+
IGVsZW1lbnRzLCB3aGljaCBjYW4ndCBsYXkgdGhlbXNlbHZlcyBvdXQKLSAgICAvLyB1bnRpbCB0
aGV5IGtub3cgYWxsIG9mIHRoZWlyIG5lc3RlZCA8cGFyYW0+cy4gWzM2MDMxOTEsIDQwNDA4NDhd
Ci0gICAgdmlydHVhbCB2b2lkIGNsb3NlUmVuZGVyZXIoKSB7fQotCi0gICAgZW51bSBNb3VzZUV2
ZW50VHlwZSB7Ci0gICAgICAgIE1vdXNlUHJlc3MsCi0gICAgICAgIE1vdXNlUmVsZWFzZSwKLSAg
ICAgICAgTW91c2VDbGljaywKLSAgICAgICAgTW91c2VEYmxDbGljaywKLSAgICAgICAgTW91c2VN
b3ZlCi0gICAgfTsKLQotICAgIHN0cnVjdCBNb3VzZUV2ZW50Ci0gICAgewotICAgICAgICBNb3Vz
ZUV2ZW50KCBpbnQgX2J1dHRvbiwgTW91c2VFdmVudFR5cGUgX3R5cGUsCi0gICAgICAgICAgICAg
ICAgICAgIGNvbnN0IERPTVN0cmluZyAmX3VybCA9IERPTVN0cmluZygpLCBjb25zdCBET01TdHJp
bmcmIF90YXJnZXQgPSBET01TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgTm9kZUltcGwg
Kl9pbm5lck5vZGUgPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1dHRvbiA9
IF9idXR0b247IHR5cGUgPSBfdHlwZTsKLSAgICAgICAgICAgICAgICB1cmwgPSBfdXJsOyB0YXJn
ZXQgPSBfdGFyZ2V0OwotICAgICAgICAgICAgICAgIGlubmVyTm9kZSA9IF9pbm5lck5vZGU7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJ1dHRvbjsKLSAgICAgICAgTW91c2VFdmVudFR5
cGUgdHlwZTsKLSAgICAgICAgRE9NU3RyaW5nIHVybDsgLy8gdXJsIHVuZGVyIG1vdXNlIG9yIGVt
cHR5Ci0gICAgICAgIERPTVN0cmluZyB0YXJnZXQ7Ci0gICAgICAgIFJlZlB0cjxOb2RlSW1wbD4g
aW5uZXJOb2RlOwotICAgIH07Ci0KLSAgICAvLyBmb3IgTElOSyBhbmQgU1RZTEUKLSAgICB2aXJ0
dWFsIHZvaWQgc2hlZXRMb2FkZWQoKSB7fQotCi0gICAgYm9vbCBoYXNJRCgpIGNvbnN0ICAgICAg
eyByZXR1cm4gbV9oYXNJZDsgfQotICAgIGJvb2wgaGFzQ2xhc3MoKSBjb25zdCAgIHsgcmV0dXJu
IG1faGFzQ2xhc3M7IH0KLSAgICBib29sIGhhc1N0eWxlKCkgY29uc3QgICB7IHJldHVybiBtX2hh
c1N0eWxlOyB9Ci0gICAgYm9vbCBhY3RpdmUoKSBjb25zdCAgICAgeyByZXR1cm4gbV9hY3RpdmU7
IH0KLSAgICBib29sIGluQWN0aXZlQ2hhaW4oKSBjb25zdCB7IHJldHVybiBtX2luQWN0aXZlQ2hh
aW47IH0KLSAgICBib29sIGhvdmVyZWQoKSBjb25zdCB7IHJldHVybiBtX2hvdmVyZWQ7IH0KLSAg
ICBib29sIGZvY3VzZWQoKSBjb25zdCB7IHJldHVybiBtX2ZvY3VzZWQ7IH0KLSAgICBib29sIGF0
dGFjaGVkKCkgY29uc3QgICB7IHJldHVybiBtX2F0dGFjaGVkOyB9Ci0gICAgYm9vbCBjaGFuZ2Vk
KCkgY29uc3QgICAgeyByZXR1cm4gbV9jaGFuZ2VkOyB9Ci0gICAgYm9vbCBoYXNDaGFuZ2VkQ2hp
bGQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NoYW5nZWRDaGlsZDsgfQotICAgIGJvb2wgaXNMaW5r
KCkgY29uc3QgeyByZXR1cm4gbV9pc0xpbms7IH0KLSAgICAvLyBpbkRvY3VtZW50IHNob3VsZCBh
bHNvIG1ha2Ugc3VyZSBhIGRvY3VtZW50IGV4aXN0cyBpbiBjYXNlIHRoZSBkb2N1bWVudCBoYXMg
YmVlbiBkZXN0cm95ZWQgYmVmb3JlIHRoZSBub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1l
bnQuCi0gICAgYm9vbCBpbkRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gZG9jdW1lbnQuZ2V0KCkg
JiYgbV9pbkRvY3VtZW50OyB9Ci0gICAgYm9vbCBzdHlsZUVsZW1lbnQoKSBjb25zdCB7IHJldHVy
biBtX3N0eWxlRWxlbWVudDsgfQotICAgIGJvb2wgaW1wbGljaXROb2RlKCkgY29uc3QgeyByZXR1
cm4gbV9pbXBsaWNpdDsgfQotICAgIHZvaWQgc2V0SGFzSUQoYm9vbCBiPXRydWUpIHsgbV9oYXNJ
ZCA9IGI7IH0KLSAgICB2b2lkIHNldEhhc0NsYXNzKGJvb2wgYj10cnVlKSB7IG1faGFzQ2xhc3Mg
PSBiOyB9Ci0gICAgdm9pZCBzZXRIYXNTdHlsZShib29sIGI9dHJ1ZSkgeyBtX2hhc1N0eWxlID0g
YjsgfQotICAgIHZvaWQgc2V0SGFzQ2hhbmdlZENoaWxkKCBib29sIGIgPSB0cnVlICkgeyBtX2hh
c0NoYW5nZWRDaGlsZCA9IGI7IH0KLSAgICB2b2lkIHNldEluRG9jdW1lbnQoYm9vbCBiPXRydWUp
IHsgbV9pbkRvY3VtZW50ID0gYjsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRGb2N1cyhib29sIGI9
dHJ1ZSkgeyBtX2ZvY3VzZWQgPSBiOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29s
IGI9dHJ1ZSwgYm9vbCBwYXVzZT1mYWxzZSkgeyBtX2FjdGl2ZSA9IGI7IH0KLSAgICB2b2lkIHNl
dEluQWN0aXZlQ2hhaW4oYm9vbCBiPXRydWUpIHsgbV9pbkFjdGl2ZUNoYWluID0gYjsgfQotICAg
IHZpcnR1YWwgdm9pZCBzZXRIb3ZlcmVkKGJvb2wgYj10cnVlKSB7IG1faG92ZXJlZCA9IGI7IH0K
LSAgICB2b2lkIHNldENoYW5nZWQoYm9vbCBiPXRydWUpOwotCi0gICAgdW5zaWduZWQgc2hvcnQg
dGFiSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3RhYkluZGV4OyB9Ci0gICAgdm9pZCBzZXRUYWJJ
bmRleCh1bnNpZ25lZCBzaG9ydCBfdGFiSW5kZXgpIHsgbV90YWJJbmRleCA9IF90YWJJbmRleDsg
fQotCi0gICAgLyoqCi0gICAgICAgICogd2hldGhlciB0aGlzIG5vZGUgY2FuIHJlY2VpdmUgdGhl
IGtleWJvYXJkIGZvY3VzLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgp
IGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCBib29sIGlzTW91c2VGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJv
b2wgaXNDb250cm9sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0gLy8gRXZlbnR1YWxseSB0aGUg
bm90aW9uIG9mIHdoYXQgaXMgYSBjb250cm9sIHdpbGwgYmUgZXh0ZW5zaWJsZS4KLSAgICB2aXJ0
dWFsIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwg
Ym9vbCBpc0NoZWNrZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9v
bCBpc0luZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVh
bCBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBRUmVjdCBnZXRS
ZWN0KCkgY29uc3Q7Ci0KLSAgICBlbnVtIFN0eWxlQ2hhbmdlIHsgTm9DaGFuZ2UsIE5vSW5oZXJp
dCwgSW5oZXJpdCwgRGV0YWNoLCBGb3JjZSB9OwotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHls
ZSggU3R5bGVDaGFuZ2UgPSBOb0NoYW5nZSApIHt9Ci0gICAgU3R5bGVDaGFuZ2UgZGlmZigga2h0
bWw6OlJlbmRlclN0eWxlICpzMSwga2h0bWw6OlJlbmRlclN0eWxlICpzMiApIGNvbnN0OwotCi0g
ICAgdW5zaWduZWQgbm9kZUluZGV4KCkgY29uc3Q7Ci0gICAgLy8gUmV0dXJucyB0aGUgZG9jdW1l
bnQgdGhhdCB0aGlzIG5vZGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBUaGlzIGlzIGd1YXJhbnRlZWQg
dG8gYWx3YXlzIGJlIG5vbi1udWxsLCBhcyBvcHBvc2VkIHRvCi0gICAgLy8gRE9NJ3Mgb3duZXJE
b2N1bWVudCgpIHdoaWNoIGlzIG51bGwgZm9yIERvY3VtZW50IG5vZGVzIChhbmQgc29tZXRpbWVz
IERvY3VtZW50VHlwZSBub2RlcykuCi0gICAgRG9jdW1lbnRJbXBsKiBnZXREb2N1bWVudCgpIGNv
bnN0IHsgcmV0dXJuIGRvY3VtZW50LmdldCgpOyB9Ci0KLSAgICB2b2lkIHNldERvY3VtZW50KERv
Y3VtZW50SW1wbCAqZG9jKTsKLQotICAgIHZvaWQgYWRkRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9t
aWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNlQ2Fw
dHVyZSk7Ci0gICAgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAm
ZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKTsKLSAg
ICB2b2lkIHJlbW92ZUhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRU
eXBlKTsKLSAgICB2b2lkIHNldEhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAm
ZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lcik7Ci0gICAgRXZlbnRMaXN0ZW5lciAq
Z2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpOwotICAg
IHZvaWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLQotICAgIGJvb2wgZGlzcGF0Y2hFdmVu
dChFdmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlLCBib29sIHRlbXBFdmVudCA9IGZh
bHNlKTsKLSAgICBib29sIGRpc3BhdGNoR2VuZXJpY0V2ZW50KCBFdmVudEltcGwgKmV2dCwgaW50
ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGRpc3BhdGNoSFRNTEV2ZW50KGNvbnN0IEF0b21p
Y1N0cmluZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJn
KTsKLSAgICBib29sIGRpc3BhdGNoV2luZG93RXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVu
dFR5cGUsIGJvb2wgY2FuQnViYmxlQXJnLCBib29sIGNhbmNlbGFibGVBcmcpOwotICAgIGJvb2wg
ZGlzcGF0Y2hNb3VzZUV2ZW50KFFNb3VzZUV2ZW50ICplLCBjb25zdCBBdG9taWNTdHJpbmcgJm92
ZXJyaWRlVHlwZSwgaW50IG92ZXJyaWRlRGV0YWlsID0gMCk7Ci0gICAgYm9vbCBkaXNwYXRjaFNp
bXVsYXRlZE1vdXNlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpOwotICAgIGJv
b2wgZGlzcGF0Y2hNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBpbnQg
YnV0dG9uLCBpbnQgZGV0YWlsLAotICAgICAgICBpbnQgY2xpZW50WCwgaW50IGNsaWVudFksIGlu
dCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwKLSAgICAgICAgYm9vbCBjdHJsS2V5LCBib29sIGFsdEtl
eSwgYm9vbCBzaGlmdEtleSwgYm9vbCBtZXRhS2V5KTsKLSAgICBib29sIGRpc3BhdGNoVUlFdmVu
dChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgaW50IGRldGFpbCA9IDApOwotICAgIGJv
b2wgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudChib29sIGNoaWxkcmVuQ2hhbmdlZCA9IHRy
dWUpOwotICAgIGJvb2wgZGlzcGF0Y2hLZXlFdmVudChRS2V5RXZlbnQgKmtleSk7Ci0gICAgdm9p
ZCBkaXNwYXRjaFdoZWVsRXZlbnQoUVdoZWVsRXZlbnQgKik7Ci0KLSAgICB2b2lkIGhhbmRsZUxv
Y2FsRXZlbnRzKEV2ZW50SW1wbCAqZXZ0LCBib29sIHVzZUNhcHR1cmUpOwotCi0gICAgLy8gSGFu
ZGxlcnMgdG8gZG8vdW5kbyBhY3Rpb25zIG9uIHRoZSB0YXJnZXQgbm9kZSBiZWZvcmUgYW4gZXZl
bnQgaXMgZGlzcGF0Y2hlZCB0byBpdCBhbmQgYWZ0ZXIgdGhlIGV2ZW50Ci0gICAgLy8gaGFzIGJl
ZW4gZGlzcGF0Y2hlZC4gIFRoZSBkYXRhIHBvaW50ZXIgaXMgaGFuZGVkIGJhY2sgYnkgdGhlIHBy
ZURpc3BhdGNoIGFuZCBwYXNzZWQgdG8gcG9zdERpc3BhdGNoLgotICAgIHZpcnR1YWwgdm9pZCog
cHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpIHsgcmV0dXJuIDA7IH0KLSAg
ICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2
b2lkKiBkYXRhKSB7fQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUgZGVmYXVsdCBhY3Rp
b24gZm9yIGFuIGV2ZW50IGUuZy4gc3VibWl0dGluZyBhIGZvcm0KLSAgICAgKi8KLSAgICB2aXJ0
dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0KLSAgICAvKioK
LSAgICAgKiBVc2VkIGZvciBkaXNhYmxlZCBmb3JtIGVsZW1lbnRzOyBpZiB0cnVlLCBwcmV2ZW50
cyBtb3VzZSBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkCi0gICAgICogdG8gZXZlbnQgbGlz
dGVuZXJzLCBhbmQgcHJldmVudHMgRE9NQWN0aXZhdGUgZXZlbnRzIGZyb20gYmVpbmcgc2VudCBh
dCBhbGwuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGRpc2FibGVkKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgpOwotICAgIHZpcnR1YWwgYm9vbCBjaGlsZFR5cGVB
bGxvd2VkKCB1bnNpZ25lZCBzaG9ydCAvKnR5cGUqLyApIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAg
dmlydHVhbCB1bnNpZ25lZCBjaGlsZE5vZGVDb3VudCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9k
ZUltcGwgKmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBEb2Vz
IGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZSB0byBmaW5kIHRoZSBub2RlIG5leHQg
bm9kZSBhZnRlciB0aGlzIG9uZS4gVGhpcyB1c2VzIHRoZSBzYW1lIG9yZGVyIHRoYXQKLSAgICAg
KiB0aGUgdGFncyBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICAqCi0gICAgICogQHBh
cmFtIHN0YXlXaXRoaW4gSWYgbm90IG51bGwsIHRoZSB0cmF2ZXJzYWwgd2lsbCBzdG9wIG9uY2Ug
dGhlIHNwZWNpZmllZCBub2RlIGlzIHJlYWNoZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8KLSAgICAg
KiByZXN0cmljdCB0cmF2ZXJzYWwgdG8gYSBwYXJ0aWN1bGFyIHN1Yi10cmVlLgotICAgICAqCi0g
ICAgICogQHJldHVybiBUaGUgbmV4dCBub2RlLCBpbiBkb2N1bWVudCBvcmRlcgotICAgICAqCi0g
ICAgICogc2VlIEByZWYgdHJhdmVyc2VQcmV2aW91c05vZGUoKQotICAgICAqLwotICAgIE5vZGVJ
bXBsICp0cmF2ZXJzZU5leHROb2RlKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluID0gMCkgY29u
c3Q7Ci0gICAgCi0gICAgLyogTGlrZSB0cmF2ZXJzZU5leHROb2RlLCBidXQgc2tpcHMgY2hpbGRy
ZW4gYW5kIHN0YXJ0cyB3aXRoIHRoZSBuZXh0IHNpYmxpbmcuICovCi0gICAgTm9kZUltcGwgKnRy
YXZlcnNlTmV4dFNpYmxpbmcoY29uc3QgTm9kZUltcGwgKnN0YXlXaXRoaW4gPSAwKSBjb25zdDsK
LQotICAgIC8qKgotICAgICAqIERvZXMgYSByZXZlcnNlIHByZS1vcmRlciB0cmF2ZXJzYWwgdG8g
ZmluZCB0aGUgbm9kZSB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgaW4gZG9jdW1l
bnQgb3JkZXIKLSAgICAgKgotICAgICAqIHNlZSBAcmVmIHRyYXZlcnNlTmV4dE5vZGUoKQotICAg
ICAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZVByZXZpb3VzTm9kZSgpIGNvbnN0OwotCi0gICAg
LyogTGlrZSB0cmF2ZXJzZVByZXZpb3VzTm9kZSwgYnV0IHZpc2l0cyBub2RlcyBiZWZvcmUgdGhl
aXIgY2hpbGRyZW4uICovCi0gICAgTm9kZUltcGwgKnRyYXZlcnNlUHJldmlvdXNOb2RlUG9zdE9y
ZGVyKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluID0gMCkgY29uc3Q7Ci0KLSAgICBOb2RlSW1w
bCAqcHJldmlvdXNFZGl0YWJsZSgpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuZXh0RWRpdGFibGUo
KSBjb25zdDsKLSAgICAvL2Jvb2wgaXNFZGl0YWJsZSgpIGNvbnN0OwotCi0gICAga2h0bWw6OlJl
bmRlck9iamVjdCAqcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3JlbmRlcjsgfQotICAgIGto
dG1sOjpSZW5kZXJPYmplY3QgKm5leHRSZW5kZXJlcigpOwotICAgIGtodG1sOjpSZW5kZXJPYmpl
Y3QgKnByZXZpb3VzUmVuZGVyZXIoKTsKLSAgICB2b2lkIHNldFJlbmRlcmVyKGtodG1sOjpSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyKSB7IG1fcmVuZGVyID0gcmVuZGVyZXI7IH0KLSAgICAKLSAgICB2
b2lkIGNoZWNrU2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgaW50ICZleGNl
cHRpb25jb2RlKTsKLSAgICBib29sIGlzQW5jZXN0b3IoY29uc3QgTm9kZUltcGwgKikgY29uc3Q7
Ci0KLQkvLyBUaGVzZSB0d28gbWV0aG9kcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgVGhlIGZv
cm1lciBpcyB1c2VkIHRvIGRvIHN0cmljdCBlcnJvci1jaGVja2luZwotCS8vIHdoZW4gYWRkaW5n
IGNoaWxkcmVuIHZpYSB0aGUgcHVibGljIERPTSBBUEkgKGUuZy4sIGFwcGVuZENoaWxkKCkpLiAg
VGhlIGxhdHRlciBpcyBjYWxsZWQgb25seSB3aGVuIHBhcnNpbmcsIAotCS8vIHRvIHNhbml0eS1j
aGVjayBhZ2FpbnN0IHRoZSBEVEQgZm9yIGVycm9yIHJlY292ZXJ5LgotCXZvaWQgY2hlY2tBZGRD
aGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSk7ICAgIC8vIEVycm9y
LWNoZWNraW5nIHdoZW4gYWRkaW5nIHZpYSB0aGUgRE9NIEFQSQotCXZpcnR1YWwgYm9vbCBjaGls
ZEFsbG93ZWQoTm9kZUltcGwgKm5ld0NoaWxkKTsJCQkJICAgLy8gRXJyb3ItY2hlY2tpbmcgZHVy
aW5nIHBhcnNpbmcgdGhhdCBjaGVja3MgdGhlIERURAotCQotICAgIHZpcnR1YWwgaW50IG1heE9m
ZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGNhcmV0TWluT2Zmc2V0KCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCBpbnQgY2FyZXRNYXhPZmZzZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2ln
bmVkIGNhcmV0TWF4UmVuZGVyZWRPZmZzZXQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgaW50IHBy
ZXZpb3VzT2Zmc2V0IChpbnQgY3VycmVudCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgbmV4dE9m
ZnNldCAoaW50IGN1cnJlbnQpIGNvbnN0OwotICAgIAotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0
dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCA9ICIiKSBjb25z
dDsKLSNlbmRpZgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBJbnRlZ3Jh
dGlvbiB3aXRoIHJlbmRlcmluZyB0cmVlCi0KLSAgICAvKioKLSAgICAgKiBBdHRhY2hlcyB0aGlz
IG5vZGUgdG8gdGhlIHJlbmRlcmluZyB0cmVlLiBUaGlzIGNhbGN1bGF0ZXMgdGhlIHN0eWxlIHRv
IGJlIGFwcGxpZWQgdG8gdGhlIG5vZGUgYW5kIGNyZWF0ZXMgYW4KLSAgICAgKiBhcHByb3ByaWF0
ZSBSZW5kZXJPYmplY3Qgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIChleGNl
cHQgd2hlbiB0aGUgc3R5bGUgaGFzIGRpc3BsYXk6IG5vbmUpLiBUaGlzCi0gICAgICogbWFrZXMg
dGhlIG5vZGUgdmlzaWJsZSBpbiB0aGUgS0hUTUxWaWV3LgotICAgICAqLwotICAgIHZpcnR1YWwg
dm9pZCBhdHRhY2goKTsKLQotICAgIC8qKgotICAgICAqIERldGFjaGVzIHRoZSBub2RlIGZyb20g
dGhlIHJlbmRlcmluZyB0cmVlLCBtYWtpbmcgaXQgaW52aXNpYmxlIGluIHRoZSByZW5kZXJlZCB2
aWV3LiBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZQotICAgICAqIHRoZSBub2RlJ3MgcmVuZGVyaW5n
IG9iamVjdCBmcm9tIHRoZSByZW5kZXJpbmcgdHJlZSBhbmQgZGVsZXRlIGl0LgotICAgICAqLwot
ICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgIHZpcnR1YWwgdm9pZCB3aWxsUmVtb3Zl
KCk7Ci0gICAgdm9pZCBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCk7Ci0gICAgdmlydHVhbCBraHRt
bDo6UmVuZGVyU3R5bGUgKnN0eWxlRm9yUmVuZGVyZXIoa2h0bWw6OlJlbmRlck9iamVjdCAqcGFy
ZW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRlZChraHRtbDo6UmVuZGVyU3R5
bGUgKik7Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRTaG91bGRDcmVh
dGVSZW5kZXJlcihET006Ok5vZGVJbXBsICopIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSNlbmRp
ZgotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVy
QXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLSAgICAvLyBNZXRob2RzIGZvciBtYWludGFpbmluZyB0aGUgc3RhdGUgb2YgdGhlIGVs
ZW1lbnQgYmV0d2VlbiBoaXN0b3J5IG5hdmlnYXRpb24KLQotICAgIC8qKgotICAgICAqIEluZGlj
YXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHR5cGUgb2Ygbm9kZSBtYWludGFpbnMgaXQncyBzdGF0
ZS4gSWYgc28sIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZSB3aWxsIGJlIHN0b3JlZCB3aGVuCi0gICAg
ICogdGhlIHVzZXIgZ29lcyB0byBhIGRpZmZlcmVudCBwYWdlIHVzaW5nIHRoZSBzdGF0ZSgpIG1l
dGhvZCwgYW5kIHJlc3RvcmVkIHVzaW5nIHRoZSByZXN0b3JlU3RhdGUoKSBtZXRob2QgaWYgdGhl
Ci0gICAgICogdXNlciByZXR1cm5zIChlLmcuIHVzaW5nIHRoZSBiYWNrIGJ1dHRvbikuIFRoaXMg
aXMgdXNlZCB0byBlbnN1cmUgdGhhdCB1c2VyLWNoYW5nZWFibGUgZWxlbWVudHMgc3VjaCBhcyBm
b3JtCi0gICAgICogY29udHJvbHMgbWFpbnRhaW4gdGhlaXIgY29udGVudHMgd2hlbiB0aGUgdXNl
ciByZXR1cm5zIHRvIGEgcHJldmlvdXMgcGFnZSBpbiB0aGUgaGlzdG9yeS4KLSAgICAgKi8KLSAg
ICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVy
bnMgdGhlIHN0YXRlIG9mIHRoaXMgbm9kZSByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gVGhpcyBz
dHJpbmcgd2lsbCBiZSBwYXNzZWQgdG8gcmVzdG9yZVN0YXRlKCkgaWYgdGhlIHVzZXIKLSAgICAg
KiByZXR1cm5zIHRvIHRoZSBwYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBTdGF0ZSBpbmZv
cm1hdGlvbiBhYm91dCB0aGUgbm9kZSByZXByZXNlbnRlZCBhcyBhIHN0cmluZwotICAgICAqLwot
ICAgIHZpcnR1YWwgUVN0cmluZyBzdGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUg
c3RhdGUgb2YgdGhlIGVsZW1lbnQgYmFzZWQgb24gc3RyaW5ncyBwcmV2aW91c2x5IHJldHVybmVk
IGJ5IHN0YXRlKCkuIFRoaXMgaXMgdXNlZCB0byBpbml0aWFsaXplIGZvcm0KLSAgICAgKiBjb250
cm9scyB3aXRoIHRoZWlyIG9sZCB2YWx1ZXMgd2hlbiB0aGUgdXNlciByZXR1cm5zIHRvIHRoZSBw
YWdlIGluIHRoZWlyIGhpc3RvcnkuICBUaGUgcmVjZWl2ZXIKLSAgICAgKiBzaG91bGQgcmVtb3Zl
IHRoZSBzdHJpbmcgZnJvbSB0aGUgbGlzdCB0aGF0IGl0IHVzZXMgZm9yIGl0cyByZXN0b3JlLgot
ICAgICAqCi0gICAgICogQHBhcmFtIHN0YXRlcyBUaGUgc3RyaW5ncyBwcmV2aW91c2x5IHJldHVy
bmVkIGJ5IG5vZGVzJyBzdGF0ZSBtZXRob2RzLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBy
ZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlTGlzdCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotICAgIC8vIE5vdGlmaWNhdGlvbiBvZiBkb2N1bWVudCBzdHVjdHVyZSBjaGFu
Z2VzCi0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0IGl0IGhhcyBiZWVu
IGluc2VydGVkIGludG8gdGhlIGRvY3VtZW50LiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgZG9jdW1l
bnQgcGFyc2luZywgYW5kIGFsc28KLSAgICAgKiB3aGVuIGEgbm9kZSBpcyBhZGRlZCB0aHJvdWdo
IHRoZSBET00gbWV0aG9kcyBpbnNlcnRCZWZvcmUoKSwgYXBwZW5kQ2hpbGQoKSBvciByZXBsYWNl
Q2hpbGQoKS4gTm90ZSB0aGF0IHRoaXMgb25seQotICAgICAqIGhhcHBlbnMgd2hlbiB0aGUgbm9k
ZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsIGkuZS4gb25seSB3aGVuIHRoZSBk
b2N1bWVudCBpcyBhY3R1YWxseSBhbiBhbmNlc3RvciBvZgotICAgICAqIHRoZSBub2RlLiBUaGUg
Y2FsbCBoYXBwZW5zIF9hZnRlcl8gdGhlIG5vZGUgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHRyZWUu
Ci0gICAgICoKLSAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIERPTU5vZGVJbnNlcnRlZElu
dG9Eb2N1bWVudCBET00gZXZlbnQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvdmVyaGVhZCBv
ZiBldmVudAotICAgICAqIGRpc3BhdGNoaW5nLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBp
bnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhlIG5v
ZGUgdGhhdCBpdCBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgZG9jdW1lbnQgdHJlZSwgaS5lLiB3
aGVuIHRoZSBkb2N1bWVudCBpcyBubyBsb25nZXIgYW4gYW5jZXN0b3IKLSAgICAgKiBub2RlLgot
ICAgICAqCi0gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBET01Ob2RlUmVtb3ZlZEZyb21E
b2N1bWVudCBET00gZXZlbnQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvdmVyaGVhZCBvZiBl
dmVudAotICAgICAqIGRpc3BhdGNoaW5nLCBhbmQgaXMgY2FsbGVkIF9hZnRlcl8gdGhlIG5vZGUg
aXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCByZW1v
dmVkRnJvbURvY3VtZW50KCk7Ci0KLSAgICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3
aGVuZXZlciB5b3UgYXJlIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQgZnJvbSBhIHRyZWUuICBU
aGF0IHRyZWUgbWF5IGJlIHRoZSBtYWluCi0gICAgLy8gZG9jdW1lbnQgdHJlZSwgb3IgaXQgY291
bGQgYmUgYW5vdGhlciBkaXNjb25uZWN0ZWQgdHJlZS4gIE92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9u
cyB0byBkbyBhbnkgd29yayB0aGF0IGRlcGVuZHMKLSAgICAvLyBvbiBjb25uZWN0ZWRuZXNzIHRv
IHNvbWUgYW5jZXN0b3IgKGUuZy4sIGFuIGFuY2VzdG9yIDxmb3JtPiBmb3IgZXhhbXBsZSkuCi0g
ICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKSB7fTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJvb2wgZGVlcCkge307Ci0KLSAgICAvKioKLSAgICAg
KiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0IGl0J3MgbGlzdCBvZiBjaGlsZHJlbiBoYXZlIGNoYW5n
ZWQgKGVpdGhlciBieSBhZGRpbmcgb3IgcmVtb3ZpbmcgY2hpbGQgbm9kZXMpLCBvciBhIGNoaWxk
Ci0gICAgICogbm9kZSB0aGF0IGlzIG9mIHRoZSB0eXBlIENEQVRBX1NFQ1RJT05fTk9ERSwgVEVY
VF9OT0RFIG9yIENPTU1FTlRfTk9ERSBoYXMgY2hhbmdlZCBpdHMgdmFsdWUuCi0gICAgICovCi0g
ICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgdmlydHVhbCBET01TdHJp
bmcgdG9TdHJpbmcoKSBjb25zdCA9IDA7Ci0gICAgCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1
YWwgdm9pZCBmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkg
Y29uc3Q7Ci0KLSAgICB2b2lkIHNob3dOb2RlKGNvbnN0IGNoYXIgKnByZWZpeD0iIikgY29uc3Q7
Ci0gICAgdm9pZCBzaG93VHJlZSgpIGNvbnN0OwotICAgIHZvaWQgc2hvd1RyZWVBbmRNYXJrKE5v
ZGVJbXBsICogbWFya2VkTm9kZTEsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJlbDEsIE5vZGVJbXBs
ICogbWFya2VkTm9kZTIsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJlbDIpIGNvbnN0OwotCQotI2Vu
ZGlmCi0KLSAgICB2b2lkIHJlZ2lzdGVyTm9kZUxpc3QoTm9kZUxpc3RJbXBsICpsaXN0KTsKLSAg
ICB2b2lkIHVucmVnaXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3QpOwotICAgIHZvaWQg
bm90aWZ5Tm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgdm9pZCBub3RpZnlMb2NhbE5v
ZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZvaWQgbm90aWZ5Tm9kZUxpc3RzQXR0cmli
dXRlQ2hhbmdlZCgpOwotICAgIHZvaWQgbm90aWZ5TG9jYWxOb2RlTGlzdHNBdHRyaWJ1dGVDaGFu
Z2VkKCk7Ci0gICAgCi0gICAgUmVmUHRyPE5vZGVMaXN0SW1wbD4gZ2V0RWxlbWVudHNCeVRhZ05h
bWUoY29uc3QgRE9NU3RyaW5nICZuYW1lKSB7IHJldHVybiBnZXRFbGVtZW50c0J5VGFnTmFtZU5T
KCIqIiwgbmFtZSk7IH0KLSAgICBSZWZQdHI8Tm9kZUxpc3RJbXBsPiBnZXRFbGVtZW50c0J5VGFn
TmFtZU5TKGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJmxv
Y2FsTmFtZSk7Ci0KLXByaXZhdGU6IC8vIG1lbWJlcnMKLSAgICBEb2NQdHI8RG9jdW1lbnRJbXBs
PiBkb2N1bWVudDsKLSAgICBOb2RlSW1wbCAqbV9wcmV2aW91czsKLSAgICBOb2RlSW1wbCAqbV9u
ZXh0OwotcHJvdGVjdGVkOgotICAgIGtodG1sOjpSZW5kZXJPYmplY3QgKm1fcmVuZGVyOwotICAg
IFFQdHJMaXN0PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiAqbV9yZWdkTGlzdGVuZXJzOwotICAg
IFFQdHJEaWN0PE5vZGVMaXN0SW1wbD4gKm1fbm9kZUxpc3RzOwotCi0gICAgdW5zaWduZWQgc2hv
cnQgbV90YWJJbmRleCA6IDE1OwotICAgIGJvb2wgbV9oYXNUYWJJbmRleCAgOiAxOwotCi0gICAg
Ym9vbCBtX2hhc0lkIDogMTsKLSAgICBib29sIG1faGFzQ2xhc3MgOiAxOwotICAgIGJvb2wgbV9o
YXNTdHlsZSA6IDE7Ci0gICAgYm9vbCBtX2F0dGFjaGVkIDogMTsKLSAgICBib29sIG1fY2hhbmdl
ZCA6IDE7Ci0gICAgYm9vbCBtX2hhc0NoYW5nZWRDaGlsZCA6IDE7Ci0gICAgYm9vbCBtX2luRG9j
dW1lbnQgOiAxOwotCi0gICAgYm9vbCBtX2lzTGluayA6IDE7Ci0gICAgYm9vbCBtX3NwZWNpZmll
ZCA6IDE7IC8vIHVzZWQgaW4gQXR0ckltcGwuIEFjY2Vzc29yIGZ1bmN0aW9ucyB0aGVyZQotICAg
IGJvb2wgbV9mb2N1c2VkIDogMTsKLSAgICBib29sIG1fYWN0aXZlIDogMTsKLSAgICBib29sIG1f
aG92ZXJlZCA6IDE7Ci0gICAgYm9vbCBtX2luQWN0aXZlQ2hhaW4gOiAxOwotICAgIGJvb2wgbV9z
dHlsZUVsZW1lbnQgOiAxOyAvLyBjb250YWlucyBzdHlsZXNoZWV0IHRleHQKLSAgICBib29sIG1f
aW1wbGljaXQgOiAxOyAvLyBpbXBsaWNpdGVseSBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlcgotCi0g
ICAgYm9vbCBtX2luRGV0YWNoIDogMTsKLX07Ci0KLWNsYXNzIENvbnRhaW5lck5vZGVJbXBsIDog
cHVibGljIE5vZGVJbXBsCi17Ci1wdWJsaWM6Ci0gICAgQ29udGFpbmVyTm9kZUltcGwoRG9jdW1l
bnRJbXBsICpkb2MpOwotICAgIHZpcnR1YWwgfkNvbnRhaW5lck5vZGVJbXBsKCk7Ci0KLSAgICAv
LyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVh
bCBOb2RlSW1wbCAqZmlyc3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmxh
c3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hp
bGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVh
bCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0
aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwg
Km5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hp
bGROb2RlcyAoICApIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2Yg
RE9NKQotICAgIHZvaWQgd2lsbFJlbW92ZSgpOwotICAgIGludCB3aWxsUmVtb3ZlQ2hpbGQoTm9k
ZUltcGwgKmNoaWxkKTsKLSAgICB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKCk7Ci0gICAgdm9pZCBy
ZW1vdmVDaGlsZHJlbigpOwotICAgIHZvaWQgY2xvbmVDaGlsZE5vZGVzKE5vZGVJbXBsICpjbG9u
ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rmlyc3RDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwot
ICAgIHZpcnR1YWwgdm9pZCBzZXRMYXN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKTsKLSAgICB2aXJ0
dWFsIE5vZGVJbXBsICphZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpOwotICAgIHZpcnR1YWwg
dm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0KLSAgICB2aXJ0dWFs
IFFSZWN0IGdldFJlY3QoKSBjb25zdDsKLSAgICBib29sIGdldFVwcGVyTGVmdENvcm5lcihpbnQg
JnhQb3MsIGludCAmeVBvcykgY29uc3Q7Ci0gICAgYm9vbCBnZXRMb3dlclJpZ2h0Q29ybmVyKGlu
dCAmeFBvcywgaW50ICZ5UG9zKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRGb2N1cyhi
b29sPXRydWUpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUgPSB0cnVl
LCBib29sIHBhdXNlID0gZmFsc2UpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRIb3ZlcmVkKGJvb2w9
dHJ1ZSk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBjaGlsZE5vZGVDb3VudCgpIGNvbnN0OwotICAg
IHZpcnR1YWwgTm9kZUltcGwgKmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCk7Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wg
ZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApOwotCi0v
L3Byb3RlY3RlZDoKLSAgICBOb2RlSW1wbCAqX2ZpcnN0OwotICAgIE5vZGVJbXBsICpfbGFzdDsK
LQotICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGluc2VydGluZyBjaGlsZHJlbjoKLQotICAg
IC8vICMjIyB0aGlzIHNob3VsZCB2YW5pc2guIGRvIGl0IGluIGRvbS8gIQotICAgIC8vIGNoZWNr
IGZvciBzYW1lIHNvdXJjZSBkb2N1bWVudDoKLSAgICBib29sIGNoZWNrU2FtZURvY3VtZW50KCBO
b2RlSW1wbCAqbmV3Y2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIC8vIGNoZWNrIGZv
ciBiZWluZyBjaGlsZDoKLSAgICBib29sIGNoZWNrSXNDaGlsZCggTm9kZUltcGwgKm9sZGNoaWxk
LCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICAvLyAjIyMKLQotICAgIC8vIGZpbmQgb3V0IGlm
IGEgbm9kZSBpcyBhbGxvd2VkIHRvIGJlIG91ciBjaGlsZAotICAgIHZvaWQgZGlzcGF0Y2hDaGls
ZEluc2VydGVkRXZlbnRzKCBOb2RlSW1wbCAqY2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZvaWQgZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwgaW50
ICZleGNlcHRpb25jb2RlICk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xhc3MgTm9k
ZTsKIGNsYXNzIE5vZGVJbXBsOworY2xhc3MgRE9NU3RyaW5nOwogCiBjbGFzcyBOb2RlTGlzdElt
cGwgOiBwdWJsaWMga2h0bWw6OlNoYXJlZDxOb2RlTGlzdEltcGw+CiB7CkBAIC01OTgsNzEgKzYy
LDUgQEAgcHJvdGVjdGVkOgogICAgIG11dGFibGUgYm9vbCBpc0l0ZW1DYWNoZVZhbGlkIDogMTsK
IH07CiAKLWNsYXNzIENoaWxkTm9kZUxpc3RJbXBsIDogcHVibGljIE5vZGVMaXN0SW1wbAotewot
cHVibGljOgotICAgIENoaWxkTm9kZUxpc3RJbXBsKCBOb2RlSW1wbCAqbik7Ci0KLSAgICAvLyBE
T00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0KLSAgICB2aXJ0dWFs
IHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1
bnNpZ25lZCBpbmRleCApIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIG5v
ZGVNYXRjaGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUgKSBjb25zdDsKLX07Ci0KLS8qKgotICogTm9k
ZUxpc3Qgd2hpY2ggbGlzdHMgYWxsIE5vZGVzIGluIGEgRWxlbWVudCB3aXRoIGEgZ2l2ZW4gIm5h
bWU9IiB0YWcKLSAqLwotY2xhc3MgTmFtZU5vZGVMaXN0SW1wbCA6IHB1YmxpYyBOb2RlTGlzdElt
cGwKLXsKLXB1YmxpYzoKLSAgICBOYW1lTm9kZUxpc3RJbXBsKCBOb2RlSW1wbCAqZG9jLCBjb25z
dCBET01TdHJpbmcgJnQgKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAg
cGFyZW50IGNsYXNzZXMKLQotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4ICkgY29uc3Q7Ci0KLSAg
ICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCB2b2lkIHJv
b3ROb2RlQ2hpbGRyZW5DaGFuZ2VkKCkge307Ci0gICAgdmlydHVhbCB2b2lkIHJvb3ROb2RlQXR0
cmlidXRlQ2hhbmdlZCgpIHsgTm9kZUxpc3RJbXBsOjpyb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgp
OyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZU1hdGNoZXMoIE5vZGVJbXBs
ICp0ZXN0Tm9kZSApIGNvbnN0OwotCi0gICAgRE9NU3RyaW5nIG5vZGVOYW1lOwotfTsKLQotCi0v
LyBHZW5lcmljIE5hbWVkTm9kZU1hcCBpbnRlcmZhY2UKLS8vIE90aGVyIGNsYXNzZXMgaW1wbGVt
ZW50IHRoaXMgZm9yIG1vcmUgc3BlY2lmaWMgc2l0dWF0aW9ucyBlLmcuIGF0dHJpYnV0ZXMKLS8v
IG9mIGFuIGVsZW1lbnQKLWNsYXNzIE5hbWVkTm9kZU1hcEltcGwgOiBwdWJsaWMga2h0bWw6OlNo
YXJlZDxOYW1lZE5vZGVNYXBJbXBsPgotewotcHVibGljOgotICAgIE5hbWVkTm9kZU1hcEltcGwo
KSB7fQotICAgIHZpcnR1YWwgfk5hbWVkTm9kZU1hcEltcGwoKSB7fQotCi0gICAgTm9kZUltcGwg
KmdldE5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUpIGNvbnN0IHsgcmV0dXJuIGdldE5h
bWVkSXRlbU5TKERPTVN0cmluZygpLCBuYW1lKTsgfQotICAgIFJlZlB0cjxOb2RlSW1wbD4gcmVt
b3ZlTmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFtZSwgaW50ICZleGNlcHRpb24pIHsgcmV0
dXJuIHJlbW92ZU5hbWVkSXRlbU5TKERPTVN0cmluZygpLCBuYW1lLCBleGNlcHRpb24pOyB9Ci0K
LSAgICB2aXJ0dWFsIE5vZGVJbXBsICpnZXROYW1lZEl0ZW1OUyhjb25zdCBET01TdHJpbmcgJm5h
bWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2NhbE5hbWUpIGNvbnN0ID0gMDsKLSAgICBS
ZWZQdHI8Tm9kZUltcGw+IHNldE5hbWVkSXRlbU5TKE5vZGVJbXBsICphcmcsIGludCAmZXhjZXB0
aW9uKSB7IHJldHVybiBzZXROYW1lZEl0ZW0oYXJnLCBleGNlcHRpb24pOyB9Ci0gICAgdmlydHVh
bCBSZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRlbU5TKGNvbnN0IERPTVN0cmluZyAmbmFt
ZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJmxvY2FsTmFtZSwgaW50ICZleGNlcHRpb24pID0g
MDsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgTmFtZWROb2RlTWFwCi0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqZ2V0TmFtZWRJdGVtKGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0
dHJOYW1lKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBSZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5h
bWVkSXRlbSAoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIGludCAmZXhjZXB0aW9uY29k
ZSkgPSAwOwotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJbXBsPiBzZXROYW1lZEl0ZW0gKE5vZGVJ
bXBsKiBhcmcsIGludCAmZXhjZXB0aW9uY29kZSkgPSAwOwotCi0gICAgdmlydHVhbCBOb2RlSW1w
bCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4ICkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdW5zaWdu
ZWQgbGVuZ3RoKCAgKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFy
dCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlzUmVhZE9ubHkoKSB7IHJldHVybiBmYWxzZTsg
fQotfTsKLQogfTsgLy9uYW1lc3BhY2UKICNlbmRpZgpJbmRleDoga2h0bWwveG1sL2RvbV9ub2Rl
aW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9kb21fbm9kZWltcGwuaAkocmV2aXNpb24g
MTIwODYpCisrKyBraHRtbC94bWwvZG9tX25vZGVpbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTEs
NjcwICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRE9NIGltcGxlbWVu
dGF0aW9uIGZvciBLREUuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtu
b2xsQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZp
c3RvQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVy
QGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgQXBwbGUgQ29tcHV0ZXIsIEluYy4KLSAq
Ci0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0g
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBT
dWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8KLSNpZm5k
ZWYgX0RPTV9Ob2RlSW1wbF9oXwotI2RlZmluZSBfRE9NX05vZGVJbXBsX2hfCi0KLSNpbmNsdWRl
ICJkb20vZG9tX3N0cmluZy5oIgotI2luY2x1ZGUgImRvbS9kb21fbm9kZS5oIgotI2luY2x1ZGUg
Im1pc2MvaGVscGVyLmgiCi0jaW5jbHVkZSAibWlzYy9zaGFyZWQuaCIKLSNpbmNsdWRlICJkb21f
YXRvbWljc3RyaW5nLmgiCi0jaW5jbHVkZSAiRG9jUHRyLmgiCi0KLWNsYXNzIFFQYWludGVyOwot
dGVtcGxhdGUgPGNsYXNzIHR5cGU+IGNsYXNzIFFQdHJMaXN0OwotdGVtcGxhdGUgPGNsYXNzIHR5
cGU+IGNsYXNzIFFQdHJEaWN0OwotY2xhc3MgS0hUTUxWaWV3OwotY2xhc3MgUmVuZGVyQXJlbmE7
Ci1jbGFzcyBRTW91c2VFdmVudDsKLWNsYXNzIFFLZXlFdmVudDsKLWNsYXNzIFFUZXh0U3RyZWFt
OwotY2xhc3MgUVN0cmluZ0xpc3Q7Ci1jbGFzcyBRV2hlZWxFdmVudDsKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotICAgIGNsYXNzIEludFJlY3Q7Ci19Ci0KLW5hbWVzcGFjZSBraHRtbCB7Ci0gICAg
Y2xhc3MgUmVuZGVyT2JqZWN0OwotICAgIGNsYXNzIFJlbmRlclN0eWxlOwotfTsKLQotbmFtZXNw
YWNlIERPTSB7Ci0KLWNsYXNzIEF0b21pY1N0cmluZzsKLWNsYXNzIERvY3VtZW50SW1wbDsKLWNs
YXNzIEVsZW1lbnRJbXBsOwotY2xhc3MgRXZlbnRJbXBsOwotY2xhc3MgRXZlbnRMaXN0ZW5lcjsK
LWNsYXNzIE5vZGVMaXN0SW1wbDsKLWNsYXNzIE5hbWVkQXR0ck1hcEltcGw7Ci1jbGFzcyBRdWFs
aWZpZWROYW1lOwotY2xhc3MgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI7Ci0KLS8vIHRoaXMgY2xh
c3MgaW1wbGVtZW50cyBub2Rlcywgd2hpY2ggY2FuIGhhdmUgYSBwYXJlbnQgYnV0IG5vIGNoaWxk
cmVuOgotY2xhc3MgTm9kZUltcGwgOiBwdWJsaWMga2h0bWw6OlRyZWVTaGFyZWQ8Tm9kZUltcGw+
Ci17Ci0gICAgZnJpZW5kIGNsYXNzIERvY3VtZW50SW1wbDsKLXB1YmxpYzoKLSAgICBOb2RlSW1w
bChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+Tm9kZUltcGwoKTsKLQotICAgIC8v
IERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgTm9kZQotICAgIHZpcnR1YWwgYm9vbCBoYXNU
YWdOYW1lKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUpIGNvbnN0IHsgcmV0dXJuIGZhbHNl
OyB9Ci0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5hbWUoKSBjb25zdCA9IDA7Ci0gICAgdmly
dHVhbCBET01TdHJpbmcgbm9kZVZhbHVlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldE5v
ZGVWYWx1ZSggY29uc3QgRE9NU3RyaW5nICZfbm9kZVZhbHVlLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3QgPSAwOwotICAg
IE5vZGVJbXBsICpwYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gcGFyZW50KCk7IH0KLSAgICBO
b2RlSW1wbCAqcHJldmlvdXNTaWJsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9wcmV2aW91czsgfQot
ICAgIE5vZGVJbXBsICpuZXh0U2libGluZygpIGNvbnN0IHsgcmV0dXJuIG1fbmV4dDsgfQotICAg
IHZpcnR1YWwgUmVmUHRyPE5vZGVMaXN0SW1wbD4gY2hpbGROb2RlcygpOwotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKmZpcnN0Q2hpbGQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpsYXN0
Q2hpbGQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0Owot
ICAgIHZpcnR1YWwgTmFtZWRBdHRyTWFwSW1wbCAqYXR0cmlidXRlcygpIGNvbnN0OwotICAgIHZp
cnR1YWwgRG9jdW1lbnRJbXBsICpvd25lckRvY3VtZW50KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBO
b2RlSW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVm
Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxh
Y2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJ
bXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1w
bCAqYXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSAp
OwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICB2aXJ0
dWFsIGJvb2wgaGFzQ2hpbGROb2RlcyAoICApIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwg
KmNsb25lTm9kZSAoIGJvb2wgZGVlcCApID0gMDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0
cmluZyYgbG9jYWxOYW1lKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcm
IG5hbWVzcGFjZVVSSSgpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBw
cmVmaXgoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0
cmluZyAmX3ByZWZpeCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICB2b2lkIG5vcm1hbGl6ZSAo
KTsKLSAgICBzdGF0aWMgYm9vbCBpc1N1cHBvcnRlZChjb25zdCBET01TdHJpbmcgJmZlYXR1cmUs
IGNvbnN0IERPTVN0cmluZyAmdmVyc2lvbik7Ci0KLSAgICBib29sIGlzU2FtZU5vZGUoTm9kZUlt
cGwgKm90aGVyKSBjb25zdCB7IHJldHVybiB0aGlzID09IG90aGVyOyB9Ci0gICAgYm9vbCBpc0Vx
dWFsTm9kZShOb2RlSW1wbCAqb3RoZXIpIGNvbnN0OwotICAgIGJvb2wgaXNEZWZhdWx0TmFtZXNw
YWNlKGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJKSBjb25zdDsKLSAgICBET01TdHJpbmcg
bG9va3VwUHJlZml4KGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJKSBjb25zdDsKLSAgICBE
T01TdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKGNvbnN0IERPTVN0cmluZyAmcHJlZml4KSBjb25z
dDsKLSAgICAKLSAgICBET01TdHJpbmcgdGV4dENvbnRlbnQoKSBjb25zdDsKLSAgICB2b2lkIHNl
dFRleHRDb250ZW50KGNvbnN0IERPTVN0cmluZyAmdGV4dCwgaW50ICZleGNlcHRpb24pOwotICAg
IAotICAgIE5vZGVJbXBsICpsYXN0RGVzY2VuZGFudCgpIGNvbnN0OwotCi0gICAgLy8gT3RoZXIg
bWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIHZpcnR1YWwgYm9vbCBpc0VsZW1lbnROb2Rl
KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNIVE1MRWxlbWVu
dCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICB2aXJ0dWFs
IGJvb2wgaXNTVkdFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZgotICAg
IHZpcnR1YWwgYm9vbCBpc1N0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
ICAgIHZpcnR1YWwgYm9vbCBpc0F0dHJpYnV0ZU5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQotICAgIHZpcnR1YWwgYm9vbCBpc1RleHROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgaXNDb21tZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9
Ci0gICAgdmlydHVhbCBib29sIGlzRG9jdW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7
IH0KLSAgICBib29sIGlzQmxvY2tGbG93KCkgY29uc3Q7Ci0gICAgYm9vbCBpc0Jsb2NrRmxvd09y
QmxvY2tUYWJsZSgpIGNvbnN0OwotICAgIAotICAgIC8vIFVzZWQgYnkgPGZvcm0+IGVsZW1lbnRz
IHRvIGluZGljYXRlIGEgbWFsZm9ybWVkIHN0YXRlIG9mIHNvbWUga2luZCwgdHlwaWNhbGx5Ci0g
ICAgLy8gdXNlZCB0byBrZWVwIGZyb20gYXBwbHlpbmcgdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhl
IGZvcm0uCi0gICAgdmlydHVhbCBib29sIGlzTWFsZm9ybWVkKCkgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgc2V0TWFsZm9ybWVkKGJvb2wgbWFsZm9ybWVkKSB7fTsKLSAgICAK
LSAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIG5vdCBiZWluZyBwYXJ0IG9mIHRoZSBET00KLSAgICAv
LyBBdHRlbnRpb246IHRoZXkgYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBkaWQgdGhlIGNvbnNpc3Rl
bmN5IGNoZWNraW5nIQotICAgIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKE5vZGVJbXBsICpwcmV2
aW91cykgeyBtX3ByZXZpb3VzID0gcHJldmlvdXM7IH0KLSAgICB2b2lkIHNldE5leHRTaWJsaW5n
KE5vZGVJbXBsICpuZXh0KSB7IG1fbmV4dCA9IG5leHQ7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBz
ZXRGaXJzdENoaWxkKE5vZGVJbXBsICpjaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldExhc3RD
aGlsZChOb2RlSW1wbCAqY2hpbGQpOwotCi0gICAgTm9kZUltcGwgKnByZXZpb3VzTm9kZUNvbnNp
ZGVyaW5nQXRvbWljTm9kZXMoKSBjb25zdDsKLSAgICBOb2RlSW1wbCAqbmV4dE5vZGVDb25zaWRl
cmluZ0F0b21pY05vZGVzKCkgY29uc3Q7Ci0gICAgCi0gICAgRWxlbWVudEltcGwgKmdldEFuY2Vz
dG9yRWxlbWVudCgpIGNvbnN0OwotICAgIERPTVN0cmluZyBsb29rdXBOYW1lc3BhY2VQcmVmaXgo
Y29uc3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBjb25zdCBFbGVtZW50SW1wbCAqb3JpZ2lu
YWxFbGVtZW50KSBjb25zdDsKLSAgICAKLSAgICAvKiogKE5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lh
bCBET00pCi0gICAgICogUmV0dXJucyB0aGUgbmV4dCBsZWFmIG5vZGUuCi0gICAgICoKLSAgICAg
KiBVc2luZyB0aGlzIGZ1bmN0aW9uIGRlbGl2ZXJzIGxlYWYgbm9kZXMgYXMgaWYgdGhlIHdob2xl
IERPTSB0cmVlCi0gICAgICogd2VyZSBhIGxpbmVhciBjaGFpbiBvZiBpdHMgbGVhZiBub2Rlcy4K
LSAgICAgKiBAcmV0dXJuIG5leHQgbGVhZiBub2RlIG9yIDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUu
Ci0gICAgICovCi0gICAgTm9kZUltcGwgKm5leHRMZWFmTm9kZSgpIGNvbnN0OwotCi0gICAgLyoq
IChOb3QgcGFydCBvZiB0aGUgb2ZmaWNpYWwgRE9NKQotICAgICAqIFJldHVybnMgdGhlIHByZXZp
b3VzIGxlYWYgbm9kZS4KLSAgICAgKgotICAgICAqIFVzaW5nIHRoaXMgZnVuY3Rpb24gZGVsaXZl
cnMgbGVhZiBub2RlcyBhcyBpZiB0aGUgd2hvbGUgRE9NIHRyZWUKLSAgICAgKiB3ZXJlIGEgbGlu
ZWFyIGNoYWluIG9mIGl0cyBsZWFmIG5vZGVzLgotICAgICAqIEByZXR1cm4gcHJldmlvdXMgbGVh
ZiBub2RlIG9yIDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUuCi0gICAgICovCi0gICAgTm9kZUltcGwg
KnByZXZpb3VzTGVhZk5vZGUoKSBjb25zdDsKLQotICAgIGJvb2wgaXNFZGl0YWJsZUJsb2NrKCkg
Y29uc3Q7Ci0gICAgRWxlbWVudEltcGwgKmVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKSBjb25z
dDsKLSAgICBFbGVtZW50SW1wbCAqZW5jbG9zaW5nQmxvY2tGbG93T3JUYWJsZUVsZW1lbnQoKSBj
b25zdDsKLSAgICBFbGVtZW50SW1wbCAqZW5jbG9zaW5nSW5saW5lRWxlbWVudCgpIGNvbnN0Owot
ICAgIEVsZW1lbnRJbXBsICpyb290RWRpdGFibGVFbGVtZW50KCkgY29uc3Q7Ci0gICAgCi0gICAg
Ym9vbCBpblNhbWVSb290RWRpdGFibGVFbGVtZW50KE5vZGVJbXBsICopOwotICAgIGJvb2wgaW5T
YW1lQ29udGFpbmluZ0Jsb2NrRmxvd0VsZW1lbnQoTm9kZUltcGwgKik7Ci0gICAgCi0gICAgLy8g
dXNlZCBieSB0aGUgcGFyc2VyLiBDaGVja3MgYWdhaW5zdCB0aGUgRFRELCB1bmxpa2UgRE9NIG9w
ZXJhdGlvbnMgbGlrZQotICAgIC8vIGFwcGVuZENoaWxkKCksIGFuZCByZXR1cm5zIHRoZSBuZXcg
Y29udGFpbmVyIG5vZGUgZm9yIGZ1dHVyZSBpbnNlcnRpb25zIGFzIHlvdSBwYXJzZS4KLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpOwotICAgIAotICAg
IC8vIGNhbGxlZCBieSB0aGUgcGFyc2VyIHdoZW4gdGhpcyBlbGVtZW50J3MgY2xvc2UgdGFnIGlz
IHJlYWNoZWQsCi0gICAgLy8gc2lnbmFsbGluZyB0aGF0IGFsbCBjaGlsZCB0YWdzIGhhdmUgYmVl
biBwYXJzZWQgYW5kIGFkZGVkLgotICAgIC8vIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIDxhcHBs
ZXQ+IGFuZCA8b2JqZWN0PiBlbGVtZW50cywgd2hpY2ggY2FuJ3QgbGF5IHRoZW1zZWx2ZXMgb3V0
Ci0gICAgLy8gdW50aWwgdGhleSBrbm93IGFsbCBvZiB0aGVpciBuZXN0ZWQgPHBhcmFtPnMuIFsz
NjAzMTkxLCA0MDQwODQ4XQotICAgIHZpcnR1YWwgdm9pZCBjbG9zZVJlbmRlcmVyKCkge30KLQot
ICAgIGVudW0gTW91c2VFdmVudFR5cGUgewotICAgICAgICBNb3VzZVByZXNzLAotICAgICAgICBN
b3VzZVJlbGVhc2UsCi0gICAgICAgIE1vdXNlQ2xpY2ssCi0gICAgICAgIE1vdXNlRGJsQ2xpY2ss
Ci0gICAgICAgIE1vdXNlTW92ZQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTW91c2VFdmVudAotICAg
IHsKLSAgICAgICAgTW91c2VFdmVudCggaW50IF9idXR0b24sIE1vdXNlRXZlbnRUeXBlIF90eXBl
LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBET01TdHJpbmcgJl91cmwgPSBET01TdHJpbmco
KSwgY29uc3QgRE9NU3RyaW5nJiBfdGFyZ2V0ID0gRE9NU3RyaW5nKCksCi0gICAgICAgICAgICAg
ICAgICAgIE5vZGVJbXBsICpfaW5uZXJOb2RlID0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAg
ICAgICAgICBidXR0b24gPSBfYnV0dG9uOyB0eXBlID0gX3R5cGU7Ci0gICAgICAgICAgICAgICAg
dXJsID0gX3VybDsgdGFyZ2V0ID0gX3RhcmdldDsKLSAgICAgICAgICAgICAgICBpbm5lck5vZGUg
PSBfaW5uZXJOb2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGludCBidXR0b247Ci0gICAg
ICAgIE1vdXNlRXZlbnRUeXBlIHR5cGU7Ci0gICAgICAgIERPTVN0cmluZyB1cmw7IC8vIHVybCB1
bmRlciBtb3VzZSBvciBlbXB0eQotICAgICAgICBET01TdHJpbmcgdGFyZ2V0OwotICAgICAgICBS
ZWZQdHI8Tm9kZUltcGw+IGlubmVyTm9kZTsKLSAgICB9OwotCi0gICAgLy8gZm9yIExJTksgYW5k
IFNUWUxFCi0gICAgdmlydHVhbCB2b2lkIHNoZWV0TG9hZGVkKCkge30KLQotICAgIGJvb2wgaGFz
SUQoKSBjb25zdCAgICAgIHsgcmV0dXJuIG1faGFzSWQ7IH0KLSAgICBib29sIGhhc0NsYXNzKCkg
Y29uc3QgICB7IHJldHVybiBtX2hhc0NsYXNzOyB9Ci0gICAgYm9vbCBoYXNTdHlsZSgpIGNvbnN0
ICAgeyByZXR1cm4gbV9oYXNTdHlsZTsgfQotICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgICAgIHsg
cmV0dXJuIG1fYWN0aXZlOyB9Ci0gICAgYm9vbCBpbkFjdGl2ZUNoYWluKCkgY29uc3QgeyByZXR1
cm4gbV9pbkFjdGl2ZUNoYWluOyB9Ci0gICAgYm9vbCBob3ZlcmVkKCkgY29uc3QgeyByZXR1cm4g
bV9ob3ZlcmVkOyB9Ci0gICAgYm9vbCBmb2N1c2VkKCkgY29uc3QgeyByZXR1cm4gbV9mb2N1c2Vk
OyB9Ci0gICAgYm9vbCBhdHRhY2hlZCgpIGNvbnN0ICAgeyByZXR1cm4gbV9hdHRhY2hlZDsgfQot
ICAgIGJvb2wgY2hhbmdlZCgpIGNvbnN0ICAgIHsgcmV0dXJuIG1fY2hhbmdlZDsgfQotICAgIGJv
b2wgaGFzQ2hhbmdlZENoaWxkKCkgY29uc3QgeyByZXR1cm4gbV9oYXNDaGFuZ2VkQ2hpbGQ7IH0K
LSAgICBib29sIGlzTGluaygpIGNvbnN0IHsgcmV0dXJuIG1faXNMaW5rOyB9Ci0gICAgLy8gaW5E
b2N1bWVudCBzaG91bGQgYWxzbyBtYWtlIHN1cmUgYSBkb2N1bWVudCBleGlzdHMgaW4gY2FzZSB0
aGUgZG9jdW1lbnQgaGFzIGJlZW4gZGVzdHJveWVkIGJlZm9yZSB0aGUgbm9kZSBpcyByZW1vdmVk
IGZyb20gdGhlIGRvY3VtZW50LgotICAgIGJvb2wgaW5Eb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJu
IGRvY3VtZW50LmdldCgpICYmIG1faW5Eb2N1bWVudDsgfQotICAgIGJvb2wgc3R5bGVFbGVtZW50
KCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZUVsZW1lbnQ7IH0KLSAgICBib29sIGltcGxpY2l0Tm9k
ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbGljaXQ7IH0KLSAgICB2b2lkIHNldEhhc0lEKGJvb2wg
Yj10cnVlKSB7IG1faGFzSWQgPSBiOyB9Ci0gICAgdm9pZCBzZXRIYXNDbGFzcyhib29sIGI9dHJ1
ZSkgeyBtX2hhc0NsYXNzID0gYjsgfQotICAgIHZvaWQgc2V0SGFzU3R5bGUoYm9vbCBiPXRydWUp
IHsgbV9oYXNTdHlsZSA9IGI7IH0KLSAgICB2b2lkIHNldEhhc0NoYW5nZWRDaGlsZCggYm9vbCBi
ID0gdHJ1ZSApIHsgbV9oYXNDaGFuZ2VkQ2hpbGQgPSBiOyB9Ci0gICAgdm9pZCBzZXRJbkRvY3Vt
ZW50KGJvb2wgYj10cnVlKSB7IG1faW5Eb2N1bWVudCA9IGI7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0Rm9jdXMoYm9vbCBiPXRydWUpIHsgbV9mb2N1c2VkID0gYjsgfQotICAgIHZpcnR1YWwgdm9p
ZCBzZXRBY3RpdmUoYm9vbCBiPXRydWUsIGJvb2wgcGF1c2U9ZmFsc2UpIHsgbV9hY3RpdmUgPSBi
OyB9Ci0gICAgdm9pZCBzZXRJbkFjdGl2ZUNoYWluKGJvb2wgYj10cnVlKSB7IG1faW5BY3RpdmVD
aGFpbiA9IGI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0SG92ZXJlZChib29sIGI9dHJ1ZSkgeyBt
X2hvdmVyZWQgPSBiOyB9Ci0gICAgdm9pZCBzZXRDaGFuZ2VkKGJvb2wgYj10cnVlKTsKLQotICAg
IHVuc2lnbmVkIHNob3J0IHRhYkluZGV4KCkgY29uc3QgeyByZXR1cm4gbV90YWJJbmRleDsgfQot
ICAgIHZvaWQgc2V0VGFiSW5kZXgodW5zaWduZWQgc2hvcnQgX3RhYkluZGV4KSB7IG1fdGFiSW5k
ZXggPSBfdGFiSW5kZXg7IH0KLQotICAgIC8qKgotICAgICAgICAqIHdoZXRoZXIgdGhpcyBub2Rl
IGNhbiByZWNlaXZlIHRoZSBrZXlib2FyZCBmb2N1cy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJv
b2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3Vz
YWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBib29sIGlzQ29udHJvbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9IC8v
IEV2ZW50dWFsbHkgdGhlIG5vdGlvbiBvZiB3aGF0IGlzIGEgY29udHJvbCB3aWxsIGJlIGV4dGVu
c2libGUuCi0gICAgdmlydHVhbCBib29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgaXNJbmRldGVybWluYXRlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7
IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgSW50UmVjdCBnZXRSZWN0KCkgY29uc3Q7Ci0KLSAgICBlbnVtIFN0eWxlQ2hhbmdlIHsg
Tm9DaGFuZ2UsIE5vSW5oZXJpdCwgSW5oZXJpdCwgRGV0YWNoLCBGb3JjZSB9OwotICAgIHZpcnR1
YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgPSBOb0NoYW5nZSApIHt9Ci0gICAgU3R5
bGVDaGFuZ2UgZGlmZigga2h0bWw6OlJlbmRlclN0eWxlICpzMSwga2h0bWw6OlJlbmRlclN0eWxl
ICpzMiApIGNvbnN0OwotCi0gICAgdW5zaWduZWQgbm9kZUluZGV4KCkgY29uc3Q7Ci0gICAgLy8g
UmV0dXJucyB0aGUgZG9jdW1lbnQgdGhhdCB0aGlzIG5vZGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBU
aGlzIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIGJlIG5vbi1udWxsLCBhcyBvcHBvc2VkIHRvCi0g
ICAgLy8gRE9NJ3Mgb3duZXJEb2N1bWVudCgpIHdoaWNoIGlzIG51bGwgZm9yIERvY3VtZW50IG5v
ZGVzIChhbmQgc29tZXRpbWVzIERvY3VtZW50VHlwZSBub2RlcykuCi0gICAgRG9jdW1lbnRJbXBs
KiBnZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGRvY3VtZW50LmdldCgpOyB9Ci0KLSAgICB2
b2lkIHNldERvY3VtZW50KERvY3VtZW50SW1wbCAqZG9jKTsKLQotICAgIHZvaWQgYWRkRXZlbnRM
aXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlz
dGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKGNv
bnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9v
bCB1c2VDYXB0dXJlKTsKLSAgICB2b2lkIHJlbW92ZUhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLSAgICB2b2lkIHNldEhUTUxFdmVudExpc3RlbmVyKGNv
bnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lcik7Ci0g
ICAgRXZlbnRMaXN0ZW5lciAqZ2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5n
ICZldmVudFR5cGUpOwotICAgIHZvaWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLQotICAg
IGJvb2wgZGlzcGF0Y2hFdmVudChFdmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlLCBi
b29sIHRlbXBFdmVudCA9IGZhbHNlKTsKLSAgICBib29sIGRpc3BhdGNoR2VuZXJpY0V2ZW50KCBF
dmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGRpc3BhdGNoSFRN
TEV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1YmJsZUFyZywg
Ym9vbCBjYW5jZWxhYmxlQXJnKTsKLSAgICBib29sIGRpc3BhdGNoV2luZG93RXZlbnQoY29uc3Qg
QXRvbWljU3RyaW5nICZldmVudFR5cGUsIGJvb2wgY2FuQnViYmxlQXJnLCBib29sIGNhbmNlbGFi
bGVBcmcpOwotICAgIGJvb2wgZGlzcGF0Y2hNb3VzZUV2ZW50KFFNb3VzZUV2ZW50ICplLCBjb25z
dCBBdG9taWNTdHJpbmcgJm92ZXJyaWRlVHlwZSwgaW50IG92ZXJyaWRlRGV0YWlsID0gMCk7Ci0g
ICAgYm9vbCBkaXNwYXRjaFNpbXVsYXRlZE1vdXNlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZl
dmVudFR5cGUpOwotICAgIGJvb2wgZGlzcGF0Y2hNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmlu
ZyAmZXZlbnRUeXBlLCBpbnQgYnV0dG9uLCBpbnQgZGV0YWlsLAotICAgICAgICBpbnQgY2xpZW50
WCwgaW50IGNsaWVudFksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwKLSAgICAgICAgYm9vbCBj
dHJsS2V5LCBib29sIGFsdEtleSwgYm9vbCBzaGlmdEtleSwgYm9vbCBtZXRhS2V5KTsKLSAgICBi
b29sIGRpc3BhdGNoVUlFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgaW50IGRl
dGFpbCA9IDApOwotICAgIGJvb2wgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudChib29sIGNo
aWxkcmVuQ2hhbmdlZCA9IHRydWUpOwotICAgIGJvb2wgZGlzcGF0Y2hLZXlFdmVudChRS2V5RXZl
bnQgKmtleSk7Ci0gICAgdm9pZCBkaXNwYXRjaFdoZWVsRXZlbnQoUVdoZWVsRXZlbnQgKik7Ci0K
LSAgICB2b2lkIGhhbmRsZUxvY2FsRXZlbnRzKEV2ZW50SW1wbCAqZXZ0LCBib29sIHVzZUNhcHR1
cmUpOwotCi0gICAgLy8gSGFuZGxlcnMgdG8gZG8vdW5kbyBhY3Rpb25zIG9uIHRoZSB0YXJnZXQg
bm9kZSBiZWZvcmUgYW4gZXZlbnQgaXMgZGlzcGF0Y2hlZCB0byBpdCBhbmQgYWZ0ZXIgdGhlIGV2
ZW50Ci0gICAgLy8gaGFzIGJlZW4gZGlzcGF0Y2hlZC4gIFRoZSBkYXRhIHBvaW50ZXIgaXMgaGFu
ZGVkIGJhY2sgYnkgdGhlIHByZURpc3BhdGNoIGFuZCBwYXNzZWQgdG8gcG9zdERpc3BhdGNoLgot
ICAgIHZpcnR1YWwgdm9pZCogcHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQp
IHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVy
KEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKSB7fQotCi0gICAgLyoqCi0gICAgICogUGVyZm9y
bSB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGFuIGV2ZW50IGUuZy4gc3VibWl0dGluZyBhIGZvcm0K
LSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwg
KmV2dCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciBkaXNhYmxlZCBmb3JtIGVsZW1lbnRz
OyBpZiB0cnVlLCBwcmV2ZW50cyBtb3VzZSBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkCi0g
ICAgICogdG8gZXZlbnQgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgRE9NQWN0aXZhdGUgZXZlbnRz
IGZyb20gYmVpbmcgc2VudCBhdCBhbGwuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGRpc2Fi
bGVkKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgpOwotICAgIHZpcnR1
YWwgYm9vbCBjaGlsZFR5cGVBbGxvd2VkKCB1bnNpZ25lZCBzaG9ydCAvKnR5cGUqLyApIHsgcmV0
dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBjaGlsZE5vZGVDb3VudCgpIGNvbnN0
OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCk7Ci0KLSAg
ICAvKioKLSAgICAgKiBEb2VzIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZSB0byBm
aW5kIHRoZSBub2RlIG5leHQgbm9kZSBhZnRlciB0aGlzIG9uZS4gVGhpcyB1c2VzIHRoZSBzYW1l
IG9yZGVyIHRoYXQKLSAgICAgKiB0aGUgdGFncyBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgot
ICAgICAqCi0gICAgICogQHBhcmFtIHN0YXlXaXRoaW4gSWYgbm90IG51bGwsIHRoZSB0cmF2ZXJz
YWwgd2lsbCBzdG9wIG9uY2UgdGhlIHNwZWNpZmllZCBub2RlIGlzIHJlYWNoZWQuIFRoaXMgY2Fu
IGJlIHVzZWQgdG8KLSAgICAgKiByZXN0cmljdCB0cmF2ZXJzYWwgdG8gYSBwYXJ0aWN1bGFyIHN1
Yi10cmVlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV4dCBub2RlLCBpbiBkb2N1bWVu
dCBvcmRlcgotICAgICAqCi0gICAgICogc2VlIEByZWYgdHJhdmVyc2VQcmV2aW91c05vZGUoKQot
ICAgICAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZU5leHROb2RlKGNvbnN0IE5vZGVJbXBsICpz
dGF5V2l0aGluID0gMCkgY29uc3Q7Ci0gICAgCi0gICAgLyogTGlrZSB0cmF2ZXJzZU5leHROb2Rl
LCBidXQgc2tpcHMgY2hpbGRyZW4gYW5kIHN0YXJ0cyB3aXRoIHRoZSBuZXh0IHNpYmxpbmcuICov
Ci0gICAgTm9kZUltcGwgKnRyYXZlcnNlTmV4dFNpYmxpbmcoY29uc3QgTm9kZUltcGwgKnN0YXlX
aXRoaW4gPSAwKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIERvZXMgYSByZXZlcnNlIHByZS1v
cmRlciB0cmF2ZXJzYWwgdG8gZmluZCB0aGUgbm9kZSB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgY3Vy
cmVudCBvbmUgaW4gZG9jdW1lbnQgb3JkZXIKLSAgICAgKgotICAgICAqIHNlZSBAcmVmIHRyYXZl
cnNlTmV4dE5vZGUoKQotICAgICAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZVByZXZpb3VzTm9k
ZSgpIGNvbnN0OwotCi0gICAgLyogTGlrZSB0cmF2ZXJzZVByZXZpb3VzTm9kZSwgYnV0IHZpc2l0
cyBub2RlcyBiZWZvcmUgdGhlaXIgY2hpbGRyZW4uICovCi0gICAgTm9kZUltcGwgKnRyYXZlcnNl
UHJldmlvdXNOb2RlUG9zdE9yZGVyKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluID0gMCkgY29u
c3Q7Ci0KLSAgICBOb2RlSW1wbCAqcHJldmlvdXNFZGl0YWJsZSgpIGNvbnN0OwotICAgIE5vZGVJ
bXBsICpuZXh0RWRpdGFibGUoKSBjb25zdDsKLSAgICAvL2Jvb2wgaXNFZGl0YWJsZSgpIGNvbnN0
OwotCi0gICAga2h0bWw6OlJlbmRlck9iamVjdCAqcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBt
X3JlbmRlcjsgfQotICAgIGtodG1sOjpSZW5kZXJPYmplY3QgKm5leHRSZW5kZXJlcigpOwotICAg
IGtodG1sOjpSZW5kZXJPYmplY3QgKnByZXZpb3VzUmVuZGVyZXIoKTsKLSAgICB2b2lkIHNldFJl
bmRlcmVyKGtodG1sOjpSZW5kZXJPYmplY3QqIHJlbmRlcmVyKSB7IG1fcmVuZGVyID0gcmVuZGVy
ZXI7IH0KLSAgICAKLSAgICB2b2lkIGNoZWNrU2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAm
X3ByZWZpeCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGlzQW5jZXN0b3IoY29uc3Qg
Tm9kZUltcGwgKikgY29uc3Q7Ci0KLSAgICAvLyBUaGVzZSB0d28gbWV0aG9kcyBhcmUgbXV0dWFs
bHkgZXhjbHVzaXZlLiAgVGhlIGZvcm1lciBpcyB1c2VkIHRvIGRvIHN0cmljdCBlcnJvci1jaGVj
a2luZwotICAgIC8vIHdoZW4gYWRkaW5nIGNoaWxkcmVuIHZpYSB0aGUgcHVibGljIERPTSBBUEkg
KGUuZy4sIGFwcGVuZENoaWxkKCkpLiAgVGhlIGxhdHRlciBpcyBjYWxsZWQgb25seSB3aGVuIHBh
cnNpbmcsIAotICAgIC8vIHRvIHNhbml0eS1jaGVjayBhZ2FpbnN0IHRoZSBEVEQgZm9yIGVycm9y
IHJlY292ZXJ5LgotICAgIHZvaWQgY2hlY2tBZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQsIGlu
dCAmZXhjZXB0aW9uY29kZSk7ICAgICAvLyBFcnJvci1jaGVja2luZyB3aGVuIGFkZGluZyB2aWEg
dGhlIERPTSBBUEkKLSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRBbGxvd2VkKE5vZGVJbXBsICpuZXdD
aGlsZCk7ICAgICAgICAgICAgICAgICAgLy8gRXJyb3ItY2hlY2tpbmcgZHVyaW5nIHBhcnNpbmcg
dGhhdCBjaGVja3MgdGhlIERURAotCi0gICAgdmlydHVhbCBpbnQgbWF4T2Zmc2V0KCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBpbnQgY2FyZXRNaW5PZmZzZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGlu
dCBjYXJldE1heE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdW5zaWduZWQgY2FyZXRNYXhS
ZW5kZXJlZE9mZnNldCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBpbnQgcHJldmlvdXNPZmZzZXQg
KGludCBjdXJyZW50KSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBuZXh0T2Zmc2V0IChpbnQgY3Vy
cmVudCkgY29uc3Q7Ci0gICAgCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1w
KFFUZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0K
LSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEludGVncmF0aW9uIHdpdGggcmVu
ZGVyaW5nIHRyZWUKLQotICAgIC8qKgotICAgICAqIEF0dGFjaGVzIHRoaXMgbm9kZSB0byB0aGUg
cmVuZGVyaW5nIHRyZWUuIFRoaXMgY2FsY3VsYXRlcyB0aGUgc3R5bGUgdG8gYmUgYXBwbGllZCB0
byB0aGUgbm9kZSBhbmQgY3JlYXRlcyBhbgotICAgICAqIGFwcHJvcHJpYXRlIFJlbmRlck9iamVj
dCB3aGljaCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIHRyZWUgKGV4Y2VwdCB3aGVuIHRoZSBz
dHlsZSBoYXMgZGlzcGxheTogbm9uZSkuIFRoaXMKLSAgICAgKiBtYWtlcyB0aGUgbm9kZSB2aXNp
YmxlIGluIHRoZSBLSFRNTFZpZXcuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgp
OwotCi0gICAgLyoqCi0gICAgICogRGV0YWNoZXMgdGhlIG5vZGUgZnJvbSB0aGUgcmVuZGVyaW5n
IHRyZWUsIG1ha2luZyBpdCBpbnZpc2libGUgaW4gdGhlIHJlbmRlcmVkIHZpZXcuIFRoaXMgbWV0
aG9kIHdpbGwgcmVtb3ZlCi0gICAgICogdGhlIG5vZGUncyByZW5kZXJpbmcgb2JqZWN0IGZyb20g
dGhlIHJlbmRlcmluZyB0cmVlIGFuZCBkZWxldGUgaXQuCi0gICAgICovCi0gICAgdmlydHVhbCB2
b2lkIGRldGFjaCgpOwotCi0gICAgdmlydHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2b2lk
IGNyZWF0ZVJlbmRlcmVySWZOZWVkZWQoKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJTdHls
ZSAqc3R5bGVGb3JSZW5kZXJlcihraHRtbDo6UmVuZGVyT2JqZWN0ICpwYXJlbnQpOwotICAgIHZp
cnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSNpZiBT
VkdfU1VQUE9SVAotICAgIHZpcnR1YWwgYm9vbCBjaGlsZFNob3VsZENyZWF0ZVJlbmRlcmVyKERP
TTo6Tm9kZUltcGwgKikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotI2VuZGlmCi0gICAgdmlydHVh
bCBraHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRt
bDo6UmVuZGVyU3R5bGUgKik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8v
IE1ldGhvZHMgZm9yIG1haW50YWluaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZWxlbWVudCBiZXR3ZWVu
IGhpc3RvcnkgbmF2aWdhdGlvbgotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIg
b3Igbm90IHRoaXMgdHlwZSBvZiBub2RlIG1haW50YWlucyBpdCdzIHN0YXRlLiBJZiBzbywgdGhl
IHN0YXRlIG9mIHRoZSBub2RlIHdpbGwgYmUgc3RvcmVkIHdoZW4KLSAgICAgKiB0aGUgdXNlciBn
b2VzIHRvIGEgZGlmZmVyZW50IHBhZ2UgdXNpbmcgdGhlIHN0YXRlKCkgbWV0aG9kLCBhbmQgcmVz
dG9yZWQgdXNpbmcgdGhlIHJlc3RvcmVTdGF0ZSgpIG1ldGhvZCBpZiB0aGUKLSAgICAgKiB1c2Vy
IHJldHVybnMgKGUuZy4gdXNpbmcgdGhlIGJhY2sgYnV0dG9uKS4gVGhpcyBpcyB1c2VkIHRvIGVu
c3VyZSB0aGF0IHVzZXItY2hhbmdlYWJsZSBlbGVtZW50cyBzdWNoIGFzIGZvcm0KLSAgICAgKiBj
b250cm9scyBtYWludGFpbiB0aGVpciBjb250ZW50cyB3aGVuIHRoZSB1c2VyIHJldHVybnMgdG8g
YSBwcmV2aW91cyBwYWdlIGluIHRoZSBoaXN0b3J5LgotICAgICAqLwotICAgIHZpcnR1YWwgYm9v
bCBtYWludGFpbnNTdGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhdGUg
b2YgdGhpcyBub2RlIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLiBUaGlzIHN0cmluZyB3aWxsIGJl
IHBhc3NlZCB0byByZXN0b3JlU3RhdGUoKSBpZiB0aGUgdXNlcgotICAgICAqIHJldHVybnMgdG8g
dGhlIHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0YXRlIGluZm9ybWF0aW9uIGFib3V0
IHRoZSBub2RlIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nCi0gICAgICovCi0gICAgdmlydHVhbCBR
U3RyaW5nIHN0YXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUg
ZWxlbWVudCBiYXNlZCBvbiBzdHJpbmdzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgc3RhdGUoKS4g
VGhpcyBpcyB1c2VkIHRvIGluaXRpYWxpemUgZm9ybQotICAgICAqIGNvbnRyb2xzIHdpdGggdGhl
aXIgb2xkIHZhbHVlcyB3aGVuIHRoZSB1c2VyIHJldHVybnMgdG8gdGhlIHBhZ2UgaW4gdGhlaXIg
aGlzdG9yeS4gIFRoZSByZWNlaXZlcgotICAgICAqIHNob3VsZCByZW1vdmUgdGhlIHN0cmluZyBm
cm9tIHRoZSBsaXN0IHRoYXQgaXQgdXNlcyBmb3IgaXRzIHJlc3RvcmUuCi0gICAgICoKLSAgICAg
KiBAcGFyYW0gc3RhdGVzIFRoZSBzdHJpbmdzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgbm9kZXMn
IHN0YXRlIG1ldGhvZHMuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShR
U3RyaW5nTGlzdCAmc3RhdGVMaXN0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0g
ICAgLy8gTm90aWZpY2F0aW9uIG9mIGRvY3VtZW50IHN0dWN0dXJlIGNoYW5nZXMKLQotICAgIC8q
KgotICAgICAqIE5vdGlmaWVzIHRoZSBub2RlIHRoYXQgaXQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50
byB0aGUgZG9jdW1lbnQuIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBkb2N1bWVudCBwYXJzaW5nLCBh
bmQgYWxzbwotICAgICAqIHdoZW4gYSBub2RlIGlzIGFkZGVkIHRocm91Z2ggdGhlIERPTSBtZXRo
b2RzIGluc2VydEJlZm9yZSgpLCBhcHBlbmRDaGlsZCgpIG9yIHJlcGxhY2VDaGlsZCgpLiBOb3Rl
IHRoYXQgdGhpcyBvbmx5Ci0gICAgICogaGFwcGVucyB3aGVuIHRoZSBub2RlIGJlY29tZXMgcGFy
dCBvZiB0aGUgZG9jdW1lbnQgdHJlZSwgaS5lLiBvbmx5IHdoZW4gdGhlIGRvY3VtZW50IGlzIGFj
dHVhbGx5IGFuIGFuY2VzdG9yIG9mCi0gICAgICogdGhlIG5vZGUuIFRoZSBjYWxsIGhhcHBlbnMg
X2FmdGVyXyB0aGUgbm9kZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdHJlZS4KLSAgICAgKgotICAg
ICAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50IERP
TSBldmVudCwgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG92ZXJoZWFkIG9mIGV2ZW50Ci0gICAg
ICogZGlzcGF0Y2hpbmcuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0Rv
Y3VtZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0IGl0IGlz
IG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0cmVlLCBpLmUuIHdoZW4gdGhlIGRvY3Vt
ZW50IGlzIG5vIGxvbmdlciBhbiBhbmNlc3RvcgotICAgICAqIG5vZGUuCi0gICAgICoKLSAgICAg
KiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50IERPTSBl
dmVudCwgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG92ZXJoZWFkIG9mIGV2ZW50Ci0gICAgICog
ZGlzcGF0Y2hpbmcsIGFuZCBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgbm9kZSBpcyByZW1vdmVkIGZy
b20gdGhlIHRyZWUuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1l
bnQoKTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW5ldmVyIHlvdSBh
cmUgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBmcm9tIGEgdHJlZS4gIFRoYXQgdHJlZSBtYXkg
YmUgdGhlIG1haW4KLSAgICAvLyBkb2N1bWVudCB0cmVlLCBvciBpdCBjb3VsZCBiZSBhbm90aGVy
IGRpc2Nvbm5lY3RlZCB0cmVlLiAgT3ZlcnJpZGUgdGhlc2UgZnVuY3Rpb25zIHRvIGRvIGFueSB3
b3JrIHRoYXQgZGVwZW5kcwotICAgIC8vIG9uIGNvbm5lY3RlZG5lc3MgdG8gc29tZSBhbmNlc3Rv
ciAoZS5nLiwgYW4gYW5jZXN0b3IgPGZvcm0+IGZvciBleGFtcGxlKS4KLSAgICB2aXJ0dWFsIHZv
aWQgaW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApIHt9OwotICAgIHZpcnR1YWwgdm9pZCByZW1v
dmVkRnJvbVRyZWUoYm9vbCBkZWVwKSB7fTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRo
ZSBub2RlIHRoYXQgaXQncyBsaXN0IG9mIGNoaWxkcmVuIGhhdmUgY2hhbmdlZCAoZWl0aGVyIGJ5
IGFkZGluZyBvciByZW1vdmluZyBjaGlsZCBub2RlcyksIG9yIGEgY2hpbGQKLSAgICAgKiBub2Rl
IHRoYXQgaXMgb2YgdGhlIHR5cGUgQ0RBVEFfU0VDVElPTl9OT0RFLCBURVhUX05PREUgb3IgQ09N
TUVOVF9OT0RFIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZv
aWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0b1N0cmluZygp
IGNvbnN0ID0gMDsKLSAgICAKLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGZvcm1h
dEZvckRlYnVnZ2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKLQotICAg
IHZvaWQgc2hvd05vZGUoY29uc3QgY2hhciAqcHJlZml4PSIiKSBjb25zdDsKLSAgICB2b2lkIHNo
b3dUcmVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzaG93VHJlZUFuZE1hcmsoTm9kZUltcGwgKiBtYXJr
ZWROb2RlMSwgY29uc3QgY2hhciAqIG1hcmtlZExhYmVsMSwgTm9kZUltcGwgKiBtYXJrZWROb2Rl
MiwgY29uc3QgY2hhciAqIG1hcmtlZExhYmVsMikgY29uc3Q7Ci0jZW5kaWYKLQotICAgIHZvaWQg
cmVnaXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3QpOwotICAgIHZvaWQgdW5yZWdpc3Rl
ck5vZGVMaXN0KE5vZGVMaXN0SW1wbCAqbGlzdCk7Ci0gICAgdm9pZCBub3RpZnlOb2RlTGlzdHND
aGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2b2lkIG5vdGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRyZW5D
aGFuZ2VkKCk7Ci0gICAgdm9pZCBub3RpZnlOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0g
ICAgdm9pZCBub3RpZnlMb2NhbE5vZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQoKTsKLSAgICAKLSAg
ICBSZWZQdHI8Tm9kZUxpc3RJbXBsPiBnZXRFbGVtZW50c0J5VGFnTmFtZShjb25zdCBET01TdHJp
bmcgJm5hbWUpIHsgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBuYW1lKTsgfQot
ICAgIFJlZlB0cjxOb2RlTGlzdEltcGw+IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoY29uc3QgRE9N
U3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmbG9jYWxOYW1lKTsKLQotcHJp
dmF0ZTogLy8gbWVtYmVycwotICAgIERvY1B0cjxEb2N1bWVudEltcGw+IGRvY3VtZW50OwotICAg
IE5vZGVJbXBsICptX3ByZXZpb3VzOwotICAgIE5vZGVJbXBsICptX25leHQ7Ci1wcm90ZWN0ZWQ6
Ci0gICAga2h0bWw6OlJlbmRlck9iamVjdCAqbV9yZW5kZXI7Ci0gICAgUVB0ckxpc3Q8UmVnaXN0
ZXJlZEV2ZW50TGlzdGVuZXI+ICptX3JlZ2RMaXN0ZW5lcnM7Ci0gICAgUVB0ckRpY3Q8Tm9kZUxp
c3RJbXBsPiAqbV9ub2RlTGlzdHM7Ci0KLSAgICB1bnNpZ25lZCBzaG9ydCBtX3RhYkluZGV4IDog
MTU7Ci0gICAgYm9vbCBtX2hhc1RhYkluZGV4ICA6IDE7Ci0KLSAgICBib29sIG1faGFzSWQgOiAx
OwotICAgIGJvb2wgbV9oYXNDbGFzcyA6IDE7Ci0gICAgYm9vbCBtX2hhc1N0eWxlIDogMTsKLSAg
ICBib29sIG1fYXR0YWNoZWQgOiAxOwotICAgIGJvb2wgbV9jaGFuZ2VkIDogMTsKLSAgICBib29s
IG1faGFzQ2hhbmdlZENoaWxkIDogMTsKLSAgICBib29sIG1faW5Eb2N1bWVudCA6IDE7Ci0KLSAg
ICBib29sIG1faXNMaW5rIDogMTsKLSAgICBib29sIG1fc3BlY2lmaWVkIDogMTsgLy8gdXNlZCBp
biBBdHRySW1wbC4gQWNjZXNzb3IgZnVuY3Rpb25zIHRoZXJlCi0gICAgYm9vbCBtX2ZvY3VzZWQg
OiAxOwotICAgIGJvb2wgbV9hY3RpdmUgOiAxOwotICAgIGJvb2wgbV9ob3ZlcmVkIDogMTsKLSAg
ICBib29sIG1faW5BY3RpdmVDaGFpbiA6IDE7Ci0gICAgYm9vbCBtX3N0eWxlRWxlbWVudCA6IDE7
IC8vIGNvbnRhaW5zIHN0eWxlc2hlZXQgdGV4dAotICAgIGJvb2wgbV9pbXBsaWNpdCA6IDE7IC8v
IGltcGxpY2l0ZWx5IGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyCi0KLSAgICBib29sIG1faW5EZXRh
Y2ggOiAxOwotfTsKLQotY2xhc3MgQ29udGFpbmVyTm9kZUltcGwgOiBwdWJsaWMgTm9kZUltcGwK
LXsKLXB1YmxpYzoKLSAgICBDb250YWluZXJOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0g
ICAgdmlydHVhbCB+Q29udGFpbmVyTm9kZUltcGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92
ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpmaXJz
dENoaWxkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqbGFzdENoaWxkKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxk
LCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9s
ZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1v
dmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAg
dmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZE5vZGVzICggICkgY29u
c3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdm9pZCB3
aWxsUmVtb3ZlKCk7Ci0gICAgaW50IHdpbGxSZW1vdmVDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwot
ICAgIHZvaWQgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsKLSAgICB2b2lkIHJlbW92ZUNoaWxkcmVuKCk7
Ci0gICAgdm9pZCBjbG9uZUNoaWxkTm9kZXMoTm9kZUltcGwgKmNsb25lKTsKLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRGaXJzdENoaWxkKE5vZGVJbXBsICpjaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lk
IHNldExhc3RDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFk
ZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwot
ICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgIHZpcnR1YWwgSW50UmVjdCBnZXRSZWN0
KCkgY29uc3Q7Ci0gICAgYm9vbCBnZXRVcHBlckxlZnRDb3JuZXIoaW50ICZ4UG9zLCBpbnQgJnlQ
b3MpIGNvbnN0OwotICAgIGJvb2wgZ2V0TG93ZXJSaWdodENvcm5lcihpbnQgJnhQb3MsIGludCAm
eVBvcykgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoYm9vbD10cnVlKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlKGJvb2wgYWN0aXZlID0gdHJ1ZSwgYm9vbCBwYXVzZSA9
IGZhbHNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SG92ZXJlZChib29sPXRydWUpOwotICAgIHZp
cnR1YWwgdW5zaWduZWQgY2hpbGROb2RlQ291bnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJ
bXBsICpjaGlsZE5vZGUodW5zaWduZWQgaW5kZXgpOwotCi0gICAgdmlydHVhbCB2b2lkIGluc2Vy
dGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQo
KTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApOwotICAgIHZp
cnR1YWwgdm9pZCByZW1vdmVkRnJvbVRyZWUoYm9vbCBkZWVwKTsKLQotLy9wcm90ZWN0ZWQ6Ci0g
ICAgTm9kZUltcGwgKl9maXJzdDsKLSAgICBOb2RlSW1wbCAqX2xhc3Q7Ci0KLSAgICAvLyBoZWxw
ZXIgZnVuY3Rpb25zIGZvciBpbnNlcnRpbmcgY2hpbGRyZW46Ci0KLSAgICAvLyAjIyMgdGhpcyBz
aG91bGQgdmFuaXNoLiBkbyBpdCBpbiBkb20vICEKLSAgICAvLyBjaGVjayBmb3Igc2FtZSBzb3Vy
Y2UgZG9jdW1lbnQ6Ci0gICAgYm9vbCBjaGVja1NhbWVEb2N1bWVudCggTm9kZUltcGwgKm5ld2No
aWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICAvLyBjaGVjayBmb3IgYmVpbmcgY2hpbGQ6
Ci0gICAgYm9vbCBjaGVja0lzQ2hpbGQoIE5vZGVJbXBsICpvbGRjaGlsZCwgaW50ICZleGNlcHRp
b25jb2RlICk7Ci0gICAgLy8gIyMjCi0KLSAgICAvLyBmaW5kIG91dCBpZiBhIG5vZGUgaXMgYWxs
b3dlZCB0byBiZSBvdXIgY2hpbGQKLSAgICB2b2lkIGRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50
cyggTm9kZUltcGwgKmNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2b2lkIGRpc3Bh
dGNoQ2hpbGRSZW1vdmFsRXZlbnRzKCBOb2RlSW1wbCAqY2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIE5vZGU7Ci1jbGFzcyBOb2Rl
SW1wbDsKLQotY2xhc3MgTm9kZUxpc3RJbXBsIDogcHVibGljIGtodG1sOjpTaGFyZWQ8Tm9kZUxp
c3RJbXBsPgotewotcHVibGljOgotICAgIE5vZGVMaXN0SW1wbCggTm9kZUltcGwgKl9yb290Tm9k
ZSApOwotICAgIHZpcnR1YWwgfk5vZGVMaXN0SW1wbCgpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMg
JiBhdHRyaWJ1dGVzIGZvciBOb2RlTGlzdAotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCkg
Y29uc3QgPSAwOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25lZCBpbmRleCAp
IGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppdGVtQnlJZCAoIGNvbnN0IERPTVN0
cmluZyAmIGVsZW1lbnRJZCApIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBh
cnQgb2YgRE9NKQotCi0gICAgdmlydHVhbCB2b2lkIHJvb3ROb2RlQ2hpbGRyZW5DaGFuZ2VkKCk7
Ci0gICAgdmlydHVhbCB2b2lkIHJvb3ROb2RlQXR0cmlidXRlQ2hhbmdlZCgpIHt9Ci0KLXByb3Rl
Y3RlZDoKLSAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBzZWFyY2hpbmcgYWxsIEVsZW1lbnRJ
bXBscyBpbiBhIHRyZWUKLSAgICB1bnNpZ25lZCByZWN1cnNpdmVMZW5ndGgoTm9kZUltcGwgKnN0
YXJ0ID0gMCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKnJlY3Vyc2l2ZUl0ZW0gKCB1bnNpZ25lZCBv
ZmZzZXQsIE5vZGVJbXBsICpzdGFydCA9IDAgKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgbm9k
ZU1hdGNoZXMoIE5vZGVJbXBsICp0ZXN0Tm9kZSApIGNvbnN0ID0gMDsKLQotICAgIE5vZGVJbXBs
ICpyb290Tm9kZTsKLSAgICBtdXRhYmxlIGludCBjYWNoZWRMZW5ndGg7Ci0gICAgbXV0YWJsZSBO
b2RlSW1wbCAqbGFzdEl0ZW07Ci0gICAgbXV0YWJsZSB1bnNpZ25lZCBsYXN0SXRlbU9mZnNldDsK
LSAgICBtdXRhYmxlIGJvb2wgaXNMZW5ndGhDYWNoZVZhbGlkIDogMTsKLSAgICBtdXRhYmxlIGJv
b2wgaXNJdGVtQ2FjaGVWYWxpZCA6IDE7Ci19OwotCi1jbGFzcyBDaGlsZE5vZGVMaXN0SW1wbCA6
IHB1YmxpYyBOb2RlTGlzdEltcGwKLXsKLXB1YmxpYzoKLSAgICBDaGlsZE5vZGVMaXN0SW1wbCgg
Tm9kZUltcGwgKm4pOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJl
bnQgY2xhc3NlcwotCi0gICAgdmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdDsKLQotcHJvdGVj
dGVkOgotICAgIHZpcnR1YWwgYm9vbCBub2RlTWF0Y2hlcyggTm9kZUltcGwgKnRlc3ROb2RlICkg
Y29uc3Q7Ci19OwotCi0vKioKLSAqIE5vZGVMaXN0IHdoaWNoIGxpc3RzIGFsbCBOb2RlcyBpbiBh
IEVsZW1lbnQgd2l0aCBhIGdpdmVuICJuYW1lPSIgdGFnCi0gKi8KLWNsYXNzIE5hbWVOb2RlTGlz
dEltcGwgOiBwdWJsaWMgTm9kZUxpc3RJbXBsCi17Ci1wdWJsaWM6Ci0gICAgTmFtZU5vZGVMaXN0
SW1wbCggTm9kZUltcGwgKmRvYywgY29uc3QgRE9NU3RyaW5nICZ0ICk7Ci0KLSAgICAvLyBET00g
bWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0KLSAgICB2aXJ0dWFsIHVu
c2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNp
Z25lZCBpbmRleCApIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2Yg
RE9NKQotICAgIHZpcnR1YWwgdm9pZCByb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpIHt9OwotICAg
IHZpcnR1YWwgdm9pZCByb290Tm9kZUF0dHJpYnV0ZUNoYW5nZWQoKSB7IE5vZGVMaXN0SW1wbDo6
cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBi
b29sIG5vZGVNYXRjaGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUgKSBjb25zdDsKLQotICAgIERPTVN0
cmluZyBub2RlTmFtZTsKLX07Ci0KLQotLy8gR2VuZXJpYyBOYW1lZE5vZGVNYXAgaW50ZXJmYWNl
Ci0vLyBPdGhlciBjbGFzc2VzIGltcGxlbWVudCB0aGlzIGZvciBtb3JlIHNwZWNpZmljIHNpdHVh
dGlvbnMgZS5nLiBhdHRyaWJ1dGVzCi0vLyBvZiBhbiBlbGVtZW50Ci1jbGFzcyBOYW1lZE5vZGVN
YXBJbXBsIDogcHVibGljIGtodG1sOjpTaGFyZWQ8TmFtZWROb2RlTWFwSW1wbD4KLXsKLXB1Ymxp
YzoKLSAgICBOYW1lZE5vZGVNYXBJbXBsKCkge30KLSAgICB2aXJ0dWFsIH5OYW1lZE5vZGVNYXBJ
bXBsKCkge30KLQotICAgIE5vZGVJbXBsICpnZXROYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZu
YW1lKSBjb25zdCB7IHJldHVybiBnZXROYW1lZEl0ZW1OUyhET01TdHJpbmcoKSwgbmFtZSk7IH0K
LSAgICBSZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5h
bWUsIGludCAmZXhjZXB0aW9uKSB7IHJldHVybiByZW1vdmVOYW1lZEl0ZW1OUyhET01TdHJpbmco
KSwgbmFtZSwgZXhjZXB0aW9uKTsgfQotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqZ2V0TmFtZWRJ
dGVtTlMoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmbG9j
YWxOYW1lKSBjb25zdCA9IDA7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBzZXROYW1lZEl0ZW1OUyhO
b2RlSW1wbCAqYXJnLCBpbnQgJmV4Y2VwdGlvbikgeyByZXR1cm4gc2V0TmFtZWRJdGVtKGFyZywg
ZXhjZXB0aW9uKTsgfQotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJbXBsPiByZW1vdmVOYW1lZEl0
ZW1OUyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2Nh
bE5hbWUsIGludCAmZXhjZXB0aW9uKSA9IDA7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJp
YnV0ZXMgZm9yIE5hbWVkTm9kZU1hcAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmdldE5hbWVkSXRl
bShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwg
UmVmUHRyPE5vZGVJbXBsPiByZW1vdmVOYW1lZEl0ZW0gKGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0
dHJOYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpID0gMDsKLSAgICB2aXJ0dWFsIFJlZlB0cjxOb2Rl
SW1wbD4gc2V0TmFtZWRJdGVtIChOb2RlSW1wbCogYXJnLCBpbnQgJmV4Y2VwdGlvbmNvZGUpID0g
MDsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0
ID0gMDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCggICkgY29uc3QgPSAwOwotCi0gICAg
Ly8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIHZpcnR1YWwgYm9vbCBpc1Jl
YWRPbmx5KCkgeyByZXR1cm4gZmFsc2U7IH0KLX07Ci0KLX07IC8vbmFtZXNwYWNlCi0jZW5kaWYK
SW5kZXg6IGtodG1sL3htbC9Ob2RlSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9Ob2Rl
SW1wbC5oCShyZXZpc2lvbiAxMjA2MykKKysrIGtodG1sL3htbC9Ob2RlSW1wbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0yMiw0NCArMjIsNDIgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNB
LgogICoKICAqLwotI2lmbmRlZiBfRE9NX05vZGVJbXBsX2hfCi0jZGVmaW5lIF9ET01fTm9kZUlt
cGxfaF8KKyNpZm5kZWYgRE9NX05vZGVJbXBsX2hfCisjZGVmaW5lIERPTV9Ob2RlSW1wbF9oXwog
Ci0jaW5jbHVkZSAiZG9tL2RvbV9zdHJpbmcuaCIKLSNpbmNsdWRlICJkb20vZG9tX25vZGUuaCIK
LSNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgogI2luY2x1ZGUgIm1pc2Mvc2hhcmVkLmgiCi0jaW5j
bHVkZSAiZG9tX2F0b21pY3N0cmluZy5oIgorI2luY2x1ZGUgImRvbV9zdHJpbmcuaCIKICNpbmNs
dWRlICJEb2NQdHIuaCIKKyNpbmNsdWRlICJOb2RlTGlzdEltcGwuaCIKIAotY2xhc3MgUVBhaW50
ZXI7Ci10ZW1wbGF0ZSA8Y2xhc3MgdHlwZT4gY2xhc3MgUVB0ckxpc3Q7Ci10ZW1wbGF0ZSA8Y2xh
c3MgdHlwZT4gY2xhc3MgUVB0ckRpY3Q7Ci1jbGFzcyBLSFRNTFZpZXc7CiBjbGFzcyBSZW5kZXJB
cmVuYTsKLWNsYXNzIFFSZWN0OwotY2xhc3MgUU1vdXNlRXZlbnQ7Ci1jbGFzcyBRS2V5RXZlbnQ7
Ci1jbGFzcyBRVGV4dFN0cmVhbTsKLWNsYXNzIFFTdHJpbmdMaXN0OwotY2xhc3MgUVdoZWVsRXZl
bnQ7Ci0KIG5hbWVzcGFjZSBraHRtbCB7CiAgICAgY2xhc3MgUmVuZGVyT2JqZWN0OwogICAgIGNs
YXNzIFJlbmRlclN0eWxlOwotfTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNz
IEludFJlY3Q7Cit9CisKK2NsYXNzIFFUZXh0U3RyZWFtOworY2xhc3MgUU1vdXNlRXZlbnQ7Citj
bGFzcyBRS2V5RXZlbnQ7CitjbGFzcyBRV2hlZWxFdmVudDsKK2NsYXNzIFFTdHJpbmdMaXN0Owor
dGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFFQdHJMaXN0OwordGVtcGxhdGUgPGNsYXNzIFQ+IGNs
YXNzIFFQdHJEaWN0OwogCiBuYW1lc3BhY2UgRE9NIHsKIAotY2xhc3MgQXRvbWljU3RyaW5nOwog
Y2xhc3MgRG9jdW1lbnRJbXBsOworY2xhc3MgUXVhbGlmaWVkTmFtZTsKK2NsYXNzIEF0b21pY1N0
cmluZzsKK2NsYXNzIE5hbWVkQXR0ck1hcEltcGw7CiBjbGFzcyBFbGVtZW50SW1wbDsKLWNsYXNz
IEV2ZW50SW1wbDsKIGNsYXNzIEV2ZW50TGlzdGVuZXI7Ci1jbGFzcyBOb2RlTGlzdEltcGw7Ci1j
bGFzcyBOYW1lZEF0dHJNYXBJbXBsOwotY2xhc3MgUXVhbGlmaWVkTmFtZTsKIGNsYXNzIFJlZ2lz
dGVyZWRFdmVudExpc3RlbmVyOworY2xhc3MgRXZlbnRJbXBsOwogCiAvLyB0aGlzIGNsYXNzIGlt
cGxlbWVudHMgbm9kZXMsIHdoaWNoIGNhbiBoYXZlIGEgcGFyZW50IGJ1dCBubyBjaGlsZHJlbjoK
IGNsYXNzIE5vZGVJbXBsIDogcHVibGljIGtodG1sOjpUcmVlU2hhcmVkPE5vZGVJbXBsPgpAQCAt
MjM4LDcgKzIzNiw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFRhYkluZGV4KHVuc2lnbmVkIHNo
b3J0IF90YWJJbmRleCkgeyBtX3RhYkluZGV4ID0gX3RhYkluZGV4OyB9CiAKICAgICAvKioKLSAg
ICAgICAgKiB3aGV0aGVyIHRoaXMgbm9kZSBjYW4gcmVjZWl2ZSB0aGUga2V5Ym9hcmQgZm9jdXMu
CisgICAgICogV2hldGhlciB0aGlzIG5vZGUgY2FuIHJlY2VpdmUgdGhlIGtleWJvYXJkIGZvY3Vz
LgogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwogICAgIHZp
cnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7CkBAIC0yNDksNyArMjQ3LDcg
QEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc0luZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQogCiAgICAgdmlydHVhbCBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBRUmVjdCBnZXRSZWN0KCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJD
b3JlOjpJbnRSZWN0IGdldFJlY3QoKSBjb25zdDsKIAogICAgIGVudW0gU3R5bGVDaGFuZ2UgeyBO
b0NoYW5nZSwgTm9Jbmhlcml0LCBJbmhlcml0LCBEZXRhY2gsIEZvcmNlIH07CiAgICAgdmlydHVh
bCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSA9IE5vQ2hhbmdlICkge30KQEAgLTM0NCwx
MSArMzQyLDExIEBAIHB1YmxpYzoKICAgICB2b2lkIGNoZWNrU2V0UHJlZml4KGNvbnN0IEF0b21p
Y1N0cmluZyAmX3ByZWZpeCwgaW50ICZleGNlcHRpb25jb2RlKTsKICAgICBib29sIGlzQW5jZXN0
b3IoY29uc3QgTm9kZUltcGwgKikgY29uc3Q7CiAKLQkvLyBUaGVzZSB0d28gbWV0aG9kcyBhcmUg
bXV0dWFsbHkgZXhjbHVzaXZlLiAgVGhlIGZvcm1lciBpcyB1c2VkIHRvIGRvIHN0cmljdCBlcnJv
ci1jaGVja2luZwotCS8vIHdoZW4gYWRkaW5nIGNoaWxkcmVuIHZpYSB0aGUgcHVibGljIERPTSBB
UEkgKGUuZy4sIGFwcGVuZENoaWxkKCkpLiAgVGhlIGxhdHRlciBpcyBjYWxsZWQgb25seSB3aGVu
IHBhcnNpbmcsIAotCS8vIHRvIHNhbml0eS1jaGVjayBhZ2FpbnN0IHRoZSBEVEQgZm9yIGVycm9y
IHJlY292ZXJ5LgotCXZvaWQgY2hlY2tBZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSk7ICAgIC8vIEVycm9yLWNoZWNraW5nIHdoZW4gYWRkaW5nIHZpYSB0aGUg
RE9NIEFQSQotCXZpcnR1YWwgYm9vbCBjaGlsZEFsbG93ZWQoTm9kZUltcGwgKm5ld0NoaWxkKTsJ
CQkJICAgLy8gRXJyb3ItY2hlY2tpbmcgZHVyaW5nIHBhcnNpbmcgdGhhdCBjaGVja3MgdGhlIERU
RAorICAgIC8vIFRoZXNlIHR3byBtZXRob2RzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBUaGUg
Zm9ybWVyIGlzIHVzZWQgdG8gZG8gc3RyaWN0IGVycm9yLWNoZWNraW5nCisgICAgLy8gd2hlbiBh
ZGRpbmcgY2hpbGRyZW4gdmlhIHRoZSBwdWJsaWMgRE9NIEFQSSAoZS5nLiwgYXBwZW5kQ2hpbGQo
KSkuICBUaGUgbGF0dGVyIGlzIGNhbGxlZCBvbmx5IHdoZW4gcGFyc2luZywgCisgICAgLy8gdG8g
c2FuaXR5LWNoZWNrIGFnYWluc3QgdGhlIERURCBmb3IgZXJyb3IgcmVjb3ZlcnkuCisgICAgdm9p
ZCBjaGVja0FkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlKTsg
ICAgLy8gRXJyb3ItY2hlY2tpbmcgd2hlbiBhZGRpbmcgdmlhIHRoZSBET00gQVBJCisgICAgdmly
dHVhbCBib29sIGNoaWxkQWxsb3dlZChOb2RlSW1wbCAqbmV3Q2hpbGQpOyAgICAgICAgICAgICAg
Ly8gRXJyb3ItY2hlY2tpbmcgZHVyaW5nIHBhcnNpbmcgdGhhdCBjaGVja3MgdGhlIERURAogCQog
ICAgIHZpcnR1YWwgaW50IG1heE9mZnNldCgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50IGNhcmV0
TWluT2Zmc2V0KCkgY29uc3Q7CkBAIC00NTgsNyArNDU2LDYgQEAgcHVibGljOgogICAgIHZvaWQg
c2hvd05vZGUoY29uc3QgY2hhciAqcHJlZml4PSIiKSBjb25zdDsKICAgICB2b2lkIHNob3dUcmVl
KCkgY29uc3Q7CiAgICAgdm9pZCBzaG93VHJlZUFuZE1hcmsoTm9kZUltcGwgKiBtYXJrZWROb2Rl
MSwgY29uc3QgY2hhciAqIG1hcmtlZExhYmVsMSwgTm9kZUltcGwgKiBtYXJrZWROb2RlMiwgY29u
c3QgY2hhciAqIG1hcmtlZExhYmVsMikgY29uc3Q7Ci0JCiAjZW5kaWYKIAogICAgIHZvaWQgcmVn
aXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3QpOwpAQCAtNTAzLDE2NiArNTAwLDIxIEBA
IHByb3RlY3RlZDoKICAgICBib29sIG1faW5EZXRhY2ggOiAxOwogfTsKIAotY2xhc3MgQ29udGFp
bmVyTm9kZUltcGwgOiBwdWJsaWMgTm9kZUltcGwKLXsKLXB1YmxpYzoKLSAgICBDb250YWluZXJO
b2RlSW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0gICAgdmlydHVhbCB+Q29udGFpbmVyTm9kZUlt
cGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNz
ZXMKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpmaXJzdENoaWxkKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBOb2RlSW1wbCAqbGFzdENoaWxkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5z
ZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5v
ZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hp
bGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1
YWwgYm9vbCBoYXNDaGlsZE5vZGVzICggICkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2Rz
IChub3QgcGFydCBvZiBET00pCi0gICAgdm9pZCB3aWxsUmVtb3ZlKCk7Ci0gICAgaW50IHdpbGxS
ZW1vdmVDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwotICAgIHZvaWQgcmVtb3ZlQWxsQ2hpbGRyZW4o
KTsKLSAgICB2b2lkIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgdm9pZCBjbG9uZUNoaWxkTm9kZXMo
Tm9kZUltcGwgKmNsb25lKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRGaXJzdENoaWxkKE5vZGVJ
bXBsICpjaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldExhc3RDaGlsZChOb2RlSW1wbCAqY2hp
bGQpOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCk7
Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsK
LQotICAgIHZpcnR1YWwgUVJlY3QgZ2V0UmVjdCgpIGNvbnN0OwotICAgIGJvb2wgZ2V0VXBwZXJM
ZWZ0Q29ybmVyKGludCAmeFBvcywgaW50ICZ5UG9zKSBjb25zdDsKLSAgICBib29sIGdldExvd2Vy
UmlnaHRDb3JuZXIoaW50ICZ4UG9zLCBpbnQgJnlQb3MpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2
b2lkIHNldEZvY3VzKGJvb2w9dHJ1ZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29s
IGFjdGl2ZSA9IHRydWUsIGJvb2wgcGF1c2UgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNl
dEhvdmVyZWQoYm9vbD10cnVlKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGNoaWxkTm9kZUNvdW50
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2hpbGROb2RlKHVuc2lnbmVkIGluZGV4
KTsKLQotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotICAgIHZpcnR1
YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIGluc2VydGVk
SW50b1RyZWUoYm9vbCBkZWVwKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJv
b2wgZGVlcCk7Ci0KLS8vcHJvdGVjdGVkOgotICAgIE5vZGVJbXBsICpfZmlyc3Q7Ci0gICAgTm9k
ZUltcGwgKl9sYXN0OwotCi0gICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgaW5zZXJ0aW5nIGNo
aWxkcmVuOgotCi0gICAgLy8gIyMjIHRoaXMgc2hvdWxkIHZhbmlzaC4gZG8gaXQgaW4gZG9tLyAh
Ci0gICAgLy8gY2hlY2sgZm9yIHNhbWUgc291cmNlIGRvY3VtZW50OgotICAgIGJvb2wgY2hlY2tT
YW1lRG9jdW1lbnQoIE5vZGVJbXBsICpuZXdjaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0g
ICAgLy8gY2hlY2sgZm9yIGJlaW5nIGNoaWxkOgotICAgIGJvb2wgY2hlY2tJc0NoaWxkKCBOb2Rl
SW1wbCAqb2xkY2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIC8vICMjIwotCi0gICAg
Ly8gZmluZCBvdXQgaWYgYSBub2RlIGlzIGFsbG93ZWQgdG8gYmUgb3VyIGNoaWxkCi0gICAgdm9p
ZCBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwgaW50ICZleGNl
cHRpb25jb2RlICk7Ci0gICAgdm9pZCBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2ZW50cyggTm9kZUlt
cGwgKmNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi1jbGFzcyBOb2RlOwotY2xhc3MgTm9kZUltcGw7Ci0KLWNsYXNzIE5vZGVMaXN0SW1wbCA6
IHB1YmxpYyBraHRtbDo6U2hhcmVkPE5vZGVMaXN0SW1wbD4KLXsKLXB1YmxpYzoKLSAgICBOb2Rl
TGlzdEltcGwoIE5vZGVJbXBsICpfcm9vdE5vZGUgKTsKLSAgICB2aXJ0dWFsIH5Ob2RlTGlzdElt
cGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgTm9kZUxpc3QKLSAg
ICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIE5vZGVJ
bXBsICppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBOb2Rl
SW1wbCAqaXRlbUJ5SWQgKCBjb25zdCBET01TdHJpbmcgJiBlbGVtZW50SWQgKSBjb25zdDsKLQot
ICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLQotICAgIHZpcnR1YWwgdm9p
ZCByb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgdm9pZCByb290Tm9kZUF0
dHJpYnV0ZUNoYW5nZWQoKSB7fQotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gaGVscGVyIGZ1bmN0aW9u
cyBmb3Igc2VhcmNoaW5nIGFsbCBFbGVtZW50SW1wbHMgaW4gYSB0cmVlCi0gICAgdW5zaWduZWQg
cmVjdXJzaXZlTGVuZ3RoKE5vZGVJbXBsICpzdGFydCA9IDApIGNvbnN0OwotICAgIE5vZGVJbXBs
ICpyZWN1cnNpdmVJdGVtICggdW5zaWduZWQgb2Zmc2V0LCBOb2RlSW1wbCAqc3RhcnQgPSAwICkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBib29sIG5vZGVNYXRjaGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUg
KSBjb25zdCA9IDA7Ci0KLSAgICBOb2RlSW1wbCAqcm9vdE5vZGU7Ci0gICAgbXV0YWJsZSBpbnQg
Y2FjaGVkTGVuZ3RoOwotICAgIG11dGFibGUgTm9kZUltcGwgKmxhc3RJdGVtOwotICAgIG11dGFi
bGUgdW5zaWduZWQgbGFzdEl0ZW1PZmZzZXQ7Ci0gICAgbXV0YWJsZSBib29sIGlzTGVuZ3RoQ2Fj
aGVWYWxpZCA6IDE7Ci0gICAgbXV0YWJsZSBib29sIGlzSXRlbUNhY2hlVmFsaWQgOiAxOwotfTsK
LQotY2xhc3MgQ2hpbGROb2RlTGlzdEltcGwgOiBwdWJsaWMgTm9kZUxpc3RJbXBsCi17Ci1wdWJs
aWM6Ci0gICAgQ2hpbGROb2RlTGlzdEltcGwoIE5vZGVJbXBsICpuKTsKLQotICAgIC8vIERPTSBt
ZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLQotICAgIHZpcnR1YWwgdW5z
aWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2ln
bmVkIGluZGV4ICkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZU1h
dGNoZXMoIE5vZGVJbXBsICp0ZXN0Tm9kZSApIGNvbnN0OwotfTsKLQotLyoqCi0gKiBOb2RlTGlz
dCB3aGljaCBsaXN0cyBhbGwgTm9kZXMgaW4gYSBFbGVtZW50IHdpdGggYSBnaXZlbiAibmFtZT0i
IHRhZwotICovCi1jbGFzcyBOYW1lTm9kZUxpc3RJbXBsIDogcHVibGljIE5vZGVMaXN0SW1wbAot
ewotcHVibGljOgotICAgIE5hbWVOb2RlTGlzdEltcGwoIE5vZGVJbXBsICpkb2MsIGNvbnN0IERP
TVN0cmluZyAmdCApOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJl
bnQgY2xhc3NlcwotCi0gICAgdmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdDsKLQotICAgIC8v
IE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICB2aXJ0dWFsIHZvaWQgcm9vdE5v
ZGVDaGlsZHJlbkNoYW5nZWQoKSB7fTsKLSAgICB2aXJ0dWFsIHZvaWQgcm9vdE5vZGVBdHRyaWJ1
dGVDaGFuZ2VkKCkgeyBOb2RlTGlzdEltcGw6OnJvb3ROb2RlQ2hpbGRyZW5DaGFuZ2VkKCk7IH0K
LQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBub2RlTWF0Y2hlcyggTm9kZUltcGwgKnRl
c3ROb2RlICkgY29uc3Q7Ci0KLSAgICBET01TdHJpbmcgbm9kZU5hbWU7Ci19OwotCi0KLS8vIEdl
bmVyaWMgTmFtZWROb2RlTWFwIGludGVyZmFjZQotLy8gT3RoZXIgY2xhc3NlcyBpbXBsZW1lbnQg
dGhpcyBmb3IgbW9yZSBzcGVjaWZpYyBzaXR1YXRpb25zIGUuZy4gYXR0cmlidXRlcwotLy8gb2Yg
YW4gZWxlbWVudAotY2xhc3MgTmFtZWROb2RlTWFwSW1wbCA6IHB1YmxpYyBraHRtbDo6U2hhcmVk
PE5hbWVkTm9kZU1hcEltcGw+Ci17Ci1wdWJsaWM6Ci0gICAgTmFtZWROb2RlTWFwSW1wbCgpIHt9
Ci0gICAgdmlydHVhbCB+TmFtZWROb2RlTWFwSW1wbCgpIHt9Ci0KLSAgICBOb2RlSW1wbCAqZ2V0
TmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFtZSkgY29uc3QgeyByZXR1cm4gZ2V0TmFtZWRJ
dGVtTlMoRE9NU3RyaW5nKCksIG5hbWUpOyB9Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiByZW1vdmVO
YW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lLCBpbnQgJmV4Y2VwdGlvbikgeyByZXR1cm4g
cmVtb3ZlTmFtZWRJdGVtTlMoRE9NU3RyaW5nKCksIG5hbWUsIGV4Y2VwdGlvbik7IH0KKyNpZm5k
ZWYgTkRFQlVHCiAKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpnZXROYW1lZEl0ZW1OUyhjb25zdCBE
T01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2NhbE5hbWUpIGNvbnN0
ID0gMDsKLSAgICBSZWZQdHI8Tm9kZUltcGw+IHNldE5hbWVkSXRlbU5TKE5vZGVJbXBsICphcmcs
IGludCAmZXhjZXB0aW9uKSB7IHJldHVybiBzZXROYW1lZEl0ZW0oYXJnLCBleGNlcHRpb24pOyB9
Ci0gICAgdmlydHVhbCBSZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRlbU5TKGNvbnN0IERP
TVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJmxvY2FsTmFtZSwgaW50ICZl
eGNlcHRpb24pID0gMDsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgTmFt
ZWROb2RlTWFwCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqZ2V0TmFtZWRJdGVtKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIGF0dHJOYW1lKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBSZWZQdHI8Tm9kZUlt
cGw+IHJlbW92ZU5hbWVkSXRlbSAoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIGludCAm
ZXhjZXB0aW9uY29kZSkgPSAwOwotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJbXBsPiBzZXROYW1l
ZEl0ZW0gKE5vZGVJbXBsKiBhcmcsIGludCAmZXhjZXB0aW9uY29kZSkgPSAwOworZXh0ZXJuIGlu
dCBnRXZlbnREaXNwYXRjaEZvcmJpZGRlbjsKKyNkZWZpbmUgZm9yYmlkRXZlbnREaXNwYXRjaCgp
IGdFdmVudERpc3BhdGNoRm9yYmlkZGVuICs9IDEKKyNkZWZpbmUgYWxsb3dFdmVudERpc3BhdGNo
KCkgYXNzZXJ0KGdFdmVudERpc3BhdGNoRm9yYmlkZGVuID4gMCk7IGdFdmVudERpc3BhdGNoRm9y
YmlkZGVuIC09IDEKKyNkZWZpbmUgZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpIChnRXZlbnREaXNw
YXRjaEZvcmJpZGRlbiA+IDApCisKKyNlbHNlCisKKyNkZWZpbmUgZm9yYmlkRXZlbnREaXNwYXRj
aCgpCisjZGVmaW5lIGFsbG93RXZlbnREaXNwYXRjaCgpCisjZGVmaW5lIGV2ZW50RGlzcGF0Y2hG
b3JiaWRkZW4oKQogCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4
ICkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCAgKSBjb25zdCA9IDA7
CisjZW5kaWYgTkRFQlVHCiAKLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00p
Ci0gICAgdmlydHVhbCBib29sIGlzUmVhZE9ubHkoKSB7IHJldHVybiBmYWxzZTsgfQotfTsKIAog
fTsgLy9uYW1lc3BhY2UKICNlbmRpZgpJbmRleDoga2h0bWwveG1sL2RvbV9lbGVtZW50aW1wbC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9kb21fZWxlbWVudGltcGwuaAkocmV2aXNpb24gMTIw
ODYpCisrKyBraHRtbC94bWwvZG9tX2VsZW1lbnRpbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3
LDcgKzI3LDggQEAKICNpZm5kZWYgRE9NX0VMRU1FTlRJTVBMX0gKICNkZWZpbmUgRE9NX0VMRU1F
TlRJTVBMX0gKIAotI2luY2x1ZGUgImRvbV9ub2RlaW1wbC5oIgorI2luY2x1ZGUgIk5hbWVkTm9k
ZU1hcEltcGwuaCIKKyNpbmNsdWRlICJDb250YWluZXJOb2RlSW1wbC5oIgogI2luY2x1ZGUgInht
bC9kb21fc3RyaW5naW1wbC5oIgogI2luY2x1ZGUgIm1pc2Mvc2hhcmVkLmgiCiAjaW5jbHVkZSAi
Y3NzL2Nzc192YWx1ZWltcGwuaCIKSW5kZXg6IGtodG1sL3htbC9OYW1lZE5vZGVNYXBJbXBsLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0ga2h0bWwveG1sL05hbWVkTm9kZU1hcEltcGwuaAkocmV2aXNpb24gMTIw
NjMpCisrKyBraHRtbC94bWwvTmFtZWROb2RlTWFwSW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
Miw2MTkgKzIyLDE3IEBACiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqCiAgKi8K
LSNpZm5kZWYgX0RPTV9Ob2RlSW1wbF9oXwotI2RlZmluZSBfRE9NX05vZGVJbXBsX2hfCisjaWZu
ZGVmIERPTV9OYW1lZE5vZGVNYXBJbXBsX2gKKyNkZWZpbmUgRE9NX05hbWVkTm9kZU1hcEltcGxf
aAogCi0jaW5jbHVkZSAiZG9tL2RvbV9zdHJpbmcuaCIKLSNpbmNsdWRlICJkb20vZG9tX25vZGUu
aCIKLSNpbmNsdWRlICJtaXNjL2hlbHBlci5oIgogI2luY2x1ZGUgIm1pc2Mvc2hhcmVkLmgiCi0j
aW5jbHVkZSAiZG9tX2F0b21pY3N0cmluZy5oIgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFz
cyBRUGFpbnRlcjsKLXRlbXBsYXRlIDxjbGFzcyB0eXBlPiBjbGFzcyBRUHRyTGlzdDsKLXRlbXBs
YXRlIDxjbGFzcyB0eXBlPiBjbGFzcyBRUHRyRGljdDsKLWNsYXNzIEtIVE1MVmlldzsKLWNsYXNz
IFJlbmRlckFyZW5hOwotY2xhc3MgUVJlY3Q7Ci1jbGFzcyBRTW91c2VFdmVudDsKLWNsYXNzIFFL
ZXlFdmVudDsKLWNsYXNzIFFUZXh0U3RyZWFtOwotY2xhc3MgUVN0cmluZ0xpc3Q7Ci1jbGFzcyBR
V2hlZWxFdmVudDsKLQotbmFtZXNwYWNlIGtodG1sIHsKLSAgICBjbGFzcyBSZW5kZXJPYmplY3Q7
Ci0gICAgY2xhc3MgUmVuZGVyU3R5bGU7Ci19OworI2luY2x1ZGUgImt4bWxjb3JlL1JlZlB0ci5o
IgorI2luY2x1ZGUgImRvbV9zdHJpbmcuaCIKIAogbmFtZXNwYWNlIERPTSB7CiAKLWNsYXNzIEF0
b21pY1N0cmluZzsKLWNsYXNzIERvY3VtZW50SW1wbDsKLWNsYXNzIEVsZW1lbnRJbXBsOwotY2xh
c3MgRXZlbnRJbXBsOwotY2xhc3MgRXZlbnRMaXN0ZW5lcjsKLWNsYXNzIE5vZGVMaXN0SW1wbDsK
LWNsYXNzIE5hbWVkQXR0ck1hcEltcGw7Ci1jbGFzcyBRdWFsaWZpZWROYW1lOwotY2xhc3MgUmVn
aXN0ZXJlZEV2ZW50TGlzdGVuZXI7Ci0KLS8vIHRoaXMgY2xhc3MgaW1wbGVtZW50cyBub2Rlcywg
d2hpY2ggY2FuIGhhdmUgYSBwYXJlbnQgYnV0IG5vIGNoaWxkcmVuOgotY2xhc3MgTm9kZUltcGwg
OiBwdWJsaWMga2h0bWw6OlRyZWVTaGFyZWQ8Tm9kZUltcGw+Ci17Ci0gICAgZnJpZW5kIGNsYXNz
IERvY3VtZW50SW1wbDsKLXB1YmxpYzoKLSAgICBOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYyk7
Ci0gICAgdmlydHVhbCB+Tm9kZUltcGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmli
dXRlcyBmb3IgTm9kZQotICAgIHZpcnR1YWwgYm9vbCBoYXNUYWdOYW1lKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIHRhZ05hbWUpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBET01T
dHJpbmcgbm9kZU5hbWUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZVZh
bHVlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldE5vZGVWYWx1ZSggY29uc3QgRE9NU3Ry
aW5nICZfbm9kZVZhbHVlLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIHVuc2ln
bmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3QgPSAwOwotICAgIE5vZGVJbXBsICpwYXJlbnROb2Rl
KCkgY29uc3QgeyByZXR1cm4gcGFyZW50KCk7IH0KLSAgICBOb2RlSW1wbCAqcHJldmlvdXNTaWJs
aW5nKCkgY29uc3QgeyByZXR1cm4gbV9wcmV2aW91czsgfQotICAgIE5vZGVJbXBsICpuZXh0U2li
bGluZygpIGNvbnN0IHsgcmV0dXJuIG1fbmV4dDsgfQotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVM
aXN0SW1wbD4gY2hpbGROb2RlcygpOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmZpcnN0Q2hpbGQo
KSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpsYXN0Q2hpbGQoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0OwotICAgIHZpcnR1YWwgTmFtZWRBdHRy
TWFwSW1wbCAqYXR0cmlidXRlcygpIGNvbnN0OwotICAgIHZpcnR1YWwgRG9jdW1lbnRJbXBsICpv
d25lckRvY3VtZW50KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5zZXJ0QmVmb3Jl
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9u
Y29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpu
ZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICpyZW1vdmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZl
eGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hpbGQgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgdm9pZCBy
ZW1vdmUoaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGROb2Rl
cyAoICApIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmNsb25lTm9kZSAoIGJvb2wgZGVl
cCApID0gMDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSgpIGNvbnN0
OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgaW50ICZl
eGNlcHRpb25jb2RlKTsKLSAgICB2b2lkIG5vcm1hbGl6ZSAoKTsKLSAgICBzdGF0aWMgYm9vbCBp
c1N1cHBvcnRlZChjb25zdCBET01TdHJpbmcgJmZlYXR1cmUsIGNvbnN0IERPTVN0cmluZyAmdmVy
c2lvbik7Ci0KLSAgICBib29sIGlzU2FtZU5vZGUoTm9kZUltcGwgKm90aGVyKSBjb25zdCB7IHJl
dHVybiB0aGlzID09IG90aGVyOyB9Ci0gICAgYm9vbCBpc0VxdWFsTm9kZShOb2RlSW1wbCAqb3Ro
ZXIpIGNvbnN0OwotICAgIGJvb2wgaXNEZWZhdWx0TmFtZXNwYWNlKGNvbnN0IERPTVN0cmluZyAm
bmFtZXNwYWNlVVJJKSBjb25zdDsKLSAgICBET01TdHJpbmcgbG9va3VwUHJlZml4KGNvbnN0IERP
TVN0cmluZyAmbmFtZXNwYWNlVVJJKSBjb25zdDsKLSAgICBET01TdHJpbmcgbG9va3VwTmFtZXNw
YWNlVVJJKGNvbnN0IERPTVN0cmluZyAmcHJlZml4KSBjb25zdDsKLSAgICAKLSAgICBET01TdHJp
bmcgdGV4dENvbnRlbnQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHRDb250ZW50KGNvbnN0IERP
TVN0cmluZyAmdGV4dCwgaW50ICZleGNlcHRpb24pOwotICAgIAotICAgIE5vZGVJbXBsICpsYXN0
RGVzY2VuZGFudCgpIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2Yg
RE9NKQotICAgIHZpcnR1YWwgYm9vbCBpc0VsZW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNIVE1MRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICB2aXJ0dWFsIGJvb2wgaXNTVkdFbGVtZW50KCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZgotICAgIHZpcnR1YWwgYm9vbCBpc1N0eWxl
ZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0F0
dHJpYnV0ZU5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBp
c1RleHROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXND
b21tZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlz
RG9jdW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICBib29sIGlzQmxvY2tG
bG93KCkgY29uc3Q7Ci0gICAgYm9vbCBpc0Jsb2NrRmxvd09yQmxvY2tUYWJsZSgpIGNvbnN0Owot
ICAgIAotICAgIC8vIFVzZWQgYnkgPGZvcm0+IGVsZW1lbnRzIHRvIGluZGljYXRlIGEgbWFsZm9y
bWVkIHN0YXRlIG9mIHNvbWUga2luZCwgdHlwaWNhbGx5Ci0gICAgLy8gdXNlZCB0byBrZWVwIGZy
b20gYXBwbHlpbmcgdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIGZvcm0uCi0gICAgdmlydHVhbCBi
b29sIGlzTWFsZm9ybWVkKCkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0
TWFsZm9ybWVkKGJvb2wgbWFsZm9ybWVkKSB7fTsKLSAgICAKLSAgICAvLyBoZWxwZXIgZnVuY3Rp
b25zIG5vdCBiZWluZyBwYXJ0IG9mIHRoZSBET00KLSAgICAvLyBBdHRlbnRpb246IHRoZXkgYXNz
dW1lIHRoYXQgdGhlIGNhbGxlciBkaWQgdGhlIGNvbnNpc3RlbmN5IGNoZWNraW5nIQotICAgIHZv
aWQgc2V0UHJldmlvdXNTaWJsaW5nKE5vZGVJbXBsICpwcmV2aW91cykgeyBtX3ByZXZpb3VzID0g
cHJldmlvdXM7IH0KLSAgICB2b2lkIHNldE5leHRTaWJsaW5nKE5vZGVJbXBsICpuZXh0KSB7IG1f
bmV4dCA9IG5leHQ7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRGaXJzdENoaWxkKE5vZGVJbXBs
ICpjaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldExhc3RDaGlsZChOb2RlSW1wbCAqY2hpbGQp
OwotCi0gICAgTm9kZUltcGwgKnByZXZpb3VzTm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKSBj
b25zdDsKLSAgICBOb2RlSW1wbCAqbmV4dE5vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCkgY29u
c3Q7Ci0gICAgCi0gICAgRWxlbWVudEltcGwgKmdldEFuY2VzdG9yRWxlbWVudCgpIGNvbnN0Owot
ICAgIERPTVN0cmluZyBsb29rdXBOYW1lc3BhY2VQcmVmaXgoY29uc3QgRE9NU3RyaW5nICZfbmFt
ZXNwYWNlVVJJLCBjb25zdCBFbGVtZW50SW1wbCAqb3JpZ2luYWxFbGVtZW50KSBjb25zdDsKLSAg
ICAKLSAgICAvKiogKE5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBET00pCi0gICAgICogUmV0dXJu
cyB0aGUgbmV4dCBsZWFmIG5vZGUuCi0gICAgICoKLSAgICAgKiBVc2luZyB0aGlzIGZ1bmN0aW9u
IGRlbGl2ZXJzIGxlYWYgbm9kZXMgYXMgaWYgdGhlIHdob2xlIERPTSB0cmVlCi0gICAgICogd2Vy
ZSBhIGxpbmVhciBjaGFpbiBvZiBpdHMgbGVhZiBub2Rlcy4KLSAgICAgKiBAcmV0dXJuIG5leHQg
bGVhZiBub2RlIG9yIDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUuCi0gICAgICovCi0gICAgTm9kZUlt
cGwgKm5leHRMZWFmTm9kZSgpIGNvbnN0OwotCi0gICAgLyoqIChOb3QgcGFydCBvZiB0aGUgb2Zm
aWNpYWwgRE9NKQotICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIGxlYWYgbm9kZS4KLSAgICAg
KgotICAgICAqIFVzaW5nIHRoaXMgZnVuY3Rpb24gZGVsaXZlcnMgbGVhZiBub2RlcyBhcyBpZiB0
aGUgd2hvbGUgRE9NIHRyZWUKLSAgICAgKiB3ZXJlIGEgbGluZWFyIGNoYWluIG9mIGl0cyBsZWFm
IG5vZGVzLgotICAgICAqIEByZXR1cm4gcHJldmlvdXMgbGVhZiBub2RlIG9yIDAgaWYgdGhlcmUg
YXJlIG5vIG1vcmUuCi0gICAgICovCi0gICAgTm9kZUltcGwgKnByZXZpb3VzTGVhZk5vZGUoKSBj
b25zdDsKLQotICAgIGJvb2wgaXNFZGl0YWJsZUJsb2NrKCkgY29uc3Q7Ci0gICAgRWxlbWVudElt
cGwgKmVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKSBjb25zdDsKLSAgICBFbGVtZW50SW1wbCAq
ZW5jbG9zaW5nQmxvY2tGbG93T3JUYWJsZUVsZW1lbnQoKSBjb25zdDsKLSAgICBFbGVtZW50SW1w
bCAqZW5jbG9zaW5nSW5saW5lRWxlbWVudCgpIGNvbnN0OwotICAgIEVsZW1lbnRJbXBsICpyb290
RWRpdGFibGVFbGVtZW50KCkgY29uc3Q7Ci0gICAgCi0gICAgYm9vbCBpblNhbWVSb290RWRpdGFi
bGVFbGVtZW50KE5vZGVJbXBsICopOwotICAgIGJvb2wgaW5TYW1lQ29udGFpbmluZ0Jsb2NrRmxv
d0VsZW1lbnQoTm9kZUltcGwgKik7Ci0gICAgCi0gICAgLy8gdXNlZCBieSB0aGUgcGFyc2VyLiBD
aGVja3MgYWdhaW5zdCB0aGUgRFRELCB1bmxpa2UgRE9NIG9wZXJhdGlvbnMgbGlrZQotICAgIC8v
IGFwcGVuZENoaWxkKCksIGFuZCByZXR1cm5zIHRoZSBuZXcgY29udGFpbmVyIG5vZGUgZm9yIGZ1
dHVyZSBpbnNlcnRpb25zIGFzIHlvdSBwYXJzZS4KLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRD
aGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpOwotICAgIAotICAgIC8vIGNhbGxlZCBieSB0aGUgcGFy
c2VyIHdoZW4gdGhpcyBlbGVtZW50J3MgY2xvc2UgdGFnIGlzIHJlYWNoZWQsCi0gICAgLy8gc2ln
bmFsbGluZyB0aGF0IGFsbCBjaGlsZCB0YWdzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFkZGVkLgot
ICAgIC8vIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIDxhcHBsZXQ+IGFuZCA8b2JqZWN0PiBlbGVt
ZW50cywgd2hpY2ggY2FuJ3QgbGF5IHRoZW1zZWx2ZXMgb3V0Ci0gICAgLy8gdW50aWwgdGhleSBr
bm93IGFsbCBvZiB0aGVpciBuZXN0ZWQgPHBhcmFtPnMuIFszNjAzMTkxLCA0MDQwODQ4XQotICAg
IHZpcnR1YWwgdm9pZCBjbG9zZVJlbmRlcmVyKCkge30KLQotICAgIGVudW0gTW91c2VFdmVudFR5
cGUgewotICAgICAgICBNb3VzZVByZXNzLAotICAgICAgICBNb3VzZVJlbGVhc2UsCi0gICAgICAg
IE1vdXNlQ2xpY2ssCi0gICAgICAgIE1vdXNlRGJsQ2xpY2ssCi0gICAgICAgIE1vdXNlTW92ZQot
ICAgIH07Ci0KLSAgICBzdHJ1Y3QgTW91c2VFdmVudAotICAgIHsKLSAgICAgICAgTW91c2VFdmVu
dCggaW50IF9idXR0b24sIE1vdXNlRXZlbnRUeXBlIF90eXBlLAotICAgICAgICAgICAgICAgICAg
ICBjb25zdCBET01TdHJpbmcgJl91cmwgPSBET01TdHJpbmcoKSwgY29uc3QgRE9NU3RyaW5nJiBf
dGFyZ2V0ID0gRE9NU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIE5vZGVJbXBsICpfaW5u
ZXJOb2RlID0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidXR0b24gPSBfYnV0
dG9uOyB0eXBlID0gX3R5cGU7Ci0gICAgICAgICAgICAgICAgdXJsID0gX3VybDsgdGFyZ2V0ID0g
X3RhcmdldDsKLSAgICAgICAgICAgICAgICBpbm5lck5vZGUgPSBfaW5uZXJOb2RlOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgIGludCBidXR0b247Ci0gICAgICAgIE1vdXNlRXZlbnRUeXBlIHR5
cGU7Ci0gICAgICAgIERPTVN0cmluZyB1cmw7IC8vIHVybCB1bmRlciBtb3VzZSBvciBlbXB0eQot
ICAgICAgICBET01TdHJpbmcgdGFyZ2V0OwotICAgICAgICBSZWZQdHI8Tm9kZUltcGw+IGlubmVy
Tm9kZTsKLSAgICB9OwotCi0gICAgLy8gZm9yIExJTksgYW5kIFNUWUxFCi0gICAgdmlydHVhbCB2
b2lkIHNoZWV0TG9hZGVkKCkge30KLQotICAgIGJvb2wgaGFzSUQoKSBjb25zdCAgICAgIHsgcmV0
dXJuIG1faGFzSWQ7IH0KLSAgICBib29sIGhhc0NsYXNzKCkgY29uc3QgICB7IHJldHVybiBtX2hh
c0NsYXNzOyB9Ci0gICAgYm9vbCBoYXNTdHlsZSgpIGNvbnN0ICAgeyByZXR1cm4gbV9oYXNTdHls
ZTsgfQotICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgICAgIHsgcmV0dXJuIG1fYWN0aXZlOyB9Ci0g
ICAgYm9vbCBpbkFjdGl2ZUNoYWluKCkgY29uc3QgeyByZXR1cm4gbV9pbkFjdGl2ZUNoYWluOyB9
Ci0gICAgYm9vbCBob3ZlcmVkKCkgY29uc3QgeyByZXR1cm4gbV9ob3ZlcmVkOyB9Ci0gICAgYm9v
bCBmb2N1c2VkKCkgY29uc3QgeyByZXR1cm4gbV9mb2N1c2VkOyB9Ci0gICAgYm9vbCBhdHRhY2hl
ZCgpIGNvbnN0ICAgeyByZXR1cm4gbV9hdHRhY2hlZDsgfQotICAgIGJvb2wgY2hhbmdlZCgpIGNv
bnN0ICAgIHsgcmV0dXJuIG1fY2hhbmdlZDsgfQotICAgIGJvb2wgaGFzQ2hhbmdlZENoaWxkKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNDaGFuZ2VkQ2hpbGQ7IH0KLSAgICBib29sIGlzTGluaygpIGNv
bnN0IHsgcmV0dXJuIG1faXNMaW5rOyB9Ci0gICAgLy8gaW5Eb2N1bWVudCBzaG91bGQgYWxzbyBt
YWtlIHN1cmUgYSBkb2N1bWVudCBleGlzdHMgaW4gY2FzZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4g
ZGVzdHJveWVkIGJlZm9yZSB0aGUgbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50Lgot
ICAgIGJvb2wgaW5Eb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGRvY3VtZW50LmdldCgpICYmIG1f
aW5Eb2N1bWVudDsgfQotICAgIGJvb2wgc3R5bGVFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9z
dHlsZUVsZW1lbnQ7IH0KLSAgICBib29sIGltcGxpY2l0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1f
aW1wbGljaXQ7IH0KLSAgICB2b2lkIHNldEhhc0lEKGJvb2wgYj10cnVlKSB7IG1faGFzSWQgPSBi
OyB9Ci0gICAgdm9pZCBzZXRIYXNDbGFzcyhib29sIGI9dHJ1ZSkgeyBtX2hhc0NsYXNzID0gYjsg
fQotICAgIHZvaWQgc2V0SGFzU3R5bGUoYm9vbCBiPXRydWUpIHsgbV9oYXNTdHlsZSA9IGI7IH0K
LSAgICB2b2lkIHNldEhhc0NoYW5nZWRDaGlsZCggYm9vbCBiID0gdHJ1ZSApIHsgbV9oYXNDaGFu
Z2VkQ2hpbGQgPSBiOyB9Ci0gICAgdm9pZCBzZXRJbkRvY3VtZW50KGJvb2wgYj10cnVlKSB7IG1f
aW5Eb2N1bWVudCA9IGI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoYm9vbCBiPXRydWUp
IHsgbV9mb2N1c2VkID0gYjsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBiPXRy
dWUsIGJvb2wgcGF1c2U9ZmFsc2UpIHsgbV9hY3RpdmUgPSBiOyB9Ci0gICAgdm9pZCBzZXRJbkFj
dGl2ZUNoYWluKGJvb2wgYj10cnVlKSB7IG1faW5BY3RpdmVDaGFpbiA9IGI7IH0KLSAgICB2aXJ0
dWFsIHZvaWQgc2V0SG92ZXJlZChib29sIGI9dHJ1ZSkgeyBtX2hvdmVyZWQgPSBiOyB9Ci0gICAg
dm9pZCBzZXRDaGFuZ2VkKGJvb2wgYj10cnVlKTsKLQotICAgIHVuc2lnbmVkIHNob3J0IHRhYklu
ZGV4KCkgY29uc3QgeyByZXR1cm4gbV90YWJJbmRleDsgfQotICAgIHZvaWQgc2V0VGFiSW5kZXgo
dW5zaWduZWQgc2hvcnQgX3RhYkluZGV4KSB7IG1fdGFiSW5kZXggPSBfdGFiSW5kZXg7IH0KLQot
ICAgIC8qKgotICAgICAgICAqIHdoZXRoZXIgdGhpcyBub2RlIGNhbiByZWNlaXZlIHRoZSBrZXli
b2FyZCBmb2N1cy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25z
dDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNLZXlib2FyZEZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgYm9vbCBpc01vdXNlRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlz
Q29udHJvbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9IC8vIEV2ZW50dWFsbHkgdGhlIG5vdGlv
biBvZiB3aGF0IGlzIGEgY29udHJvbCB3aWxsIGJlIGV4dGVuc2libGUuCi0gICAgdmlydHVhbCBi
b29sIGlzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wg
aXNDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJ
bmRldGVybWluYXRlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgYm9v
bCBpc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgUVJlY3QgZ2V0UmVjdCgp
IGNvbnN0OwotCi0gICAgZW51bSBTdHlsZUNoYW5nZSB7IE5vQ2hhbmdlLCBOb0luaGVyaXQsIElu
aGVyaXQsIERldGFjaCwgRm9yY2UgfTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0
eWxlQ2hhbmdlID0gTm9DaGFuZ2UgKSB7fQotICAgIFN0eWxlQ2hhbmdlIGRpZmYoIGtodG1sOjpS
ZW5kZXJTdHlsZSAqczEsIGtodG1sOjpSZW5kZXJTdHlsZSAqczIgKSBjb25zdDsKLQotICAgIHVu
c2lnbmVkIG5vZGVJbmRleCgpIGNvbnN0OwotICAgIC8vIFJldHVybnMgdGhlIGRvY3VtZW50IHRo
YXQgdGhpcyBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyBpcyBndWFyYW50ZWVkIHRvIGFs
d2F5cyBiZSBub24tbnVsbCwgYXMgb3Bwb3NlZCB0bwotICAgIC8vIERPTSdzIG93bmVyRG9jdW1l
bnQoKSB3aGljaCBpcyBudWxsIGZvciBEb2N1bWVudCBub2RlcyAoYW5kIHNvbWV0aW1lcyBEb2N1
bWVudFR5cGUgbm9kZXMpLgotICAgIERvY3VtZW50SW1wbCogZ2V0RG9jdW1lbnQoKSBjb25zdCB7
IHJldHVybiBkb2N1bWVudC5nZXQoKTsgfQotCi0gICAgdm9pZCBzZXREb2N1bWVudChEb2N1bWVu
dEltcGwgKmRvYyk7Ci0KLSAgICB2b2lkIGFkZEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3Ry
aW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUp
OwotICAgIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50
VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9p
ZCByZW1vdmVIVE1MRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSk7
Ci0gICAgdm9pZCBzZXRIVE1MRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50
VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOwotICAgIEV2ZW50TGlzdGVuZXIgKmdldEhU
TUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLSAgICB2b2lk
IHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Ci0KLSAgICBib29sIGRpc3BhdGNoRXZlbnQoRXZl
bnRJbXBsICpldnQsIGludCAmZXhjZXB0aW9uY29kZSwgYm9vbCB0ZW1wRXZlbnQgPSBmYWxzZSk7
Ci0gICAgYm9vbCBkaXNwYXRjaEdlbmVyaWNFdmVudCggRXZlbnRJbXBsICpldnQsIGludCAmZXhj
ZXB0aW9uY29kZSk7Ci0gICAgYm9vbCBkaXNwYXRjaEhUTUxFdmVudChjb25zdCBBdG9taWNTdHJp
bmcgJmV2ZW50VHlwZSwgYm9vbCBjYW5CdWJibGVBcmcsIGJvb2wgY2FuY2VsYWJsZUFyZyk7Ci0g
ICAgYm9vbCBkaXNwYXRjaFdpbmRvd0V2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBl
LCBib29sIGNhbkJ1YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJnKTsKLSAgICBib29sIGRpc3Bh
dGNoTW91c2VFdmVudChRTW91c2VFdmVudCAqZSwgY29uc3QgQXRvbWljU3RyaW5nICZvdmVycmlk
ZVR5cGUsIGludCBvdmVycmlkZURldGFpbCA9IDApOwotICAgIGJvb2wgZGlzcGF0Y2hTaW11bGF0
ZWRNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLSAgICBib29sIGRp
c3BhdGNoTW91c2VFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgaW50IGJ1dHRv
biwgaW50IGRldGFpbCwKLSAgICAgICAgaW50IGNsaWVudFgsIGludCBjbGllbnRZLCBpbnQgc2Ny
ZWVuWCwgaW50IHNjcmVlblksCi0gICAgICAgIGJvb2wgY3RybEtleSwgYm9vbCBhbHRLZXksIGJv
b2wgc2hpZnRLZXksIGJvb2wgbWV0YUtleSk7Ci0gICAgYm9vbCBkaXNwYXRjaFVJRXZlbnQoY29u
c3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIGludCBkZXRhaWwgPSAwKTsKLSAgICBib29sIGRp
c3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoYm9vbCBjaGlsZHJlbkNoYW5nZWQgPSB0cnVlKTsK
LSAgICBib29sIGRpc3BhdGNoS2V5RXZlbnQoUUtleUV2ZW50ICprZXkpOwotICAgIHZvaWQgZGlz
cGF0Y2hXaGVlbEV2ZW50KFFXaGVlbEV2ZW50ICopOwotCi0gICAgdm9pZCBoYW5kbGVMb2NhbEV2
ZW50cyhFdmVudEltcGwgKmV2dCwgYm9vbCB1c2VDYXB0dXJlKTsKLQotICAgIC8vIEhhbmRsZXJz
IHRvIGRvL3VuZG8gYWN0aW9ucyBvbiB0aGUgdGFyZ2V0IG5vZGUgYmVmb3JlIGFuIGV2ZW50IGlz
IGRpc3BhdGNoZWQgdG8gaXQgYW5kIGFmdGVyIHRoZSBldmVudAotICAgIC8vIGhhcyBiZWVuIGRp
c3BhdGNoZWQuICBUaGUgZGF0YSBwb2ludGVyIGlzIGhhbmRlZCBiYWNrIGJ5IHRoZSBwcmVEaXNw
YXRjaCBhbmQgcGFzc2VkIHRvIHBvc3REaXNwYXRjaC4KLSAgICB2aXJ0dWFsIHZvaWQqIHByZURp
c3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KSB7IHJldHVybiAwOyB9Ci0gICAgdmly
dHVhbCB2b2lkIHBvc3REaXNwYXRjaEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCwgdm9pZCog
ZGF0YSkge30KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIGRlZmF1bHQgYWN0aW9uIGZv
ciBhbiBldmVudCBlLmcuIHN1Ym1pdHRpbmcgYSBmb3JtCi0gICAgICovCi0gICAgdmlydHVhbCB2
b2lkIGRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpOwotCi0gICAgLyoqCi0gICAg
ICogVXNlZCBmb3IgZGlzYWJsZWQgZm9ybSBlbGVtZW50czsgaWYgdHJ1ZSwgcHJldmVudHMgbW91
c2UgZXZlbnRzIGZyb20gYmVpbmcgZGlzcGF0Y2hlZAotICAgICAqIHRvIGV2ZW50IGxpc3RlbmVy
cywgYW5kIHByZXZlbnRzIERPTUFjdGl2YXRlIGV2ZW50cyBmcm9tIGJlaW5nIHNlbnQgYXQgYWxs
LgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZCgpIGNvbnN0OwotCi0gICAgdmly
dHVhbCBib29sIGlzUmVhZE9ubHkoKTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRUeXBlQWxsb3dl
ZCggdW5zaWduZWQgc2hvcnQgLyp0eXBlKi8gKSB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1
YWwgdW5zaWduZWQgY2hpbGROb2RlQ291bnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBs
ICpjaGlsZE5vZGUodW5zaWduZWQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogRG9lcyBhIHBy
ZS1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUgdG8gZmluZCB0aGUgbm9kZSBuZXh0IG5vZGUg
YWZ0ZXIgdGhpcyBvbmUuIFRoaXMgdXNlcyB0aGUgc2FtZSBvcmRlciB0aGF0Ci0gICAgICogdGhl
IHRhZ3MgYXBwZWFyIGluIHRoZSBzb3VyY2UgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBz
dGF5V2l0aGluIElmIG5vdCBudWxsLCB0aGUgdHJhdmVyc2FsIHdpbGwgc3RvcCBvbmNlIHRoZSBz
cGVjaWZpZWQgbm9kZSBpcyByZWFjaGVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvCi0gICAgICogcmVz
dHJpY3QgdHJhdmVyc2FsIHRvIGEgcGFydGljdWxhciBzdWItdHJlZS4KLSAgICAgKgotICAgICAq
IEByZXR1cm4gVGhlIG5leHQgbm9kZSwgaW4gZG9jdW1lbnQgb3JkZXIKLSAgICAgKgotICAgICAq
IHNlZSBAcmVmIHRyYXZlcnNlUHJldmlvdXNOb2RlKCkKLSAgICAgKi8KLSAgICBOb2RlSW1wbCAq
dHJhdmVyc2VOZXh0Tm9kZShjb25zdCBOb2RlSW1wbCAqc3RheVdpdGhpbiA9IDApIGNvbnN0Owot
ICAgIAotICAgIC8qIExpa2UgdHJhdmVyc2VOZXh0Tm9kZSwgYnV0IHNraXBzIGNoaWxkcmVuIGFu
ZCBzdGFydHMgd2l0aCB0aGUgbmV4dCBzaWJsaW5nLiAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJz
ZU5leHRTaWJsaW5nKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluID0gMCkgY29uc3Q7Ci0KLSAg
ICAvKioKLSAgICAgKiBEb2VzIGEgcmV2ZXJzZSBwcmUtb3JkZXIgdHJhdmVyc2FsIHRvIGZpbmQg
dGhlIG5vZGUgdGhhdCBjb21lcyBiZWZvcmUgdGhlIGN1cnJlbnQgb25lIGluIGRvY3VtZW50IG9y
ZGVyCi0gICAgICoKLSAgICAgKiBzZWUgQHJlZiB0cmF2ZXJzZU5leHROb2RlKCkKLSAgICAgKi8K
LSAgICBOb2RlSW1wbCAqdHJhdmVyc2VQcmV2aW91c05vZGUoKSBjb25zdDsKLQotICAgIC8qIExp
a2UgdHJhdmVyc2VQcmV2aW91c05vZGUsIGJ1dCB2aXNpdHMgbm9kZXMgYmVmb3JlIHRoZWlyIGNo
aWxkcmVuLiAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZVByZXZpb3VzTm9kZVBvc3RPcmRlcihj
b25zdCBOb2RlSW1wbCAqc3RheVdpdGhpbiA9IDApIGNvbnN0OwotCi0gICAgTm9kZUltcGwgKnBy
ZXZpb3VzRWRpdGFibGUoKSBjb25zdDsKLSAgICBOb2RlSW1wbCAqbmV4dEVkaXRhYmxlKCkgY29u
c3Q7Ci0gICAgLy9ib29sIGlzRWRpdGFibGUoKSBjb25zdDsKLQotICAgIGtodG1sOjpSZW5kZXJP
YmplY3QgKnJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV9yZW5kZXI7IH0KLSAgICBraHRtbDo6
UmVuZGVyT2JqZWN0ICpuZXh0UmVuZGVyZXIoKTsKLSAgICBraHRtbDo6UmVuZGVyT2JqZWN0ICpw
cmV2aW91c1JlbmRlcmVyKCk7Ci0gICAgdm9pZCBzZXRSZW5kZXJlcihraHRtbDo6UmVuZGVyT2Jq
ZWN0KiByZW5kZXJlcikgeyBtX3JlbmRlciA9IHJlbmRlcmVyOyB9Ci0gICAgCi0gICAgdm9pZCBj
aGVja1NldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIGludCAmZXhjZXB0aW9u
Y29kZSk7Ci0gICAgYm9vbCBpc0FuY2VzdG9yKGNvbnN0IE5vZGVJbXBsICopIGNvbnN0OwotCi0J
Ly8gVGhlc2UgdHdvIG1ldGhvZHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gIFRoZSBmb3JtZXIg
aXMgdXNlZCB0byBkbyBzdHJpY3QgZXJyb3ItY2hlY2tpbmcKLQkvLyB3aGVuIGFkZGluZyBjaGls
ZHJlbiB2aWEgdGhlIHB1YmxpYyBET00gQVBJIChlLmcuLCBhcHBlbmRDaGlsZCgpKS4gIFRoZSBs
YXR0ZXIgaXMgY2FsbGVkIG9ubHkgd2hlbiBwYXJzaW5nLCAKLQkvLyB0byBzYW5pdHktY2hlY2sg
YWdhaW5zdCB0aGUgRFREIGZvciBlcnJvciByZWNvdmVyeS4KLQl2b2lkIGNoZWNrQWRkQ2hpbGQo
Tm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOyAgICAvLyBFcnJvci1jaGVj
a2luZyB3aGVuIGFkZGluZyB2aWEgdGhlIERPTSBBUEkKLQl2aXJ0dWFsIGJvb2wgY2hpbGRBbGxv
d2VkKE5vZGVJbXBsICpuZXdDaGlsZCk7CQkJCSAgIC8vIEVycm9yLWNoZWNraW5nIGR1cmluZyBw
YXJzaW5nIHRoYXQgY2hlY2tzIHRoZSBEVEQKLQkKLSAgICB2aXJ0dWFsIGludCBtYXhPZmZzZXQo
KSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjYXJldE1pbk9mZnNldCgpIGNvbnN0OwotICAgIHZp
cnR1YWwgaW50IGNhcmV0TWF4T2Zmc2V0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBj
YXJldE1heFJlbmRlcmVkT2Zmc2V0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGludCBwcmV2aW91
c09mZnNldCAoaW50IGN1cnJlbnQpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IG5leHRPZmZzZXQg
KGludCBjdXJyZW50KSBjb25zdDsKLSAgICAKLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2
b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0j
ZW5kaWYKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSW50ZWdyYXRpb24g
d2l0aCByZW5kZXJpbmcgdHJlZQotCi0gICAgLyoqCi0gICAgICogQXR0YWNoZXMgdGhpcyBub2Rl
IHRvIHRoZSByZW5kZXJpbmcgdHJlZS4gVGhpcyBjYWxjdWxhdGVzIHRoZSBzdHlsZSB0byBiZSBh
cHBsaWVkIHRvIHRoZSBub2RlIGFuZCBjcmVhdGVzIGFuCi0gICAgICogYXBwcm9wcmlhdGUgUmVu
ZGVyT2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgdHJlZSAoZXhjZXB0IHdo
ZW4gdGhlIHN0eWxlIGhhcyBkaXNwbGF5OiBub25lKS4gVGhpcwotICAgICAqIG1ha2VzIHRoZSBu
b2RlIHZpc2libGUgaW4gdGhlIEtIVE1MVmlldy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQg
YXR0YWNoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXRhY2hlcyB0aGUgbm9kZSBmcm9tIHRoZSBy
ZW5kZXJpbmcgdHJlZSwgbWFraW5nIGl0IGludmlzaWJsZSBpbiB0aGUgcmVuZGVyZWQgdmlldy4g
VGhpcyBtZXRob2Qgd2lsbCByZW1vdmUKLSAgICAgKiB0aGUgbm9kZSdzIHJlbmRlcmluZyBvYmpl
Y3QgZnJvbSB0aGUgcmVuZGVyaW5nIHRyZWUgYW5kIGRlbGV0ZSBpdC4KLSAgICAgKi8KLSAgICB2
aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgd2lsbFJlbW92ZSgpOwot
ICAgIHZvaWQgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpOwotICAgIHZpcnR1YWwga2h0bWw6OlJl
bmRlclN0eWxlICpzdHlsZUZvclJlbmRlcmVyKGtodG1sOjpSZW5kZXJPYmplY3QgKnBhcmVudCk7
Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoa2h0bWw6OlJlbmRlclN0eWxlICop
OwotI2lmIFNWR19TVVBQT1JUCi0gICAgdmlydHVhbCBib29sIGNoaWxkU2hvdWxkQ3JlYXRlUmVu
ZGVyZXIoRE9NOjpOb2RlSW1wbCAqKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0jZW5kaWYKLSAg
ICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
ICosIGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0gICAgLy8gTWV0aG9kcyBmb3IgbWFpbnRhaW5pbmcgdGhlIHN0YXRlIG9mIHRoZSBlbGVtZW50
IGJldHdlZW4gaGlzdG9yeSBuYXZpZ2F0aW9uCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMg
d2hldGhlciBvciBub3QgdGhpcyB0eXBlIG9mIG5vZGUgbWFpbnRhaW5zIGl0J3Mgc3RhdGUuIElm
IHNvLCB0aGUgc3RhdGUgb2YgdGhlIG5vZGUgd2lsbCBiZSBzdG9yZWQgd2hlbgotICAgICAqIHRo
ZSB1c2VyIGdvZXMgdG8gYSBkaWZmZXJlbnQgcGFnZSB1c2luZyB0aGUgc3RhdGUoKSBtZXRob2Qs
IGFuZCByZXN0b3JlZCB1c2luZyB0aGUgcmVzdG9yZVN0YXRlKCkgbWV0aG9kIGlmIHRoZQotICAg
ICAqIHVzZXIgcmV0dXJucyAoZS5nLiB1c2luZyB0aGUgYmFjayBidXR0b24pLiBUaGlzIGlzIHVz
ZWQgdG8gZW5zdXJlIHRoYXQgdXNlci1jaGFuZ2VhYmxlIGVsZW1lbnRzIHN1Y2ggYXMgZm9ybQot
ICAgICAqIGNvbnRyb2xzIG1haW50YWluIHRoZWlyIGNvbnRlbnRzIHdoZW4gdGhlIHVzZXIgcmV0
dXJucyB0byBhIHByZXZpb3VzIHBhZ2UgaW4gdGhlIGhpc3RvcnkuCi0gICAgICovCi0gICAgdmly
dHVhbCBib29sIG1haW50YWluc1N0YXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRo
ZSBzdGF0ZSBvZiB0aGlzIG5vZGUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuIFRoaXMgc3RyaW5n
IHdpbGwgYmUgcGFzc2VkIHRvIHJlc3RvcmVTdGF0ZSgpIGlmIHRoZSB1c2VyCi0gICAgICogcmV0
dXJucyB0byB0aGUgcGFnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RhdGUgaW5mb3JtYXRp
b24gYWJvdXQgdGhlIG5vZGUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcKLSAgICAgKi8KLSAgICB2
aXJ0dWFsIFFTdHJpbmcgc3RhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0YXRl
IG9mIHRoZSBlbGVtZW50IGJhc2VkIG9uIHN0cmluZ3MgcHJldmlvdXNseSByZXR1cm5lZCBieSBz
dGF0ZSgpLiBUaGlzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBmb3JtCi0gICAgICogY29udHJvbHMg
d2l0aCB0aGVpciBvbGQgdmFsdWVzIHdoZW4gdGhlIHVzZXIgcmV0dXJucyB0byB0aGUgcGFnZSBp
biB0aGVpciBoaXN0b3J5LiAgVGhlIHJlY2VpdmVyCi0gICAgICogc2hvdWxkIHJlbW92ZSB0aGUg
c3RyaW5nIGZyb20gdGhlIGxpc3QgdGhhdCBpdCB1c2VzIGZvciBpdHMgcmVzdG9yZS4KLSAgICAg
KgotICAgICAqIEBwYXJhbSBzdGF0ZXMgVGhlIHN0cmluZ3MgcHJldmlvdXNseSByZXR1cm5lZCBi
eSBub2Rlcycgc3RhdGUgbWV0aG9kcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9y
ZVN0YXRlKFFTdHJpbmdMaXN0ICZzdGF0ZUxpc3QpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLSAgICAvLyBOb3RpZmljYXRpb24gb2YgZG9jdW1lbnQgc3R1Y3R1cmUgY2hhbmdlcwot
Ci0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhlIG5vZGUgdGhhdCBpdCBoYXMgYmVlbiBpbnNl
cnRlZCBpbnRvIHRoZSBkb2N1bWVudC4gVGhpcyBpcyBjYWxsZWQgZHVyaW5nIGRvY3VtZW50IHBh
cnNpbmcsIGFuZCBhbHNvCi0gICAgICogd2hlbiBhIG5vZGUgaXMgYWRkZWQgdGhyb3VnaCB0aGUg
RE9NIG1ldGhvZHMgaW5zZXJ0QmVmb3JlKCksIGFwcGVuZENoaWxkKCkgb3IgcmVwbGFjZUNoaWxk
KCkuIE5vdGUgdGhhdCB0aGlzIG9ubHkKLSAgICAgKiBoYXBwZW5zIHdoZW4gdGhlIG5vZGUgYmVj
b21lcyBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0cmVlLCBpLmUuIG9ubHkgd2hlbiB0aGUgZG9jdW1l
bnQgaXMgYWN0dWFsbHkgYW4gYW5jZXN0b3Igb2YKLSAgICAgKiB0aGUgbm9kZS4gVGhlIGNhbGwg
aGFwcGVucyBfYWZ0ZXJfIHRoZSBub2RlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB0cmVlLgotICAg
ICAqCi0gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBET01Ob2RlSW5zZXJ0ZWRJbnRvRG9j
dW1lbnQgRE9NIGV2ZW50LCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgb3ZlcmhlYWQgb2YgZXZl
bnQKLSAgICAgKiBkaXNwYXRjaGluZy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0
ZWRJbnRvRG9jdW1lbnQoKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSBub2RlIHRo
YXQgaXQgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsIGkuZS4gd2hlbiB0
aGUgZG9jdW1lbnQgaXMgbm8gbG9uZ2VyIGFuIGFuY2VzdG9yCi0gICAgICogbm9kZS4KLSAgICAg
KgotICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1l
bnQgRE9NIGV2ZW50LCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgb3ZlcmhlYWQgb2YgZXZlbnQK
LSAgICAgKiBkaXNwYXRjaGluZywgYW5kIGlzIGNhbGxlZCBfYWZ0ZXJfIHRoZSBub2RlIGlzIHJl
bW92ZWQgZnJvbSB0aGUgdHJlZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZy
b21Eb2N1bWVudCgpOwotCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2hlbmV2
ZXIgeW91IGFyZSBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkIGZyb20gYSB0cmVlLiAgVGhhdCB0
cmVlIG1heSBiZSB0aGUgbWFpbgotICAgIC8vIGRvY3VtZW50IHRyZWUsIG9yIGl0IGNvdWxkIGJl
IGFub3RoZXIgZGlzY29ubmVjdGVkIHRyZWUuICBPdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMgdG8g
ZG8gYW55IHdvcmsgdGhhdCBkZXBlbmRzCi0gICAgLy8gb24gY29ubmVjdGVkbmVzcyB0byBzb21l
IGFuY2VzdG9yIChlLmcuLCBhbiBhbmNlc3RvciA8Zm9ybT4gZm9yIGV4YW1wbGUpLgotICAgIHZp
cnR1YWwgdm9pZCBpbnNlcnRlZEludG9UcmVlKGJvb2wgZGVlcCkge307Ci0gICAgdmlydHVhbCB2
b2lkIHJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApIHt9OwotCi0gICAgLyoqCi0gICAgICogTm90
aWZpZXMgdGhlIG5vZGUgdGhhdCBpdCdzIGxpc3Qgb2YgY2hpbGRyZW4gaGF2ZSBjaGFuZ2VkIChl
aXRoZXIgYnkgYWRkaW5nIG9yIHJlbW92aW5nIGNoaWxkIG5vZGVzKSwgb3IgYSBjaGlsZAotICAg
ICAqIG5vZGUgdGhhdCBpcyBvZiB0aGUgdHlwZSBDREFUQV9TRUNUSU9OX05PREUsIFRFWFRfTk9E
RSBvciBDT01NRU5UX05PREUgaGFzIGNoYW5nZWQgaXRzIHZhbHVlLgotICAgICAqLwotICAgIHZp
cnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHRv
U3RyaW5nKCkgY29uc3QgPSAwOwotICAgIAotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0dWFsIHZv
aWQgZm9ybWF0Rm9yRGVidWdnZXIoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0
OwotCi0gICAgdm9pZCBzaG93Tm9kZShjb25zdCBjaGFyICpwcmVmaXg9IiIpIGNvbnN0OwotICAg
IHZvaWQgc2hvd1RyZWUoKSBjb25zdDsKLSAgICB2b2lkIHNob3dUcmVlQW5kTWFyayhOb2RlSW1w
bCAqIG1hcmtlZE5vZGUxLCBjb25zdCBjaGFyICogbWFya2VkTGFiZWwxLCBOb2RlSW1wbCAqIG1h
cmtlZE5vZGUyLCBjb25zdCBjaGFyICogbWFya2VkTGFiZWwyKSBjb25zdDsKLQkKLSNlbmRpZgot
Ci0gICAgdm9pZCByZWdpc3Rlck5vZGVMaXN0KE5vZGVMaXN0SW1wbCAqbGlzdCk7Ci0gICAgdm9p
ZCB1bnJlZ2lzdGVyTm9kZUxpc3QoTm9kZUxpc3RJbXBsICpsaXN0KTsKLSAgICB2b2lkIG5vdGlm
eU5vZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZvaWQgbm90aWZ5TG9jYWxOb2RlTGlz
dHNDaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2b2lkIG5vdGlmeU5vZGVMaXN0c0F0dHJpYnV0ZUNo
YW5nZWQoKTsKLSAgICB2b2lkIG5vdGlmeUxvY2FsTm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgp
OwotICAgIAotICAgIFJlZlB0cjxOb2RlTGlzdEltcGw+IGdldEVsZW1lbnRzQnlUYWdOYW1lKGNv
bnN0IERPTVN0cmluZyAmbmFtZSkgeyByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiKiIs
IG5hbWUpOyB9Ci0gICAgUmVmUHRyPE5vZGVMaXN0SW1wbD4gZ2V0RWxlbWVudHNCeVRhZ05hbWVO
Uyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2NhbE5h
bWUpOwotCi1wcml2YXRlOiAvLyBtZW1iZXJzCi0gICAgRG9jUHRyPERvY3VtZW50SW1wbD4gZG9j
dW1lbnQ7Ci0gICAgTm9kZUltcGwgKm1fcHJldmlvdXM7Ci0gICAgTm9kZUltcGwgKm1fbmV4dDsK
LXByb3RlY3RlZDoKLSAgICBraHRtbDo6UmVuZGVyT2JqZWN0ICptX3JlbmRlcjsKLSAgICBRUHRy
TGlzdDxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gKm1fcmVnZExpc3RlbmVyczsKLSAgICBRUHRy
RGljdDxOb2RlTGlzdEltcGw+ICptX25vZGVMaXN0czsKLQotICAgIHVuc2lnbmVkIHNob3J0IG1f
dGFiSW5kZXggOiAxNTsKLSAgICBib29sIG1faGFzVGFiSW5kZXggIDogMTsKLQotICAgIGJvb2wg
bV9oYXNJZCA6IDE7Ci0gICAgYm9vbCBtX2hhc0NsYXNzIDogMTsKLSAgICBib29sIG1faGFzU3R5
bGUgOiAxOwotICAgIGJvb2wgbV9hdHRhY2hlZCA6IDE7Ci0gICAgYm9vbCBtX2NoYW5nZWQgOiAx
OwotICAgIGJvb2wgbV9oYXNDaGFuZ2VkQ2hpbGQgOiAxOwotICAgIGJvb2wgbV9pbkRvY3VtZW50
IDogMTsKLQotICAgIGJvb2wgbV9pc0xpbmsgOiAxOwotICAgIGJvb2wgbV9zcGVjaWZpZWQgOiAx
OyAvLyB1c2VkIGluIEF0dHJJbXBsLiBBY2Nlc3NvciBmdW5jdGlvbnMgdGhlcmUKLSAgICBib29s
IG1fZm9jdXNlZCA6IDE7Ci0gICAgYm9vbCBtX2FjdGl2ZSA6IDE7Ci0gICAgYm9vbCBtX2hvdmVy
ZWQgOiAxOwotICAgIGJvb2wgbV9pbkFjdGl2ZUNoYWluIDogMTsKLSAgICBib29sIG1fc3R5bGVF
bGVtZW50IDogMTsgLy8gY29udGFpbnMgc3R5bGVzaGVldCB0ZXh0Ci0gICAgYm9vbCBtX2ltcGxp
Y2l0IDogMTsgLy8gaW1wbGljaXRlbHkgZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIKLQotICAgIGJv
b2wgbV9pbkRldGFjaCA6IDE7Ci19OwotCi1jbGFzcyBDb250YWluZXJOb2RlSW1wbCA6IHB1Ymxp
YyBOb2RlSW1wbAotewotcHVibGljOgotICAgIENvbnRhaW5lck5vZGVJbXBsKERvY3VtZW50SW1w
bCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5Db250YWluZXJOb2RlSW1wbCgpOwotCi0gICAgLy8gRE9N
IG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgTm9k
ZUltcGwgKmZpcnN0Q2hpbGQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpsYXN0Q2hp
bGQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRCZWZvcmUgKCBOb2RlSW1w
bCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBO
b2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9k
ZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdD
aGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBib29sIGhhc0NoaWxkTm9k
ZXMgKCAgKSBjb25zdDsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkK
LSAgICB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICBpbnQgd2lsbFJlbW92ZUNoaWxkKE5vZGVJbXBs
ICpjaGlsZCk7Ci0gICAgdm9pZCByZW1vdmVBbGxDaGlsZHJlbigpOwotICAgIHZvaWQgcmVtb3Zl
Q2hpbGRyZW4oKTsKLSAgICB2b2lkIGNsb25lQ2hpbGROb2RlcyhOb2RlSW1wbCAqY2xvbmUpOwot
Ci0gICAgdmlydHVhbCB2b2lkIHNldEZpcnN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKTsKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0TGFzdENoaWxkKE5vZGVJbXBsICpjaGlsZCk7Ci0gICAgdmlydHVhbCBO
b2RlSW1wbCAqYWRkQ2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQg
YXR0YWNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotCi0gICAgdmlydHVhbCBRUmVj
dCBnZXRSZWN0KCkgY29uc3Q7Ci0gICAgYm9vbCBnZXRVcHBlckxlZnRDb3JuZXIoaW50ICZ4UG9z
LCBpbnQgJnlQb3MpIGNvbnN0OwotICAgIGJvb2wgZ2V0TG93ZXJSaWdodENvcm5lcihpbnQgJnhQ
b3MsIGludCAmeVBvcykgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoYm9vbD10
cnVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlKGJvb2wgYWN0aXZlID0gdHJ1ZSwgYm9v
bCBwYXVzZSA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SG92ZXJlZChib29sPXRydWUp
OwotICAgIHZpcnR1YWwgdW5zaWduZWQgY2hpbGROb2RlQ291bnQoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIE5vZGVJbXBsICpjaGlsZE5vZGUodW5zaWduZWQgaW5kZXgpOwotCi0gICAgdmlydHVhbCB2
b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9t
RG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXAp
OwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbVRyZWUoYm9vbCBkZWVwKTsKLQotLy9wcm90
ZWN0ZWQ6Ci0gICAgTm9kZUltcGwgKl9maXJzdDsKLSAgICBOb2RlSW1wbCAqX2xhc3Q7Ci0KLSAg
ICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBpbnNlcnRpbmcgY2hpbGRyZW46Ci0KLSAgICAvLyAj
IyMgdGhpcyBzaG91bGQgdmFuaXNoLiBkbyBpdCBpbiBkb20vICEKLSAgICAvLyBjaGVjayBmb3Ig
c2FtZSBzb3VyY2UgZG9jdW1lbnQ6Ci0gICAgYm9vbCBjaGVja1NhbWVEb2N1bWVudCggTm9kZUlt
cGwgKm5ld2NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICAvLyBjaGVjayBmb3IgYmVp
bmcgY2hpbGQ6Ci0gICAgYm9vbCBjaGVja0lzQ2hpbGQoIE5vZGVJbXBsICpvbGRjaGlsZCwgaW50
ICZleGNlcHRpb25jb2RlICk7Ci0gICAgLy8gIyMjCi0KLSAgICAvLyBmaW5kIG91dCBpZiBhIG5v
ZGUgaXMgYWxsb3dlZCB0byBiZSBvdXIgY2hpbGQKLSAgICB2b2lkIGRpc3BhdGNoQ2hpbGRJbnNl
cnRlZEV2ZW50cyggTm9kZUltcGwgKmNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
b2lkIGRpc3BhdGNoQ2hpbGRSZW1vdmFsRXZlbnRzKCBOb2RlSW1wbCAqY2hpbGQsIGludCAmZXhj
ZXB0aW9uY29kZSApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIE5vZGU7CiBj
bGFzcyBOb2RlSW1wbDsKLQotY2xhc3MgTm9kZUxpc3RJbXBsIDogcHVibGljIGtodG1sOjpTaGFy
ZWQ8Tm9kZUxpc3RJbXBsPgotewotcHVibGljOgotICAgIE5vZGVMaXN0SW1wbCggTm9kZUltcGwg
Kl9yb290Tm9kZSApOwotICAgIHZpcnR1YWwgfk5vZGVMaXN0SW1wbCgpOwotCi0gICAgLy8gRE9N
IG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBOb2RlTGlzdAotICAgIHZpcnR1YWwgdW5zaWduZWQg
bGVuZ3RoKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25l
ZCBpbmRleCApIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppdGVtQnlJZCAoIGNv
bnN0IERPTVN0cmluZyAmIGVsZW1lbnRJZCApIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9k
cyAobm90IHBhcnQgb2YgRE9NKQotCi0gICAgdmlydHVhbCB2b2lkIHJvb3ROb2RlQ2hpbGRyZW5D
aGFuZ2VkKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJvb3ROb2RlQXR0cmlidXRlQ2hhbmdlZCgpIHt9
Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBzZWFyY2hpbmcgYWxs
IEVsZW1lbnRJbXBscyBpbiBhIHRyZWUKLSAgICB1bnNpZ25lZCByZWN1cnNpdmVMZW5ndGgoTm9k
ZUltcGwgKnN0YXJ0ID0gMCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKnJlY3Vyc2l2ZUl0ZW0gKCB1
bnNpZ25lZCBvZmZzZXQsIE5vZGVJbXBsICpzdGFydCA9IDAgKSBjb25zdDsKLSAgICB2aXJ0dWFs
IGJvb2wgbm9kZU1hdGNoZXMoIE5vZGVJbXBsICp0ZXN0Tm9kZSApIGNvbnN0ID0gMDsKLQotICAg
IE5vZGVJbXBsICpyb290Tm9kZTsKLSAgICBtdXRhYmxlIGludCBjYWNoZWRMZW5ndGg7Ci0gICAg
bXV0YWJsZSBOb2RlSW1wbCAqbGFzdEl0ZW07Ci0gICAgbXV0YWJsZSB1bnNpZ25lZCBsYXN0SXRl
bU9mZnNldDsKLSAgICBtdXRhYmxlIGJvb2wgaXNMZW5ndGhDYWNoZVZhbGlkIDogMTsKLSAgICBt
dXRhYmxlIGJvb2wgaXNJdGVtQ2FjaGVWYWxpZCA6IDE7Ci19OwotCi1jbGFzcyBDaGlsZE5vZGVM
aXN0SW1wbCA6IHB1YmxpYyBOb2RlTGlzdEltcGwKLXsKLXB1YmxpYzoKLSAgICBDaGlsZE5vZGVM
aXN0SW1wbCggTm9kZUltcGwgKm4pOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBm
cm9tICBwYXJlbnQgY2xhc3NlcwotCi0gICAgdmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBjb25z
dDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdDsK
LQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBub2RlTWF0Y2hlcyggTm9kZUltcGwgKnRl
c3ROb2RlICkgY29uc3Q7Ci19OwotCi0vKioKLSAqIE5vZGVMaXN0IHdoaWNoIGxpc3RzIGFsbCBO
b2RlcyBpbiBhIEVsZW1lbnQgd2l0aCBhIGdpdmVuICJuYW1lPSIgdGFnCi0gKi8KLWNsYXNzIE5h
bWVOb2RlTGlzdEltcGwgOiBwdWJsaWMgTm9kZUxpc3RJbXBsCi17Ci1wdWJsaWM6Ci0gICAgTmFt
ZU5vZGVMaXN0SW1wbCggTm9kZUltcGwgKmRvYywgY29uc3QgRE9NU3RyaW5nICZ0ICk7Ci0KLSAg
ICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0KLSAgICB2
aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0
ZW0gKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90
IHBhcnQgb2YgRE9NKQotICAgIHZpcnR1YWwgdm9pZCByb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgp
IHt9OwotICAgIHZpcnR1YWwgdm9pZCByb290Tm9kZUF0dHJpYnV0ZUNoYW5nZWQoKSB7IE5vZGVM
aXN0SW1wbDo6cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAg
dmlydHVhbCBib29sIG5vZGVNYXRjaGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUgKSBjb25zdDsKLQot
ICAgIERPTVN0cmluZyBub2RlTmFtZTsKLX07Ci0KK2NsYXNzIFF1YWxpZmllZE5hbWU7CiAKIC8v
IEdlbmVyaWMgTmFtZWROb2RlTWFwIGludGVyZmFjZQogLy8gT3RoZXIgY2xhc3NlcyBpbXBsZW1l
bnQgdGhpcyBmb3IgbW9yZSBzcGVjaWZpYyBzaXR1YXRpb25zIGUuZy4gYXR0cmlidXRlcwpAQCAt
NjQyLDggKzQwLDggQEAgcHJvdGVjdGVkOgogY2xhc3MgTmFtZWROb2RlTWFwSW1wbCA6IHB1Ymxp
YyBraHRtbDo6U2hhcmVkPE5hbWVkTm9kZU1hcEltcGw+CiB7CiBwdWJsaWM6Ci0gICAgTmFtZWRO
b2RlTWFwSW1wbCgpIHt9Ci0gICAgdmlydHVhbCB+TmFtZWROb2RlTWFwSW1wbCgpIHt9CisgICAg
TmFtZWROb2RlTWFwSW1wbCgpIHsgfQorICAgIHZpcnR1YWwgfk5hbWVkTm9kZU1hcEltcGwoKSB7
IH0KIAogICAgIE5vZGVJbXBsICpnZXROYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBj
b25zdCB7IHJldHVybiBnZXROYW1lZEl0ZW1OUyhET01TdHJpbmcoKSwgbmFtZSk7IH0KICAgICBS
ZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUsIGlu
dCAmZXhjZXB0aW9uKSB7IHJldHVybiByZW1vdmVOYW1lZEl0ZW1OUyhET01TdHJpbmcoKSwgbmFt
ZSwgZXhjZXB0aW9uKTsgfQpAQCAtNjU4LDcgKzU2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwg
UmVmUHRyPE5vZGVJbXBsPiBzZXROYW1lZEl0ZW0gKE5vZGVJbXBsKiBhcmcsIGludCAmZXhjZXB0
aW9uY29kZSkgPSAwOwogCiAgICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2lnbmVkIGlu
ZGV4ICkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCAgKSBjb25zdCA9
IDA7CisgICAgdmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCA9IDA7CiAKICAgICAvLyBP
dGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCiAgICAgdmlydHVhbCBib29sIGlzUmVhZE9u
bHkoKSB7IHJldHVybiBmYWxzZTsgfQpJbmRleDoga2h0bWwveG1sL0NvbnRhaW5lck5vZGVJbXBs
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL0NvbnRhaW5lck5vZGVJbXBsLmgJKHJldmlzaW9u
IDEyMDYzKQorKysga2h0bWwveG1sL0NvbnRhaW5lck5vZGVJbXBsLmgJKHdvcmtpbmcgY29weSkK
QEAgLTIyLDQ4NyArMjIsMTMgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICoK
ICAqLwotI2lmbmRlZiBfRE9NX05vZGVJbXBsX2hfCi0jZGVmaW5lIF9ET01fTm9kZUltcGxfaF8K
KyNpZm5kZWYgRE9NX0NvbnRhaW5lck5vZGVJbXBsX2gKKyNkZWZpbmUgRE9NX0NvbnRhaW5lck5v
ZGVJbXBsX2gKIAotI2luY2x1ZGUgImRvbS9kb21fc3RyaW5nLmgiCi0jaW5jbHVkZSAiZG9tL2Rv
bV9ub2RlLmgiCi0jaW5jbHVkZSAibWlzYy9oZWxwZXIuaCIKLSNpbmNsdWRlICJtaXNjL3NoYXJl
ZC5oIgotI2luY2x1ZGUgImRvbV9hdG9taWNzdHJpbmcuaCIKLSNpbmNsdWRlICJEb2NQdHIuaCIK
LQotY2xhc3MgUVBhaW50ZXI7Ci10ZW1wbGF0ZSA8Y2xhc3MgdHlwZT4gY2xhc3MgUVB0ckxpc3Q7
Ci10ZW1wbGF0ZSA8Y2xhc3MgdHlwZT4gY2xhc3MgUVB0ckRpY3Q7Ci1jbGFzcyBLSFRNTFZpZXc7
Ci1jbGFzcyBSZW5kZXJBcmVuYTsKLWNsYXNzIFFSZWN0OwotY2xhc3MgUU1vdXNlRXZlbnQ7Ci1j
bGFzcyBRS2V5RXZlbnQ7Ci1jbGFzcyBRVGV4dFN0cmVhbTsKLWNsYXNzIFFTdHJpbmdMaXN0Owot
Y2xhc3MgUVdoZWVsRXZlbnQ7Ci0KLW5hbWVzcGFjZSBraHRtbCB7Ci0gICAgY2xhc3MgUmVuZGVy
T2JqZWN0OwotICAgIGNsYXNzIFJlbmRlclN0eWxlOwotfTsKKyNpbmNsdWRlICJOb2RlSW1wbC5o
IgogCiBuYW1lc3BhY2UgRE9NIHsKIAotY2xhc3MgQXRvbWljU3RyaW5nOwotY2xhc3MgRG9jdW1l
bnRJbXBsOwotY2xhc3MgRWxlbWVudEltcGw7Ci1jbGFzcyBFdmVudEltcGw7Ci1jbGFzcyBFdmVu
dExpc3RlbmVyOwotY2xhc3MgTm9kZUxpc3RJbXBsOwotY2xhc3MgTmFtZWRBdHRyTWFwSW1wbDsK
LWNsYXNzIFF1YWxpZmllZE5hbWU7Ci1jbGFzcyBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcjsKLQot
Ly8gdGhpcyBjbGFzcyBpbXBsZW1lbnRzIG5vZGVzLCB3aGljaCBjYW4gaGF2ZSBhIHBhcmVudCBi
dXQgbm8gY2hpbGRyZW46Ci1jbGFzcyBOb2RlSW1wbCA6IHB1YmxpYyBraHRtbDo6VHJlZVNoYXJl
ZDxOb2RlSW1wbD4KLXsKLSAgICBmcmllbmQgY2xhc3MgRG9jdW1lbnRJbXBsOwotcHVibGljOgot
ICAgIE5vZGVJbXBsKERvY3VtZW50SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5Ob2RlSW1wbCgp
OwotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBOb2RlCi0gICAgdmlydHVh
bCBib29sIGhhc1RhZ05hbWUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyBub2RlTmFtZSgpIGNvbnN0ID0g
MDsKLSAgICB2aXJ0dWFsIERPTVN0cmluZyBub2RlVmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IHZvaWQgc2V0Tm9kZVZhbHVlKCBjb25zdCBET01TdHJpbmcgJl9ub2RlVmFsdWUsIGludCAmZXhj
ZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgbm9kZVR5cGUoKSBjb25z
dCA9IDA7Ci0gICAgTm9kZUltcGwgKnBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBwYXJlbnQo
KTsgfQotICAgIE5vZGVJbXBsICpwcmV2aW91c1NpYmxpbmcoKSBjb25zdCB7IHJldHVybiBtX3By
ZXZpb3VzOyB9Ci0gICAgTm9kZUltcGwgKm5leHRTaWJsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9u
ZXh0OyB9Ci0gICAgdmlydHVhbCBSZWZQdHI8Tm9kZUxpc3RJbXBsPiBjaGlsZE5vZGVzKCk7Ci0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqZmlyc3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9k
ZUltcGwgKmxhc3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBoYXNBdHRyaWJ1dGVz
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOYW1lZEF0dHJNYXBJbXBsICphdHRyaWJ1dGVzKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBEb2N1bWVudEltcGwgKm93bmVyRG9jdW1lbnQoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIE5vZGVJbXBsICppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5v
ZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2Rl
SW1wbCAqcmVwbGFjZUNoaWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hp
bGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlbW92ZUNo
aWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0
dWFsIE5vZGVJbXBsICphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNl
cHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZShpbnQgJmV4Y2VwdGlvbmNvZGUp
OwotICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZE5vZGVzICggICkgY29uc3Q7Ci0gICAgdmlydHVh
bCBOb2RlSW1wbCAqY2xvbmVOb2RlICggYm9vbCBkZWVwICkgPSAwOwotICAgIHZpcnR1YWwgY29u
c3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9t
aWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVmaXgoY29u
c3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIHZvaWQg
bm9ybWFsaXplICgpOwotICAgIHN0YXRpYyBib29sIGlzU3VwcG9ydGVkKGNvbnN0IERPTVN0cmlu
ZyAmZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5nICZ2ZXJzaW9uKTsKLQotICAgIGJvb2wgaXNTYW1l
Tm9kZShOb2RlSW1wbCAqb3RoZXIpIGNvbnN0IHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH0KLSAg
ICBib29sIGlzRXF1YWxOb2RlKE5vZGVJbXBsICpvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc0Rl
ZmF1bHROYW1lc3BhY2UoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0OwotICAg
IERPTVN0cmluZyBsb29rdXBQcmVmaXgoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNv
bnN0OwotICAgIERPTVN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoY29uc3QgRE9NU3RyaW5nICZw
cmVmaXgpIGNvbnN0OwotICAgIAotICAgIERPTVN0cmluZyB0ZXh0Q29udGVudCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0VGV4dENvbnRlbnQoY29uc3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4Y2Vw
dGlvbik7Ci0gICAgCi0gICAgTm9kZUltcGwgKmxhc3REZXNjZW5kYW50KCkgY29uc3Q7Ci0KLSAg
ICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlz
RWxlbWVudE5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBp
c0hUTUxFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSNpZiBTVkdfU1VQUE9SVAot
ICAgIHZpcnR1YWwgYm9vbCBpc1NWR0VsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
I2VuZGlmCi0gICAgdmlydHVhbCBib29sIGlzU3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJu
IGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQXR0cmlidXRlTm9kZSgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzVGV4dE5vZGUoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0NvbW1lbnROb2RlKCkgY29uc3QgeyByZXR1
cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNEb2N1bWVudE5vZGUoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQotICAgIGJvb2wgaXNCbG9ja0Zsb3coKSBjb25zdDsKLSAgICBib29sIGlz
QmxvY2tGbG93T3JCbG9ja1RhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgLy8gVXNlZCBieSA8Zm9y
bT4gZWxlbWVudHMgdG8gaW5kaWNhdGUgYSBtYWxmb3JtZWQgc3RhdGUgb2Ygc29tZSBraW5kLCB0
eXBpY2FsbHkKLSAgICAvLyB1c2VkIHRvIGtlZXAgZnJvbSBhcHBseWluZyB0aGUgYm90dG9tIG1h
cmdpbiBvZiB0aGUgZm9ybS4KLSAgICB2aXJ0dWFsIGJvb2wgaXNNYWxmb3JtZWQoKSB7IHJldHVy
biBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRNYWxmb3JtZWQoYm9vbCBtYWxmb3JtZWQp
IHt9OwotICAgIAotICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgbm90IGJlaW5nIHBhcnQgb2YgdGhl
IERPTQotICAgIC8vIEF0dGVudGlvbjogdGhleSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGRpZCB0
aGUgY29uc2lzdGVuY3kgY2hlY2tpbmchCi0gICAgdm9pZCBzZXRQcmV2aW91c1NpYmxpbmcoTm9k
ZUltcGwgKnByZXZpb3VzKSB7IG1fcHJldmlvdXMgPSBwcmV2aW91czsgfQotICAgIHZvaWQgc2V0
TmV4dFNpYmxpbmcoTm9kZUltcGwgKm5leHQpIHsgbV9uZXh0ID0gbmV4dDsgfQotCi0gICAgdmly
dHVhbCB2b2lkIHNldEZpcnN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKTsKLSAgICB2aXJ0dWFsIHZv
aWQgc2V0TGFzdENoaWxkKE5vZGVJbXBsICpjaGlsZCk7Ci0KLSAgICBOb2RlSW1wbCAqcHJldmlv
dXNOb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuZXh0
Tm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKSBjb25zdDsKLSAgICAKLSAgICBFbGVtZW50SW1w
bCAqZ2V0QW5jZXN0b3JFbGVtZW50KCkgY29uc3Q7Ci0gICAgRE9NU3RyaW5nIGxvb2t1cE5hbWVz
cGFjZVByZWZpeChjb25zdCBET01TdHJpbmcgJl9uYW1lc3BhY2VVUkksIGNvbnN0IEVsZW1lbnRJ
bXBsICpvcmlnaW5hbEVsZW1lbnQpIGNvbnN0OwotICAgIAotICAgIC8qKiAoTm90IHBhcnQgb2Yg
dGhlIG9mZmljaWFsIERPTSkKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGxlYWYgbm9kZS4KLSAg
ICAgKgotICAgICAqIFVzaW5nIHRoaXMgZnVuY3Rpb24gZGVsaXZlcnMgbGVhZiBub2RlcyBhcyBp
ZiB0aGUgd2hvbGUgRE9NIHRyZWUKLSAgICAgKiB3ZXJlIGEgbGluZWFyIGNoYWluIG9mIGl0cyBs
ZWFmIG5vZGVzLgotICAgICAqIEByZXR1cm4gbmV4dCBsZWFmIG5vZGUgb3IgMCBpZiB0aGVyZSBh
cmUgbm8gbW9yZS4KLSAgICAgKi8KLSAgICBOb2RlSW1wbCAqbmV4dExlYWZOb2RlKCkgY29uc3Q7
Ci0KLSAgICAvKiogKE5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBET00pCi0gICAgICogUmV0dXJu
cyB0aGUgcHJldmlvdXMgbGVhZiBub2RlLgotICAgICAqCi0gICAgICogVXNpbmcgdGhpcyBmdW5j
dGlvbiBkZWxpdmVycyBsZWFmIG5vZGVzIGFzIGlmIHRoZSB3aG9sZSBET00gdHJlZQotICAgICAq
IHdlcmUgYSBsaW5lYXIgY2hhaW4gb2YgaXRzIGxlYWYgbm9kZXMuCi0gICAgICogQHJldHVybiBw
cmV2aW91cyBsZWFmIG5vZGUgb3IgMCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4KLSAgICAgKi8KLSAg
ICBOb2RlSW1wbCAqcHJldmlvdXNMZWFmTm9kZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc0VkaXRh
YmxlQmxvY2soKSBjb25zdDsKLSAgICBFbGVtZW50SW1wbCAqZW5jbG9zaW5nQmxvY2tGbG93RWxl
bWVudCgpIGNvbnN0OwotICAgIEVsZW1lbnRJbXBsICplbmNsb3NpbmdCbG9ja0Zsb3dPclRhYmxl
RWxlbWVudCgpIGNvbnN0OwotICAgIEVsZW1lbnRJbXBsICplbmNsb3NpbmdJbmxpbmVFbGVtZW50
KCkgY29uc3Q7Ci0gICAgRWxlbWVudEltcGwgKnJvb3RFZGl0YWJsZUVsZW1lbnQoKSBjb25zdDsK
LSAgICAKLSAgICBib29sIGluU2FtZVJvb3RFZGl0YWJsZUVsZW1lbnQoTm9kZUltcGwgKik7Ci0g
ICAgYm9vbCBpblNhbWVDb250YWluaW5nQmxvY2tGbG93RWxlbWVudChOb2RlSW1wbCAqKTsKLSAg
ICAKLSAgICAvLyB1c2VkIGJ5IHRoZSBwYXJzZXIuIENoZWNrcyBhZ2FpbnN0IHRoZSBEVEQsIHVu
bGlrZSBET00gb3BlcmF0aW9ucyBsaWtlCi0gICAgLy8gYXBwZW5kQ2hpbGQoKSwgYW5kIHJldHVy
bnMgdGhlIG5ldyBjb250YWluZXIgbm9kZSBmb3IgZnV0dXJlIGluc2VydGlvbnMgYXMgeW91IHBh
cnNlLgotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCk7
Ci0gICAgCi0gICAgLy8gY2FsbGVkIGJ5IHRoZSBwYXJzZXIgd2hlbiB0aGlzIGVsZW1lbnQncyBj
bG9zZSB0YWcgaXMgcmVhY2hlZCwKLSAgICAvLyBzaWduYWxsaW5nIHRoYXQgYWxsIGNoaWxkIHRh
Z3MgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWRkZWQuCi0gICAgLy8gVGhpcyBpcyBvbmx5IG5lZWRl
ZCBmb3IgPGFwcGxldD4gYW5kIDxvYmplY3Q+IGVsZW1lbnRzLCB3aGljaCBjYW4ndCBsYXkgdGhl
bXNlbHZlcyBvdXQKLSAgICAvLyB1bnRpbCB0aGV5IGtub3cgYWxsIG9mIHRoZWlyIG5lc3RlZCA8
cGFyYW0+cy4gWzM2MDMxOTEsIDQwNDA4NDhdCi0gICAgdmlydHVhbCB2b2lkIGNsb3NlUmVuZGVy
ZXIoKSB7fQotCi0gICAgZW51bSBNb3VzZUV2ZW50VHlwZSB7Ci0gICAgICAgIE1vdXNlUHJlc3Ms
Ci0gICAgICAgIE1vdXNlUmVsZWFzZSwKLSAgICAgICAgTW91c2VDbGljaywKLSAgICAgICAgTW91
c2VEYmxDbGljaywKLSAgICAgICAgTW91c2VNb3ZlCi0gICAgfTsKLQotICAgIHN0cnVjdCBNb3Vz
ZUV2ZW50Ci0gICAgewotICAgICAgICBNb3VzZUV2ZW50KCBpbnQgX2J1dHRvbiwgTW91c2VFdmVu
dFR5cGUgX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERPTVN0cmluZyAmX3VybCA9
IERPTVN0cmluZygpLCBjb25zdCBET01TdHJpbmcmIF90YXJnZXQgPSBET01TdHJpbmcoKSwKLSAg
ICAgICAgICAgICAgICAgICAgTm9kZUltcGwgKl9pbm5lck5vZGUgPSAwKQotICAgICAgICAgICAg
ewotICAgICAgICAgICAgICAgIGJ1dHRvbiA9IF9idXR0b247IHR5cGUgPSBfdHlwZTsKLSAgICAg
ICAgICAgICAgICB1cmwgPSBfdXJsOyB0YXJnZXQgPSBfdGFyZ2V0OwotICAgICAgICAgICAgICAg
IGlubmVyTm9kZSA9IF9pbm5lck5vZGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJ1
dHRvbjsKLSAgICAgICAgTW91c2VFdmVudFR5cGUgdHlwZTsKLSAgICAgICAgRE9NU3RyaW5nIHVy
bDsgLy8gdXJsIHVuZGVyIG1vdXNlIG9yIGVtcHR5Ci0gICAgICAgIERPTVN0cmluZyB0YXJnZXQ7
Ci0gICAgICAgIFJlZlB0cjxOb2RlSW1wbD4gaW5uZXJOb2RlOwotICAgIH07Ci0KLSAgICAvLyBm
b3IgTElOSyBhbmQgU1RZTEUKLSAgICB2aXJ0dWFsIHZvaWQgc2hlZXRMb2FkZWQoKSB7fQotCi0g
ICAgYm9vbCBoYXNJRCgpIGNvbnN0ICAgICAgeyByZXR1cm4gbV9oYXNJZDsgfQotICAgIGJvb2wg
aGFzQ2xhc3MoKSBjb25zdCAgIHsgcmV0dXJuIG1faGFzQ2xhc3M7IH0KLSAgICBib29sIGhhc1N0
eWxlKCkgY29uc3QgICB7IHJldHVybiBtX2hhc1N0eWxlOyB9Ci0gICAgYm9vbCBhY3RpdmUoKSBj
b25zdCAgICAgeyByZXR1cm4gbV9hY3RpdmU7IH0KLSAgICBib29sIGluQWN0aXZlQ2hhaW4oKSBj
b25zdCB7IHJldHVybiBtX2luQWN0aXZlQ2hhaW47IH0KLSAgICBib29sIGhvdmVyZWQoKSBjb25z
dCB7IHJldHVybiBtX2hvdmVyZWQ7IH0KLSAgICBib29sIGZvY3VzZWQoKSBjb25zdCB7IHJldHVy
biBtX2ZvY3VzZWQ7IH0KLSAgICBib29sIGF0dGFjaGVkKCkgY29uc3QgICB7IHJldHVybiBtX2F0
dGFjaGVkOyB9Ci0gICAgYm9vbCBjaGFuZ2VkKCkgY29uc3QgICAgeyByZXR1cm4gbV9jaGFuZ2Vk
OyB9Ci0gICAgYm9vbCBoYXNDaGFuZ2VkQ2hpbGQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NoYW5n
ZWRDaGlsZDsgfQotICAgIGJvb2wgaXNMaW5rKCkgY29uc3QgeyByZXR1cm4gbV9pc0xpbms7IH0K
LSAgICAvLyBpbkRvY3VtZW50IHNob3VsZCBhbHNvIG1ha2Ugc3VyZSBhIGRvY3VtZW50IGV4aXN0
cyBpbiBjYXNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBkZXN0cm95ZWQgYmVmb3JlIHRoZSBub2Rl
IGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQuCi0gICAgYm9vbCBpbkRvY3VtZW50KCkgY29u
c3QgeyByZXR1cm4gZG9jdW1lbnQuZ2V0KCkgJiYgbV9pbkRvY3VtZW50OyB9Ci0gICAgYm9vbCBz
dHlsZUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlRWxlbWVudDsgfQotICAgIGJvb2wg
aW1wbGljaXROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsaWNpdDsgfQotICAgIHZvaWQgc2V0
SGFzSUQoYm9vbCBiPXRydWUpIHsgbV9oYXNJZCA9IGI7IH0KLSAgICB2b2lkIHNldEhhc0NsYXNz
KGJvb2wgYj10cnVlKSB7IG1faGFzQ2xhc3MgPSBiOyB9Ci0gICAgdm9pZCBzZXRIYXNTdHlsZShi
b29sIGI9dHJ1ZSkgeyBtX2hhc1N0eWxlID0gYjsgfQotICAgIHZvaWQgc2V0SGFzQ2hhbmdlZENo
aWxkKCBib29sIGIgPSB0cnVlICkgeyBtX2hhc0NoYW5nZWRDaGlsZCA9IGI7IH0KLSAgICB2b2lk
IHNldEluRG9jdW1lbnQoYm9vbCBiPXRydWUpIHsgbV9pbkRvY3VtZW50ID0gYjsgfQotICAgIHZp
cnR1YWwgdm9pZCBzZXRGb2N1cyhib29sIGI9dHJ1ZSkgeyBtX2ZvY3VzZWQgPSBiOyB9Ci0gICAg
dmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29sIGI9dHJ1ZSwgYm9vbCBwYXVzZT1mYWxzZSkgeyBt
X2FjdGl2ZSA9IGI7IH0KLSAgICB2b2lkIHNldEluQWN0aXZlQ2hhaW4oYm9vbCBiPXRydWUpIHsg
bV9pbkFjdGl2ZUNoYWluID0gYjsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRIb3ZlcmVkKGJvb2wg
Yj10cnVlKSB7IG1faG92ZXJlZCA9IGI7IH0KLSAgICB2b2lkIHNldENoYW5nZWQoYm9vbCBiPXRy
dWUpOwotCi0gICAgdW5zaWduZWQgc2hvcnQgdGFiSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3Rh
YkluZGV4OyB9Ci0gICAgdm9pZCBzZXRUYWJJbmRleCh1bnNpZ25lZCBzaG9ydCBfdGFiSW5kZXgp
IHsgbV90YWJJbmRleCA9IF90YWJJbmRleDsgfQotCi0gICAgLyoqCi0gICAgICAgICogd2hldGhl
ciB0aGlzIG5vZGUgY2FuIHJlY2VpdmUgdGhlIGtleWJvYXJkIGZvY3VzLgotICAgICAqLwotICAg
IHZpcnR1YWwgYm9vbCBpc0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0tl
eWJvYXJkRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzTW91c2VGb2N1c2Fi
bGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNDb250cm9sKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0gLy8gRXZlbnR1YWxseSB0aGUgbm90aW9uIG9mIHdoYXQgaXMgYSBjb250cm9sIHdp
bGwgYmUgZXh0ZW5zaWJsZS4KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0NoZWNrZWQoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0luZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBRUmVjdCBnZXRSZWN0KCkgY29uc3Q7Ci0KLSAgICBlbnVtIFN0eWxl
Q2hhbmdlIHsgTm9DaGFuZ2UsIE5vSW5oZXJpdCwgSW5oZXJpdCwgRGV0YWNoLCBGb3JjZSB9Owot
ICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgPSBOb0NoYW5nZSApIHt9
Ci0gICAgU3R5bGVDaGFuZ2UgZGlmZigga2h0bWw6OlJlbmRlclN0eWxlICpzMSwga2h0bWw6OlJl
bmRlclN0eWxlICpzMiApIGNvbnN0OwotCi0gICAgdW5zaWduZWQgbm9kZUluZGV4KCkgY29uc3Q7
Ci0gICAgLy8gUmV0dXJucyB0aGUgZG9jdW1lbnQgdGhhdCB0aGlzIG5vZGUgaXMgYXNzb2NpYXRl
ZCB3aXRoLiBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIGJlIG5vbi1udWxsLCBhcyBvcHBv
c2VkIHRvCi0gICAgLy8gRE9NJ3Mgb3duZXJEb2N1bWVudCgpIHdoaWNoIGlzIG51bGwgZm9yIERv
Y3VtZW50IG5vZGVzIChhbmQgc29tZXRpbWVzIERvY3VtZW50VHlwZSBub2RlcykuCi0gICAgRG9j
dW1lbnRJbXBsKiBnZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGRvY3VtZW50LmdldCgpOyB9
Ci0KLSAgICB2b2lkIHNldERvY3VtZW50KERvY3VtZW50SW1wbCAqZG9jKTsKLQotICAgIHZvaWQg
YWRkRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0
ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9pZCByZW1vdmVFdmVudExp
c3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0
ZW5lciwgYm9vbCB1c2VDYXB0dXJlKTsKLSAgICB2b2lkIHJlbW92ZUhUTUxFdmVudExpc3RlbmVy
KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLSAgICB2b2lkIHNldEhUTUxFdmVudExp
c3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0
ZW5lcik7Ci0gICAgRXZlbnRMaXN0ZW5lciAqZ2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRv
bWljU3RyaW5nICZldmVudFR5cGUpOwotICAgIHZvaWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMo
KTsKLQotICAgIGJvb2wgZGlzcGF0Y2hFdmVudChFdmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRp
b25jb2RlLCBib29sIHRlbXBFdmVudCA9IGZhbHNlKTsKLSAgICBib29sIGRpc3BhdGNoR2VuZXJp
Y0V2ZW50KCBFdmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGRp
c3BhdGNoSFRNTEV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1
YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJnKTsKLSAgICBib29sIGRpc3BhdGNoV2luZG93RXZl
bnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIGJvb2wgY2FuQnViYmxlQXJnLCBib29s
IGNhbmNlbGFibGVBcmcpOwotICAgIGJvb2wgZGlzcGF0Y2hNb3VzZUV2ZW50KFFNb3VzZUV2ZW50
ICplLCBjb25zdCBBdG9taWNTdHJpbmcgJm92ZXJyaWRlVHlwZSwgaW50IG92ZXJyaWRlRGV0YWls
ID0gMCk7Ci0gICAgYm9vbCBkaXNwYXRjaFNpbXVsYXRlZE1vdXNlRXZlbnQoY29uc3QgQXRvbWlj
U3RyaW5nICZldmVudFR5cGUpOwotICAgIGJvb2wgZGlzcGF0Y2hNb3VzZUV2ZW50KGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlLCBpbnQgYnV0dG9uLCBpbnQgZGV0YWlsLAotICAgICAgICBp
bnQgY2xpZW50WCwgaW50IGNsaWVudFksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwKLSAgICAg
ICAgYm9vbCBjdHJsS2V5LCBib29sIGFsdEtleSwgYm9vbCBzaGlmdEtleSwgYm9vbCBtZXRhS2V5
KTsKLSAgICBib29sIGRpc3BhdGNoVUlFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlw
ZSwgaW50IGRldGFpbCA9IDApOwotICAgIGJvb2wgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVu
dChib29sIGNoaWxkcmVuQ2hhbmdlZCA9IHRydWUpOwotICAgIGJvb2wgZGlzcGF0Y2hLZXlFdmVu
dChRS2V5RXZlbnQgKmtleSk7Ci0gICAgdm9pZCBkaXNwYXRjaFdoZWVsRXZlbnQoUVdoZWVsRXZl
bnQgKik7Ci0KLSAgICB2b2lkIGhhbmRsZUxvY2FsRXZlbnRzKEV2ZW50SW1wbCAqZXZ0LCBib29s
IHVzZUNhcHR1cmUpOwotCi0gICAgLy8gSGFuZGxlcnMgdG8gZG8vdW5kbyBhY3Rpb25zIG9uIHRo
ZSB0YXJnZXQgbm9kZSBiZWZvcmUgYW4gZXZlbnQgaXMgZGlzcGF0Y2hlZCB0byBpdCBhbmQgYWZ0
ZXIgdGhlIGV2ZW50Ci0gICAgLy8gaGFzIGJlZW4gZGlzcGF0Y2hlZC4gIFRoZSBkYXRhIHBvaW50
ZXIgaXMgaGFuZGVkIGJhY2sgYnkgdGhlIHByZURpc3BhdGNoIGFuZCBwYXNzZWQgdG8gcG9zdERp
c3BhdGNoLgotICAgIHZpcnR1YWwgdm9pZCogcHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJ
bXBsICpldnQpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZl
bnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKSB7fQotCi0gICAgLyoqCi0gICAg
ICogUGVyZm9ybSB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIGFuIGV2ZW50IGUuZy4gc3VibWl0dGlu
ZyBhIGZvcm0KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihF
dmVudEltcGwgKmV2dCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciBkaXNhYmxlZCBmb3Jt
IGVsZW1lbnRzOyBpZiB0cnVlLCBwcmV2ZW50cyBtb3VzZSBldmVudHMgZnJvbSBiZWluZyBkaXNw
YXRjaGVkCi0gICAgICogdG8gZXZlbnQgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgRE9NQWN0aXZh
dGUgZXZlbnRzIGZyb20gYmVpbmcgc2VudCBhdCBhbGwuCi0gICAgICovCi0gICAgdmlydHVhbCBi
b29sIGRpc2FibGVkKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgpOwot
ICAgIHZpcnR1YWwgYm9vbCBjaGlsZFR5cGVBbGxvd2VkKCB1bnNpZ25lZCBzaG9ydCAvKnR5cGUq
LyApIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBjaGlsZE5vZGVDb3Vu
dCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRl
eCk7Ci0KLSAgICAvKioKLSAgICAgKiBEb2VzIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUg
dHJlZSB0byBmaW5kIHRoZSBub2RlIG5leHQgbm9kZSBhZnRlciB0aGlzIG9uZS4gVGhpcyB1c2Vz
IHRoZSBzYW1lIG9yZGVyIHRoYXQKLSAgICAgKiB0aGUgdGFncyBhcHBlYXIgaW4gdGhlIHNvdXJj
ZSBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXlXaXRoaW4gSWYgbm90IG51bGwsIHRo
ZSB0cmF2ZXJzYWwgd2lsbCBzdG9wIG9uY2UgdGhlIHNwZWNpZmllZCBub2RlIGlzIHJlYWNoZWQu
IFRoaXMgY2FuIGJlIHVzZWQgdG8KLSAgICAgKiByZXN0cmljdCB0cmF2ZXJzYWwgdG8gYSBwYXJ0
aWN1bGFyIHN1Yi10cmVlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV4dCBub2RlLCBp
biBkb2N1bWVudCBvcmRlcgotICAgICAqCi0gICAgICogc2VlIEByZWYgdHJhdmVyc2VQcmV2aW91
c05vZGUoKQotICAgICAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZU5leHROb2RlKGNvbnN0IE5v
ZGVJbXBsICpzdGF5V2l0aGluID0gMCkgY29uc3Q7Ci0gICAgCi0gICAgLyogTGlrZSB0cmF2ZXJz
ZU5leHROb2RlLCBidXQgc2tpcHMgY2hpbGRyZW4gYW5kIHN0YXJ0cyB3aXRoIHRoZSBuZXh0IHNp
YmxpbmcuICovCi0gICAgTm9kZUltcGwgKnRyYXZlcnNlTmV4dFNpYmxpbmcoY29uc3QgTm9kZUlt
cGwgKnN0YXlXaXRoaW4gPSAwKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIERvZXMgYSByZXZl
cnNlIHByZS1vcmRlciB0cmF2ZXJzYWwgdG8gZmluZCB0aGUgbm9kZSB0aGF0IGNvbWVzIGJlZm9y
ZSB0aGUgY3VycmVudCBvbmUgaW4gZG9jdW1lbnQgb3JkZXIKLSAgICAgKgotICAgICAqIHNlZSBA
cmVmIHRyYXZlcnNlTmV4dE5vZGUoKQotICAgICAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZVBy
ZXZpb3VzTm9kZSgpIGNvbnN0OwotCi0gICAgLyogTGlrZSB0cmF2ZXJzZVByZXZpb3VzTm9kZSwg
YnV0IHZpc2l0cyBub2RlcyBiZWZvcmUgdGhlaXIgY2hpbGRyZW4uICovCi0gICAgTm9kZUltcGwg
KnRyYXZlcnNlUHJldmlvdXNOb2RlUG9zdE9yZGVyKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGlu
ID0gMCkgY29uc3Q7Ci0KLSAgICBOb2RlSW1wbCAqcHJldmlvdXNFZGl0YWJsZSgpIGNvbnN0Owot
ICAgIE5vZGVJbXBsICpuZXh0RWRpdGFibGUoKSBjb25zdDsKLSAgICAvL2Jvb2wgaXNFZGl0YWJs
ZSgpIGNvbnN0OwotCi0gICAga2h0bWw6OlJlbmRlck9iamVjdCAqcmVuZGVyZXIoKSBjb25zdCB7
IHJldHVybiBtX3JlbmRlcjsgfQotICAgIGtodG1sOjpSZW5kZXJPYmplY3QgKm5leHRSZW5kZXJl
cigpOwotICAgIGtodG1sOjpSZW5kZXJPYmplY3QgKnByZXZpb3VzUmVuZGVyZXIoKTsKLSAgICB2
b2lkIHNldFJlbmRlcmVyKGtodG1sOjpSZW5kZXJPYmplY3QqIHJlbmRlcmVyKSB7IG1fcmVuZGVy
ID0gcmVuZGVyZXI7IH0KLSAgICAKLSAgICB2b2lkIGNoZWNrU2V0UHJlZml4KGNvbnN0IEF0b21p
Y1N0cmluZyAmX3ByZWZpeCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGlzQW5jZXN0
b3IoY29uc3QgTm9kZUltcGwgKikgY29uc3Q7Ci0KLQkvLyBUaGVzZSB0d28gbWV0aG9kcyBhcmUg
bXV0dWFsbHkgZXhjbHVzaXZlLiAgVGhlIGZvcm1lciBpcyB1c2VkIHRvIGRvIHN0cmljdCBlcnJv
ci1jaGVja2luZwotCS8vIHdoZW4gYWRkaW5nIGNoaWxkcmVuIHZpYSB0aGUgcHVibGljIERPTSBB
UEkgKGUuZy4sIGFwcGVuZENoaWxkKCkpLiAgVGhlIGxhdHRlciBpcyBjYWxsZWQgb25seSB3aGVu
IHBhcnNpbmcsIAotCS8vIHRvIHNhbml0eS1jaGVjayBhZ2FpbnN0IHRoZSBEVEQgZm9yIGVycm9y
IHJlY292ZXJ5LgotCXZvaWQgY2hlY2tBZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSk7ICAgIC8vIEVycm9yLWNoZWNraW5nIHdoZW4gYWRkaW5nIHZpYSB0aGUg
RE9NIEFQSQotCXZpcnR1YWwgYm9vbCBjaGlsZEFsbG93ZWQoTm9kZUltcGwgKm5ld0NoaWxkKTsJ
CQkJICAgLy8gRXJyb3ItY2hlY2tpbmcgZHVyaW5nIHBhcnNpbmcgdGhhdCBjaGVja3MgdGhlIERU
RAotCQotICAgIHZpcnR1YWwgaW50IG1heE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50
IGNhcmV0TWluT2Zmc2V0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgY2FyZXRNYXhPZmZzZXQo
KSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGNhcmV0TWF4UmVuZGVyZWRPZmZzZXQoKSBj
b25zdDsKLQotICAgIHZpcnR1YWwgaW50IHByZXZpb3VzT2Zmc2V0IChpbnQgY3VycmVudCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBpbnQgbmV4dE9mZnNldCAoaW50IGN1cnJlbnQpIGNvbnN0OwotICAg
IAotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3Ry
ZWFtLCBRU3RyaW5nIGluZCA9ICIiKSBjb25zdDsKLSNlbmRpZgotCi0gICAgLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLSAgICAvLyBJbnRlZ3JhdGlvbiB3aXRoIHJlbmRlcmluZyB0cmVlCi0KLSAg
ICAvKioKLSAgICAgKiBBdHRhY2hlcyB0aGlzIG5vZGUgdG8gdGhlIHJlbmRlcmluZyB0cmVlLiBU
aGlzIGNhbGN1bGF0ZXMgdGhlIHN0eWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIG5vZGUgYW5kIGNy
ZWF0ZXMgYW4KLSAgICAgKiBhcHByb3ByaWF0ZSBSZW5kZXJPYmplY3Qgd2hpY2ggd2lsbCBiZSBp
bnNlcnRlZCBpbnRvIHRoZSB0cmVlIChleGNlcHQgd2hlbiB0aGUgc3R5bGUgaGFzIGRpc3BsYXk6
IG5vbmUpLiBUaGlzCi0gICAgICogbWFrZXMgdGhlIG5vZGUgdmlzaWJsZSBpbiB0aGUgS0hUTUxW
aWV3LgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLQotICAgIC8qKgotICAg
ICAqIERldGFjaGVzIHRoZSBub2RlIGZyb20gdGhlIHJlbmRlcmluZyB0cmVlLCBtYWtpbmcgaXQg
aW52aXNpYmxlIGluIHRoZSByZW5kZXJlZCB2aWV3LiBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZQot
ICAgICAqIHRoZSBub2RlJ3MgcmVuZGVyaW5nIG9iamVjdCBmcm9tIHRoZSByZW5kZXJpbmcgdHJl
ZSBhbmQgZGVsZXRlIGl0LgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCB3aWxsUmVtb3ZlKCk7Ci0gICAgdm9pZCBjcmVhdGVSZW5kZXJlcklm
TmVlZGVkKCk7Ci0gICAgdmlydHVhbCBraHRtbDo6UmVuZGVyU3R5bGUgKnN0eWxlRm9yUmVuZGVy
ZXIoa2h0bWw6OlJlbmRlck9iamVjdCAqcGFyZW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVuZGVy
ZXJJc05lZWRlZChraHRtbDo6UmVuZGVyU3R5bGUgKik7Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICB2
aXJ0dWFsIGJvb2wgY2hpbGRTaG91bGRDcmVhdGVSZW5kZXJlcihET006Ok5vZGVJbXBsICopIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLSNlbmRpZgotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9i
amVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICop
OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRob2RzIGZvciBtYWlu
dGFpbmluZyB0aGUgc3RhdGUgb2YgdGhlIGVsZW1lbnQgYmV0d2VlbiBoaXN0b3J5IG5hdmlnYXRp
b24KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHR5cGUg
b2Ygbm9kZSBtYWludGFpbnMgaXQncyBzdGF0ZS4gSWYgc28sIHRoZSBzdGF0ZSBvZiB0aGUgbm9k
ZSB3aWxsIGJlIHN0b3JlZCB3aGVuCi0gICAgICogdGhlIHVzZXIgZ29lcyB0byBhIGRpZmZlcmVu
dCBwYWdlIHVzaW5nIHRoZSBzdGF0ZSgpIG1ldGhvZCwgYW5kIHJlc3RvcmVkIHVzaW5nIHRoZSBy
ZXN0b3JlU3RhdGUoKSBtZXRob2QgaWYgdGhlCi0gICAgICogdXNlciByZXR1cm5zIChlLmcuIHVz
aW5nIHRoZSBiYWNrIGJ1dHRvbikuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB1c2VyLWNo
YW5nZWFibGUgZWxlbWVudHMgc3VjaCBhcyBmb3JtCi0gICAgICogY29udHJvbHMgbWFpbnRhaW4g
dGhlaXIgY29udGVudHMgd2hlbiB0aGUgdXNlciByZXR1cm5zIHRvIGEgcHJldmlvdXMgcGFnZSBp
biB0aGUgaGlzdG9yeS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUo
KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoaXMgbm9kZSByZXBy
ZXNlbnRlZCBhcyBhIHN0cmluZy4gVGhpcyBzdHJpbmcgd2lsbCBiZSBwYXNzZWQgdG8gcmVzdG9y
ZVN0YXRlKCkgaWYgdGhlIHVzZXIKLSAgICAgKiByZXR1cm5zIHRvIHRoZSBwYWdlLgotICAgICAq
Ci0gICAgICogQHJldHVybiBTdGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSByZXByZXNl
bnRlZCBhcyBhIHN0cmluZwotICAgICAqLwotICAgIHZpcnR1YWwgUVN0cmluZyBzdGF0ZSgpOwot
Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGVsZW1lbnQgYmFzZWQgb24g
c3RyaW5ncyBwcmV2aW91c2x5IHJldHVybmVkIGJ5IHN0YXRlKCkuIFRoaXMgaXMgdXNlZCB0byBp
bml0aWFsaXplIGZvcm0KLSAgICAgKiBjb250cm9scyB3aXRoIHRoZWlyIG9sZCB2YWx1ZXMgd2hl
biB0aGUgdXNlciByZXR1cm5zIHRvIHRoZSBwYWdlIGluIHRoZWlyIGhpc3RvcnkuICBUaGUgcmVj
ZWl2ZXIKLSAgICAgKiBzaG91bGQgcmVtb3ZlIHRoZSBzdHJpbmcgZnJvbSB0aGUgbGlzdCB0aGF0
IGl0IHVzZXMgZm9yIGl0cyByZXN0b3JlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXRlcyBU
aGUgc3RyaW5ncyBwcmV2aW91c2x5IHJldHVybmVkIGJ5IG5vZGVzJyBzdGF0ZSBtZXRob2RzLgot
ICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCByZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRl
TGlzdCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5vdGlmaWNhdGlv
biBvZiBkb2N1bWVudCBzdHVjdHVyZSBjaGFuZ2VzCi0KLSAgICAvKioKLSAgICAgKiBOb3RpZmll
cyB0aGUgbm9kZSB0aGF0IGl0IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIGRvY3VtZW50LiBU
aGlzIGlzIGNhbGxlZCBkdXJpbmcgZG9jdW1lbnQgcGFyc2luZywgYW5kIGFsc28KLSAgICAgKiB3
aGVuIGEgbm9kZSBpcyBhZGRlZCB0aHJvdWdoIHRoZSBET00gbWV0aG9kcyBpbnNlcnRCZWZvcmUo
KSwgYXBwZW5kQ2hpbGQoKSBvciByZXBsYWNlQ2hpbGQoKS4gTm90ZSB0aGF0IHRoaXMgb25seQot
ICAgICAqIGhhcHBlbnMgd2hlbiB0aGUgbm9kZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGRvY3VtZW50
IHRyZWUsIGkuZS4gb25seSB3aGVuIHRoZSBkb2N1bWVudCBpcyBhY3R1YWxseSBhbiBhbmNlc3Rv
ciBvZgotICAgICAqIHRoZSBub2RlLiBUaGUgY2FsbCBoYXBwZW5zIF9hZnRlcl8gdGhlIG5vZGUg
aGFzIGJlZW4gYWRkZWQgdG8gdGhlIHRyZWUuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHNpbWls
YXIgdG8gdGhlIERPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudCBET00gZXZlbnQsIGJ1dCBkb2Vz
IG5vdCByZXF1aXJlIHRoZSBvdmVyaGVhZCBvZiBldmVudAotICAgICAqIGRpc3BhdGNoaW5nLgot
ICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAg
LyoqCi0gICAgICogTm90aWZpZXMgdGhlIG5vZGUgdGhhdCBpdCBpcyBubyBsb25nZXIgcGFydCBv
ZiB0aGUgZG9jdW1lbnQgdHJlZSwgaS5lLiB3aGVuIHRoZSBkb2N1bWVudCBpcyBubyBsb25nZXIg
YW4gYW5jZXN0b3IKLSAgICAgKiBub2RlLgotICAgICAqCi0gICAgICogVGhpcyBpcyBzaW1pbGFy
IHRvIHRoZSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCBET00gZXZlbnQsIGJ1dCBkb2VzIG5v
dCByZXF1aXJlIHRoZSBvdmVyaGVhZCBvZiBldmVudAotICAgICAqIGRpc3BhdGNoaW5nLCBhbmQg
aXMgY2FsbGVkIF9hZnRlcl8gdGhlIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgotICAg
ICAqLwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0KLSAgICAvLyBU
aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aGVuZXZlciB5b3UgYXJlIGNvbm5lY3RlZCBvciBk
aXNjb25uZWN0ZWQgZnJvbSBhIHRyZWUuICBUaGF0IHRyZWUgbWF5IGJlIHRoZSBtYWluCi0gICAg
Ly8gZG9jdW1lbnQgdHJlZSwgb3IgaXQgY291bGQgYmUgYW5vdGhlciBkaXNjb25uZWN0ZWQgdHJl
ZS4gIE92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucyB0byBkbyBhbnkgd29yayB0aGF0IGRlcGVuZHMK
LSAgICAvLyBvbiBjb25uZWN0ZWRuZXNzIHRvIHNvbWUgYW5jZXN0b3IgKGUuZy4sIGFuIGFuY2Vz
dG9yIDxmb3JtPiBmb3IgZXhhbXBsZSkuCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b1Ry
ZWUoYm9vbCBkZWVwKSB7fTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJvb2wg
ZGVlcCkge307Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0IGl0J3Mg
bGlzdCBvZiBjaGlsZHJlbiBoYXZlIGNoYW5nZWQgKGVpdGhlciBieSBhZGRpbmcgb3IgcmVtb3Zp
bmcgY2hpbGQgbm9kZXMpLCBvciBhIGNoaWxkCi0gICAgICogbm9kZSB0aGF0IGlzIG9mIHRoZSB0
eXBlIENEQVRBX1NFQ1RJT05fTk9ERSwgVEVYVF9OT0RFIG9yIENPTU1FTlRfTk9ERSBoYXMgY2hh
bmdlZCBpdHMgdmFsdWUuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdl
ZCgpOwotCi0gICAgdmlydHVhbCBET01TdHJpbmcgdG9TdHJpbmcoKSBjb25zdCA9IDA7Ci0gICAg
Ci0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBmb3JtYXRGb3JEZWJ1Z2dlcihjaGFy
ICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNob3dOb2RlKGNv
bnN0IGNoYXIgKnByZWZpeD0iIikgY29uc3Q7Ci0gICAgdm9pZCBzaG93VHJlZSgpIGNvbnN0Owot
ICAgIHZvaWQgc2hvd1RyZWVBbmRNYXJrKE5vZGVJbXBsICogbWFya2VkTm9kZTEsIGNvbnN0IGNo
YXIgKiBtYXJrZWRMYWJlbDEsIE5vZGVJbXBsICogbWFya2VkTm9kZTIsIGNvbnN0IGNoYXIgKiBt
YXJrZWRMYWJlbDIpIGNvbnN0OwotCQotI2VuZGlmCi0KLSAgICB2b2lkIHJlZ2lzdGVyTm9kZUxp
c3QoTm9kZUxpc3RJbXBsICpsaXN0KTsKLSAgICB2b2lkIHVucmVnaXN0ZXJOb2RlTGlzdChOb2Rl
TGlzdEltcGwgKmxpc3QpOwotICAgIHZvaWQgbm90aWZ5Tm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2Vk
KCk7Ci0gICAgdm9pZCBub3RpZnlMb2NhbE5vZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpOwotICAg
IHZvaWQgbm90aWZ5Tm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpOwotICAgIHZvaWQgbm90aWZ5
TG9jYWxOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0gICAgCi0gICAgUmVmUHRyPE5vZGVM
aXN0SW1wbD4gZ2V0RWxlbWVudHNCeVRhZ05hbWUoY29uc3QgRE9NU3RyaW5nICZuYW1lKSB7IHJl
dHVybiBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKCIqIiwgbmFtZSk7IH0KLSAgICBSZWZQdHI8Tm9k
ZUxpc3RJbXBsPiBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKGNvbnN0IERPTVN0cmluZyAmbmFtZXNw
YWNlVVJJLCBjb25zdCBET01TdHJpbmcgJmxvY2FsTmFtZSk7Ci0KLXByaXZhdGU6IC8vIG1lbWJl
cnMKLSAgICBEb2NQdHI8RG9jdW1lbnRJbXBsPiBkb2N1bWVudDsKLSAgICBOb2RlSW1wbCAqbV9w
cmV2aW91czsKLSAgICBOb2RlSW1wbCAqbV9uZXh0OwotcHJvdGVjdGVkOgotICAgIGtodG1sOjpS
ZW5kZXJPYmplY3QgKm1fcmVuZGVyOwotICAgIFFQdHJMaXN0PFJlZ2lzdGVyZWRFdmVudExpc3Rl
bmVyPiAqbV9yZWdkTGlzdGVuZXJzOwotICAgIFFQdHJEaWN0PE5vZGVMaXN0SW1wbD4gKm1fbm9k
ZUxpc3RzOwotCi0gICAgdW5zaWduZWQgc2hvcnQgbV90YWJJbmRleCA6IDE1OwotICAgIGJvb2wg
bV9oYXNUYWJJbmRleCAgOiAxOwotCi0gICAgYm9vbCBtX2hhc0lkIDogMTsKLSAgICBib29sIG1f
aGFzQ2xhc3MgOiAxOwotICAgIGJvb2wgbV9oYXNTdHlsZSA6IDE7Ci0gICAgYm9vbCBtX2F0dGFj
aGVkIDogMTsKLSAgICBib29sIG1fY2hhbmdlZCA6IDE7Ci0gICAgYm9vbCBtX2hhc0NoYW5nZWRD
aGlsZCA6IDE7Ci0gICAgYm9vbCBtX2luRG9jdW1lbnQgOiAxOwotCi0gICAgYm9vbCBtX2lzTGlu
ayA6IDE7Ci0gICAgYm9vbCBtX3NwZWNpZmllZCA6IDE7IC8vIHVzZWQgaW4gQXR0ckltcGwuIEFj
Y2Vzc29yIGZ1bmN0aW9ucyB0aGVyZQotICAgIGJvb2wgbV9mb2N1c2VkIDogMTsKLSAgICBib29s
IG1fYWN0aXZlIDogMTsKLSAgICBib29sIG1faG92ZXJlZCA6IDE7Ci0gICAgYm9vbCBtX2luQWN0
aXZlQ2hhaW4gOiAxOwotICAgIGJvb2wgbV9zdHlsZUVsZW1lbnQgOiAxOyAvLyBjb250YWlucyBz
dHlsZXNoZWV0IHRleHQKLSAgICBib29sIG1faW1wbGljaXQgOiAxOyAvLyBpbXBsaWNpdGVseSBn
ZW5lcmF0ZWQgYnkgdGhlIHBhcnNlcgotCi0gICAgYm9vbCBtX2luRGV0YWNoIDogMTsKLX07Ci0K
IGNsYXNzIENvbnRhaW5lck5vZGVJbXBsIDogcHVibGljIE5vZGVJbXBsCiB7CiBwdWJsaWM6CkBA
IC01MzEsNyArNTcsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwogICAg
IHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKIAotICAgIHZpcnR1YWwgUVJlY3QgZ2V0UmVjdCgpIGNv
bnN0OworICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50UmVjdCBnZXRSZWN0KCkgY29uc3Q7CiAgICAg
Ym9vbCBnZXRVcHBlckxlZnRDb3JuZXIoaW50ICZ4UG9zLCBpbnQgJnlQb3MpIGNvbnN0OwogICAg
IGJvb2wgZ2V0TG93ZXJSaWdodENvcm5lcihpbnQgJnhQb3MsIGludCAmeVBvcykgY29uc3Q7CiAK
QEAgLTU0Niw3ICs3Miw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRv
VHJlZShib29sIGRlZXApOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbVRyZWUoYm9vbCBk
ZWVwKTsKIAotLy9wcm90ZWN0ZWQ6CiAgICAgTm9kZUltcGwgKl9maXJzdDsKICAgICBOb2RlSW1w
bCAqX2xhc3Q7CiAKQEAgLTU2NCwxMDUgKzg5LDUgQEAgcHVibGljOgogICAgIHZvaWQgZGlzcGF0
Y2hDaGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICk7CiB9OwogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xhc3MgTm9kZTsKLWNsYXNzIE5vZGVJ
bXBsOwotCi1jbGFzcyBOb2RlTGlzdEltcGwgOiBwdWJsaWMga2h0bWw6OlNoYXJlZDxOb2RlTGlz
dEltcGw+Ci17Ci1wdWJsaWM6Ci0gICAgTm9kZUxpc3RJbXBsKCBOb2RlSW1wbCAqX3Jvb3ROb2Rl
ICk7Ci0gICAgdmlydHVhbCB+Tm9kZUxpc3RJbXBsKCk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAm
IGF0dHJpYnV0ZXMgZm9yIE5vZGVMaXN0Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBj
b25zdCA9IDA7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4ICkg
Y29uc3QgPSAwOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW1CeUlkICggY29uc3QgRE9NU3Ry
aW5nICYgZWxlbWVudElkICkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFy
dCBvZiBET00pCi0KLSAgICB2aXJ0dWFsIHZvaWQgcm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKTsK
LSAgICB2aXJ0dWFsIHZvaWQgcm9vdE5vZGVBdHRyaWJ1dGVDaGFuZ2VkKCkge30KLQotcHJvdGVj
dGVkOgotICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHNlYXJjaGluZyBhbGwgRWxlbWVudElt
cGxzIGluIGEgdHJlZQotICAgIHVuc2lnbmVkIHJlY3Vyc2l2ZUxlbmd0aChOb2RlSW1wbCAqc3Rh
cnQgPSAwKSBjb25zdDsKLSAgICBOb2RlSW1wbCAqcmVjdXJzaXZlSXRlbSAoIHVuc2lnbmVkIG9m
ZnNldCwgTm9kZUltcGwgKnN0YXJ0ID0gMCApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBub2Rl
TWF0Y2hlcyggTm9kZUltcGwgKnRlc3ROb2RlICkgY29uc3QgPSAwOwotCi0gICAgTm9kZUltcGwg
KnJvb3ROb2RlOwotICAgIG11dGFibGUgaW50IGNhY2hlZExlbmd0aDsKLSAgICBtdXRhYmxlIE5v
ZGVJbXBsICpsYXN0SXRlbTsKLSAgICBtdXRhYmxlIHVuc2lnbmVkIGxhc3RJdGVtT2Zmc2V0Owot
ICAgIG11dGFibGUgYm9vbCBpc0xlbmd0aENhY2hlVmFsaWQgOiAxOwotICAgIG11dGFibGUgYm9v
bCBpc0l0ZW1DYWNoZVZhbGlkIDogMTsKLX07Ci0KLWNsYXNzIENoaWxkTm9kZUxpc3RJbXBsIDog
cHVibGljIE5vZGVMaXN0SW1wbAotewotcHVibGljOgotICAgIENoaWxkTm9kZUxpc3RJbXBsKCBO
b2RlSW1wbCAqbik7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVu
dCBjbGFzc2VzCi0KLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OwotICAgIHZp
cnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0OwotCi1wcm90ZWN0
ZWQ6Ci0gICAgdmlydHVhbCBib29sIG5vZGVNYXRjaGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUgKSBj
b25zdDsKLX07Ci0KLS8qKgotICogTm9kZUxpc3Qgd2hpY2ggbGlzdHMgYWxsIE5vZGVzIGluIGEg
RWxlbWVudCB3aXRoIGEgZ2l2ZW4gIm5hbWU9IiB0YWcKLSAqLwotY2xhc3MgTmFtZU5vZGVMaXN0
SW1wbCA6IHB1YmxpYyBOb2RlTGlzdEltcGwKLXsKLXB1YmxpYzoKLSAgICBOYW1lTm9kZUxpc3RJ
bXBsKCBOb2RlSW1wbCAqZG9jLCBjb25zdCBET01TdHJpbmcgJnQgKTsKLQotICAgIC8vIERPTSBt
ZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLQotICAgIHZpcnR1YWwgdW5z
aWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2ln
bmVkIGluZGV4ICkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBE
T00pCi0gICAgdmlydHVhbCB2b2lkIHJvb3ROb2RlQ2hpbGRyZW5DaGFuZ2VkKCkge307Ci0gICAg
dmlydHVhbCB2b2lkIHJvb3ROb2RlQXR0cmlidXRlQ2hhbmdlZCgpIHsgTm9kZUxpc3RJbXBsOjpy
b290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJv
b2wgbm9kZU1hdGNoZXMoIE5vZGVJbXBsICp0ZXN0Tm9kZSApIGNvbnN0OwotCi0gICAgRE9NU3Ry
aW5nIG5vZGVOYW1lOwotfTsKLQotCi0vLyBHZW5lcmljIE5hbWVkTm9kZU1hcCBpbnRlcmZhY2UK
LS8vIE90aGVyIGNsYXNzZXMgaW1wbGVtZW50IHRoaXMgZm9yIG1vcmUgc3BlY2lmaWMgc2l0dWF0
aW9ucyBlLmcuIGF0dHJpYnV0ZXMKLS8vIG9mIGFuIGVsZW1lbnQKLWNsYXNzIE5hbWVkTm9kZU1h
cEltcGwgOiBwdWJsaWMga2h0bWw6OlNoYXJlZDxOYW1lZE5vZGVNYXBJbXBsPgotewotcHVibGlj
OgotICAgIE5hbWVkTm9kZU1hcEltcGwoKSB7fQotICAgIHZpcnR1YWwgfk5hbWVkTm9kZU1hcElt
cGwoKSB7fQotCi0gICAgTm9kZUltcGwgKmdldE5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5h
bWUpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWVkSXRlbU5TKERPTVN0cmluZygpLCBuYW1lKTsgfQot
ICAgIFJlZlB0cjxOb2RlSW1wbD4gcmVtb3ZlTmFtZWRJdGVtKGNvbnN0IERPTVN0cmluZyAmbmFt
ZSwgaW50ICZleGNlcHRpb24pIHsgcmV0dXJuIHJlbW92ZU5hbWVkSXRlbU5TKERPTVN0cmluZygp
LCBuYW1lLCBleGNlcHRpb24pOyB9Ci0KLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpnZXROYW1lZEl0
ZW1OUyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2Nh
bE5hbWUpIGNvbnN0ID0gMDsKLSAgICBSZWZQdHI8Tm9kZUltcGw+IHNldE5hbWVkSXRlbU5TKE5v
ZGVJbXBsICphcmcsIGludCAmZXhjZXB0aW9uKSB7IHJldHVybiBzZXROYW1lZEl0ZW0oYXJnLCBl
eGNlcHRpb24pOyB9Ci0gICAgdmlydHVhbCBSZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRl
bU5TKGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJmxvY2Fs
TmFtZSwgaW50ICZleGNlcHRpb24pID0gMDsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmli
dXRlcyBmb3IgTmFtZWROb2RlTWFwCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqZ2V0TmFtZWRJdGVt
KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBS
ZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRlbSAoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIGludCAmZXhjZXB0aW9uY29kZSkgPSAwOwotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJ
bXBsPiBzZXROYW1lZEl0ZW0gKE5vZGVJbXBsKiBhcmcsIGludCAmZXhjZXB0aW9uY29kZSkgPSAw
OwotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4ICkgY29uc3Qg
PSAwOwotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCAgKSBjb25zdCA9IDA7Ci0KLSAgICAv
LyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlzUmVh
ZE9ubHkoKSB7IHJldHVybiBmYWxzZTsgfQotfTsKLQogfTsgLy9uYW1lc3BhY2UKICNlbmRpZgpJ
bmRleDoga2h0bWwveG1sL2RvbV94bWxpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94bWwv
ZG9tX3htbGltcGwuY3BwCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL3htbC9kb21feG1saW1w
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJjb25maWcu
aCIKICNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgogCisjaW5jbHVkZSAiZG9tX25vZGUu
aCIKICNpbmNsdWRlICJ4bWwvZG9tX3htbGltcGwuaCIKICNpbmNsdWRlICJEb2N1bWVudEltcGwu
aCIKICNpbmNsdWRlICJ4bWwvZG9tX3N0cmluZ2ltcGwuaCIKSW5kZXg6IGtodG1sL3htbC9Eb2N1
bWVudEZyYWdtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL0RvY3VtZW50RnJh
Z21lbnRJbXBsLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRtbC94bWwvRG9jdW1lbnRGcmFn
bWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAKICNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50SW1wbC5oIgorI2luY2x1ZGUg
ImRvbV9ub2RlLmgiCiAKIG5hbWVzcGFjZSBET00gewogCkluZGV4OiBraHRtbC94bWwvRG9jdW1l
bnRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94bWwvRG9jdW1lbnRJbXBsLmNwcAkocmV2
aXNpb24gMTIwODYpCisrKyBraHRtbC94bWwvRG9jdW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uSW1wbC5oIgog
I2luY2x1ZGUgIkRvY3VtZW50VHlwZUltcGwuaCIKICNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50
SW1wbC5oIgorI2luY2x1ZGUgIk5hbWVOb2RlTGlzdEltcGwuaCIKIAogI2luY2x1ZGUgImNzcy9j
c3NoZWxwZXIuaCIKICNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgpJbmRleDoga2h0
bWwveG1sL2RvbV9wb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL2RvbV9wb3Np
dGlvbi5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwveG1sL2RvbV9wb3NpdGlvbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlICJjc3NfY29tcHV0ZWRz
dHlsZS5oIgogI2luY2x1ZGUgImNzc192YWx1ZWltcGwuaCIKICNpbmNsdWRlICJkb21fZWxlbWVu
dGltcGwuaCIKLSNpbmNsdWRlICJkb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJkb20yX3Jhbmdl
LmgiCiAjaW5jbHVkZSAiZG9tMl9yYW5nZWltcGwuaCIKICNpbmNsdWRlICJkb20yX3ZpZXdzaW1w
bC5oIgpJbmRleDoga2h0bWwveG1sL05vZGVMaXN0SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0
bWwveG1sL05vZGVMaXN0SW1wbC5jcHAJKHJldmlzaW9uIDEyMDYzKQorKysga2h0bWwveG1sL05v
ZGVMaXN0SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDI4MjYgKzIzLDE0IEBACiAgKi8K
IAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKLQot
I2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiZG9tL2RvbTJfZXZlbnRz
LmgiCi0jaW5jbHVkZSAieG1sL2RvbV9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21f
dGV4dGltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAi
RG9jdW1lbnRJbXBsLmgiCi0jaW5jbHVkZSAiRE9NSW1wbGVtZW50YXRpb25JbXBsLmgiCi0jaW5j
bHVkZSAieG1sL2RvbV9wb3NpdGlvbi5oIgotI2luY2x1ZGUgInhtbC9kb20yX3JhbmdlaW1wbC5o
IgotI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc2hlbHBlci5o
IgotI2luY2x1ZGUgImNzcy9jc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiZWRpdGluZy9o
dG1sZWRpdGluZy5oIgotI2luY2x1ZGUgImVkaXRpbmcvaHRtbF9pbnRlcmNoYW5nZS5oIgotI2lu
Y2x1ZGUgImVkaXRpbmcvU2VsZWN0aW9uQ29udHJvbGxlci5oIgotCi0jaW5jbHVkZSA8a2RlYnVn
Lmg+Ci0KLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX29iamVjdC5oIgotI2luY2x1ZGUgIklu
bGluZVRleHRCb3guaCIKLSNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIKLQotI2luY2x1ZGUgImVj
bWEva2pzX2JpbmRpbmcuaCIKLSNpbmNsdWRlICJlY21hL2tqc19wcm94eS5oIgotI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0KLS8vIEZJWE1FOiBTaG91bGQgbm90
IGhhdmUgdG8gaW5jbHVkZSB0aGlzLiAgQ3V0IHRoZSBIVE1MIGRlcGVuZGVuY3khCi0jaW5jbHVk
ZSAiaHRtbG5hbWVzLmgiCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0jaW5jbHVkZSAieGJsL3hi
bF9iaW5kaW5nX21hbmFnZXIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0
aW9ucy5oPgotI2luY2x1ZGUgIktXUUxvZ2dpbmcuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGtodG1s
OwotCi1uYW1lc3BhY2UgRE9NIHsKLQotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci11c2lu
ZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi0vKioKLSAqIE5vZGVMaXN0IHdoaWNoIGxpc3RzIGFs
bCBOb2RlcyBpbiBhIGRvY3VtZW50IHdpdGggYSBnaXZlbiB0YWcgbmFtZQotICovCi1jbGFzcyBU
YWdOb2RlTGlzdEltcGwgOiBwdWJsaWMgTm9kZUxpc3RJbXBsCi17Ci1wdWJsaWM6Ci0gICAgVGFn
Tm9kZUxpc3RJbXBsKE5vZGVJbXBsICpuLCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVS
SSwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMg
b3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVu
Z3RoKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbSAodW5zaWduZWQgaW5kZXgp
IGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotCi1wcm90
ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIG5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkg
Y29uc3Q7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lc3BhY2VVUkk7Ci0gICAgQXRvbWljU3Ry
aW5nIG1fbG9jYWxOYW1lOwotfTsKLQotI2lmbmRlZiBOREVCVUcKLXN0cnVjdCBOb2RlSW1wbENv
dW50ZXIgeyAKLSAgICBzdGF0aWMgaW50IGNvdW50OyAKLSAgICB+Tm9kZUltcGxDb3VudGVyKCkg
eyAvKiBpZiAoY291bnQgIT0gMCkgZnByaW50ZihzdGRlcnIsICJMRUFLOiAlZCBOb2RlSW1wbFxu
IiwgY291bnQpOyAqLyB9Ci19OwotaW50IE5vZGVJbXBsQ291bnRlcjo6Y291bnQgPSAwOwotc3Rh
dGljIE5vZGVJbXBsQ291bnRlciBub2RlSW1wbENvdW50ZXI7Ci0KLXN0YXRpYyBpbnQgZ0V2ZW50
RGlzcGF0Y2hGb3JiaWRkZW47Ci0jZGVmaW5lIGZvcmJpZEV2ZW50RGlzcGF0Y2goKSBnRXZlbnRE
aXNwYXRjaEZvcmJpZGRlbiArPSAxCi0jZGVmaW5lIGFsbG93RXZlbnREaXNwYXRjaCgpIGFzc2Vy
dChnRXZlbnREaXNwYXRjaEZvcmJpZGRlbiA+IDApOyBnRXZlbnREaXNwYXRjaEZvcmJpZGRlbiAt
PSAxCi0jZGVmaW5lIGV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSAoZ0V2ZW50RGlzcGF0Y2hGb3Ji
aWRkZW4gPiAwKQotI2Vsc2UKLQotI2RlZmluZSBmb3JiaWRFdmVudERpc3BhdGNoKCkKLSNkZWZp
bmUgYWxsb3dFdmVudERpc3BhdGNoKCkKLSNkZWZpbmUgZXZlbnREaXNwYXRjaEZvcmJpZGRlbigp
Ci0jZW5kaWYgTkRFQlVHCi0KLU5vZGVJbXBsOjpOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYykK
LSAgICA6IGRvY3VtZW50KGRvYyksCi0gICAgICBtX3ByZXZpb3VzKDApLAotICAgICAgbV9uZXh0
KDApLAotICAgICAgbV9yZW5kZXIoMCksCi0gICAgICBtX3JlZ2RMaXN0ZW5lcnMoMCksCi0gICAg
ICBtX25vZGVMaXN0cygwKSwKLSAgICAgIG1fdGFiSW5kZXgoMCksCi0gICAgICBtX2hhc0lkKGZh
bHNlKSwKLSAgICAgIG1faGFzQ2xhc3MoZmFsc2UpLAotICAgICAgbV9oYXNTdHlsZShmYWxzZSks
Ci0gICAgICBtX2F0dGFjaGVkKGZhbHNlKSwKLSAgICAgIG1fY2hhbmdlZChmYWxzZSksCi0gICAg
ICBtX2hhc0NoYW5nZWRDaGlsZChmYWxzZSksCi0gICAgICBtX2luRG9jdW1lbnQoZmFsc2UpLAot
ICAgICAgbV9pc0xpbmsoZmFsc2UpLAotICAgICAgbV9zcGVjaWZpZWQoZmFsc2UpLAotICAgICAg
bV9mb2N1c2VkKGZhbHNlKSwKLSAgICAgIG1fYWN0aXZlKGZhbHNlKSwKLSAgICAgIG1faG92ZXJl
ZChmYWxzZSksCi0gICAgICBtX2luQWN0aXZlQ2hhaW4oZmFsc2UpLAotICAgICAgbV9zdHlsZUVs
ZW1lbnQoZmFsc2UpLAotICAgICAgbV9pbXBsaWNpdChmYWxzZSksCi0gICAgICBtX2luRGV0YWNo
KGZhbHNlKQotewotI2lmbmRlZiBOREVCVUcKLSAgICArK05vZGVJbXBsQ291bnRlcjo6Y291bnQ7
Ci0jZW5kaWYKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0RG9jdW1lbnQoRG9jdW1lbnRJbXBsICpk
b2MpCi17Ci0gICAgaWYgKGluRG9jdW1lbnQoKSkKLQlyZXR1cm47Ci0gICAgCi0gICAgZG9jdW1l
bnQgPSBkb2M7Ci19Ci0KLU5vZGVJbXBsOjp+Tm9kZUltcGwoKQotewotI2lmbmRlZiBOREVCVUcK
LSAgICAtLU5vZGVJbXBsQ291bnRlcjo6Y291bnQ7Ci0jZW5kaWYKLSAgICBpZiAobV9yZW5kZXIp
Ci0gICAgICAgIGRldGFjaCgpOwotICAgIGlmIChtX3JlZ2RMaXN0ZW5lcnMgJiYgIW1fcmVnZExp
c3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3VtZW50KCkgJiYgIWluRG9jdW1lbnQoKSkKLSAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+dW5yZWdpc3RlckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRM
aXN0ZW5lcnModGhpcyk7Ci0gICAgZGVsZXRlIG1fcmVnZExpc3RlbmVyczsKLSAgICBkZWxldGUg
bV9ub2RlTGlzdHM7Ci0gICAgaWYgKG1fcHJldmlvdXMpCi0gICAgICAgIG1fcHJldmlvdXMtPnNl
dE5leHRTaWJsaW5nKDApOwotICAgIGlmIChtX25leHQpCi0gICAgICAgIG1fbmV4dC0+c2V0UHJl
dmlvdXNTaWJsaW5nKDApOwotfQotCi1ET01TdHJpbmcgTm9kZUltcGw6Om5vZGVWYWx1ZSgpIGNv
bnN0Ci17Ci0gIHJldHVybiBET01TdHJpbmcoKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0Tm9k
ZVZhbHVlKCBjb25zdCBET01TdHJpbmcgJi8qX25vZGVWYWx1ZSovLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKQotewotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4g
dGhlIG5vZGUgaXMgcmVhZG9ubHkKLSAgICBpZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGV4
Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGJlIGRlZmF1bHQgbm9kZVZhbHVlIGlz
IG51bGwsIHNvIHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdAotfQotCi1SZWZQdHI8Tm9kZUxpc3RJ
bXBsPiBOb2RlSW1wbDo6Y2hpbGROb2RlcygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxOb2RlTGlz
dEltcGw+KG5ldyBDaGlsZE5vZGVMaXN0SW1wbCh0aGlzKSk7Ci19Ci0KLU5vZGVJbXBsICpOb2Rl
SW1wbDo6Zmlyc3RDaGlsZCgpIGNvbnN0Ci17Ci0gIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAq
Tm9kZUltcGw6Omxhc3RDaGlsZCgpIGNvbnN0Ci17Ci0gIHJldHVybiAwOwotfQotCi1Ob2RlSW1w
bCAqTm9kZUltcGw6Omxhc3REZXNjZW5kYW50KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9
IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0gICAgd2hpbGUgKG4gJiYgbi0+bGFzdENo
aWxkKCkpCi0gICAgICAgIG4gPSBuLT5sYXN0Q2hpbGQoKTsKLSAgICByZXR1cm4gbjsKLX0KLQot
Tm9kZUltcGwgKk5vZGVJbXBsOjppbnNlcnRCZWZvcmUoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9k
ZUltcGwgKiwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBuZXdDaGlsZC0+cmVmKCk7Ci0g
ICAgbmV3Q2hpbGQtPmRlcmVmKCk7Ci0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6
SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9k
ZUltcGw6OnJlcGxhY2VDaGlsZCggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICBuZXdDaGlsZC0+cmVmKCk7Ci0gIG5ld0NoaWxkLT5kZXJl
ZigpOwotICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9F
UlI7Ci0gIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnJlbW92ZUNoaWxkKCBO
b2RlSW1wbCAqLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICBleGNlcHRpb25jb2RlID0gRE9N
RXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5v
ZGVJbXBsOjphcHBlbmRDaGlsZCggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKQotewotICAgIG5ld0NoaWxkLT5yZWYoKTsKLSAgICBuZXdDaGlsZC0+ZGVyZWYoKTsKLSAg
ICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0g
ICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnJlbW92ZShpbnQgJmV4Y2VwdGlvbmNv
ZGUpCi17Ci0gICAgcmVmKCk7Ci0gICAgaWYgKE5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgpKQot
ICAgICAgICBwLT5yZW1vdmVDaGlsZCh0aGlzLCBleGNlcHRpb25jb2RlKTsKLSAgICBlbHNlCi0g
ICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VS
UjsKLSAgICBkZXJlZigpOwotfQotCi1ib29sIE5vZGVJbXBsOjpoYXNDaGlsZE5vZGVzKCAgKSBj
b25zdAotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgTm9kZUltcGw6Om5vcm1hbGl6ZSAo
KQotewotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBm
aXJzdENoaWxkKCk7Ci0KLSAgICBpZiAoaXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAgIC8vIE5v
cm1hbGl6ZSBhbnkgYXR0cmlidXRlIGNoaWxkcmVuIHdlIG1pZ2h0IGhhdmUgCi0gICAgICAgIEVs
ZW1lbnRJbXBsICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4odGhpcyk7Ci0g
ICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJNYXAgPSBlbGVtZW50LT5hdHRyaWJ1dGVzKCk7
Ci0gICAgICAgIAotICAgICAgICBpZiAoYXR0ck1hcCkgewotICAgICAgICAgICAgdW5zaWduZWQg
bnVtQXR0cnMgPSBhdHRyTWFwLT5sZW5ndGgoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUF0dHJzOyBpKyspIHsKLSAgICAgICAgICAgICAg
ICBBdHRyaWJ1dGVJbXBsICphdHRyaWJ1dGUgPSBhdHRyTWFwLT5hdHRyaWJ1dGVJdGVtKGkpOwot
ICAgICAgICAgICAgICAgIEF0dHJJbXBsICphdHRyID0gYXR0cmlidXRlLT5hdHRySW1wbCgpOwot
ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChhdHRyKQotICAgICAgICAgICAg
ICAgICAgICBhdHRyLT5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0KLSAgICAKLSAgICAvLyBSZWN1cnNpdmVseSBnbyB0aHJvdWdoIHRoZSBzdWJ0cmVlIGJlbmVh
dGggdXMsIG5vcm1hbGl6aW5nIGFsbCBub2Rlcy4gSW4gdGhlIGNhc2UKLSAgICAvLyB3aGVyZSB0
aGVyZSBhcmUgdHdvIGFkamFjZW50IHRleHQgbm9kZXMsIHRoZXkgYXJlIG1lcmdlZCB0b2dldGhl
cgotICAgIHdoaWxlIChjaGlsZCkgewotICAgICAgICBOb2RlSW1wbCAqbmV4dENoaWxkID0gY2hp
bGQtPm5leHRTaWJsaW5nKCk7Ci0KLSAgICAgICAgaWYgKG5leHRDaGlsZCAmJiBjaGlsZC0+bm9k
ZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUgJiYgbmV4dENoaWxkLT5ub2RlVHlwZSgpID09IE5v
ZGU6OlRFWFRfTk9ERSkgewotICAgICAgICAgICAgLy8gQ3VycmVudCBjaGlsZCBhbmQgdGhlIG5l
eHQgb25lIGFyZSBib3RoIHRleHQgbm9kZXMuLi4gbWVyZ2UgdGhlbQotICAgICAgICAgICAgVGV4
dEltcGwgKmN1cnJlbnRUZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dEltcGwqPihjaGlsZCk7Ci0gICAg
ICAgICAgICBUZXh0SW1wbCAqbmV4dFRleHQgPSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KG5leHRD
aGlsZCk7Ci0KLSAgICAgICAgICAgIGN1cnJlbnRUZXh0LT5hcHBlbmREYXRhKG5leHRUZXh0LT5k
YXRhKCksZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAg
ICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIG5leHRDaGlsZC0+cmVtb3ZlKGV4
Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2hp
bGQtPm5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHNpbmdsZSBlbXB0eSB0
ZXh0IG5vZGUgbGVmdCBhbmQgcmVtb3ZlIGl0IGlmIHNvCi0gICAgY2hpbGQgPSBmaXJzdENoaWxk
KCk7Ci0gICAgaWYgKGNoaWxkICYmICFjaGlsZC0+bmV4dFNpYmxpbmcoKSAmJiBjaGlsZC0+aXNU
ZXh0Tm9kZSgpKSB7Ci0gICAgICAgIFRleHRJbXBsICp0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dElt
cGwqPihjaGlsZCk7Ci0gICAgICAgIGlmICh0ZXh0LT5kYXRhKCkuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgY2hpbGQtPnJlbW92ZShleGNlcHRpb25jb2RlKTsKLSAgICB9Ci19Ci0KLWNvbnN0IEF0
b21pY1N0cmluZyYgTm9kZUltcGw6OnByZWZpeCgpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIG5vZGVz
IG90aGVyIHRoYW4gZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIHRoZSBwcmVmaXggaXMgYWx3YXlz
IG51bGwKLSAgICByZXR1cm4gbnVsbEF0b207Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldFByZWZp
eChjb25zdCBBdG9taWNTdHJpbmcgJi8qX3ByZWZpeCovLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQot
ewotICAgIC8vIFRoZSBzcGVjIHNheXMgdGhhdCBmb3Igbm9kZXMgb3RoZXIgdGhhbiBlbGVtZW50
cyBhbmQgYXR0cmlidXRlcywgcHJlZml4IGlzIGFsd2F5cyBudWxsLgotICAgIC8vIEl0IGRvZXMg
bm90IHNheSB3aGF0IHRvIGRvIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8gc2V0IHRoZSBwcmVmaXgg
b24gYW5vdGhlciB0eXBlIG9mCi0gICAgLy8gbm9kZSwgaG93ZXZlciBtb3ppbGxhIHRocm93cyBh
IE5BTUVTUEFDRV9FUlIgZXhjZXB0aW9uCi0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlv
bjo6TkFNRVNQQUNFX0VSUjsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBOb2RlSW1wbDo6bG9j
YWxOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZW1wdHlBdG9tOwotfQotCi1jb25zdCBBdG9t
aWNTdHJpbmcmIE5vZGVJbXBsOjpuYW1lc3BhY2VVUkkoKSBjb25zdAotewotICAgIHJldHVybiBu
dWxsQXRvbTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0Rmlyc3RDaGlsZChOb2RlSW1wbCAqKQot
ewotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRMYXN0Q2hpbGQoTm9kZUltcGwgKikKLXsKLX0KLQot
Tm9kZUltcGwgKk5vZGVJbXBsOjphZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpCi17Ci0gICAg
UmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0TmV3Q2hpbGQobmV3Q2hpbGQpOyAvLyBtYWtlIHN1cmUg
dGhlIG5ldyBjaGlsZCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0g
ICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzQ29udGVudEVkaXRhYmxlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gcGFyZW50KCkgJiYgcGFyZW50KCktPmlzQ29udGVudEVkaXRhYmxl
KCk7Ci19Ci0KLVFSZWN0IE5vZGVJbXBsOjpnZXRSZWN0KCkgY29uc3QKLXsKLSAgICBpbnQgX3gs
IF95OwotICAgIGlmKG1fcmVuZGVyICYmIG1fcmVuZGVyLT5hYnNvbHV0ZVBvc2l0aW9uKF94LCBf
eSkpCi0gICAgICAgIHJldHVybiBRUmVjdCggX3gsIF95LCBtX3JlbmRlci0+d2lkdGgoKSwgbV9y
ZW5kZXItPmhlaWdodCgpICk7Ci0KLSAgICByZXR1cm4gUVJlY3QoKTsKLX0KLQotdm9pZCBOb2Rl
SW1wbDo6c2V0Q2hhbmdlZChib29sIGIpCi17Ci0gICAgaWYgKGIgJiYgIWF0dGFjaGVkKCkpIC8v
IGNoYW5nZWQgY29tcGFyZWQgdG8gd2hhdD8KLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9jaGFu
Z2VkID0gYjsKLSAgICBpZiAoIGIgKSB7Ci0JTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCk7Ci0J
d2hpbGUgKCBwICkgewotCSAgICBwLT5zZXRIYXNDaGFuZ2VkQ2hpbGQoIHRydWUgKTsKLQkgICAg
cCA9IHAtPnBhcmVudE5vZGUoKTsKLQl9Ci0gICAgICAgIGdldERvY3VtZW50KCktPnNldERvY3Vt
ZW50Q2hhbmdlZCh0cnVlKTsKLSAgICB9Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzRm9jdXNhYmxl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzS2V5
Ym9hcmRGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBpc0ZvY3VzYWJsZSgpOwotfQot
Ci1ib29sIE5vZGVJbXBsOjppc01vdXNlRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
aXNGb2N1c2FibGUoKTsKLX0KLQotdW5zaWduZWQgTm9kZUltcGw6Om5vZGVJbmRleCgpIGNvbnN0
Ci17Ci0gICAgTm9kZUltcGwgKl90ZW1wTm9kZSA9IHByZXZpb3VzU2libGluZygpOwotICAgIHVu
c2lnbmVkIGNvdW50PTA7Ci0gICAgZm9yKCBjb3VudD0wOyBfdGVtcE5vZGU7IGNvdW50KysgKQot
ICAgICAgICBfdGVtcE5vZGUgPSBfdGVtcE5vZGUtPnByZXZpb3VzU2libGluZygpOwotICAgIHJl
dHVybiBjb3VudDsKLX0KLQotdm9pZCBOb2RlSW1wbDo6YWRkRXZlbnRMaXN0ZW5lcihjb25zdCBB
dG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGNvbnN0IGJv
b2wgdXNlQ2FwdHVyZSkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKSAmJiAhZ2V0RG9jdW1lbnQo
KS0+YXR0YWNoZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnRJbXBsOjpMaXN0
ZW5lclR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PERvY3VtZW50SW1wbDo6TGlzdGVuZXJUeXBlPigw
KTsKLSAgICBpZiAoZXZlbnRUeXBlID09IERPTVN1YnRyZWVNb2RpZmllZEV2ZW50KQotICAgICAg
ICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01TVUJUUkVFTU9ESUZJRURfTElTVEVORVI7Ci0gICAg
ZWxzZSBpZiAoZXZlbnRUeXBlID09IERPTU5vZGVJbnNlcnRlZEV2ZW50KQotICAgICAgICB0eXBl
ID0gRG9jdW1lbnRJbXBsOjpET01OT0RFSU5TRVJURURfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAo
ZXZlbnRUeXBlID09IERPTU5vZGVSZW1vdmVkRXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVu
dEltcGw6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9
PSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudEV2ZW50KQotICAgICAgICB0eXBlID0gRG9jdW1l
bnRJbXBsOjpET01OT0RFUkVNT1ZFREZST01ET0NVTUVOVF9MSVNURU5FUjsKLSAgICBlbHNlIGlm
IChldmVudFR5cGUgPT0gRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50RXZlbnQpCi0gICAgICAg
IHR5cGUgPSBEb2N1bWVudEltcGw6OkRPTU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5F
UjsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gRE9NQXR0ck1vZGlmaWVkRXZlbnQpCi0gICAg
ICAgIHR5cGUgPSBEb2N1bWVudEltcGw6OkRPTUFUVFJNT0RJRklFRF9MSVNURU5FUjsKLSAgICBl
bHNlIGlmIChldmVudFR5cGUgPT0gRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkRXZlbnQpCi0gICAg
ICAgIHR5cGUgPSBEb2N1bWVudEltcGw6OkRPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5F
UjsKLSAgICBpZiAodHlwZSkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+YWRkTGlzdGVuZXJUeXBl
KHR5cGUpOwotCi0gICAgaWYgKCFtX3JlZ2RMaXN0ZW5lcnMpIHsKLSAgICAgICAgbV9yZWdkTGlz
dGVuZXJzID0gbmV3IFFQdHJMaXN0PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPjsKLQltX3JlZ2RM
aXN0ZW5lcnMtPnNldEF1dG9EZWxldGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgbGlzdGVuZXItPnJl
ZigpOwotCi0gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGlkZW50aWNhbCBsaXN0ZW5lciBzZXQgd2l0
aCBpZGVudGljYWwgYXJndW1lbnRzLgotICAgIC8vIFRoZSBET00yIHNwZWMgc2F5cyB0aGF0ICJk
dXBsaWNhdGUgaW5zdGFuY2VzIGFyZSBkaXNjYXJkZWQiIGluIHRoaXMgY2FzZS4KLSAgICByZW1v
dmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOwotCi0gICAg
Ly8gYWRkaW5nIHRoZSBmaXJzdCBvbmUKLSAgICBpZiAobV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5
KCkgJiYgZ2V0RG9jdW1lbnQoKSAmJiAhaW5Eb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVu
dCgpLT5yZWdpc3RlckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnModGhpcyk7Ci0g
ICAgICAgIAotICAgIG1fcmVnZExpc3RlbmVycy0+YXBwZW5kKG5ldyBSZWdpc3RlcmVkRXZlbnRM
aXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKSk7Ci0KLSAgICBsaXN0ZW5l
ci0+ZGVyZWYoKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6cmVtb3ZlRXZlbnRMaXN0ZW5lcihjb25z
dCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wg
dXNlQ2FwdHVyZSkKLXsKLSAgICBpZiAoIW1fcmVnZExpc3RlbmVycykgLy8gbm90aGluZyB0byBy
ZW1vdmUKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXIgcmwo
ZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9y
PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdCgqbV9yZWdkTGlzdGVuZXJzKTsKLSAgICBmb3Ig
KDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpZiAoKihpdC5jdXJyZW50KCkpID09IHJs
KSB7Ci0gICAgICAgICAgICBtX3JlZ2RMaXN0ZW5lcnMtPnJlbW92ZVJlZihpdC5jdXJyZW50KCkp
OwotICAgICAgICAgICAgLy8gcmVtb3ZlZCBsYXN0Ci0gICAgICAgICAgICBpZiAobV9yZWdkTGlz
dGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSAmJiAhaW5Eb2N1bWVudCgpKQotICAg
ICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0
aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19
Ci0KLXZvaWQgTm9kZUltcGw6OnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCkKLXsKLSAgICBkZWxl
dGUgbV9yZWdkTGlzdGVuZXJzOwotICAgIG1fcmVnZExpc3RlbmVycyA9IDA7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OnJlbW92ZUhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZl
bnRUeXBlKQotewotICAgIGlmICghbV9yZWdkTGlzdGVuZXJzKSAvLyBub3RoaW5nIHRvIHJlbW92
ZQotICAgICAgICByZXR1cm47Ci0KLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVu
dExpc3RlbmVyPiBpdCgqbV9yZWdkTGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgp
OyArK2l0KQotICAgICAgICBpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldmVudFR5
cGUgJiYgaXQuY3VycmVudCgpLT5saXN0ZW5lcigpLT5ldmVudExpc3RlbmVyVHlwZSgpID09ICJf
a2h0bWxfSFRNTEV2ZW50TGlzdGVuZXIiKSB7Ci0gICAgICAgICAgICBtX3JlZ2RMaXN0ZW5lcnMt
PnJlbW92ZVJlZihpdC5jdXJyZW50KCkpOwotICAgICAgICAgICAgLy8gcmVtb3ZlZCBsYXN0Ci0g
ICAgICAgICAgICBpZiAobV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQo
KSAmJiAhaW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgICAgIGdldERvY3VtZW50KCktPnVucmVn
aXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldEhUTUxFdmVudExp
c3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0
ZW5lcikKLXsKLSAgICAvLyBJbiBjYXNlIHdlIGFyZSB0aGUgb25seSBvbmUgaG9sZGluZyBhIHJl
ZmVyZW5jZSB0byBpdCwgd2UgZG9uJ3Qgd2FudCByZW1vdmVIVE1MRXZlbnRMaXN0ZW5lciB0byBk
ZXN0cm95IGl0LgotICAgIGlmIChsaXN0ZW5lcikKLSAgICAgICAgbGlzdGVuZXItPnJlZigpOwot
ICAgIHJlbW92ZUhUTUxFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Ci0gICAgaWYgKGxpc3RlbmVy
KSB7Ci0gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2Up
OwotICAgICAgICBsaXN0ZW5lci0+ZGVyZWYoKTsKLSAgICB9Ci19Ci0KLUV2ZW50TGlzdGVuZXIg
Kk5vZGVJbXBsOjpnZXRIVE1MRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50
VHlwZSkKLXsKLSAgICBpZiAoIW1fcmVnZExpc3RlbmVycykKLSAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdCgqbV9yZWdk
TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpZiAo
aXQuY3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldmVudFR5cGUgJiYgaXQuY3VycmVudCgpLT5s
aXN0ZW5lcigpLT5ldmVudExpc3RlbmVyVHlwZSgpID09ICJfa2h0bWxfSFRNTEV2ZW50TGlzdGVu
ZXIiKQotICAgICAgICAgICAgcmV0dXJuIGl0LmN1cnJlbnQoKS0+bGlzdGVuZXIoKTsKLSAgICBy
ZXR1cm4gMDsKLX0KLQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaEV2ZW50KEV2ZW50SW1wbCAq
ZXZ0LCBpbnQgJmV4Y2VwdGlvbmNvZGUsIGJvb2wgdGVtcEV2ZW50KQotewotICAgIGFzc2VydCgh
ZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpZiAoIWV2dCB8fCBldnQtPnR5cGUoKS5p
c0VtcHR5KCkpIHsgCi0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBFdmVudEV4Y2VwdGlvbjo6X0VY
Q0VQVElPTl9PRkZTRVQgKyBFdmVudEV4Y2VwdGlvbjo6VU5TUEVDSUZJRURfRVZFTlRfVFlQRV9F
UlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBldnQtPnJlZigpOwotCi0g
ICAgZXZ0LT5zZXRUYXJnZXQodGhpcyk7Ci0KLSAgICAvLyBXZSd2ZSBoYWQgYXQgbGVhc3Qgb25l
IHJlcG9ydCBvZiBhIGNyYXNoIG9uIGEgcGFnZSB3aGVyZSBkb2N1bWVudCBpcyBudWxsIGhlcmUu
Ci0gICAgLy8gVW5mb3J0dW5hdGVseSB0aGF0IHBhZ2Ugbm8gbG9uZ2VyIGV4aXN0cywgYnV0IHdl
J2xsIG1ha2UgdGhpcyBjb2RlIHJvYnVzdCBhZ2FpbnN0Ci0gICAgLy8gdGhhdCBhbnl3YXkuCi0g
ICAgLy8gRklYTUU6IE11Y2ggY29kZSBpbiB0aGlzIGNsYXNzIGFzc3VtZXMgZG9jdW1lbnQgaXMg
bm9uLW51bGw7IGl0IHdvdWxkIGJlIGJldHRlciB0bwotICAgIC8vIGVuc3VyZSB0aGF0IGRvY3Vt
ZW50IGNhbiBuZXZlciBiZSBudWxsLgotICAgIEZyYW1lICpmcmFtZSA9IDA7Ci0gICAgS0hUTUxW
aWV3ICp2aWV3ID0gMDsKLQotICAgIGlmIChEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50
KCkpIHsKLSAgICAgICAgZnJhbWUgPSBkb2MtPmZyYW1lKCk7Ci0gICAgICAgIHZpZXcgPSBkb2Mt
PnZpZXcoKTsKLSAgICAgICAgLy8gU2luY2UgZXZlbnQgaGFuZGxpbmcgY29kZSBjb3VsZCBjYXVz
ZSB0aGlzIG9iamVjdCB0byBiZSBkZWxldGVkLCBncmFiIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3
IG5vdwotICAgICAgICBpZiAodmlldykKLSAgICAgICAgICAgIHZpZXctPnJlZigpOwotICAgIH0g
ICAgCi0KLSAgICBib29sIHJldCA9IGRpc3BhdGNoR2VuZXJpY0V2ZW50KCBldnQsIGV4Y2VwdGlv
bmNvZGUgKTsKLQotICAgIC8vIElmIHRlbXBFdmVudCBpcyB0cnVlLCB0aGlzIG1lYW5zIHRoYXQg
dGhlIERPTSBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCBiZSBzdG9yaW5nIGEgcmVmZXJlbmNlIHRv
IHRoZSBldmVudCwgaS5lLgotICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byByZXRyaWV2ZSBpdCBm
cm9tIGphdmFzY3JpcHQgaWYgYSBzY3JpcHQgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgcmVmZXJl
bmNlIHRvIGl0IGluIGEgdmFyaWFibGUuCi0gICAgLy8gU28gdGhlcmUgaXMgbm8gbmVlZCBmb3Ig
dGhlIGludGVycHJldGVyIHRvIGtlZXAgdGhlIGV2ZW50IGluIGl0J3MgY2FjaGUKLSAgICBpZiAo
dGVtcEV2ZW50ICYmIGZyYW1lICYmIGZyYW1lLT5qU2NyaXB0KCkpCi0gICAgICAgIGZyYW1lLT5q
U2NyaXB0KCktPmZpbmlzaGVkV2l0aEV2ZW50KGV2dCk7Ci0KLSAgICBpZiAodmlldykKLSAgICAg
ICAgdmlldy0+ZGVyZWYoKTsKLQotICAgIGV2dC0+ZGVyZWYoKTsKLQotICAgIHJldHVybiByZXQ7
Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoR2VuZXJpY0V2ZW50KCBFdmVudEltcGwgKmV2
dCwgaW50ICYvKmV4Y2VwdGlvbmNvZGUgKi8pCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNo
Rm9yYmlkZGVuKCkpOwotICAgIGFzc2VydChldnQtPnRhcmdldCgpKTsKLQotICAgIGV2dC0+cmVm
KCk7Ci0KLSAgICAvLyAjIyMgY2hlY2sgdGhhdCB0eXBlIHNwZWNpZmllZAotCi0gICAgLy8gd29y
ayBvdXQgd2hhdCBub2RlcyB0byBzZW5kIGV2ZW50IHRvCi0gICAgUVB0ckxpc3Q8Tm9kZUltcGw+
IG5vZGVDaGFpbjsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSB0aGlzOyBuOyBuID0g
bi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIG4tPnJlZigpOwotICAgICAgICBub2RlQ2hhaW4u
cHJlcGVuZChuKTsKLSAgICB9Ci0KLSAgICAKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPE5vZGVJbXBs
PiBpdChub2RlQ2hhaW4pOwotICAgIAotICAgIC8vIEJlZm9yZSB3ZSBiZWdpbiBkaXNwYXRjaGlu
ZyBldmVudHMsIGdpdmUgdGhlIHRhcmdldCBub2RlIGEgY2hhbmNlIHRvIGRvIHNvbWUgd29yayBw
cmlvcgotICAgIC8vIHRvIHRoZSBET00gZXZlbnQgaGFuZGxlcnMgZ2V0dGluZyBhIGNyYWNrLgot
ICAgIHZvaWQqIGRhdGEgPSBwcmVEaXNwYXRjaEV2ZW50SGFuZGxlcihldnQpOwotCi0gICAgLy8g
dHJpZ2dlciBhbnkgY2FwdHVyaW5nIGV2ZW50IGhhbmRsZXJzIG9uIG91ciB3YXkgZG93bgotICAg
IGV2dC0+c2V0RXZlbnRQaGFzZShFdmVudDo6Q0FQVFVSSU5HX1BIQVNFKTsKLSAgICBpdC50b0Zp
cnN0KCk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKSAmJiBpdC5jdXJyZW50KCkgIT0gdGhpcyAm
JiAhZXZ0LT5wcm9wYWdhdGlvblN0b3BwZWQoKTsgKytpdCkgewotICAgICAgICBldnQtPnNldEN1
cnJlbnRUYXJnZXQoaXQuY3VycmVudCgpKTsKLSAgICAgICAgaXQuY3VycmVudCgpLT5oYW5kbGVM
b2NhbEV2ZW50cyhldnQsdHJ1ZSk7Ci0gICAgfQotCi0gICAgLy8gZGlzcGF0Y2ggdG8gdGhlIGFj
dHVhbCB0YXJnZXQgbm9kZQotICAgIGl0LnRvTGFzdCgpOwotICAgIGlmICghZXZ0LT5wcm9wYWdh
dGlvblN0b3BwZWQoKSkgewotICAgICAgICBldnQtPnNldEV2ZW50UGhhc2UoRXZlbnQ6OkFUX1RB
UkdFVCk7Ci0gICAgICAgIGV2dC0+c2V0Q3VycmVudFRhcmdldChpdC5jdXJyZW50KCkpOwotCi0J
aWYgKCFldnQtPnByb3BhZ2F0aW9uU3RvcHBlZCgpKQotICAgICAgICAgICAgaXQuY3VycmVudCgp
LT5oYW5kbGVMb2NhbEV2ZW50cyhldnQsZmFsc2UpOwotICAgIH0KLSAgICAtLWl0OwotCi0gICAg
Ly8gb2ssIG5vdyBidWJibGUgdXAgYWdhaW4gKG9ubHkgbm9uLWNhcHR1cmluZyBldmVudCBoYW5k
bGVycyB3aWxsIGJlIGNhbGxlZCkKLSAgICAvLyAjIyMgcmVjYWxjdWxhdGUgdGhlIG5vZGUgY2hh
aW4gaGVyZT8gKGUuZy4gaWYgdGFyZ2V0IG5vZGUgbW92ZWQgaW4gZG9jdW1lbnQgYnkgcHJldmlv
dXMgZXZlbnQgaGFuZGxlcnMpCi0gICAgLy8gbm8uIHRoZSBET00gc3BlY3Mgc2F5czoKLSAgICAv
LyBUaGUgY2hhaW4gb2YgRXZlbnRUYXJnZXRzIGZyb20gdGhlIGV2ZW50IHRhcmdldCB0byB0aGUg
dG9wIG9mIHRoZSB0cmVlCi0gICAgLy8gaXMgZGV0ZXJtaW5lZCBiZWZvcmUgdGhlIGluaXRpYWwg
ZGlzcGF0Y2ggb2YgdGhlIGV2ZW50LgotICAgIC8vIElmIG1vZGlmaWNhdGlvbnMgb2NjdXIgdG8g
dGhlIHRyZWUgZHVyaW5nIGV2ZW50IHByb2Nlc3NpbmcsCi0gICAgLy8gZXZlbnQgZmxvdyB3aWxs
IHByb2NlZWQgYmFzZWQgb24gdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHRyZWUuCi0gICAgLy8K
LSAgICAvLyBzaW5jZSB0aGUgaW5pdGlhbCBkaXNwYXRjaCBpcyBiZWZvcmUgdGhlIGNhcHR1cmlu
ZyBwaGFzZSwKLSAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIG5vZGUg
Y2hhaW4uCi0gICAgLy8gKHRvYmlhcykKLQotICAgIGlmIChldnQtPmJ1YmJsZXMoKSkgewotICAg
ICAgICBldnQtPnNldEV2ZW50UGhhc2UoRXZlbnQ6OkJVQkJMSU5HX1BIQVNFKTsKLSAgICAgICAg
Zm9yICg7IGl0LmN1cnJlbnQoKSAmJiAhZXZ0LT5wcm9wYWdhdGlvblN0b3BwZWQoKSAmJiAhZXZ0
LT5nZXRDYW5jZWxCdWJibGUoKTsgLS1pdCkgewotICAgICAgICAgICAgZXZ0LT5zZXRDdXJyZW50
VGFyZ2V0KGl0LmN1cnJlbnQoKSk7Ci0gICAgICAgICAgICBpdC5jdXJyZW50KCktPmhhbmRsZUxv
Y2FsRXZlbnRzKGV2dCxmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBldnQtPnNldEN1
cnJlbnRUYXJnZXQoMCk7Ci0gICAgZXZ0LT5zZXRFdmVudFBoYXNlKDApOyAvLyBJIGd1ZXNzIHRo
aXMgaXMgY29ycmVjdCwgdGhlIHNwZWMgZG9lcyBub3Qgc2VlbSB0byBzYXkKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGFib3V0IHRoZSBkZWZhdWx0IGV2ZW50IGhhbmRs
ZXIgcGhhc2UuCi0KLQotICAgIC8vIE5vdyBjYWxsIHRoZSBwb3N0IGRpc3BhdGNoLgotICAgIHBv
c3REaXNwYXRjaEV2ZW50SGFuZGxlcihldnQsIGRhdGEpOwotICAgIAotICAgIGlmIChldnQtPmJ1
YmJsZXMoKSkgewotCS8vIG5vdyB3ZSBjYWxsIGFsbCBkZWZhdWx0IGV2ZW50IGhhbmRsZXJzICh0
aGlzIGlzIG5vdCBwYXJ0IG9mIERPTSAtIGl0IGlzIGludGVybmFsIHRvIGtodG1sKQotCi0JaXQu
dG9MYXN0KCk7Ci0JZm9yICg7IGl0LmN1cnJlbnQoKSAmJiAhZXZ0LT5kZWZhdWx0UHJldmVudGVk
KCkgJiYgIWV2dC0+ZGVmYXVsdEhhbmRsZWQoKTsgLS1pdCkKLQkgICAgaXQuY3VycmVudCgpLT5k
ZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci0gICAgfQotICAgIAotICAgIC8vIGRlcmVmIGFsbCBu
b2RlcyBpbiBjaGFpbgotICAgIGl0LnRvRmlyc3QoKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgp
OyArK2l0KQotICAgICAgICBpdC5jdXJyZW50KCktPmRlcmVmKCk7IC8vIHRoaXMgbWF5IGRlbGV0
ZSB1cwotCi0gICAgRG9jdW1lbnRJbXBsOjp1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKTsKLQot
ICAgIGJvb2wgZGVmYXVsdFByZXZlbnRlZCA9IGV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpOwotCi0g
ICAgZXZ0LT5kZXJlZigpOwotCi0gICAgcmV0dXJuICFkZWZhdWx0UHJldmVudGVkOyAvLyAjIyMg
d2hhdCBpZiBkZWZhdWx0UHJldmVudGVkIHdhcyBjYWxsZWQgYmVmb3JlIGRpc3BhdGNoRXZlbnQ/
Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoSFRNTEV2ZW50KGNvbnN0IEF0b21pY1N0cmlu
ZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJnKQotewot
ICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpbnQgZXhjZXB0aW9u
Y29kZSA9IDA7Ci0gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQobmV3IEV2ZW50SW1wbChldmVudFR5
cGUsIGNhbkJ1YmJsZUFyZywgY2FuY2VsYWJsZUFyZyksIGV4Y2VwdGlvbmNvZGUsIHRydWUpOwot
fQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaFdpbmRvd0V2ZW50KGNvbnN0IEF0b21pY1N0cmlu
ZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1YmJsZUFyZywgYm9vbCBjYW5jZWxhYmxlQXJnKQotewot
ICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpbnQgZXhjZXB0aW9u
Y29kZSA9IDA7Ci0gICAgUmVmUHRyPEV2ZW50SW1wbD4gZXZ0ID0gbmV3IEV2ZW50SW1wbChldmVu
dFR5cGUsIGNhbkJ1YmJsZUFyZywgY2FuY2VsYWJsZUFyZyk7Ci0gICAgUmVmUHRyPERvY3VtZW50
SW1wbD4gZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBldnQtPnNldFRhcmdldChkb2MuZ2V0KCkp
OwotICAgIGJvb2wgciA9IGRpc3BhdGNoR2VuZXJpY0V2ZW50KGV2dC5nZXQoKSwgZXhjZXB0aW9u
Y29kZSk7Ci0gICAgaWYgKCFldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSAmJiBkb2MpCi0gCWRvYy0+
ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQuZ2V0KCkpOwotCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBs
b2FkRXZlbnQgJiYgIWV2dC0+cHJvcGFnYXRpb25TdG9wcGVkKCkgJiYgZG9jKSB7Ci0gICAgICAg
IC8vIEZvciBvbmxvYWQgZXZlbnRzLCBzZW5kIHRoZW0gdG8gdGhlIGVuY2xvc2luZyBmcmFtZSBv
bmx5LgotICAgICAgICAvLyBUaGlzIGlzIGEgRE9NIGV4dGVuc2lvbiBhbmQgaXMgaW5kZXBlbmRl
bnQgb2YgYnViYmxpbmcvY2FwdHVyaW5nIHJ1bGVzIG9mCi0gICAgICAgIC8vIHRoZSBET00uICBZ
b3Ugc2VuZCB0aGUgZXZlbnQgb25seSB0byB0aGUgZW5jbG9zaW5nIGZyYW1lLiAgSXQgZG9lcyBu
b3QKLSAgICAgICAgLy8gYnViYmxlIHRocm91Z2ggdGhlIHBhcmVudCBkb2N1bWVudC4KLSAgICAg
ICAgRWxlbWVudEltcGwqIGVsdCA9IGRvYy0+b3duZXJFbGVtZW50KCk7Ci0gICAgICAgIGlmIChl
bHQgJiYgKGVsdC0+Z2V0RG9jdW1lbnQoKS0+ZG9tYWluKCkuaXNOdWxsKCkgfHwKLSAgICAgICAg
ICAgICAgICAgICAgZWx0LT5nZXREb2N1bWVudCgpLT5kb21haW4oKSA9PSBkb2MtPmRvbWFpbigp
KSkgewotICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyBhIHNlY3VyaXR5IGNoZWNrLCBzaW5jZSB3
ZSBkb24ndCB3YW50IHRvIGFsbG93IHRoZSBlbmNsb3NpbmcKLSAgICAgICAgICAgIC8vIGlmcmFt
ZSB0byBzZWUgbG9hZHMgb2YgY2hpbGQgZG9jdW1lbnRzIGluIG90aGVyIGRvbWFpbnMuCi0gICAg
ICAgICAgICBldnQtPnNldEN1cnJlbnRUYXJnZXQoZWx0KTsKLQotICAgICAgICAgICAgLy8gQ2Fw
dHVyaW5nIGZpcnN0LgotICAgICAgICAgICAgZWx0LT5oYW5kbGVMb2NhbEV2ZW50cyhldnQuZ2V0
KCksIHRydWUpOwotCi0gICAgICAgICAgICAvLyBCdWJibGluZyBzZWNvbmQuCi0gICAgICAgICAg
ICBpZiAoIWV2dC0+cHJvcGFnYXRpb25TdG9wcGVkKCkpCi0gICAgICAgICAgICAgICAgZWx0LT5o
YW5kbGVMb2NhbEV2ZW50cyhldnQuZ2V0KCksIGZhbHNlKTsKLSAgICAgICAgICAgIHIgPSAhZXZ0
LT5kZWZhdWx0UHJldmVudGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcjsK
LX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0Y2hNb3VzZUV2ZW50KFFNb3VzZUV2ZW50ICpfbW91
c2UsIGNvbnN0IEF0b21pY1N0cmluZyAmb3ZlcnJpZGVUeXBlLCBpbnQgb3ZlcnJpZGVEZXRhaWwp
Ci17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGludCBkZXRh
aWwgPSBvdmVycmlkZURldGFpbDsgLy8gZGVmYXVsdHMgdG8gMAotICAgIEF0b21pY1N0cmluZyBl
dmVudFR5cGU7Ci0gICAgaWYgKCFvdmVycmlkZVR5cGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGV2
ZW50VHlwZSA9IG92ZXJyaWRlVHlwZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKF9t
b3VzZS0+dHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25QcmVz
czoKLSAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBtb3VzZWRvd25FdmVudDsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVh
c2U6Ci0gICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gbW91c2V1cEV2ZW50OwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uRGJsQ2xp
Y2s6Ci0gICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gY2xpY2tFdmVudDsKLSAgICAgICAgICAg
ICAgICBkZXRhaWwgPSBfbW91c2UtPmNsaWNrQ291bnQoKTsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIGNhc2UgUUV2ZW50OjpNb3VzZU1vdmU6Ci0gICAgICAgICAgICAgICAg
ZXZlbnRUeXBlID0gbW91c2Vtb3ZlRXZlbnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgaW50IGNsaWVudFggPSAwOwotICAgIGludCBjbGllbnRZID0gMDsKLSAgICBpZiAo
S0hUTUxWaWV3ICp2aWV3ID0gZ2V0RG9jdW1lbnQoKS0+dmlldygpKQotICAgICAgICB2aWV3LT52
aWV3cG9ydFRvQ29udGVudHMoX21vdXNlLT54KCksIF9tb3VzZS0+eSgpLCBjbGllbnRYLCBjbGll
bnRZKTsKLSAgICBpbnQgc2NyZWVuWCA9IF9tb3VzZS0+Z2xvYmFsWCgpOwotICAgIGludCBzY3Jl
ZW5ZID0gX21vdXNlLT5nbG9iYWxZKCk7Ci0KLSAgICBpbnQgYnV0dG9uID0gLTE7Ci0gICAgc3dp
dGNoIChfbW91c2UtPmJ1dHRvbigpKSB7Ci0gICAgICAgIGNhc2UgUXQ6OkxlZnRCdXR0b246Ci0g
ICAgICAgICAgICBidXR0b24gPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
UXQ6Ok1pZEJ1dHRvbjoKLSAgICAgICAgICAgIGJ1dHRvbiA9IDE7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBRdDo6UmlnaHRCdXR0b246Ci0gICAgICAgICAgICBidXR0b24gPSAy
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVh
azsKLSAgICB9Ci0KLSAgICBib29sIGN0cmxLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6OkNv
bnRyb2xCdXR0b24pOwotICAgIGJvb2wgYWx0S2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0OjpB
bHRCdXR0b24pOwotICAgIGJvb2wgc2hpZnRLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6OlNo
aWZ0QnV0dG9uKTsKLSAgICBib29sIG1ldGFLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6Ok1l
dGFCdXR0b24pOwotICAgIAotICAgIHJldHVybiBkaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnRUeXBl
LCBidXR0b24sIGRldGFpbCwKLSAgICAgICAgY2xpZW50WCwgY2xpZW50WSwgc2NyZWVuWCwgc2Ny
ZWVuWSwKLSAgICAgICAgY3RybEtleSwgYWx0S2V5LCBzaGlmdEtleSwgbWV0YUtleSk7Ci19Ci0K
LWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoU2ltdWxhdGVkTW91c2VFdmVudChjb25zdCBBdG9taWNT
dHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4o
KSk7Ci0gICAgLy8gTGlrZSBHZWNrbywgd2UganVzdCBwYXNzIDAgZm9yIGV2ZXJ5dGhpbmcgd2hl
biB3ZSBtYWtlIGEgZmFrZSBtb3VzZSBldmVudC4KLSAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciBp
bnN0ZWFkIGdpdmVzIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uIGFuZCBzdGF0ZS4KLSAgICBy
ZXR1cm4gZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50VHlwZSwgMCwgMCwgMCwgMCwgMCwgMCwgZmFs
c2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaE1v
dXNlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIGludCBidXR0b24sIGludCBk
ZXRhaWwsCi0gICAgaW50IGNsaWVudFgsIGludCBjbGllbnRZLCBpbnQgc2NyZWVuWCwgaW50IHNj
cmVlblksCi0gICAgYm9vbCBjdHJsS2V5LCBib29sIGFsdEtleSwgYm9vbCBzaGlmdEtleSwgYm9v
bCBtZXRhS2V5KQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAg
ICBpZiAoZGlzYWJsZWQoKSkgLy8gRG9uJ3QgZXZlbiBzZW5kIERPTSBldmVudHMgZm9yIGRpc2Fi
bGVkIGNvbnRyb2xzLi4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAoZXZlbnRUeXBl
LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBTaG91bGRuJ3QgaGFwcGVuLgot
Ci0gICAgLy8gRGlzcGF0Y2hpbmcgdGhlIGZpcnN0IGV2ZW50IGNhbiBlYXNpbHkgcmVzdWx0IGlu
IHRoaXMgbm9kZSBiZWluZyBkZXN0cm95ZWQuCi0gICAgLy8gU2luY2Ugd2UgZGlzcGF0Y2ggdXAg
dG8gdGhyZWUgZXZlbnRzIGhlcmUsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlJ3JlIHJlZmVyZW5j
ZWQKLSAgICAvLyBzbyB0aGUgcG9pbnRlciB3aWxsIGJlIGdvb2QgZm9yIHRoZSB0d28gc3Vic2Vx
dWVudCBvbmVzLgotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVjdCh0aGlzKTsKLQotICAgIGJv
b2wgY2FuY2VsYWJsZSA9IGV2ZW50VHlwZSAhPSBtb3VzZW1vdmVFdmVudDsKLSAgICAKLSAgICBp
bnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBib29sIHN3YWxsb3dFdmVudCA9IGZhbHNlOwot
Ci0gICAgRXZlbnRJbXBsICptZSA9IG5ldyBNb3VzZUV2ZW50SW1wbChldmVudFR5cGUsdHJ1ZSxj
YW5jZWxhYmxlLGdldERvY3VtZW50KCktPmRlZmF1bHRWaWV3KCksCi0gICAgICAgICAgICAgICAg
ICAgZGV0YWlsLHNjcmVlblgsc2NyZWVuWSxjbGllbnRYLGNsaWVudFksY3RybEtleSxhbHRLZXks
c2hpZnRLZXksbWV0YUtleSwKLSAgICAgICAgICAgICAgICAgICBidXR0b24sMCk7Ci0gICAgbWUt
PnJlZigpOwotICAgIGRpc3BhdGNoRXZlbnQobWUsIGV4Y2VwdGlvbmNvZGUsIHRydWUpOwotICAg
IGJvb2wgZGVmYXVsdEhhbmRsZWQgPSBtZS0+ZGVmYXVsdEhhbmRsZWQoKTsKLSAgICBib29sIGRl
ZmF1bHRQcmV2ZW50ZWQgPSBtZS0+ZGVmYXVsdFByZXZlbnRlZCgpOwotICAgIGlmIChkZWZhdWx0
SGFuZGxlZCB8fCBkZWZhdWx0UHJldmVudGVkKQotICAgICAgICBzd2FsbG93RXZlbnQgPSB0cnVl
OwotICAgIG1lLT5kZXJlZigpOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlOiBJZiBpdCdzIGEgZG91
YmxlIGNsaWNrIGV2ZW50LCB3ZSBhbHNvIHNlbmQgdGhlIEtIVE1MX0RCTENMSUNLIGV2ZW50LiBU
aGlzIGlzIG5vdCBwYXJ0Ci0gICAgLy8gb2YgdGhlIERPTSBzcGVjcywgYnV0IGlzIHVzZWQgZm9y
IGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb25kYmxjbGljaz0iIiBhdHRyaWJ1dGUuICBUaGlzIGlz
IHRyZWF0ZWQKLSAgICAvLyBhcyBhIHNlcGFyYXRlIGV2ZW50IGluIG90aGVyIERPTS1jb21wbGlh
bnQgYnJvd3NlcnMgbGlrZSBGaXJlZm94LCBhbmQgc28gd2UgZG8gdGhlIHNhbWUuCi0gICAgaWYg
KGV2ZW50VHlwZSA9PSBjbGlja0V2ZW50ICYmIGRldGFpbCA9PSAyKSB7Ci0gICAgICAgIG1lID0g
bmV3IE1vdXNlRXZlbnRJbXBsKGtodG1sRGJsY2xpY2tFdmVudCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHJ1ZSxjYW5jZWxhYmxlLGdldERvY3VtZW50KCktPmRlZmF1bHRWaWV3
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbCxzY3JlZW5YLHNjcmVl
blksY2xpZW50WCxjbGllbnRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJs
S2V5LGFsdEtleSxzaGlmdEtleSxtZXRhS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBidXR0b24sMCk7Ci0gICAgICAgIG1lLT5yZWYoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRI
YW5kbGVkKQotICAgICAgICAgICAgbWUtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgIGRp
c3BhdGNoRXZlbnQobWUsZXhjZXB0aW9uY29kZSx0cnVlKTsKLSAgICAgICAgaWYgKG1lLT5kZWZh
dWx0SGFuZGxlZCgpIHx8IG1lLT5kZWZhdWx0UHJldmVudGVkKCkpCi0gICAgICAgICAgICBzd2Fs
bG93RXZlbnQgPSB0cnVlOwotICAgICAgICBtZS0+ZGVyZWYoKTsKLSAgICB9Ci0KLSAgICAvLyBB
bHNvIHNlbmQgYSBET01BY3RpdmF0ZSBldmVudCwgd2hpY2ggY2F1c2VzIHRoaW5ncyBsaWtlIGZv
cm0gc3VibWlzc2lvbnMgdG8gb2NjdXIuCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBjbGlja0V2ZW50
ICYmICFkZWZhdWx0UHJldmVudGVkKQotICAgICAgICBkaXNwYXRjaFVJRXZlbnQoRE9NQWN0aXZh
dGVFdmVudCwgZGV0YWlsKTsKLQotICAgIHJldHVybiBzd2FsbG93RXZlbnQ7Ci19Ci0KLWJvb2wg
Tm9kZUltcGw6OmRpc3BhdGNoVUlFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwg
aW50IGRldGFpbCkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0g
ICAgYXNzZXJ0ICghKCAoZXZlbnRUeXBlICE9IERPTUZvY3VzSW5FdmVudCAmJgotICAgICAgICAg
ICAgICAgIGV2ZW50VHlwZSAhPSBET01Gb2N1c091dEV2ZW50ICYmCi0gICAgICAgICAgICAgICAg
ZXZlbnRUeXBlICE9IERPTUFjdGl2YXRlRXZlbnQpKSk7Ci0KLSAgICBpZiAoIWdldERvY3VtZW50
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgY2FuY2VsYWJsZSA9IGZhbHNl
OwotICAgIGlmIChldmVudFR5cGUgPT0gRE9NQWN0aXZhdGVFdmVudCkKLSAgICAgICAgY2FuY2Vs
YWJsZSA9IHRydWU7Ci0KLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBVSUV2ZW50
SW1wbCAqZXZ0ID0gbmV3IFVJRXZlbnRJbXBsKGV2ZW50VHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwg
Z2V0RG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwgZGV0YWlsKTsKLSAgICByZXR1cm4gZGlzcGF0
Y2hFdmVudChldnQsZXhjZXB0aW9uY29kZSx0cnVlKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6cmVn
aXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3QpCi17Ci0gICAgaWYgKCFtX25vZGVMaXN0
cykgewotICAgICAgICBtX25vZGVMaXN0cyA9IG5ldyBRUHRyRGljdDxOb2RlTGlzdEltcGw+Owot
ICAgIH0KLQotICAgIG1fbm9kZUxpc3RzLT5pbnNlcnQobGlzdCwgbGlzdCk7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OnVucmVnaXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3QpCi17Ci0gICAg
aWYgKCFtX25vZGVMaXN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9ub2RlTGlzdHMtPnJl
bW92ZShsaXN0KTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6bm90aWZ5TG9jYWxOb2RlTGlzdHNBdHRy
aWJ1dGVDaGFuZ2VkKCkKLXsKLSAgICBpZiAoIW1fbm9kZUxpc3RzKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBRUHRyRGljdEl0ZXJhdG9yPE5vZGVMaXN0SW1wbD4gaSgqbV9ub2RlTGlzdHMpOwot
Ci0gICAgd2hpbGUgKE5vZGVMaXN0SW1wbCAqbGlzdCA9IGkuY3VycmVudCgpKSB7Ci0gICAgICAg
IGxpc3QtPnJvb3ROb2RlQXR0cmlidXRlQ2hhbmdlZCgpOwotICAgICAgICArK2k7Ci0gICAgfQot
fQotCi12b2lkIE5vZGVJbXBsOjpub3RpZnlOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCkKLXsK
LSAgICBmb3IgKE5vZGVJbXBsICpuID0gdGhpczsgbjsgbiA9IG4tPnBhcmVudE5vZGUoKSkgewot
ICAgICAgICBuLT5ub3RpZnlMb2NhbE5vZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQoKTsKLSAgICB9
Ci19Ci0KLXZvaWQgTm9kZUltcGw6Om5vdGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2Vk
KCkKLXsKLSAgICBpZiAoIW1fbm9kZUxpc3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBRUHRy
RGljdEl0ZXJhdG9yPE5vZGVMaXN0SW1wbD4gaSgqbV9ub2RlTGlzdHMpOwotCi0gICAgd2hpbGUg
KE5vZGVMaXN0SW1wbCAqbGlzdCA9IGkuY3VycmVudCgpKSB7Ci0gICAgICAgIGxpc3QtPnJvb3RO
b2RlQ2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgICAgICsraTsKLSAgICB9Ci19Ci0KLXZvaWQgTm9k
ZUltcGw6Om5vdGlmeU5vZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgZm9yIChOb2Rl
SW1wbCAqbiA9IHRoaXM7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgbi0+bm90
aWZ5TG9jYWxOb2RlTGlzdHNDaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB9Ci19Ci0KLWJvb2wgTm9k
ZUltcGw6OmRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoYm9vbCBzZW5kQ2hpbGRyZW5DaGFu
Z2VkKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLQotICAgIC8v
IEZJWE1FOiBQdWxsIHRoaXMgd2hvbGUgaWYgY2xhdXNlIG91dCBvZiB0aGlzIGZ1bmN0aW9uLgot
ICAgIGlmIChzZW5kQ2hpbGRyZW5DaGFuZ2VkKSB7Ci0gICAgICAgIG5vdGlmeU5vZGVMaXN0c0No
aWxkcmVuQ2hhbmdlZCgpOwotICAgICAgICBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgbm90aWZ5Tm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpOyAvLyBGSVhNRTogQ2Fu
IGRvIGJldHRlciBzb21lIGRheS4gUmVhbGx5IG9ubHkgY2FyZSBhYm91dCB0aGUgbmFtZSBhdHRy
aWJ1dGUgY2hhbmdpbmcuCi0KLSAgICBpZiAoIWdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlw
ZShEb2N1bWVudEltcGw6OkRPTVNVQlRSRUVNT0RJRklFRF9MSVNURU5FUikpCi0JcmV0dXJuIGZh
bHNlOwotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAgICByZXR1cm4gZGlzcGF0Y2hFdmVu
dChuZXcgTXV0YXRpb25FdmVudEltcGwoRE9NU3VidHJlZU1vZGlmaWVkRXZlbnQsCi0JCQkgdHJ1
ZSxmYWxzZSwwLERPTVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlv
bmNvZGUsdHJ1ZSk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoS2V5RXZlbnQoUUtleUV2
ZW50ICprZXkpCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAg
IGludCBleGNlcHRpb25jb2RlID0gMDsKLSAgICAvL2tkRGVidWcoNjAxMCkgPDwgIkRPTTo6Tm9k
ZUltcGw6IGRpc3BhdGNoaW5nIGtleWJvYXJkIGV2ZW50IiA8PCBlbmRsOwotICAgIEtleWJvYXJk
RXZlbnRJbXBsICprZXlib2FyZEV2ZW50SW1wbCA9IG5ldyBLZXlib2FyZEV2ZW50SW1wbChrZXks
IGdldERvY3VtZW50KCktPmRlZmF1bHRWaWV3KCkpOwotICAgIGtleWJvYXJkRXZlbnRJbXBsLT5y
ZWYoKTsKLSAgICBib29sIHIgPSBkaXNwYXRjaEV2ZW50KGtleWJvYXJkRXZlbnRJbXBsLGV4Y2Vw
dGlvbmNvZGUsdHJ1ZSk7Ci0KLSAgICAvLyB3ZSB3YW50IHRvIHJldHVybiBmYWxzZSBpZiBkZWZh
dWx0IGlzIHByZXZlbnRlZCAoYWxyZWFkeSB0YWtlbiBjYXJlIG9mKQotICAgIC8vIG9yIGlmIHRo
ZSBlbGVtZW50IGlzIGRlZmF1bHQtaGFuZGxlZCBieSB0aGUgRE9NLiBPdGhlcndpc2Ugd2UgbGV0
IGl0IGp1c3QKLSAgICAvLyBsZXQgaXQgZ2V0IGhhbmRsZWQgYnkgQXBwS2l0IAotICAgIGlmIChr
ZXlib2FyZEV2ZW50SW1wbC0+ZGVmYXVsdEhhbmRsZWQoKSkKLSAgICAgIHIgPSBmYWxzZTsKLQot
ICAgIGtleWJvYXJkRXZlbnRJbXBsLT5kZXJlZigpOwotICAgIHJldHVybiByOwotCi19Ci0KLXZv
aWQgTm9kZUltcGw6OmRpc3BhdGNoV2hlZWxFdmVudChRV2hlZWxFdmVudCAqZSkKLXsKLSAgICBh
c3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaWYgKGUtPmRlbHRhKCkgPT0g
MCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVu
dCgpOwotICAgIGlmICghZG9jKQotICAgICAgICByZXR1cm47Ci0KLSAgICBLSFRNTFZpZXcgKnZp
ZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgaWYgKCF2aWV3KQotICAgICAgICByZXR1
cm47Ci0KLSAgICBpbnQgeDsKLSAgICBpbnQgeTsKLSAgICB2aWV3LT52aWV3cG9ydFRvQ29udGVu
dHMoZS0+eCgpLCBlLT55KCksIHgsIHkpOwotCi0gICAgaW50IHN0YXRlID0gZS0+c3RhdGUoKTsK
LQotICAgIFdoZWVsRXZlbnRJbXBsICp3ZSA9IG5ldyBXaGVlbEV2ZW50SW1wbChlLT5vcmllbnRh
dGlvbigpID09IFF0OjpIb3Jpem9udGFsLCBlLT5kZWx0YSgpLAotICAgICAgICBnZXREb2N1bWVu
dCgpLT5kZWZhdWx0VmlldygpLCBlLT5nbG9iYWxYKCksIGUtPmdsb2JhbFkoKSwgeCwgeSwKLSAg
ICAgICAgc3RhdGUgJiBRdDo6Q29udHJvbEJ1dHRvbiwgc3RhdGUgJiBRdDo6QWx0QnV0dG9uLCBz
dGF0ZSAmIFF0OjpTaGlmdEJ1dHRvbiwgc3RhdGUgJiBRdDo6TWV0YUJ1dHRvbik7Ci0KLSAgICBp
bnQgZXhjZXB0aW9uQ29kZSA9IDA7Ci0gICAgaWYgKCFkaXNwYXRjaEV2ZW50KHdlLCBleGNlcHRp
b25Db2RlLCB0cnVlKSkKLSAgICAgICAgZS0+YWNjZXB0KCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6
OmhhbmRsZUxvY2FsRXZlbnRzKEV2ZW50SW1wbCAqZXZ0LCBib29sIHVzZUNhcHR1cmUpCi17Ci0g
ICAgaWYgKCFtX3JlZ2RMaXN0ZW5lcnMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChkaXNh
YmxlZCgpICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFQ
dHJMaXN0PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnNDb3B5ID0gKm1fcmVnZExp
c3RlbmVyczsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBp
dChsaXN0ZW5lcnNDb3B5KTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAg
ICBpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldnQtPnR5cGUoKSAmJiBpdC5jdXJy
ZW50KCktPnVzZUNhcHR1cmUoKSA9PSB1c2VDYXB0dXJlKQotICAgICAgICAgICAgaXQuY3VycmVu
dCgpLT5saXN0ZW5lcigpLT5oYW5kbGVFdmVudEltcGwoZXZ0LCBmYWxzZSk7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci19Ci0KLXVu
c2lnbmVkIE5vZGVJbXBsOjpjaGlsZE5vZGVDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6Y2hpbGROb2RlKHVuc2lnbmVkIC8qaW5kZXgqLykK
LXsKLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjp0cmF2ZXJzZU5leHRO
b2RlKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluKSBjb25zdAotewotICAgIGlmIChmaXJzdENo
aWxkKCkpIHsKLSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8IGZpcnN0Q2hpbGQoKS0+aXNB
bmNlc3RvcihzdGF5V2l0aGluKSk7Ci0JcmV0dXJuIGZpcnN0Q2hpbGQoKTsKLSAgICB9Ci0gICAg
aWYgKHRoaXMgPT0gc3RheVdpdGhpbikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG5leHRT
aWJsaW5nKCkpIHsKLSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8IG5leHRTaWJsaW5nKCkt
PmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwotCXJldHVybiBuZXh0U2libGluZygpOwotICAgIH0K
LSAgICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgd2hpbGUgKG4gJiYgIW4tPm5leHRT
aWJsaW5nKCkgJiYgKCFzdGF5V2l0aGluIHx8IG4tPnBhcmVudE5vZGUoKSAhPSBzdGF5V2l0aGlu
KSkKLSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICBpZiAobikgewotICAgICAgICBh
c3NlcnQoIXN0YXlXaXRoaW4gfHwgIW4tPm5leHRTaWJsaW5nKCkgfHwgbi0+bmV4dFNpYmxpbmco
KS0+aXNBbmNlc3RvcihzdGF5V2l0aGluKSk7Ci0gICAgICAgIHJldHVybiBuLT5uZXh0U2libGlu
ZygpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjp0cmF2
ZXJzZU5leHRTaWJsaW5nKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluKSBjb25zdAotewotICAg
IGlmICh0aGlzID09IHN0YXlXaXRoaW4pCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChuZXh0
U2libGluZygpKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCBuZXh0U2libGluZygp
LT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4pKTsKLQlyZXR1cm4gbmV4dFNpYmxpbmcoKTsKLSAgICB9
Ci0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5uZXh0
U2libGluZygpICYmICghc3RheVdpdGhpbiB8fCBuLT5wYXJlbnROb2RlKCkgIT0gc3RheVdpdGhp
bikpCi0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAg
YXNzZXJ0KCFzdGF5V2l0aGluIHx8ICFuLT5uZXh0U2libGluZygpIHx8IG4tPm5leHRTaWJsaW5n
KCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwotICAgICAgICByZXR1cm4gbi0+bmV4dFNpYmxp
bmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6dHJh
dmVyc2VQcmV2aW91c05vZGUoKSBjb25zdAotewotICAgIGlmIChwcmV2aW91c1NpYmxpbmcoKSkg
ewotICAgICAgICBOb2RlSW1wbCAqbiA9IHByZXZpb3VzU2libGluZygpOwotICAgICAgICB3aGls
ZSAobi0+bGFzdENoaWxkKCkpCi0gICAgICAgICAgICBuID0gbi0+bGFzdENoaWxkKCk7Ci0gICAg
ICAgIHJldHVybiBuOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnROb2RlKCkpIHsKLSAgICAg
ICAgcmV0dXJuIHBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjp0cmF2ZXJzZVByZXZpb3VzTm9k
ZVBvc3RPcmRlcihjb25zdCBOb2RlSW1wbCAqc3RheVdpdGhpbikgY29uc3QKLXsKLSAgICBpZiAo
bGFzdENoaWxkKCkpIHsKLSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8IGxhc3RDaGlsZCgp
LT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4pKTsKLQlyZXR1cm4gbGFzdENoaWxkKCk7Ci0gICAgfQot
ICAgIGlmICh0aGlzID09IHN0YXlXaXRoaW4pCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChw
cmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgcHJldmlv
dXNTaWJsaW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwotCXJldHVybiBwcmV2aW91c1Np
YmxpbmcoKTsKLSAgICB9Ci0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzOwotICAgIHdoaWxl
IChuICYmICFuLT5wcmV2aW91c1NpYmxpbmcoKSAmJiAoIXN0YXlXaXRoaW4gfHwgbi0+cGFyZW50
Tm9kZSgpICE9IHN0YXlXaXRoaW4pKQotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAg
IGlmIChuKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCAhbi0+cHJldmlvdXNTaWJs
aW5nKCkgfHwgbi0+cHJldmlvdXNTaWJsaW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwot
ICAgICAgICByZXR1cm4gbi0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiAw
OwotfQotCi12b2lkIE5vZGVJbXBsOjpjaGVja1NldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcg
Jl9wcmVmaXgsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICAvLyBQZXJmb3JtIGVycm9yIGNo
ZWNraW5nIGFzIHJlcXVpcmVkIGJ5IHNwZWMgZm9yIHNldHRpbmcgTm9kZS5wcmVmaXguIFVzZWQg
YnkKLSAgICAvLyBFbGVtZW50SW1wbDo6c2V0UHJlZml4KCkgYW5kIEF0dHJJbXBsOjpzZXRQcmVm
aXgoKQotCi0gICAgLy8gRklYTUU6IEltcGxlbWVudCBzdXBwb3J0IGZvciBJTlZBTElEX0NIQVJB
Q1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHByZWZpeCBjb250YWlucyBhbiBpbGxl
Z2FsIGNoYXJhY3Rlci4KLSAgICAKLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6
IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkg
ewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05f
QUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogSW1w
bGVtZW50IE5BTUVTUEFDRV9FUlI6IC0gUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcHJlZml4IGlz
IG1hbGZvcm1lZAotICAgIC8vIFdlIGhhdmUgdG8gY29tbWVudCB0aGlzIG91dCwgc2luY2UgaXQn
cyB1c2VkIGZvciBhdHRyaWJ1dGVzIGFuZCB0YWcgbmFtZXMsIGFuZCB3ZSd2ZSBvbmx5Ci0gICAg
Ly8gc3dpdGNoZWQgb25lIG92ZXIuCi0gICAgLyoKLSAgICAvLyAtIGlmIHRoZSBuYW1lc3BhY2VV
Ukkgb2YgdGhpcyBub2RlIGlzIG51bGwsCi0gICAgLy8gLSBpZiB0aGUgc3BlY2lmaWVkIHByZWZp
eCBpcyAieG1sIiBhbmQgdGhlIG5hbWVzcGFjZVVSSSBvZiB0aGlzIG5vZGUgaXMgZGlmZmVyZW50
IGZyb20KLSAgICAvLyAgICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAot
ICAgIC8vIC0gaWYgdGhpcyBub2RlIGlzIGFuIGF0dHJpYnV0ZSBhbmQgdGhlIHNwZWNpZmllZCBw
cmVmaXggaXMgInhtbG5zIiBhbmQKLSAgICAvLyAgIHRoZSBuYW1lc3BhY2VVUkkgb2YgdGhpcyBu
b2RlIGlzIGRpZmZlcmVudCBmcm9tICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsCi0g
ICAgLy8gLSBvciBpZiB0aGlzIG5vZGUgaXMgYW4gYXR0cmlidXRlIGFuZCB0aGUgcXVhbGlmaWVk
TmFtZSBvZiB0aGlzIG5vZGUgaXMgInhtbG5zIiBbTmFtZXNwYWNlc10uCi0gICAgaWYgKChuYW1l
c3BhY2VQYXJ0KGlkKCkpID09IG5vTmFtZXNwYWNlICYmIGlkKCkgPiBJRF9MQVNUX1RBRykgfHwK
LSAgICAgICAgKF9wcmVmaXggPT0gInhtbCIgJiYgRE9NU3RyaW5nKGdldERvY3VtZW50KCktPm5h
bWVzcGFjZVVSSShpZCgpKSkgIT0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFj
ZSIpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5BTUVTUEFDRV9F
UlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ki8KLX0KLQotdm9pZCBOb2RlSW1wbDo6Y2hlY2tB
ZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICAv
LyBQZXJmb3JtIGVycm9yIGNoZWNraW5nIGFzIHJlcXVpcmVkIGJ5IHNwZWMgZm9yIGFkZGluZyBh
IG5ldyBjaGlsZC4gVXNlZCBieQotICAgIC8vIGFwcGVuZENoaWxkKCksIHJlcGxhY2VDaGlsZCgp
IGFuZCBpbnNlcnRCZWZvcmUoKQotCi0gICAgLy8gTm90IG1lbnRpb25lZCBpbiBzcGVjOiB0aHJv
dyBOT1RfRk9VTkRfRVJSIGlmIG5ld0NoaWxkIGlzIG51bGwKLSAgICBpZiAoIW5ld0NoaWxkKSB7
Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9F
UlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkKLSAgICBpZiAoaXNSZWFkT25seSgp
KSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElP
Tl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgc2hvdWxk
QWRvcHRDaGlsZCA9IGZhbHNlOwotCi0gICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQg
aWYgbmV3Q2hpbGQgd2FzIGNyZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBkb2N1bWVudCB0aGFuIHRo
ZSBvbmUgdGhhdAotICAgIC8vIGNyZWF0ZWQgdGhpcyBub2RlLgotICAgIC8vIFdlIGFzc3VtZSB0
aGF0IGlmIG5ld0NoaWxkIGlzIGEgRG9jdW1lbnRGcmFnbWVudCwgYWxsIGNoaWxkcmVuIGFyZSBj
cmVhdGVkIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQKLSAgICAvLyBhcyB0aGUgZnJhZ21lbnQgaXRz
ZWxmIChvdGhlcndpc2UgdGhleSBjb3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkIGFzIGNoaWxkcmVu
KQotICAgIGlmIChuZXdDaGlsZC0+Z2V0RG9jdW1lbnQoKSAhPSBnZXREb2N1bWVudCgpKSB7Ci0J
Ly8gYnV0IGlmIHRoZSBjaGlsZCBpcyBub3QgaW4gYSBkb2N1bWVudCB5ZXQgdGhlbiBsb29zZW4g
dGhlCi0JLy8gcmVzdHJpY3Rpb24sIHNvIHRoYXQgZS5nLiBjcmVhdGluZyBhbiBlbGVtZW50IHdp
dGggdGhlIE9wdGlvbigpCi0JLy8gY29uc3RydWN0b3IgYW5kIHRoZW4gYWRkaW5nIGl0IHRvIGEg
ZGlmZmVyZW50IGRvY3VtZW50IHdvcmtzLAotCS8vIGFzIGl0IGRvZXMgaW4gTW96aWxsYSBhbmQg
TWFjIElFLgotCWlmICghbmV3Q2hpbGQtPmluRG9jdW1lbnQoKSkgewotCSAgICBzaG91bGRBZG9w
dENoaWxkID0gdHJ1ZTsKLQl9IGVsc2UgewotCSAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0
aW9uOjpXUk9OR19ET0NVTUVOVF9FUlI7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAg
Ly8gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIG9mIGEgdHlw
ZSB0aGF0IGRvZXMgbm90IGFsbG93IGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIHRoZQotICAgIC8v
IG5ld0NoaWxkIG5vZGUsIG9yIGlmIHRoZSBub2RlIHRvIGFwcGVuZCBpcyBvbmUgb2YgdGhpcyBu
b2RlJ3MgYW5jZXN0b3JzLgotCi0gICAgLy8gY2hlY2sgZm9yIGFuY2VzdG9yL3NhbWUgbm9kZQot
ICAgIGlmIChuZXdDaGlsZCA9PSB0aGlzIHx8IGlzQW5jZXN0b3IobmV3Q2hpbGQpKSB7Ci0gICAg
ICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAobmV3Q2hpbGQtPm5vZGVUeXBl
KCkgIT0gTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERSkgewotICAgICAgICBpZiAoIWNoaWxk
VHlwZUFsbG93ZWQobmV3Q2hpbGQtPm5vZGVUeXBlKCkpKSB7Ci0gICAgICAgICAgICBleGNlcHRp
b25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoTm9k
ZUltcGwgKm4gPSBuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmco
KSkgewotICAgICAgICAgICAgaWYgKCFjaGlsZFR5cGVBbGxvd2VkKG4tPm5vZGVUeXBlKCkpKSB7
Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZ
X1JFUVVFU1RfRVJSOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBjaGFuZ2UgdGhlIGRvY3VtZW50IHBvaW50ZXIg
b2YgbmV3Q2hpbGQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gdG8gYmUgdGhlIG5ldyBkb2N1bWVu
dAotICAgIGlmIChzaG91bGRBZG9wdENoaWxkKSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwqIG5v
ZGUgPSBuZXdDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUobmV3Q2hp
bGQpKSB7Ci0gICAgICAgICAgICBLSlM6OlNjcmlwdEludGVycHJldGVyOjp1cGRhdGVET01Ob2Rl
RG9jdW1lbnQobm9kZSwgbm9kZS0+Z2V0RG9jdW1lbnQoKSwgZ2V0RG9jdW1lbnQoKSk7Ci0gICAg
ICAgICAgICBub2RlLT5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLSAgICAgICAgfQotICAg
IH0KLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNBbmNlc3Rvcihjb25zdCBOb2RlSW1wbCAqb3RoZXIp
IGNvbnN0Ci17Ci0gICAgLy8gUmV0dXJuIHRydWUgaWYgb3RoZXIgaXMgYW4gYW5jZXN0b3Igb2Yg
dGhpcywgb3RoZXJ3aXNlIGZhbHNlCi0gICAgaWYgKCFvdGhlcikKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIGZvciAoY29uc3QgTm9kZUltcGwgKm4gPSBwYXJlbnROb2RlKCk7IG47IG4gPSBu
LT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYgKG4gPT0gb3RoZXIpCi0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBs
OjpjaGlsZEFsbG93ZWQoIE5vZGVJbXBsICpuZXdDaGlsZCApCi17Ci0gICAgcmV0dXJuIGNoaWxk
VHlwZUFsbG93ZWQobmV3Q2hpbGQtPm5vZGVUeXBlKCkpOwotfQotCi1Ob2RlSW1wbDo6U3R5bGVD
aGFuZ2UgTm9kZUltcGw6OmRpZmYoIGtodG1sOjpSZW5kZXJTdHlsZSAqczEsIGtodG1sOjpSZW5k
ZXJTdHlsZSAqczIgKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBUaGUgYmVoYXZpb3Igb2YgdGhp
cyBmdW5jdGlvbiBpcyBqdXN0IHRvdGFsbHkgd3JvbmcuICBJdCBkb2Vzbid0IGhhbmRsZQotICAg
IC8vIGV4cGxpY2l0IGluaGVyaXRhbmNlIG9mIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcyBhbmQg
c28geW91IGVuZCB1cCBub3QgcmUtcmVzb2x2aW5nCi0gICAgLy8gc3R5bGUgaW4gY2FzZXMgd2hl
cmUgeW91IG5lZWQgdG8uCi0gICAgU3R5bGVDaGFuZ2UgY2ggPSBOb0luaGVyaXQ7Ci0gICAgRURp
c3BsYXkgZGlzcGxheTEgPSBzMSA/IHMxLT5kaXNwbGF5KCkgOiBOT05FOwotICAgIGJvb2wgZmwx
ID0gczEgPyBzMS0+aGFzUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OkZJUlNUX0xFVFRFUikgOiBm
YWxzZTsKLSAgICBFRGlzcGxheSBkaXNwbGF5MiA9IHMyID8gczItPmRpc3BsYXkoKSA6IE5PTkU7
Ci0gICAgYm9vbCBmbDIgPSBzMiA/IHMyLT5oYXNQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6RklS
U1RfTEVUVEVSKSA6IGZhbHNlOwotICAgIGlmIChkaXNwbGF5MSAhPSBkaXNwbGF5MiB8fCBmbDEg
IT0gZmwyKQotICAgICAgICBjaCA9IERldGFjaDsKLSAgICBlbHNlIGlmICggIXMxIHx8ICFzMiAp
Ci0JY2ggPSBJbmhlcml0OwotICAgIGVsc2UgaWYgKCAqczEgPT0gKnMyICkKLSAJY2ggPSBOb0No
YW5nZTsKLSAgICBlbHNlIGlmICggczEtPmluaGVyaXRlZE5vdEVxdWFsKCBzMiApICkKLQljaCA9
IEluaGVyaXQ7Ci0gICAgcmV0dXJuIGNoOwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBOb2Rl
SW1wbDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGluZCkgY29uc3QKLXsKLSAg
ICAvLyAjIyMgaW1wbGVtZW50IGR1bXAoKSBmb3IgYWxsIGFwcHJvcHJpYXRlIHN1YmNsYXNzZXMK
LQotICAgIGlmIChtX2hhc0lkKSB7ICpzdHJlYW0gPDwgIiBoYXNJZCI7IH0KLSAgICBpZiAobV9o
YXNDbGFzcykgeyAqc3RyZWFtIDw8ICIgaGFzQ2xhc3MiOyB9Ci0gICAgaWYgKG1faGFzU3R5bGUp
IHsgKnN0cmVhbSA8PCAiIGhhc1N0eWxlIjsgfQotICAgIGlmIChtX3NwZWNpZmllZCkgeyAqc3Ry
ZWFtIDw8ICIgc3BlY2lmaWVkIjsgfQotICAgIGlmIChtX2ZvY3VzZWQpIHsgKnN0cmVhbSA8PCAi
IGZvY3VzZWQiOyB9Ci0gICAgaWYgKG1fYWN0aXZlKSB7ICpzdHJlYW0gPDwgIiBhY3RpdmUiOyB9
Ci0gICAgaWYgKG1fc3R5bGVFbGVtZW50KSB7ICpzdHJlYW0gPDwgIiBzdHlsZUVsZW1lbnQiOyB9
Ci0gICAgaWYgKG1faW1wbGljaXQpIHsgKnN0cmVhbSA8PCAiIGltcGxpY2l0IjsgfQotCi0gICAg
KnN0cmVhbSA8PCAiIHRhYkluZGV4PSIgPDwgbV90YWJJbmRleDsKLSAgICBpZiAobV9yZWdkTGlz
dGVuZXJzKQotCSpzdHJlYW0gPDwgIiAjcmVnZExpc3RlbmVycz0iIDw8IG1fcmVnZExpc3RlbmVy
cy0+Y291bnQoKTsgLy8gIyMjIG1vcmUgZGV0YWlsCi0gICAgKnN0cmVhbSA8PCBlbmRsOwotCi0g
ICAgTm9kZUltcGwgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlKGNoaWxkKSB7Ci0J
KnN0cmVhbSA8PCBpbmQgPDwgY2hpbGQtPm5vZGVOYW1lKCkucXN0cmluZygpLmFzY2lpKCkgPDwg
IjogIjsKLSAgICAgICAgY2hpbGQtPmR1bXAoc3RyZWFtLGluZCsiICAiKTsKLSAgICAgICAgY2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotdm9pZCBOb2Rl
SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotICAgIGFzc2VydCgh
bV9yZW5kZXIgfHwgKG1fcmVuZGVyLT5zdHlsZSgpICYmIG1fcmVuZGVyLT5wYXJlbnQoKSkpOwot
ICAgIGdldERvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7Ci0gICAgbV9hdHRhY2hlZCA9
IHRydWU7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OndpbGxSZW1vdmUoKQotewotfQotCi12b2lkIE5v
ZGVJbXBsOjpkZXRhY2goKQotewotICAgIG1faW5EZXRhY2ggPSB0cnVlOwotLy8gICAgYXNzZXJ0
KG1fYXR0YWNoZWQpOwotCi0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+ZGVz
dHJveSgpOwotICAgIG1fcmVuZGVyID0gMDsKLQotICAgIERvY3VtZW50SW1wbCAqZG9jID0gZ2V0
RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jKQotICAgICAgICBkb2MtPmluY0RPTVRyZWVWZXJzaW9u
KCk7Ci0gICAgbV9hdHRhY2hlZCA9IGZhbHNlOwotICAgIG1faW5EZXRhY2ggPSBmYWxzZTsKLX0K
LQotYm9vbCBOb2RlSW1wbDo6bWFpbnRhaW5zU3RhdGUoKQotewotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotUVN0cmluZyBOb2RlSW1wbDo6c3RhdGUoKQotewotICAgIHJldHVybiBRU3RyaW5nOjpu
dWxsOwotfQotCi12b2lkIE5vZGVJbXBsOjpyZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJi8qc3Rh
dGVzKi8pCi17Ci19Ci0KLXZvaWQgTm9kZUltcGw6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsK
LSAgICBpZiAobV9yZWdkTGlzdGVuZXJzICYmICFtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAm
JiBnZXREb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVudCgpLT51bnJlZ2lzdGVyRGlzY29u
bmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsKLQotICAgIHNldEluRG9jdW1lbnQo
dHJ1ZSk7Ci0gICAgCi0gICAgaW5zZXJ0ZWRJbnRvVHJlZShmYWxzZSk7Ci19Ci0KLXZvaWQgTm9k
ZUltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChtX3JlZ2RMaXN0ZW5lcnMg
JiYgIW1fcmVnZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3VtZW50KCkpCi0gICAgICAg
IGdldERvY3VtZW50KCktPnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVy
cyh0aGlzKTsKLQotICAgIHNldEluRG9jdW1lbnQoZmFsc2UpOwotICAgIAotICAgIHJlbW92ZWRG
cm9tVHJlZShmYWxzZSk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmNoaWxkcmVuQ2hhbmdlZCgpCi17
Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc2FibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzUmVhZE9ubHkoKQotewotICAgIC8vIEVudGl0eSAm
IEVudGl0eSBSZWZlcmVuY2Ugbm9kZXMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIGFyZSByZWFkLW9u
bHkKLSAgICBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgd2hpbGUgKG4pIHsKLQlpZiAobi0+bm9k
ZVR5cGUoKSA9PSBOb2RlOjpFTlRJVFlfTk9ERSB8fAotCSAgICBuLT5ub2RlVHlwZSgpID09IE5v
ZGU6OkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKLQkgICAgcmV0dXJuIHRydWU7Ci0JbiA9IG4tPnBh
cmVudE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Ob2RlSW1wbCAqTm9k
ZUltcGw6OnByZXZpb3VzRWRpdGFibGUoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpub2RlID0g
cHJldmlvdXNMZWFmTm9kZSgpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChub2Rl
LT5pc0NvbnRlbnRFZGl0YWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAg
IG5vZGUgPSBub2RlLT5wcmV2aW91c0xlYWZOb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwot
fQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6Om5leHRFZGl0YWJsZSgpIGNvbnN0Ci17Ci0gICAgTm9k
ZUltcGwgKm5vZGUgPSBuZXh0TGVhZk5vZGUoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAg
ICBpZiAobm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBub2Rl
OwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dExlYWZOb2RlKCk7Ci0gICAgfQotICAgIHJldHVy
biAwOwotfQotCi1SZW5kZXJPYmplY3QgKiBOb2RlSW1wbDo6cHJldmlvdXNSZW5kZXJlcigpCi17
Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9IHByZXZpb3VzU2libGluZygpOyBuOyBuID0gbi0+cHJl
dmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKG4tPnJlbmRlcmVyKCkpCi0gICAgICAgICAg
ICByZXR1cm4gbi0+cmVuZGVyZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVJlbmRl
ck9iamVjdCAqIE5vZGVJbXBsOjpuZXh0UmVuZGVyZXIoKQotewotICAgIC8vIEF2b2lkIGFuIE8o
bl4yKSBwcm9ibGVtIHdpdGggdGhpcyBmdW5jdGlvbiBieSBub3QgY2hlY2tpbmcgZm9yIG5leHRS
ZW5kZXJlcigpIHdoZW4gdGhlIHBhcmVudCBlbGVtZW50IGhhc24ndCBldmVuIAotICAgIC8vIGJl
ZW4gYXR0YWNoZWQgeWV0LgotICAgIGlmIChwYXJlbnQoKSAmJiAhcGFyZW50KCktPmF0dGFjaGVk
KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yIChOb2RlSW1wbCAqbiA9IG5leHRTaWJs
aW5nKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlmIChuLT5yZW5kZXJl
cigpKQotICAgICAgICAgICAgcmV0dXJuIG4tPnJlbmRlcmVyKCk7Ci0gICAgfQotICAgIHJldHVy
biAwOwotfQotCi0vLyBGSVhNRTogVGhpcyBjb2RlIGlzIHVzZWQgYnkgZWRpdGluZy4gIFNlZW1z
IGxpa2UgaXQgY291bGQgbW92ZSBvdmVyIHRoZXJlIGFuZCBub3QgcG9sbHV0ZSBOb2RlSW1wbC4K
LU5vZGVJbXBsICpOb2RlSW1wbDo6cHJldmlvdXNOb2RlQ29uc2lkZXJpbmdBdG9taWNOb2Rlcygp
IGNvbnN0Ci17Ci0gICAgaWYgKHByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgIE5vZGVJbXBs
ICpuID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIHdoaWxlICghaXNBdG9taWNOb2RlKG4p
ICYmIG4tPmxhc3RDaGlsZCgpKQotICAgICAgICAgICAgbiA9IG4tPmxhc3RDaGlsZCgpOwotICAg
ICAgICByZXR1cm4gbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50Tm9kZSgpKSB7Ci0gICAg
ICAgIHJldHVybiBwYXJlbnROb2RlKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6bmV4dE5vZGVDb25zaWRlcmlu
Z0F0b21pY05vZGVzKCkgY29uc3QKLXsKLSAgICBpZiAoIWlzQXRvbWljTm9kZSh0aGlzKSAmJiBm
aXJzdENoaWxkKCkpCi0JcmV0dXJuIGZpcnN0Q2hpbGQoKTsKLSAgICBpZiAobmV4dFNpYmxpbmco
KSkKLQlyZXR1cm4gbmV4dFNpYmxpbmcoKTsKLSAgICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXM7
Ci0gICAgd2hpbGUgKG4gJiYgIW4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIG4gPSBuLT5wYXJl
bnROb2RlKCk7Ci0gICAgaWYgKG4pCi0gICAgICAgIHJldHVybiBuLT5uZXh0U2libGluZygpOwot
ICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnByZXZpb3VzTGVhZk5vZGUo
KSBjb25zdAotewotICAgIE5vZGVJbXBsICpub2RlID0gcHJldmlvdXNOb2RlQ29uc2lkZXJpbmdB
dG9taWNOb2RlcygpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChpc0F0b21pY05v
ZGUobm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgbm9kZSA9IG5vZGUt
PnByZXZpb3VzTm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6bmV4dExlYWZOb2RlKCkgY29uc3QKLXsKLSAg
ICBOb2RlSW1wbCAqbm9kZSA9IG5leHROb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpOwotICAg
IHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChpc0F0b21pY05vZGUobm9kZSkpCi0gICAgICAg
ICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHROb2RlQ29uc2lkZXJp
bmdBdG9taWNOb2RlcygpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOb2RlSW1w
bDo6Y3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpCi17Ci0KLSAgICBpZiAoIWdldERvY3VtZW50KCkt
PnNob3VsZENyZWF0ZVJlbmRlcmVycygpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAg
IGFzc2VydCghYXR0YWNoZWQoKSk7Ci0gICAgYXNzZXJ0KCFtX3JlbmRlcik7Ci0gICAgCi0gICAg
Tm9kZUltcGwgKnBhcmVudCA9IHBhcmVudE5vZGUoKTsgICAgCi0gICAgYXNzZXJ0KHBhcmVudCk7
Ci0gICAgICAgIAotICAgIFJlbmRlck9iamVjdCAqcGFyZW50UmVuZGVyZXIgPSBwYXJlbnQtPnJl
bmRlcmVyKCk7Ci0gICAgaWYgKHBhcmVudFJlbmRlcmVyICYmIHBhcmVudFJlbmRlcmVyLT5jYW5I
YXZlQ2hpbGRyZW4oKQotI2lmIFNWR19TVVBQT1JUCi0gICAgICAgICYmIHBhcmVudC0+Y2hpbGRT
aG91bGRDcmVhdGVSZW5kZXJlcih0aGlzKQotI2VuZGlmCi0gICAgICAgICkgewotICAgICAgICBS
ZW5kZXJTdHlsZSAqc3R5bGUgPSBzdHlsZUZvclJlbmRlcmVyKHBhcmVudFJlbmRlcmVyKTsKLSAg
ICAgICAgc3R5bGUtPnJlZigpOwotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICAgYm9vbCBy
ZXNvbHZlU3R5bGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGdldERvY3VtZW50KCktPmJpbmRpbmdN
YW5hZ2VyKCktPmxvYWRCaW5kaW5ncyh0aGlzLCBzdHlsZS0+YmluZGluZ1VSSXMoKSwgdHJ1ZSwg
JnJlc29sdmVTdHlsZSkgJiYgCi0gICAgICAgICAgICByZW5kZXJlcklzTmVlZGVkKHN0eWxlKSkg
ewotICAgICAgICAgICAgaWYgKHJlc29sdmVTdHlsZSkgewotICAgICAgICAgICAgICAgIHN0eWxl
LT5kZXJlZigpOwotICAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGVGb3JSZW5kZXJlcihwYXJl
bnRSZW5kZXJlcik7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAocmVuZGVyZXJJ
c05lZWRlZChzdHlsZSkpIHsKLSNlbmRpZgotICAgICAgICAgICAgbV9yZW5kZXIgPSBjcmVhdGVS
ZW5kZXJlcihnZXREb2N1bWVudCgpLT5yZW5kZXJBcmVuYSgpLCBzdHlsZSk7Ci0gICAgICAgICAg
ICBpZiAobV9yZW5kZXIpIHsKLSAgICAgICAgICAgICAgICBtX3JlbmRlci0+c2V0U3R5bGUoc3R5
bGUpOwotICAgICAgICAgICAgICAgIHBhcmVudFJlbmRlcmVyLT5hZGRDaGlsZChtX3JlbmRlciwg
bmV4dFJlbmRlcmVyKCkpOwotICAgICAgICAgICAgfQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAg
ICAgICAgfSAvLyBhdm9pZCBjb25mdXNpbmcgdGhlIGNoYW5nZSBsb2cgY29kZSBwYXJzZXIgYnkg
aGF2aW5nIHR3byBjbG9zZSBicmFjZXMgdG8gbWF0Y2ggdGhlIHR3byBvcGVuIGJyYWNlcyBhYm92
ZQotI2Vsc2UKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHN0eWxlLT5kZXJlZihnZXREb2N1
bWVudCgpLT5yZW5kZXJBcmVuYSgpKTsKLSAgICB9Ci19Ci0KLVJlbmRlclN0eWxlICpOb2RlSW1w
bDo6c3R5bGVGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QgKnBhcmVudCkKLXsKLSAgICByZXR1cm4g
cGFyZW50LT5zdHlsZSgpOwotfQotCi1ib29sIE5vZGVJbXBsOjpyZW5kZXJlcklzTmVlZGVkKFJl
bmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gKGdldERvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpID09IHRoaXMpIHx8IChzdHlsZS0+ZGlzcGxheSgpICE9IE5PTkUpOwotfQotCi1S
ZW5kZXJPYmplY3QgKk5vZGVJbXBsOjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEs
IFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiAw
OwotfQotCi1pbnQgTm9kZUltcGw6Om1heE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDE7
Ci19Ci0KLS8vIEZJWE1FOiBTaG91bGRuJ3QgdGhlc2UgZnVuY3Rpb25zIGJlIGluIHRoZSBlZGl0
aW5nIGNvZGU/ICBDb2RlIHRoYXQgYXNrcyBxdWVzdGlvbnMgYWJvdXQgSFRNTCBpbiB0aGUgY29y
ZSBET00gY2xhc3MKLS8vIGlzIG9idmlvdXNseSBtaXNwbGFjZWQuCi1pbnQgTm9kZUltcGw6OmNh
cmV0TWluT2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSA/IHJlbmRlcmVy
KCktPmNhcmV0TWluT2Zmc2V0KCkgOiAwOwotfQotCi1pbnQgTm9kZUltcGw6OmNhcmV0TWF4T2Zm
c2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPmNhcmV0
TWF4T2Zmc2V0KCkgOiAxOwotfQotCi11bnNpZ25lZCBOb2RlSW1wbDo6Y2FyZXRNYXhSZW5kZXJl
ZE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5j
YXJldE1heFJlbmRlcmVkT2Zmc2V0KCkgOiAxOwotfQotCi1pbnQgTm9kZUltcGw6OnByZXZpb3Vz
T2Zmc2V0IChpbnQgY3VycmVudCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSA/IHJl
bmRlcmVyKCktPnByZXZpb3VzT2Zmc2V0KGN1cnJlbnQpIDogY3VycmVudCAtIDE7Ci19Ci0KLWlu
dCBOb2RlSW1wbDo6bmV4dE9mZnNldCAoaW50IGN1cnJlbnQpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5uZXh0T2Zmc2V0KGN1cnJlbnQpIDogY3VycmVudCAr
IDE7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzQmxvY2tGbG93KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gcmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc0Jsb2NrRmxvdygpOwotfQotCi1ib29sIE5v
ZGVJbXBsOjppc0Jsb2NrRmxvd09yQmxvY2tUYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJl
bmRlcmVyKCkgJiYgKHJlbmRlcmVyKCktPmlzQmxvY2tGbG93KCkgfHwgcmVuZGVyZXIoKS0+aXNU
YWJsZSgpICYmICFyZW5kZXJlcigpLT5pc0lubGluZSgpKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6
aXNFZGl0YWJsZUJsb2NrKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNDb250ZW50RWRpdGFibGUo
KSAmJiBpc0Jsb2NrRmxvdygpOwotfQotCi1FbGVtZW50SW1wbCAqTm9kZUltcGw6OmVuY2xvc2lu
Z0Jsb2NrRmxvd09yVGFibGVFbGVtZW50KCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9IGNv
bnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0gICAgaWYgKGlzQmxvY2tGbG93T3JCbG9ja1Rh
YmxlKCkpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLQot
ICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlm
ICghbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAobi0+aXNCbG9ja0Zsb3dPckJs
b2NrVGFibGUoKSB8fCBuLT5oYXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0K
LQotRWxlbWVudEltcGwgKk5vZGVJbXBsOjplbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KCkgY29u
c3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0g
ICAgaWYgKGlzQmxvY2tGbG93KCkpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50
SW1wbCAqPihuKTsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnROb2Rl
KCk7Ci0gICAgICAgIGlmICghbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAobi0+
aXNCbG9ja0Zsb3coKSB8fCBuLT5oYXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwotICAgIH0KLSAgICByZXR1cm4gMDsK
LX0KLQotRWxlbWVudEltcGwgKk5vZGVJbXBsOjplbmNsb3NpbmdJbmxpbmVFbGVtZW50KCkgY29u
c3QKLXsKLSAgICBOb2RlSW1wbCAqbiA9IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0g
ICAgTm9kZUltcGwgKnA7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBwID0gbi0+cGFyZW50
Tm9kZSgpOwotICAgICAgICBpZiAoIXAgfHwgcC0+aXNCbG9ja0Zsb3coKSB8fCBwLT5oYXNUYWdO
YW1lKGJvZHlUYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBs
ICo+KG4pOwotICAgICAgICAvLyBBbHNvIHN0b3AgaWYgYW55IHByZXZpb3VzIHNpYmxpbmcgaXMg
YSBibG9jawotICAgICAgICBmb3IgKE5vZGVJbXBsICpzaWJsaW5nID0gbi0+cHJldmlvdXNTaWJs
aW5nKCk7IHNpYmxpbmc7IHNpYmxpbmcgPSBzaWJsaW5nLT5wcmV2aW91c1NpYmxpbmcoKSkgewot
ICAgICAgICAgICAgaWYgKHNpYmxpbmctPmlzQmxvY2tGbG93KCkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwotICAgICAgICB9Ci0gICAgICAg
IG4gPSBwOwotICAgIH0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsK
LX0KLQotRWxlbWVudEltcGwgKk5vZGVJbXBsOjpyb290RWRpdGFibGVFbGVtZW50KCkgY29uc3QK
LXsKLSAgICBpZiAoIWlzQ29udGVudEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgTm9kZUltcGwgKm4gPSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMpOwotICAgIGlmIChu
LT5oYXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVu
dEltcGwgKj4obik7Ci0KLSAgICBOb2RlSW1wbCAqcmVzdWx0ID0gbi0+aXNFZGl0YWJsZUJsb2Nr
KCkgPyBuIDogMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgp
OwotICAgICAgICBpZiAoIW4gfHwgIW4tPmlzQ29udGVudEVkaXRhYmxlKCkpCi0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoYm9keVRhZykpIHsKLSAgICAgICAg
ICAgIHJlc3VsdCA9IG47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBp
ZiAobi0+aXNCbG9ja0Zsb3coKSkKLSAgICAgICAgICAgIHJlc3VsdCA9IG47Ci0gICAgfQotICAg
IHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihyZXN1bHQpOwotfQotCi1ib29sIE5v
ZGVJbXBsOjppblNhbWVSb290RWRpdGFibGVFbGVtZW50KE5vZGVJbXBsICpuKQotewotICAgIHJl
dHVybiBuID8gcm9vdEVkaXRhYmxlRWxlbWVudCgpID09IG4tPnJvb3RFZGl0YWJsZUVsZW1lbnQo
KSA6IGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBsOjppblNhbWVDb250YWluaW5nQmxvY2tGbG93
RWxlbWVudChOb2RlSW1wbCAqbikKLXsKLSAgICByZXR1cm4gbiA/IGVuY2xvc2luZ0Jsb2NrRmxv
d0VsZW1lbnQoKSA9PSBuLT5lbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KCkgOiBmYWxzZTsKLX0K
LQotLy8gRklYTUU6IEVuZCBvZiBvYnZpb3VzbHkgbWlzcGxhY2VkIEhUTUwgZWRpdGluZyBmdW5j
dGlvbnMuICBUcnkgdG8gbW92ZSB0aGVzZSBvdXQgb2YgTm9kZUltcGwuCi0KLVJlZlB0cjxOb2Rl
TGlzdEltcGw+IE5vZGVJbXBsOjpnZXRFbGVtZW50c0J5VGFnTmFtZU5TKGNvbnN0IERPTVN0cmlu
ZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJmxvY2FsTmFtZSkKLXsKLSAgICBpZiAo
bmFtZXNwYWNlVVJJLmlzTnVsbCgpIHx8IGxvY2FsTmFtZS5pc051bGwoKSkKLSAgICAgICAgcmV0
dXJuIFJlZlB0cjxOb2RlTGlzdEltcGw+KCk7IC8vIEZJWE1FOiBXaG8gY2FyZXMgYWJvdXQgdGhp
cyBhZGRpdGlvbmFsIGNoZWNrPwotICAgIAotICAgIERPTVN0cmluZyBuYW1lID0gbG9jYWxOYW1l
OwotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKQotICAgICAgICBuYW1l
ID0gbG9jYWxOYW1lLmxvd2VyKCk7Ci0gICAgcmV0dXJuIFJlZlB0cjxOb2RlTGlzdEltcGw+KG5l
dyBUYWdOb2RlTGlzdEltcGwodGhpcywgQXRvbWljU3RyaW5nKG5hbWVzcGFjZVVSSSksIEF0b21p
Y1N0cmluZyhuYW1lKSkpOwotfQotCi1ib29sIE5vZGVJbXBsOjppc1N1cHBvcnRlZChjb25zdCBE
T01TdHJpbmcgJmZlYXR1cmUsIGNvbnN0IERPTVN0cmluZyAmdmVyc2lvbikKLXsKLSAgICByZXR1
cm4gRE9NSW1wbGVtZW50YXRpb25JbXBsOjppbnN0YW5jZSgpLT5oYXNGZWF0dXJlKGZlYXR1cmUs
IHZlcnNpb24pOwotfQotCi1Eb2N1bWVudEltcGwgKk5vZGVJbXBsOjpvd25lckRvY3VtZW50KCkg
Y29uc3QKLXsKLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgcmV0
dXJuIGRvYyA9PSB0aGlzID8gMCA6IGRvYzsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aGFzQXR0cmli
dXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1OYW1lZEF0dHJNYXBJbXBs
ICpOb2RlSW1wbDo6YXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWJv
b2wgTm9kZUltcGw6OmlzRXF1YWxOb2RlKE5vZGVJbXBsICpvdGhlcikgY29uc3QKLXsKLSAgICBp
ZiAoIW90aGVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG5vZGVUeXBl
KCkgIT0gb3RoZXItPm5vZGVUeXBlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAg
ICBpZiAobm9kZU5hbWUoKSAhPSBvdGhlci0+bm9kZU5hbWUoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIGlmIChsb2NhbE5hbWUoKSAhPSBvdGhlci0+bG9jYWxOYW1lKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobmFtZXNwYWNlVVJJKCkgIT0gb3Ro
ZXItPm5hbWVzcGFjZVVSSSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYg
KHByZWZpeCgpICE9IG90aGVyLT5wcmVmaXgoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IAotICAgIGlmIChub2RlVmFsdWUoKSAhPSBvdGhlci0+bm9kZVZhbHVlKCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBOYW1lZEF0dHJNYXBJbXBsICphdHRycyA9IGF0dHJpYnV0
ZXMoKTsKLSAgICBOYW1lZEF0dHJNYXBJbXBsICpvdGhlckF0dHJzID0gb3RoZXItPmF0dHJpYnV0
ZXMoKTsKLSAgICAKLSAgICBpZiAoIWF0dHJzICYmIG90aGVyQXR0cnMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBpZiAoYXR0cnMgJiYgIWF0dHJzLT5tYXBzRXF1aXZhbGVudChv
dGhlckF0dHJzKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIE5vZGVJbXBsICpj
aGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBOb2RlSW1wbCAqb3RoZXJDaGlsZCA9IG90aGVyLT5m
aXJzdENoaWxkKCk7Ci0gICAgCi0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIGlmICghY2hp
bGQtPmlzRXF1YWxOb2RlKG90aGVyQ2hpbGQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICAKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAg
b3RoZXJDaGlsZCA9IG90aGVyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIAotICAg
IGlmIChvdGhlckNoaWxkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgLy8gRklY
TUU6IEZvciBEb2N1bWVudFR5cGUgbm9kZXMgd2Ugc2hvdWxkIGNoZWNrIGVxdWFsaXR5IG9uCi0g
ICAgLy8gdGhlIGVudGl0aWVzIGFuZCBub3RhdGlvbnMgTmFtZWROb2RlTWFwcyBhcyB3ZWxsLgot
ICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0RlZmF1bHROYW1l
c3BhY2UoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0Ci17Ci0gICAgLy8gSW1w
bGVtZW50ZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9S
RUMtRE9NLUxldmVsLTMtQ29yZS0yMDA0MDQwNy9uYW1lc3BhY2VzLWFsZ29yaXRobXMuaHRtbCNp
c0RlZmF1bHROYW1lc3BhY2VBbGdvCi0gICAgCi0gICAgc3dpdGNoIChub2RlVHlwZSgpKSB7Ci0g
ICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBFbGVt
ZW50SW1wbCAqZWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KHRoaXMpOwot
ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZWxlbS0+cHJlZml4KCkuaXNOdWxsKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0tPm5hbWVzcGFjZVVSSSgpID09IG5hbWVzcGFjZVVS
STsKLQotICAgICAgICAgICAgaWYgKGVsZW0tPmhhc0F0dHJpYnV0ZXMoKSkgewotICAgICAgICAg
ICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gZWxlbS0+YXR0cmlidXRlcygpOwotICAg
ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBh
dHRycy0+bGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBs
ICphdHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bG9jYWxOYW1lKCkgPT0gInhtbG5zIikKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT52YWx1ZSgpID09IG5hbWVzcGFjZVVS
STsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGlmIChFbGVtZW50SW1wbCAqYW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3ItPmlzRGVmYXVsdE5hbWVzcGFjZShuYW1l
c3BhY2VVUkkpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAg
ICAgY2FzZSBOb2RlOjpET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19j
YXN0IDxjb25zdCBEb2N1bWVudEltcGwgKj4odGhpcyktPmRvY3VtZW50RWxlbWVudCgpLT5pc0Rl
ZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlf
Tk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpOT1RBVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5v
ZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFH
TUVOVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIE5vZGU6
OkFUVFJJQlVURV9OT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBBdHRySW1wbCAqYXR0ciA9IHN0
YXRpY19jYXN0PGNvbnN0IEF0dHJJbXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGF0
dHItPm93bmVyRWxlbWVudCgpLT5pc0RlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoRWxlbWVudEltcGwgKmFuY2VzdG9yID0gZ2V0QW5j
ZXN0b3JFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLT5pc0RlZmF1
bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIE5vZGVJbXBsOjpsb29rdXBQcmVmaXgo
Y29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0Ci17Ci0gICAgLy8gSW1wbGVtZW50
ZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMtRE9N
LUxldmVsLTMtQ29yZS0yMDA0MDQwNy9uYW1lc3BhY2VzLWFsZ29yaXRobXMuaHRtbCNsb29rdXBO
YW1lc3BhY2VQcmVmaXhBbGdvCi0gICAgCi0gICAgaWYgKG5hbWVzcGFjZVVSSS5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAKLSAgICBzd2l0Y2ggKG5vZGVUeXBl
KCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6Ci0gICAgICAgICAgICByZXR1
cm4gbG9va3VwTmFtZXNwYWNlUHJlZml4KG5hbWVzcGFjZVVSSSwgc3RhdGljX2Nhc3Q8Y29uc3Qg
RWxlbWVudEltcGwgKj4odGhpcykpOwotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6
Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRG9jdW1lbnRJbXBsICo+KHRo
aXMpLT5kb2N1bWVudEVsZW1lbnQoKS0+bG9va3VwUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAg
ICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05f
Tk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAg
ICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBET01T
dHJpbmcoKTsKLSAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERTogewotICAgICAgICAg
ICAgY29uc3QgQXR0ckltcGwgKmF0dHIgPSBzdGF0aWNfY2FzdDxjb25zdCBBdHRySW1wbCAqPih0
aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgp
KQotICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT5vd25lckVsZW1lbnQoKS0+bG9va3VwUHJl
Zml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBET01T
dHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKEVs
ZW1lbnRJbXBsICphbmNlc3RvciA9IGdldEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBhbmNlc3Rvci0+bG9va3VwUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICB9Ci19Ci0KLURPTVN0
cmluZyBOb2RlSW1wbDo6bG9va3VwTmFtZXNwYWNlVVJJKGNvbnN0IERPTVN0cmluZyAmcHJlZml4
KSBjb25zdAotewotICAgIC8vIEltcGxlbWVudGVkIGFjY29yZGluZyB0bwotICAgIC8vIGh0dHA6
Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLURPTS1MZXZlbC0zLUNvcmUtMjAwNDA0MDcvbmFtZXNw
YWNlcy1hbGdvcml0aG1zLmh0bWwjbG9va3VwTmFtZXNwYWNlVVJJQWxnbwotICAgIAotICAgIGlm
ICghcHJlZml4LmlzTnVsbCgpICYmIHByZWZpeC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBE
T01TdHJpbmcoKTsKLSAgICAKLSAgICBzd2l0Y2ggKG5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2Fz
ZSBOb2RlOjpFTEVNRU5UX05PREU6IHsKLSAgICAgICAgICAgIGNvbnN0IEVsZW1lbnRJbXBsICpl
bGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxlbWVudEltcGwgKj4odGhpcyk7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIGlmICghZWxlbS0+bmFtZXNwYWNlVVJJKCkuaXNOdWxsKCkgJiYgZWxl
bS0+cHJlZml4KCkgPT0gcHJlZml4KQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLT5uYW1l
c3BhY2VVUkkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVsZW0tPmhhc0F0dHJp
YnV0ZXMoKSkgewotICAgICAgICAgICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gZWxl
bS0+YXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBhdHRycy0+bGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAg
ICAgICAgICBBdHRyaWJ1dGVJbXBsICphdHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0g
ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci0+cHJlZml4
KCkgPT0gInhtbG5zIiAmJiBhdHRyLT5sb2NhbE5hbWUoKSA9PSBwcmVmaXgpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHItPnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyLT5sb2NhbE5hbWUoKSA9PSAieG1sbnMi
ICYmIHByZWZpeC5pc051bGwoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRy
LT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
YXR0ci0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBp
ZiAoRWxlbWVudEltcGwgKmFuY2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICB9Ci0g
ICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxjb25zdCBEb2N1bWVudEltcGwgKj4odGhpcyktPmRvY3VtZW50RWxlbWVudCgpLT5s
b29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9E
RToKLSAgICAgICAgY2FzZSBOb2RlOjpOT1RBVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6
OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVO
VF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICBjYXNlIE5v
ZGU6OkFUVFJJQlVURV9OT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBBdHRySW1wbCAqYXR0ciA9
IHN0YXRpY19jYXN0PGNvbnN0IEF0dHJJbXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGF0dHItPm93bmVyRWxlbWVudCgpLT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAg
IH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChFbGVtZW50SW1wbCAqYW5jZXN0
b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0
b3ItPmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgTm9kZUltcGw6Omxv
b2t1cE5hbWVzcGFjZVByZWZpeChjb25zdCBET01TdHJpbmcgJl9uYW1lc3BhY2VVUkksIGNvbnN0
IEVsZW1lbnRJbXBsICpvcmlnaW5hbEVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgaWYgKF9uYW1lc3Bh
Y2VVUkkuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgICAg
IAotICAgIGlmIChvcmlnaW5hbEVsZW1lbnQtPmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgoKSkg
PT0gX25hbWVzcGFjZVVSSSkKLSAgICAgICAgcmV0dXJuIHByZWZpeCgpOwotICAgIAotICAgIGlm
IChoYXNBdHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgTmFtZWRBdHRyTWFwSW1wbCAqYXR0cnMgPSBh
dHRyaWJ1dGVzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
YXR0cnMtPmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgKmF0dHIg
PSBhdHRycy0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYg
KGF0dHItPnByZWZpeCgpID09ICJ4bWxucyIgJiYKLSAgICAgICAgICAgICAgICBhdHRyLT52YWx1
ZSgpID09IF9uYW1lc3BhY2VVUkkgJiYKLSAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnQt
Pmxvb2t1cE5hbWVzcGFjZVVSSShhdHRyLT5sb2NhbE5hbWUoKSkgPT0gX25hbWVzcGFjZVVSSSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci0+bG9jYWxOYW1lKCk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgCi0gICAgaWYgKEVsZW1lbnRJbXBsICphbmNlc3RvciA9IGdldEFuY2VzdG9yRWxl
bWVudCgpKQotICAgICAgICByZXR1cm4gYW5jZXN0b3ItPmxvb2t1cE5hbWVzcGFjZVByZWZpeChf
bmFtZXNwYWNlVVJJLCBvcmlnaW5hbEVsZW1lbnQpOwotICAgIAotICAgIHJldHVybiBET01TdHJp
bmcoKTsKLX0KLQotRE9NU3RyaW5nIE5vZGVJbXBsOjp0ZXh0Q29udGVudCgpIGNvbnN0Ci17Ci0g
ICAgc3dpdGNoIChub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6VEVYVF9OT0RFOgot
ICAgICAgICBjYXNlIE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2Rl
OjpDT01NRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElP
Tl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIG5vZGVWYWx1ZSgpOwotICAgICAgICAKLSAgICAg
ICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRF
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9k
ZTo6RU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZS
QUdNRU5UX05PREU6IHsKLSAgICAgICAgICAgIERPTVN0cmluZyBzID0gIiI7Ci0gICAgICAgIAot
ICAgICAgICAgICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxk
LT5ub2RlVHlwZSgpID09IE5vZGU6OkNPTU1FTlRfTk9ERSB8fCAKLSAgICAgICAgICAgICAgICAg
ICAgY2hpbGQtPm5vZGVUeXBlKCkgPT0gTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RF
KQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIHMgKz0gY2hpbGQtPnRleHRDb250ZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNh
c2UgTm9kZTo6RE9DVU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBF
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsgICAgICAgICAgICAKLSAgICB9Ci19
Ci0KLXZvaWQgTm9kZUltcGw6OnNldFRleHRDb250ZW50KGNvbnN0IERPTVN0cmluZyAmdGV4dCwg
aW50ICZleGNlcHRpb24pCi17ICAgICAgICAgICAKLSAgICBzd2l0Y2ggKG5vZGVUeXBlKCkpIHsK
LSAgICAgICAgY2FzZSBOb2RlOjpURVhUX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Q0RBVEFf
U0VDVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKLSAgICAgICAg
Y2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICBzZXRO
b2RlVmFsdWUodGV4dCwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIE5vZGU6OkVMRU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9E
RToKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpF
TlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01F
TlRfTk9ERTogewotICAgICAgICAgICAgQ29udGFpbmVyTm9kZUltcGwgKmNvbnRhaW5lciA9IHN0
YXRpY19jYXN0PENvbnRhaW5lck5vZGVJbXBsICo+KHRoaXMpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBjb250YWluZXItPnJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGQo
Z2V0RG9jdW1lbnQoKS0+Y3JlYXRlVGV4dE5vZGUodGV4dCksIGV4Y2VwdGlvbik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6
Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICBjYXNlIE5v
ZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBEbyBu
b3RoaW5nCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2Rl
SW1wbDo6Z2V0QW5jZXN0b3JFbGVtZW50KCkgY29uc3QKLXsKLSAgICAvLyBJbiB0aGVvcnksIHRo
ZXJlIGNhbiBiZSBFbnRpdHlSZWZlcmVuY2Ugbm9kZXMgYmV0d2VlbiBlbGVtZW50cwotICAgIC8v
IGJ1dCB0aGlzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgotICAgIGZvciAoTm9kZUltcGwg
Km4gPSBwYXJlbnROb2RlKCk7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgaWYg
KG4tPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVt
ZW50SW1wbCAqPihuKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYg
TkRFQlVHCi0KLXN0YXRpYyB2b2lkIGFwcGVuZEF0dHJpYnV0ZURlc2MoY29uc3QgTm9kZUltcGwg
Km5vZGUsIERPTVN0cmluZyAmc3RyaW5nLCBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBRU3Ry
aW5nIGF0dHJEZXNjKQotewotICAgIGlmIChub2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKLSAgICAg
ICAgRE9NU3RyaW5nIGF0dHIgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPihub2Rl
KS0+Z2V0QXR0cmlidXRlKG5hbWUpOwotICAgICAgICBpZiAoIWF0dHIuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICBzdHJpbmcgKz0gYXR0ckRlc2M7Ci0gICAgICAgICAgICBzdHJpbmcgKz0gYXR0
cjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBOb2RlSW1wbDo6c2hvd05vZGUoY29uc3Qg
Y2hhciAqcHJlZml4KSBjb25zdAotewotICAgIGlmICghcHJlZml4KQotICAgICAgICBwcmVmaXgg
PSAiIjsKLSAgICBpZiAoaXNUZXh0Tm9kZSgpKSB7Ci0gICAgICAgIFFTdHJpbmcgdmFsdWUgPSBu
b2RlVmFsdWUoKS5xc3RyaW5nKCk7Ci0gICAgICAgIHZhbHVlLnJlcGxhY2UoJ1xcJywgIlxcXFwi
KTsKLSAgICAgICAgdmFsdWUucmVwbGFjZSgnXG4nLCAiXFxuIik7Ci0gICAgICAgIGZwcmludGYo
c3RkZXJyLCAiJXMlc1x0JXAgXCIlc1wiXG4iLCBwcmVmaXgsIG5vZGVOYW1lKCkucXN0cmluZygp
LnV0ZjgoKS5kYXRhKCksIHRoaXMsIHZhbHVlLnV0ZjgoKS5kYXRhKCkpOwotICAgIH0gZWxzZSB7
Ci0gICAgICAgIERPTVN0cmluZyBhdHRycyA9ICIiOwotICAgICAgICBhcHBlbmRBdHRyaWJ1dGVE
ZXNjKHRoaXMsIGF0dHJzLCBjbGFzc0F0dHIsICIgQ0xBU1M9Iik7Ci0gICAgICAgIGFwcGVuZEF0
dHJpYnV0ZURlc2ModGhpcywgYXR0cnMsIHN0eWxlQXR0ciwgIiBTVFlMRT0iKTsKLSAgICAgICAg
ZnByaW50ZihzdGRlcnIsICIlcyVzXHQlcCVzXG4iLCBwcmVmaXgsIG5vZGVOYW1lKCkucXN0cmlu
ZygpLnV0ZjgoKS5kYXRhKCksIHRoaXMsIGF0dHJzLnFzdHJpbmcoKS5hc2NpaSgpKTsKLSAgICB9
Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNob3dUcmVlKCkgY29uc3QKLXsKLSAgICBzaG93VHJlZUFu
ZE1hcmsoKE5vZGVJbXBsICopdGhpcywgIioiLCBOVUxMLCBOVUxMKTsKLX0KLQotdm9pZCBOb2Rl
SW1wbDo6c2hvd1RyZWVBbmRNYXJrKE5vZGVJbXBsICogbWFya2VkTm9kZTEsIGNvbnN0IGNoYXIg
KiBtYXJrZWRMYWJlbDEsIE5vZGVJbXBsICogbWFya2VkTm9kZTIsIGNvbnN0IGNoYXIgKiBtYXJr
ZWRMYWJlbDIpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKnJvb3ROb2RlOwotICAgIE5vZGVJbXBs
ICpub2RlID0gKE5vZGVJbXBsICopdGhpczsKLSAgICB3aGlsZSAobm9kZS0+cGFyZW50Tm9kZSgp
ICYmICFub2RlLT5oYXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICBub2RlID0gbm9kZS0+cGFy
ZW50Tm9kZSgpOwotICAgIHJvb3ROb2RlID0gbm9kZTsKLQkKLSAgICBmb3IgKG5vZGUgPSByb290
Tm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICBO
b2RlSW1wbCAqdG1wTm9kZTsKLQkJCi0gICAgICAgIGlmIChub2RlID09IG1hcmtlZE5vZGUxKQot
ICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1hcmtlZExhYmVsMSk7Ci0gICAgICAg
IGlmIChub2RlID09IG1hcmtlZE5vZGUyKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIl
cyIsIG1hcmtlZExhYmVsMik7Ci0JCQkKLSAgICAgICAgZm9yICh0bXBOb2RlID0gbm9kZTsgdG1w
Tm9kZSAmJiB0bXBOb2RlICE9IHJvb3ROb2RlOyB0bXBOb2RlID0gdG1wTm9kZS0+cGFyZW50Tm9k
ZSgpKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcdCIpOwotICAgICAgICBub2RlLT5z
aG93Tm9kZSgwKTsKLSAgICB9Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmZvcm1hdEZvckRlYnVnZ2Vy
KGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAotewotICAgIERPTVN0cmluZyBy
ZXN1bHQ7Ci0gICAgRE9NU3RyaW5nIHM7Ci0gICAgCi0gICAgcyA9IG5vZGVOYW1lKCk7Ci0gICAg
aWYgKHMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgcmVzdWx0ICs9ICI8bm9uZT4iOwotICAgIGVs
c2UKLSAgICAgICAgcmVzdWx0ICs9IHM7Ci0gICAgICAgICAgCi0gICAgc3RybmNweShidWZmZXIs
IHJlc3VsdC5xc3RyaW5nKCkubGF0aW4xKCksIGxlbmd0aCAtIDEpOwotfQotCi0jZW5kaWYKLQot
Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvbnRhaW5lck5vZGVJbXBsOjpDb250YWluZXJOb2RlSW1w
bChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IE5vZGVJbXBsKGRvYykKLXsKLSAgICBfZmlyc3Qg
PSBfbGFzdCA9IDA7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZUFsbENoaWxk
cmVuKCkKLXsKLSAgICAvL2tkRGVidWcoIDYwMjAgKSA8PCAiQ29udGFpbmVyTm9kZUltcGwgZGVz
dHJ1Y3RvciIgPDwgZW5kbDsKLQotICAgIC8vIEF2b2lkIGRlZXAgcmVjdXJzaW9uIHdoZW4gZGVz
dHJveWluZyB0aGUgbm9kZSB0cmVlLgotICAgIHN0YXRpYyBib29sIGFscmVhZHlJbnNpZGVEZXN0
cnVjdG9yOyAKLSAgICBib29sIHRvcExldmVsID0gIWFscmVhZHlJbnNpZGVEZXN0cnVjdG9yOwot
ICAgIGlmICh0b3BMZXZlbCkKLSAgICAgICAgYWxyZWFkeUluc2lkZURlc3RydWN0b3IgPSB0cnVl
OwotICAgIAotICAgIC8vIExpc3Qgb2Ygbm9kZXMgdG8gYmUgZGVsZXRlZC4KLSAgICBzdGF0aWMg
Tm9kZUltcGwgKmhlYWQ7Ci0gICAgc3RhdGljIE5vZGVJbXBsICp0YWlsOwotICAgIAotICAgIC8v
IFdlIGhhdmUgdG8gdGVsbCBhbGwgY2hpbGRyZW4gdGhhdCB0aGVpciBwYXJlbnQgaGFzIGRpZWQu
Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgTm9kZUltcGwgKm5leHQ7Ci0KLSAgICBmb3IoIG4gPSBf
Zmlyc3Q7IG4gIT0gMDsgbiA9IG5leHQgKSB7Ci0gICAgICAgIG5leHQgPSBuLT5uZXh0U2libGlu
ZygpOwotICAgICAgICBuLT5zZXRQcmV2aW91c1NpYmxpbmcoMCk7Ci0gICAgICAgIG4tPnNldE5l
eHRTaWJsaW5nKDApOwotICAgICAgICBuLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIAotCWlmICgg
IW4tPnJlZkNvdW50KCkgKSB7Ci0gICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGxp
c3Qgb2Ygbm9kZXMgdG8gYmUgZGVsZXRlZC4KLSAgICAgICAgICAgIC8vIFJldXNlIHRoZSBuZXh0
U2libGluZyBwb2ludGVyIGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICAgICAgICBpZiAodGFpbCkK
LSAgICAgICAgICAgICAgICB0YWlsLT5zZXROZXh0U2libGluZyhuKTsKLSAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICBoZWFkID0gbjsKLSAgICAgICAgICAgIHRhaWwgPSBuOwotICAg
ICAgICB9IGVsc2UgaWYgKG4tPmluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgIG4tPnJlbW92ZWRG
cm9tRG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gT25seSBmb3IgdGhlIHRvcCBsZXZl
bCBjYWxsLCBkbyB0aGUgYWN0dWFsIGRlbGV0aW5nLgotICAgIGlmICh0b3BMZXZlbCkgewotICAg
ICAgICB3aGlsZSAoKG4gPSBoZWFkKSAhPSAwKSB7Ci0gICAgICAgICAgICBuZXh0ID0gbi0+bmV4
dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIG4tPnNldE5leHRTaWJsaW5nKDApOwotCi0gICAgICAg
ICAgICBoZWFkID0gbmV4dDsKLSAgICAgICAgICAgIGlmIChuZXh0ID09IDApCi0gICAgICAgICAg
ICAgICAgdGFpbCA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRlbGV0ZSBuOwotICAg
ICAgICB9Ci0gICAgICAgIAotICAgICAgICBhbHJlYWR5SW5zaWRlRGVzdHJ1Y3RvciA9IGZhbHNl
OwotICAgICAgICBfZmlyc3QgPSAwOwotICAgICAgICBfbGFzdCA9IDA7Ci0gICAgfQotfQotCi1D
b250YWluZXJOb2RlSW1wbDo6fkNvbnRhaW5lck5vZGVJbXBsKCkKLXsKLSAgICByZW1vdmVBbGxD
aGlsZHJlbigpOwotfQotCi0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6Zmlyc3RDaGls
ZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIF9maXJzdDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5l
ck5vZGVJbXBsOjpsYXN0Q2hpbGQoKSBjb25zdAotewotICAgIHJldHVybiBfbGFzdDsKLX0KLQot
Tm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3
Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBl
eGNlcHRpb25jb2RlID0gMDsKLQotICAgIC8vIGluc2VydEJlZm9yZSguLi4sbnVsbCkgaXMgZXF1
aXZhbGVudCB0byBhcHBlbmRDaGlsZCgpCi0gICAgaWYoIXJlZkNoaWxkKQotICAgICAgICByZXR1
cm4gYXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotCi0gICAgUmVmUHRyPE5v
ZGVJbXBsPiBwcm90ZWN0TmV3Q2hpbGQobmV3Q2hpbGQpOyAvLyBtYWtlIHN1cmUgdGhlIG5ldyBj
aGlsZCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICAvLyBN
YWtlIHN1cmUgYWRkaW5nIHRoZSBuZXcgY2hpbGQgaXMgb2sKLSAgICBjaGVja0FkZENoaWxkKG5l
d0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICAvLyBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgcmVmQ2hpbGQgaXMg
bm90IGEgY2hpbGQgb2YgdGhpcyBub2RlCi0gICAgaWYgKHJlZkNoaWxkLT5wYXJlbnROb2RlKCkg
IT0gdGhpcykgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9V
TkRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGlzRnJhZ21lbnQg
PSBuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwot
Ci0gICAgLy8gSWYgbmV3Q2hpbGQgaXMgYSBEb2N1bWVudEZyYWdtZW50IHdpdGggbm8gY2hpbGRy
ZW4uLi4uIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KLSAgICAvLyBKdXN0IHJldHVybiB0aGUgZG9j
dW1lbnQgZnJhZ21lbnQKLSAgICBpZiAoaXNGcmFnbWVudCAmJiAhbmV3Q2hpbGQtPmZpcnN0Q2hp
bGQoKSkKLSAgICAgICAgcmV0dXJuIChuZXdDaGlsZC0+aGFzT25lUmVmKCkgJiYgIW5ld0NoaWxk
LT5wYXJlbnQoKSkgPyAwIDogbmV3Q2hpbGQ7Ci0KLSAgICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRo
ZSBjaGlsZChyZW4pCi0gICAgTm9kZUltcGwgKm5leHRDaGlsZDsKLSAgICBOb2RlSW1wbCAqY2hp
bGQgPSBpc0ZyYWdtZW50ID8gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKSA6IG5ld0NoaWxkOwotCi0g
ICAgTm9kZUltcGwgKnByZXYgPSByZWZDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYg
KCBwcmV2ID09IG5ld0NoaWxkIHx8IHJlZkNoaWxkID09IG5ld0NoaWxkICkgLy8gbm90aGluZyB0
byBkbwotCXJldHVybiBuZXdDaGlsZDsKLSAgICAKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAg
ICAgbmV4dENoaWxkID0gaXNGcmFnbWVudCA/IGNoaWxkLT5uZXh0U2libGluZygpIDogMDsKLQot
ICAgICAgICAvLyBJZiBjaGlsZCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHRyZWUsIGZpcnN0
IHJlbW92ZSBpdAotICAgICAgICBOb2RlSW1wbCAqbmV3UGFyZW50ID0gY2hpbGQtPnBhcmVudE5v
ZGUoKTsKLSAgICAgICAgaWYgKG5ld1BhcmVudCkKLSAgICAgICAgICAgIG5ld1BhcmVudC0+cmVt
b3ZlQ2hpbGQoIGNoaWxkLCBleGNlcHRpb25jb2RlICk7Ci0gICAgICAgIGlmIChleGNlcHRpb25j
b2RlKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxkIGluIHRo
ZSBjb3JyZWN0IHBvc2l0aW9uCi0gICAgICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLSAgICAg
ICAgaWYgKHByZXYpCi0gICAgICAgICAgICBwcmV2LT5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9maXJzdCA9IGNoaWxkOwotICAgICAgICByZWZDaGls
ZC0+c2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLSAgICAgICAgY2hpbGQtPnNldFBhcmVudCh0
aGlzKTsKLSAgICAgICAgY2hpbGQtPnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLSAgICAgICAg
Y2hpbGQtPnNldE5leHRTaWJsaW5nKHJlZkNoaWxkKTsKLSAgICAgICAgYWxsb3dFdmVudERpc3Bh
dGNoKCk7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxkIHRvIHRoZSByZW5kZXJpbmcgdHJlZQotICAg
ICAgICAvLyAjIyMgc2hvdWxkIHdlIGRldGFjaCgpIGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFkeSBh
dHRhY2hlZD8KLSAgICAgICAgaWYgKGF0dGFjaGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgpKQot
ICAgICAgICAgICAgY2hpbGQtPmF0dGFjaCgpOwotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGF0
Y2ggdGhlIG11dGF0aW9uIGV2ZW50cwotICAgICAgICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVu
dHMoY2hpbGQsZXhjZXB0aW9uY29kZSk7Ci0KLSAgICAgICAgcHJldiA9IGNoaWxkOwotICAgICAg
ICBjaGlsZCA9IG5leHRDaGlsZDsKLSAgICB9Ci0KLSAgICBnZXREb2N1bWVudCgpLT5zZXREb2N1
bWVudENoYW5nZWQodHJ1ZSk7Ci0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwot
ICAgIHJldHVybiBuZXdDaGlsZDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpy
ZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50
ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBleGNlcHRpb25jb2RlID0gMDsKLQotICAgIFJlZlB0
cjxOb2RlSW1wbD4gcHJvdGVjdE5ld0NoaWxkKG5ld0NoaWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBu
ZXcgY2hpbGQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAg
aWYgKCBvbGRDaGlsZCA9PSBuZXdDaGlsZCApIC8vIG5vdGhpbmcgdG8gZG8KLQlyZXR1cm4gb2xk
Q2hpbGQ7Ci0gICAgCi0gICAgLy8gTWFrZSBzdXJlIGFkZGluZyB0aGUgbmV3IGNoaWxkIGlzIG9r
Ci0gICAgY2hlY2tBZGRDaGlsZChuZXdDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKGV4
Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gTk9UX0ZPVU5EX0VSUjog
UmFpc2VkIGlmIG9sZENoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLSAgICBpZiAo
IW9sZENoaWxkIHx8IG9sZENoaWxkLT5wYXJlbnROb2RlKCkgIT0gdGhpcykgewotICAgICAgICBl
eGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGlzRnJhZ21lbnQgPSBuZXdDaGlsZC0+bm9kZVR5cGUo
KSA9PSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwotICAgIE5vZGVJbXBsICpuZXh0Q2hp
bGQ7Ci0gICAgTm9kZUltcGwgKmNoaWxkID0gaXNGcmFnbWVudCA/IG5ld0NoaWxkLT5maXJzdENo
aWxkKCkgOiBuZXdDaGlsZDsKLQotICAgIC8vIFJlbW92ZSB0aGUgb2xkIGNoaWxkCi0gICAgTm9k
ZUltcGwgKnByZXYgPSBvbGRDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgTm9kZUltcGwg
Km5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLQotICAgIHJlbW92ZUNoaWxkKG9sZENo
aWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIHdhcyByaWdodCBiZWZvcmUgb3Igcmln
aHQgYWZ0ZXIgdGhlIG9sZCBjaGlsZCwgbm90aGluZyBlbHNlIG5lZWRzIHRvIGNoYW5nZQotICAg
IGlmIChwcmV2ID09IGNoaWxkIHx8IG5leHQgPT0gY2hpbGQpCi0gICAgICAgIGNoaWxkID0gMDsK
LSAgICAvLyBBZGQgdGhlIG5ldyBjaGlsZChyZW4pCi0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAg
ICAgIG5leHRDaGlsZCA9IGlzRnJhZ21lbnQgPyBjaGlsZC0+bmV4dFNpYmxpbmcoKSA6IDA7Ci0K
LSAgICAgICAgLy8gSWYgY2hpbGQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSB0cmVlLCBmaXJz
dCByZW1vdmUgaXQKLSAgICAgICAgTm9kZUltcGwgKm5ld1BhcmVudCA9IGNoaWxkLT5wYXJlbnRO
b2RlKCk7Ci0gICAgICAgIGlmIChuZXdQYXJlbnQpCi0gICAgICAgICAgICBuZXdQYXJlbnQtPnJl
bW92ZUNoaWxkKCBjaGlsZCwgZXhjZXB0aW9uY29kZSApOwotICAgICAgICBpZiAoZXhjZXB0aW9u
Y29kZSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8vIEFkZCBjaGlsZCBpbiB0
aGUgY29ycmVjdCBwb3NpdGlvbgotICAgICAgICBmb3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAg
ICAgIGlmIChwcmV2KSBwcmV2LT5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICAgIGlmIChu
ZXh0KSBuZXh0LT5zZXRQcmV2aW91c1NpYmxpbmcoY2hpbGQpOwotICAgICAgICBpZighcHJldikg
X2ZpcnN0ID0gY2hpbGQ7Ci0gICAgICAgIGlmKCFuZXh0KSBfbGFzdCA9IGNoaWxkOwotICAgICAg
ICBjaGlsZC0+c2V0UGFyZW50KHRoaXMpOwotICAgICAgICBjaGlsZC0+c2V0UHJldmlvdXNTaWJs
aW5nKHByZXYpOwotICAgICAgICBjaGlsZC0+c2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0gICAgICAg
IGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAgICAgIC8vIEFkZCBjaGlsZCB0byB0aGUgcmVu
ZGVyaW5nIHRyZWUKLSAgICAgICAgLy8gIyMjIHNob3VsZCB3ZSBkZXRhY2goKSBpdCBmaXJzdCBp
ZiBpdCdzIGFscmVhZHkgYXR0YWNoZWQ/Ci0gICAgICAgIGlmIChhdHRhY2hlZCgpICYmICFjaGls
ZC0+YXR0YWNoZWQoKSkKLSAgICAgICAgICAgIGNoaWxkLT5hdHRhY2goKTsKLQotICAgICAgICAv
LyBEaXNwYXRjaCB0aGUgbXV0YXRpb24gZXZlbnRzCi0gICAgICAgIGRpc3BhdGNoQ2hpbGRJbnNl
cnRlZEV2ZW50cyhjaGlsZCxleGNlcHRpb25jb2RlKTsKLQotICAgICAgICBwcmV2ID0gY2hpbGQ7
Ci0gICAgICAgIGNoaWxkID0gbmV4dENoaWxkOwotICAgIH0KLQotICAgIC8vICMjIyBzZXQgc3R5
bGUgaW4gY2FzZSBpdCdzIGF0dGFjaGVkCi0gICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRD
aGFuZ2VkKHRydWUpOwotICAgIGRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoKTsKLSAgICBy
ZXR1cm4gb2xkQ2hpbGQ7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OndpbGxSZW1vdmUo
KQotewotICAgIGZvciAoTm9kZUltcGwgKm4gPSBfZmlyc3Q7IG4gIT0gMDsgbiA9IG4tPm5leHRT
aWJsaW5nKCkpIHsKLSAgICAgICAgbi0+d2lsbFJlbW92ZSgpOwotICAgIH0KLX0KLQotaW50IENv
bnRhaW5lck5vZGVJbXBsOjp3aWxsUmVtb3ZlQ2hpbGQoTm9kZUltcGwgKmNoaWxkKQotewotICAg
IGludCBleGNlcHRpb25Db2RlID0gMDsKLQotICAgIC8vIGZpcmUgcmVtb3ZlZCBmcm9tIGRvY3Vt
ZW50IG11dGF0aW9uIGV2ZW50cy4KLSAgICBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2ZW50cyhjaGls
ZCwgZXhjZXB0aW9uQ29kZSk7Ci0gICAgaWYgKGV4Y2VwdGlvbkNvZGUpCi0gICAgICAgIHJldHVy
biBleGNlcHRpb25Db2RlOwotCi0gICAgaWYgKGNoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICBj
aGlsZC0+d2lsbFJlbW92ZSgpOwotICAgIAotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAq
Q29udGFpbmVyTm9kZUltcGw6OnJlbW92ZUNoaWxkICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgLy8gTk9f
TU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5
LgotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4
Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICAvLyBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgb2xkQ2hpbGQgaXMgbm90
IGEgY2hpbGQgb2YgdGhpcyBub2RlLgotICAgIGlmICghb2xkQ2hpbGQgfHwgb2xkQ2hpbGQtPnBh
cmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRp
b246Ok5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAv
LyB1cGRhdGUgYXV4aWxpYXJ5IGRvYyBpbmZvIChlLmcuIGl0ZXJhdG9ycykgdG8gbm90ZSB0aGF0
IG5vZGUgaXMgYmVpbmcgcmVtb3ZlZAotICAgIC8vIEZJWDogVGhpcyBsb29rcyByZWR1bmRhbnQg
d2l0aCBzYW1lIGNhbGwgZnJvbSBkaXNwYXRjaENoaWxkUmVtb3ZhbEV2ZW50cyBpbiB3aWxsUmVt
b3ZlQ2hpbGQKLS8vICBnZXREb2N1bWVudCgpLT5ub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChvbGRD
aGlsZCk7IC8vICMjIyB1c2UgZXZlbnRzIGluc3RlYWQKLQotICAgIC8vIGRpc3BhdGNoIHByZS1y
ZW1vdmFsIG11dGF0aW9uIGV2ZW50cwotICAgIGlmIChnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5l
clR5cGUoRG9jdW1lbnRJbXBsOjpET01OT0RFUkVNT1ZFRF9MSVNURU5FUikpIHsKLQlvbGRDaGls
ZC0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudEltcGwoRE9NTm9kZVJlbW92ZWRFdmVu
dCwKLQkJCSAgICAgdHJ1ZSxmYWxzZSx0aGlzLERPTVN0cmluZygpLERPTVN0cmluZygpLERPTVN0
cmluZygpLDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci0JaWYgKGV4Y2VwdGlvbmNvZGUpCi0JICAg
IHJldHVybiAwOwotICAgIH0KLQotICAgIGV4Y2VwdGlvbmNvZGUgPSB3aWxsUmVtb3ZlQ2hpbGQo
b2xkQ2hpbGQpOwotICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLQotICAgIC8vIFJlbW92ZSBmcm9tIHJlbmRlcmlu
ZyB0cmVlCi0gICAgaWYgKG9sZENoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICBvbGRDaGlsZC0+
ZGV0YWNoKCk7Ci0KLSAgICAvLyBSZW1vdmUgdGhlIGNoaWxkCi0gICAgTm9kZUltcGwgKnByZXYs
ICpuZXh0OwotICAgIHByZXYgPSBvbGRDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgbmV4
dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwotCi0gICAgaWYobmV4dCkgbmV4dC0+c2V0UHJl
dmlvdXNTaWJsaW5nKHByZXYpOwotICAgIGlmKHByZXYpIHByZXYtPnNldE5leHRTaWJsaW5nKG5l
eHQpOwotICAgIGlmKF9maXJzdCA9PSBvbGRDaGlsZCkgX2ZpcnN0ID0gbmV4dDsKLSAgICBpZihf
bGFzdCA9PSBvbGRDaGlsZCkgX2xhc3QgPSBwcmV2OwotCi0gICAgb2xkQ2hpbGQtPnNldFByZXZp
b3VzU2libGluZygwKTsKLSAgICBvbGRDaGlsZC0+c2V0TmV4dFNpYmxpbmcoMCk7Ci0gICAgb2xk
Q2hpbGQtPnNldFBhcmVudCgwKTsKLQotICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAg
Z2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwotCi0gICAgLy8gRGlzcGF0
Y2ggcG9zdC1yZW1vdmFsIG11dGF0aW9uIGV2ZW50cwotICAgIGRpc3BhdGNoU3VidHJlZU1vZGlm
aWVkRXZlbnQoKTsKLQotICAgIGlmIChvbGRDaGlsZC0+aW5Eb2N1bWVudCgpKQotICAgICAgICBv
bGRDaGlsZC0+cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotICAgIGVsc2UKLSAgICAgICAgb2xkQ2hp
bGQtPnJlbW92ZWRGcm9tVHJlZSh0cnVlKTsKLQotICAgIHJldHVybiBvbGRDaGlsZDsKLX0KLQot
Ly8gdGhpcyBkaWZmZXJzIGZyb20gb3RoZXIgcmVtb3ZlIGZ1bmN0aW9ucyBiZWNhdXNlIGl0IGZv
cmNpYmx5IHJlbW92ZXMgYWxsIHRoZSBjaGlsZHJlbiwKLS8vIHJlZ2FyZGxlc3Mgb2YgcmVhZC1v
bmx5IHN0YXR1cyBvciBldmVudCBleGNlcHRpb25zLCBlLmcuCi12b2lkIENvbnRhaW5lck5vZGVJ
bXBsOjpyZW1vdmVDaGlsZHJlbigpCi17Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgCi0gICAgaWYg
KCFfZmlyc3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIGRvIGFueSBwcmVwIHdvcmsgbmVl
ZGVkIGJlZm9yZSBhY3R1YWxseSBzdGFydGluZyB0byBkZXRhY2gKLSAgICAvLyBhbmQgcmVtb3Zl
Li4uIGUuZy4gc3RvcCBsb2FkaW5nIGZyYW1lcywgZmlyZSB1bmxvYWQgZXZlbnRzCi0gICAgZm9y
IChuID0gX2ZpcnN0OyBuICE9IDA7IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICB3aWxs
UmVtb3ZlQ2hpbGQobik7Ci0gICAgCi0gICAgZm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgIHdo
aWxlICgobiA9IF9maXJzdCkgIT0gMCkgewotICAgICAgICBOb2RlSW1wbCAqbmV4dCA9IG4tPm5l
eHRTaWJsaW5nKCk7Ci0gICAgICAgIAotICAgICAgICBuLT5yZWYoKTsKLQotICAgICAgICBpZiAo
bi0+YXR0YWNoZWQoKSkKLSAgICAgICAgICAgIG4tPmRldGFjaCgpOwotICAgICAgICBuLT5zZXRQ
cmV2aW91c1NpYmxpbmcoMCk7Ci0gICAgICAgIG4tPnNldE5leHRTaWJsaW5nKDApOwotICAgICAg
ICBuLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobi0+aW5Eb2N1bWVudCgp
KQotICAgICAgICAgICAgbi0+cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotCi0gICAgICAgIG4tPmRl
cmVmKCk7Ci0KLSAgICAgICAgX2ZpcnN0ID0gbmV4dDsKLSAgICB9Ci0gICAgX2xhc3QgPSAwOwot
ICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotICAgIAotICAgIC8vIERpc3BhdGNoIGEgc2luZ2xl
IHBvc3QtcmVtb3ZhbCBtdXRhdGlvbiBldmVudCBkZW5vdGluZyBhIG1vZGlmaWVkIHN1YnRyZWUu
Ci0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwotfQotCi0KLU5vZGVJbXBsICpD
b250YWluZXJOb2RlSW1wbDo6YXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSApCi17Ci0gICAgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBSZWZQdHI8
Tm9kZUltcGw+IHByb3RlY3ROZXdDaGlsZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3
IGNoaWxkIGlzIHJlZidkIGFuZCBkZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLQotICAgIC8v
IE1ha2Ugc3VyZSBhZGRpbmcgdGhlIG5ldyBjaGlsZCBpcyBvawotICAgIGNoZWNrQWRkQ2hpbGQo
bmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoIG5ld0NoaWxkID09IF9sYXN0ICkgLy8gbm90aGlu
ZyB0byBkbwotCXJldHVybiBuZXdDaGlsZDsKLQotICAgIGJvb2wgaXNGcmFnbWVudCA9IG5ld0No
aWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU7Ci0KLSAgICAv
LyBJZiBuZXdDaGlsZCBpcyBhIERvY3VtZW50RnJhZ21lbnQgd2l0aCBubyBjaGlsZHJlbi4uLi4g
dGhlcmUncyBub3RoaW5nIHRvIGRvLgotICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBkb2N1bWVudCBm
cmFnbWVudAotICAgIGlmIChpc0ZyYWdtZW50ICYmICFuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpKQot
ICAgICAgICByZXR1cm4gbmV3Q2hpbGQ7Ci0KLSAgICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRoZSBj
aGlsZChyZW4pCi0gICAgTm9kZUltcGwgKm5leHRDaGlsZDsKLSAgICBOb2RlSW1wbCAqY2hpbGQg
PSBpc0ZyYWdtZW50ID8gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKSA6IG5ld0NoaWxkOwotCi0gICAg
d2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIG5leHRDaGlsZCA9IGlzRnJhZ21lbnQgPyBjaGlsZC0+
bmV4dFNpYmxpbmcoKSA6IDA7Ci0KLSAgICAgICAgLy8gSWYgY2hpbGQgaXMgYWxyZWFkeSBwcmVz
ZW50IGluIHRoZSB0cmVlLCBmaXJzdCByZW1vdmUgaXQKLSAgICAgICAgTm9kZUltcGwgKm9sZFBh
cmVudCA9IGNoaWxkLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmKG9sZFBhcmVudCkgewotICAg
ICAgICAgICAgb2xkUGFyZW50LT5yZW1vdmVDaGlsZCggY2hpbGQsIGV4Y2VwdGlvbmNvZGUgKTsK
LSAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwZW5kIGNoaWxkIHRvIHRoZSBlbmQgb2YgdGhl
IGxpc3QKLSAgICAgICAgZm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgICAgICBjaGlsZC0+c2V0
UGFyZW50KHRoaXMpOwotICAgICAgICBpZiAoX2xhc3QpIHsKLSAgICAgICAgICAgIGNoaWxkLT5z
ZXRQcmV2aW91c1NpYmxpbmcoX2xhc3QpOwotICAgICAgICAgICAgX2xhc3QtPnNldE5leHRTaWJs
aW5nKGNoaWxkKTsKLSAgICAgICAgICAgIF9sYXN0ID0gY2hpbGQ7Ci0gICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgX2ZpcnN0ID0gX2xhc3QgPSBjaGlsZDsKLSAgICAgICAgYWxsb3dFdmVudERp
c3BhdGNoKCk7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxkIHRvIHRoZSByZW5kZXJpbmcgdHJlZQot
ICAgICAgICAvLyAjIyMgc2hvdWxkIHdlIGRldGFjaCgpIGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFk
eSBhdHRhY2hlZD8KLSAgICAgICAgaWYgKGF0dGFjaGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgp
KQotICAgICAgICAgICAgY2hpbGQtPmF0dGFjaCgpOwotICAgICAgICAKLSAgICAgICAgLy8gRGlz
cGF0Y2ggdGhlIG11dGF0aW9uIGV2ZW50cwotICAgICAgICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRF
dmVudHMoY2hpbGQsZXhjZXB0aW9uY29kZSk7Ci0KLSAgICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7
Ci0gICAgfQotCi0gICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwot
ICAgIC8vICMjIyBzZXQgc3R5bGUgaW4gY2FzZSBpdCdzIGF0dGFjaGVkCi0gICAgZGlzcGF0Y2hT
dWJ0cmVlTW9kaWZpZWRFdmVudCgpOwotICAgIHJldHVybiBuZXdDaGlsZDsKLX0KLQotYm9vbCBD
b250YWluZXJOb2RlSW1wbDo6aGFzQ2hpbGROb2RlcyAoICApIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IF9maXJzdCAhPSAwOwotfQotCi0vLyBub3QgcGFydCBvZiB0aGUgRE9NCi12b2lkIENvbnRhaW5l
ck5vZGVJbXBsOjpzZXRGaXJzdENoaWxkKE5vZGVJbXBsICpjaGlsZCkKLXsKLSAgICBfZmlyc3Qg
PSBjaGlsZDsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0TGFzdENoaWxkKE5vZGVJ
bXBsICpjaGlsZCkKLXsKLSAgICBfbGFzdCA9IGNoaWxkOwotfQotCi0vLyBjaGVjayBmb3Igc2Ft
ZSBzb3VyY2UgZG9jdW1lbnQ6Ci1ib29sIENvbnRhaW5lck5vZGVJbXBsOjpjaGVja1NhbWVEb2N1
bWVudCggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4
Y2VwdGlvbmNvZGUgPSAwOwotICAgIERvY3VtZW50SW1wbCAqb3duZXJEb2NUaGlzID0gZ2V0RG9j
dW1lbnQoKTsKLSAgICAvLyBGSVhNRTogRG9oISBUaGlzIG5leHQgbGluZSBpc24ndCBnZXR0aW5n
IG5ld0NoaWxkLCBzbyBpdCdzIG5ldmVyIGdvaW5nIHRvIHdvcmshCi0gICAgRG9jdW1lbnRJbXBs
ICpvd25lckRvY05ldyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYob3duZXJEb2NUaGlzICE9IG93
bmVyRG9jTmV3KSB7Ci0gICAgICAgIGtkRGVidWcoNjAxMCk8PCAibm90IHNhbWUgZG9jdW1lbnQs
IG5ld0NoaWxkID0gIiA8PCBuZXdDaGlsZCA8PCAiZG9jdW1lbnQgPSAiIDw8IGdldERvY3VtZW50
KCkgPDwgZW5kbDsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6V1JPTkdf
RE9DVU1FTlRfRVJSOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi0vLyBjaGVjayBmb3IgYmVpbmcgY2hpbGQ6Ci1ib29sIENvbnRhaW5lck5vZGVJ
bXBsOjpjaGVja0lzQ2hpbGQoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBpZighb2xkQ2hpbGQgfHwgb2xkQ2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlz
KSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLU5v
ZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkKQot
ewotICAgIC8vIGRvIG5vdCBhZGQgYXBwbHlDaGFuZ2VzIGhlcmUhIFRoaXMgZnVuY3Rpb24gaXMg
b25seSB1c2VkIGR1cmluZyBwYXJzaW5nCi0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3RO
ZXdDaGlsZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidkIGFu
ZCBkZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLQotICAgIC8vIHNob3J0IGNoZWNrIGZvciBj
b25zaXN0ZW5jeSB3aXRoIERURAotICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVu
dCgpICYmICFjaGlsZEFsbG93ZWQobmV3Q2hpbGQpKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IC8vIGp1c3QgYWRkIGl0Li4uCi0gICAgZm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgIG5ld0No
aWxkLT5zZXRQYXJlbnQodGhpcyk7Ci0gICAgaWYoX2xhc3QpIHsKLSAgICAgICAgbmV3Q2hpbGQt
PnNldFByZXZpb3VzU2libGluZyhfbGFzdCk7Ci0gICAgICAgIF9sYXN0LT5zZXROZXh0U2libGlu
ZyhuZXdDaGlsZCk7Ci0gICAgICAgIF9sYXN0ID0gbmV3Q2hpbGQ7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIF9maXJzdCA9IF9sYXN0ID0gbmV3Q2hpbGQ7Ci0gICAgYWxsb3dFdmVudERpc3BhdGNoKCk7
Ci0KLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBuZXdDaGlsZC0+aW5zZXJ0ZWRJbnRv
RG9jdW1lbnQoKTsKLSAgICBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAKLSAgICBpZihuZXdDaGls
ZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUpCi0gICAgICAgIHJldHVybiBuZXdD
aGlsZDsKLSAgICByZXR1cm4gdGhpczsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6YXR0
YWNoKCkKLXsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBfZmlyc3Q7Ci0gICAgd2hpbGUoY2hpbGQg
IT0gMCkKLSAgICB7Ci0gICAgICAgIGNoaWxkLT5hdHRhY2goKTsKLSAgICAgICAgY2hpbGQgPSBj
aGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gICAgTm9kZUltcGw6OmF0dGFjaCgpOwotfQot
Ci12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpkZXRhY2goKQotewotICAgIE5vZGVJbXBsICpjaGls
ZCA9IF9maXJzdDsKLSAgICB3aGlsZShjaGlsZCAhPSAwKQotICAgIHsKLSAgICAgICAgTm9kZUlt
cGwqIHByZXYgPSBjaGlsZDsKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgcHJldi0+ZGV0YWNoKCk7Ci0gICAgfQotICAgIE5vZGVJbXBsOjpkZXRhY2goKTsK
LX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewot
ICAgIE5vZGVJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpOwotICAgIGZvciAoTm9kZUltcGwg
KmNoaWxkID0gX2ZpcnN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAg
ICAgICAgY2hpbGQtPmluc2VydGVkSW50b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgQ29udGFpbmVy
Tm9kZUltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIE5vZGVJbXBsOjpyZW1vdmVk
RnJvbURvY3VtZW50KCk7Ci0gICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBfZmlyc3Q7IGNoaWxk
OyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICBjaGlsZC0+cmVtb3ZlZEZy
b21Eb2N1bWVudCgpOwotfQotCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjppbnNlcnRlZEludG9U
cmVlKGJvb2wgZGVlcCkKLXsKLSAgICBOb2RlSW1wbDo6aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsK
LSAgICBpZiAoZGVlcCkgewotICAgICAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsg
Y2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICBjaGlsZC0+
aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUlt
cGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXApCi17Ci0gICAgTm9kZUltcGw6OnJlbW92ZWRG
cm9tVHJlZShkZWVwKTsKLSAgICBpZiAoZGVlcCkgewotICAgICAgICBmb3IgKE5vZGVJbXBsICpj
aGlsZCA9IF9maXJzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCi0gICAg
ICAgICAgICBjaGlsZC0+cmVtb3ZlZEZyb21UcmVlKGRlZXApOwotICAgIH0KLX0KLQotdm9pZCBD
b250YWluZXJOb2RlSW1wbDo6Y2xvbmVDaGlsZE5vZGVzKE5vZGVJbXBsICpjbG9uZSkKLXsKLSAg
ICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSBm
aXJzdENoaWxkKCk7IG4gJiYgIWV4Y2VwdGlvbmNvZGU7IG4gPSBuLT5uZXh0U2libGluZygpKQot
ICAgIHsKLSAgICAgICAgY2xvbmUtPmFwcGVuZENoaWxkKG4tPmNsb25lTm9kZSh0cnVlKSxleGNl
cHRpb25jb2RlKTsKLSAgICB9Ci19Ci0KLWJvb2wgQ29udGFpbmVyTm9kZUltcGw6OmdldFVwcGVy
TGVmdENvcm5lcihpbnQgJnhQb3MsIGludCAmeVBvcykgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVu
ZGVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0ICpvID0gbV9yZW5k
ZXI7Ci0gICAgUmVuZGVyT2JqZWN0ICpwID0gbzsKLQotICAgIHhQb3MgPSB5UG9zID0gMDsKLSAg
ICBpZiAoIW8tPmlzSW5saW5lKCkgfHwgby0+aXNSZXBsYWNlZCgpKSB7Ci0gICAgICAgIG8tPmFi
c29sdXRlUG9zaXRpb24oIHhQb3MsIHlQb3MgKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
fQotCi0gICAgLy8gZmluZCB0aGUgbmV4dCB0ZXh0L2ltYWdlIGNoaWxkLCB0byBnZXQgYSBwb3Np
dGlvbgotICAgIHdoaWxlKG8pIHsKLSAgICAgICAgcCA9IG87Ci0gICAgICAgIGlmKG8tPmZpcnN0
Q2hpbGQoKSkKLSAgICAgICAgICAgIG8gPSBvLT5maXJzdENoaWxkKCk7Ci0gICAgICAgIGVsc2Ug
aWYoby0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIG8gPSBvLT5uZXh0U2libGluZygpOwot
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG8gPSBvLT5wYXJlbnQoKTsKLSAgICAgICAgICAg
IGlmIChvKSAKLSAgICAgICAgICAgICAgICBvID0gby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAg
ICAgIGlmICghbykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmICghby0+aXNJbmxpbmUoKSB8fCBvLT5pc1JlcGxhY2VkKCkpIHsKLSAgICAgICAgICAgIG8t
PmFic29sdXRlUG9zaXRpb24oIHhQb3MsIHlQb3MgKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAtPmVsZW1lbnQoKSAmJiBwLT5lbGVtZW50KCkg
PT0gdGhpcyAmJiBvLT5pc1RleHQoKSAmJiAhby0+aXNCUigpICYmICFzdGF0aWNfY2FzdDxSZW5k
ZXJUZXh0Kj4obyktPmZpcnN0VGV4dEJveCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90
aGluZyAtIHNraXAgdW5yZW5kZXJlZCB3aGl0ZXNwYWNlIHRoYXQgaXMgYSBjaGlsZCBvciBuZXh0
IHNpYmxpbmcgb2YgdGhlIGFuY2hvcgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoKG8tPmlz
VGV4dCgpICYmICFvLT5pc0JSKCkpIHx8IG8tPmlzUmVwbGFjZWQoKSkgewotICAgICAgICAgICAg
by0+Y29udGFpbmVyKCktPmFic29sdXRlUG9zaXRpb24oIHhQb3MsIHlQb3MgKTsKLSAgICAgICAg
ICAgIGlmIChvLT5pc1RleHQoKSAmJiBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0ICo+KG8pLT5maXJz
dFRleHRCb3goKSkgewotICAgICAgICAgICAgICAgIHhQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dCAqPihvKS0+bWluWFBvcygpOwotICAgICAgICAgICAgICAgIHlQb3MgKz0gc3RhdGljX2Nh
c3Q8UmVuZGVyVGV4dCAqPihvKS0+Zmlyc3RUZXh0Qm94KCktPnJvb3QoKS0+dG9wT3ZlcmZsb3co
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHhQ
b3MgKz0gby0+eFBvcygpOwotICAgICAgICAgICAgICAgIHlQb3MgKz0gby0+eVBvcygpOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgCi0gICAgLy8gSWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuIG9yIHNp
YmxpbmdzIHRoYXQgY291bGQgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNjcm9sbCBwb3NpdGlv
biwgd2UgbXVzdCBiZQotICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiAgU2Nyb2xs
IHRvIHRoZSBib3R0b20uCi0gICAgaWYgKCFvKSB7Ci0gICAgICAgIHlQb3MgKz0gZ2V0RG9jdW1l
bnQoKS0+dmlldygpLT5jb250ZW50c0hlaWdodCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENvbnRhaW5lck5vZGVJbXBsOjpnZXRM
b3dlclJpZ2h0Q29ybmVyKGludCAmeFBvcywgaW50ICZ5UG9zKSBjb25zdAotewotICAgIGlmICgh
bV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFJlbmRlck9iamVjdCAqbyA9
IG1fcmVuZGVyOwotICAgIHhQb3MgPSB5UG9zID0gMDsKLSAgICBpZiAoIW8tPmlzSW5saW5lKCkg
fHwgby0+aXNSZXBsYWNlZCgpKQotICAgIHsKLSAgICAgICAgby0+YWJzb2x1dGVQb3NpdGlvbigg
eFBvcywgeVBvcyApOwotICAgICAgICB4UG9zICs9IG8tPndpZHRoKCk7Ci0gICAgICAgIHlQb3Mg
Kz0gby0+aGVpZ2h0KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBmaW5k
IHRoZSBsYXN0IHRleHQvaW1hZ2UgY2hpbGQsIHRvIGdldCBhIHBvc2l0aW9uCi0gICAgd2hpbGUo
bykgewotICAgICAgICBpZihvLT5sYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIG8gPSBvLT5sYXN0
Q2hpbGQoKTsKLSAgICAgICAgZWxzZSBpZihvLT5wcmV2aW91c1NpYmxpbmcoKSkKLSAgICAgICAg
ICAgIG8gPSBvLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICBSZW5kZXJPYmplY3QgKnByZXYgPSAwOwotICAgICAgICAgICAgd2hpbGUoIXByZXYpIHsKLSAg
ICAgICAgICAgICAgICBvID0gby0+cGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYoIW8pIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBwcmV2ID0gby0+cHJldmlvdXNTaWJsaW5nKCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvID0gcHJldjsKLSAgICAgICAgfQotICAgICAg
ICBpZihvLT5pc1RleHQoKSB8fCBvLT5pc1JlcGxhY2VkKCkpIHsKLSAgICAgICAgICAgIG8tPmNv
bnRhaW5lcigpLT5hYnNvbHV0ZVBvc2l0aW9uKHhQb3MsIHlQb3MpOwotICAgICAgICAgICAgaWYg
KG8tPmlzVGV4dCgpKQotICAgICAgICAgICAgICAgIHhQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dCAqPihvKS0+bWluWFBvcygpICsgby0+d2lkdGgoKTsKLSAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICB4UG9zICs9IG8tPnhQb3MoKStvLT53aWR0aCgpOwotICAgICAgICAgICAg
eVBvcyArPSBvLT55UG9zKCkrby0+aGVpZ2h0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotUVJlY3QgQ29udGFpbmVy
Tm9kZUltcGw6OmdldFJlY3QoKSBjb25zdAotewotICAgIGludCB4UG9zID0gMCwgeVBvcyA9IDAs
IHhFbmQgPSAwLCB5RW5kID0gMDsKLSAgICBib29sIGZvdW5kVXBwZXJMZWZ0ID0gZ2V0VXBwZXJM
ZWZ0Q29ybmVyKHhQb3MseVBvcyk7Ci0gICAgYm9vbCBmb3VuZExvd2VyUmlnaHQgPSBnZXRMb3dl
clJpZ2h0Q29ybmVyKHhFbmQseUVuZCk7Ci0gICAgCi0gICAgLy8gSWYgd2UndmUgZm91bmQgb25l
IGNvcm5lciwgYnV0IG5vdCB0aGUgb3RoZXIsCi0gICAgLy8gdGhlbiB3ZSBzaG91bGQganVzdCBy
ZXR1cm4gYSBwb2ludCBhdCB0aGUgY29ybmVyIHRoYXQgd2UgZGlkIGZpbmQuCi0gICAgaWYgKGZv
dW5kVXBwZXJMZWZ0ICE9IGZvdW5kTG93ZXJSaWdodCkKLSAgICB7Ci0gICAgICAgIGlmIChmb3Vu
ZFVwcGVyTGVmdCkgewotICAgICAgICAgICAgeEVuZCA9IHhQb3M7Ci0gICAgICAgICAgICB5RW5k
ID0geVBvczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhQb3MgPSB4RW5kOwotICAg
ICAgICAgICAgeVBvcyA9IHlFbmQ7Ci0gICAgICAgIH0KLSAgICB9IAotCi0gICAgaWYgKHhFbmQg
PCB4UG9zKQotICAgICAgICB4RW5kID0geFBvczsKLSAgICBpZiAoeUVuZCA8IHlQb3MpCi0gICAg
ICAgIHlFbmQgPSB5UG9zOwotICAgICAgICAKLSAgICByZXR1cm4gUVJlY3QoeFBvcywgeVBvcywg
eEVuZCAtIHhQb3MsIHlFbmQgLSB5UG9zKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6
c2V0Rm9jdXMoYm9vbCByZWNlaXZlZCkKLXsKLSAgICBpZiAobV9mb2N1c2VkID09IHJlY2VpdmVk
KSByZXR1cm47Ci0KLSAgICBOb2RlSW1wbDo6c2V0Rm9jdXMocmVjZWl2ZWQpOwotCi0gICAgLy8g
bm90ZSB0aGF0IHdlIG5lZWQgdG8gcmVjYWxjIHRoZSBzdHlsZQotICAgIHNldENoYW5nZWQoKTsK
LX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0QWN0aXZlKGJvb2wgZG93biwgYm9vbCBw
YXVzZSkKLXsKLSAgICBpZiAoZG93biA9PSBhY3RpdmUoKSkgcmV0dXJuOwotCi0gICAgTm9kZUlt
cGw6OnNldEFjdGl2ZShkb3duKTsKLQotICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2Fs
YyB0aGUgc3R5bGUKLSAgICAvLyBGSVhNRTogTW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlmICht
X3JlbmRlcikgewotICAgICAgICBib29sIHJlYWN0c1RvUHJlc3MgPSBtX3JlbmRlci0+c3R5bGUo
KS0+YWZmZWN0ZWRCeUFjdGl2ZVJ1bGVzKCk7Ci0gICAgICAgIGlmIChyZWFjdHNUb1ByZXNzKQot
ICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5k
ZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpIHsKLSAgICAgICAgICAgIGlmICh0aGVt
ZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwgUHJlc3NlZFN0YXRlKSkKLSAgICAgICAgICAg
ICAgICByZWFjdHNUb1ByZXNzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhY3Rz
VG9QcmVzcyAmJiBwYXVzZSkgewotICAgICAgICAgICAgLy8gVGhlIGRlbGF5IGhlcmUgaXMgc3Vi
dGxlLiAgSXQgcmVsaWVzIG9uIGFuIGFzc3VtcHRpb24sIG5hbWVseSB0aGF0IHRoZSBhbW91bnQg
b2YgdGltZSBpdCB0YWtlcwotICAgICAgICAgICAgLy8gdG8gcmVwYWludCB0aGUgImRvd24iIHN0
YXRlIG9mIHRoZSBjb250cm9sIGlzIGFib3V0IHRoZSBzYW1lIHRpbWUgYXMgaXQgd291bGQgdGFr
ZSB0byByZXBhaW50IHRoZQotICAgICAgICAgICAgLy8gInVwIiBzdGF0ZS4gIE9uY2UgeW91IGFz
c3VtZSB0aGlzLCB5b3UgY2FuIGp1c3QgZGVsYXkgZm9yIDEwMG1zIC0gdGhhdCB0aW1lIChhc3N1
bWluZyB0aGF0IGFmdGVyIHlvdQotICAgICAgICAgICAgLy8gbGVhdmUgdGhpcyBtZXRob2QsIGl0
IHdpbGwgYmUgYWJvdXQgdGhhdCBsb25nIGJlZm9yZSB0aGUgZmx1c2ggb2YgdGhlIHVwIHN0YXRl
IGhhcHBlbnMgYWdhaW4pLgotICAgICAgICAgICAgUVRpbWUgc3RhcnRUaW1lOwotICAgICAgICAg
ICAgc3RhcnRUaW1lLnJlc3RhcnQoKTsKLQotICAgICAgICAgICAgLy8gRG8gYW4gaW1tZWRpYXRl
IHJlcGFpbnQuCi0gICAgICAgICAgICBtX3JlbmRlci0+cmVwYWludCh0cnVlKTsKLSAgICAgICAg
ICAgIAotI2lmICFXSU4zMgotICAgICAgICAgICAgLy8gRklYTUU6IEZpbmQgYSBzdWJzdGl0dXRl
IGZvciB1c2xlZXAuICBCZXR0ZXIgeWV0LCBjb21lIHVwIHdpdGggYSB3YXkgb2YgZG9pbmcgdGhp
cyB0aGF0IAotICAgICAgICAgICAgLy8gZG9lc24ndCB1c2UgdXNsZWVwIGF0IGFsbC4KLSAgICAg
ICAgICAgIGludCByZW1haW5pbmdUaW1lID0gMTAwIC0gc3RhcnRUaW1lLmVsYXBzZWQoKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm93IHBhdXNlIGZvciBhIHNtYWxsIGFtb3VudCBv
ZiB0aW1lICgxLzEwdGggb2YgYSBzZWNvbmQgZnJvbSBiZWZvcmUgd2UgcmVwYWludGVkIGluIHRo
ZSBwcmVzc2VkIHN0YXRlKQotICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWUgPiAwKQotICAg
ICAgICAgICAgICAgIHVzbGVlcChyZW1haW5pbmdUaW1lICogMTAwMCk7Ci0jZW5kaWYKLSAgICAg
ICAgfQotICAgIH0KLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0SG92ZXJlZChib29s
IG92ZXIpCi17Ci0gICAgaWYgKG92ZXIgPT0gaG92ZXJlZCgpKSByZXR1cm47Ci0KLSAgICBOb2Rl
SW1wbDo6c2V0SG92ZXJlZChvdmVyKTsKLQotICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJl
Y2FsYyB0aGUgc3R5bGUKLSAgICAvLyBGSVhNRTogTW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlm
IChtX3JlbmRlcikgewotICAgICAgICBpZiAobV9yZW5kZXItPnN0eWxlKCktPmFmZmVjdGVkQnlI
b3ZlclJ1bGVzKCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIGlmIChyZW5k
ZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAg
ICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBIb3ZlclN0YXRlKTsKLSAgICB9
Ci19Ci0KLXVuc2lnbmVkIENvbnRhaW5lck5vZGVJbXBsOjpjaGlsZE5vZGVDb3VudCgpIGNvbnN0
Ci17Ci0gICAgdW5zaWduZWQgY291bnQgPSAwOwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAo
biA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGNvdW50
Kys7Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6
OmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICB1bnNpZ25lZCBpOwotICAgIE5vZGVJ
bXBsICpuID0gZmlyc3RDaGlsZCgpOwotICAgIGZvciAoaSA9IDA7IG4gIT0gMCAmJiBpIDwgaW5k
ZXg7IGkrKykKLSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgcmV0dXJuIG47Ci19
Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OmRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cygg
Tm9kZUltcGwgKmNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGFzc2VydCghZXZl
bnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBj
aGlsZC0+aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICAgIGNoaWxkLT5p
bnNlcnRlZEludG9UcmVlKHRydWUpOwotCi0gICAgaWYgKGdldERvY3VtZW50KCktPmhhc0xpc3Rl
bmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVJTlNFUlRFRF9MSVNURU5FUikpIHsKLSAgICAg
ICAgY2hpbGQtPmRpc3BhdGNoRXZlbnQobmV3IE11dGF0aW9uRXZlbnRJbXBsKERPTU5vZGVJbnNl
cnRlZEV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHJ1ZSxmYWxzZSx0aGlzLERPTVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygp
LDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci0gICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAg
ICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlSW5z
ZXJ0ZWRJbnRvRG9jdW1lbnQgZXZlbnQgdG8gYWxsIGRlc2NlbmRhbnRzCi0gICAgYm9vbCBoYXNJ
bnNlcnRlZExpc3RlbmVycyA9IGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVu
dEltcGw6OkRPTU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUik7Ci0KLSAgICBpZiAo
aGFzSW5zZXJ0ZWRMaXN0ZW5lcnMgJiYgaW5Eb2N1bWVudCgpKSB7Ci0gICAgICAgIGZvciAoTm9k
ZUltcGwgKmMgPSBjaGlsZDsgYzsgYyA9IGMtPnRyYXZlcnNlTmV4dE5vZGUoY2hpbGQpKSB7Ci0g
ICAgICAgICAgICBjLT5kaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2Rl
SW5zZXJ0ZWRJbnRvRG9jdW1lbnRFdmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLGZhbHNlLDAsRE9NU3RyaW5nKCksRE9NU3RyaW5n
KCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9uY29kZSx0cnVlKTsKLSAgICAgICAgICAgIGlmIChl
eGNlcHRpb25jb2RlKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0K
LX0KLQotLy8gYmFzZSBjbGFzcyBmb3Igbm9kZXMgdGhhdCBtYXkgaGF2ZSBjaGlsZHJlbgotdm9p
ZCBDb250YWluZXJOb2RlSW1wbDo6ZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBs
ICpjaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICAvLyB1cGRhdGUgYXV4aWxpYXJ5
IGRvYyBpbmZvIChlLmcuIGl0ZXJhdG9ycykgdG8gbm90ZSB0aGF0IG5vZGUgaXMgYmVpbmcgcmVt
b3ZlZAotICAgIGdldERvY3VtZW50KCktPm5vdGlmeUJlZm9yZU5vZGVSZW1vdmFsKGNoaWxkKTsg
Ly8gIyMjIHVzZSBldmVudHMgaW5zdGVhZAotCi0gICAgLy8gZGlzcGF0Y2ggcHJlLXJlbW92YWwg
bXV0YXRpb24gZXZlbnRzCi0gICAgaWYgKGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShE
b2N1bWVudEltcGw6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSKSkgewotCWNoaWxkLT5kaXNwYXRj
aEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlUmVtb3ZlZEV2ZW50LAotCQkJICAg
ICB0cnVlLGZhbHNlLHRoaXMsRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCks
ZXhjZXB0aW9uY29kZSx0cnVlKTsKLQlpZiAoZXhjZXB0aW9uY29kZSkKLQkgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIGJvb2wgaGFzUmVtb3ZhbExpc3RlbmVycyA9IGdldERvY3VtZW50KCktPmhh
c0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJ
U1RFTkVSKTsKLQotICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVu
dCBldmVudCB0byBhbGwgZGVzY2VuZGFudHMKLSAgICBpZiAoaW5Eb2N1bWVudCgpKSB7Ci0JZm9y
IChOb2RlSW1wbCAqYyA9IGNoaWxkOyBjOyBjID0gYy0+dHJhdmVyc2VOZXh0Tm9kZShjaGlsZCkp
IHsKLQkgICAgaWYgKGhhc1JlbW92YWxMaXN0ZW5lcnMpIHsKLQkJYy0+ZGlzcGF0Y2hFdmVudChu
ZXcgTXV0YXRpb25FdmVudEltcGwoRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCwKLQkJ
CQkgZmFsc2UsZmFsc2UsMCxET01TdHJpbmcoKSxET01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxl
eGNlcHRpb25jb2RlLHRydWUpOwotCQlpZiAoZXhjZXB0aW9uY29kZSkKLQkJICAgIHJldHVybjsK
LQkgICAgfQotCX0KLSAgICB9Ci19CisjaW5jbHVkZSAiTm9kZUxpc3RJbXBsLmgiCisjaW5jbHVk
ZSAiTm9kZUltcGwuaCIKKyNpbmNsdWRlICJkb21fbm9kZS5oIgorI2luY2x1ZGUgIkRvY3VtZW50
SW1wbC5oIgogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3VzaW5nIG5hbWVzcGFjZSBraHRtbDsK
IAorbmFtZXNwYWNlIERPTSB7CiAKIE5vZGVMaXN0SW1wbDo6Tm9kZUxpc3RJbXBsKE5vZGVJbXBs
ICpfcm9vdE5vZGUpCiAgICAgOiByb290Tm9kZShfcm9vdE5vZGUpLApAQCAtMjk1MSw3ICsxMzks
NiBAQCBOb2RlSW1wbCAqTm9kZUxpc3RJbXBsOjppdGVtQnlJZCAoY29uc3QgCiAgICAgcmV0dXJu
IDA7CiB9CiAKLQogdm9pZCBOb2RlTGlzdEltcGw6OnJvb3ROb2RlQ2hpbGRyZW5DaGFuZ2VkKCkK
IHsKICAgICBpc0xlbmd0aENhY2hlVmFsaWQgPSBmYWxzZTsKQEAgLTI5NTksMTA3ICsxNDYsNCBA
QCB2b2lkIE5vZGVMaXN0SW1wbDo6cm9vdE5vZGVDaGlsZHJlbkNoYW5nCiAgICAgbGFzdEl0ZW0g
PSAwOwogfQogCi1DaGlsZE5vZGVMaXN0SW1wbDo6Q2hpbGROb2RlTGlzdEltcGwoIE5vZGVJbXBs
ICpuICkKLSAgICA6IE5vZGVMaXN0SW1wbChuKQotewotfQotCi11bnNpZ25lZCBDaGlsZE5vZGVM
aXN0SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICBpZiAoaXNMZW5ndGhDYWNoZVZhbGlkKQot
ICAgICAgICByZXR1cm4gY2FjaGVkTGVuZ3RoOwotCi0gICAgdW5zaWduZWQgbGVuID0gMDsKLSAg
ICBOb2RlSW1wbCAqbjsKLSAgICBmb3IobiA9IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7IG4gIT0g
MDsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGxlbisrOwotCi0gICAgY2FjaGVkTGVu
Z3RoID0gbGVuOwotICAgIGlzTGVuZ3RoQ2FjaGVWYWxpZCA9IHRydWU7Ci0KLSAgICByZXR1cm4g
bGVuOwotfQotCi1Ob2RlSW1wbCAqQ2hpbGROb2RlTGlzdEltcGw6Oml0ZW0gKCB1bnNpZ25lZCBp
bmRleCApIGNvbnN0Ci17Ci0gICAgdW5zaWduZWQgaW50IHBvcyA9IDA7Ci0gICAgTm9kZUltcGwg
Km4gPSByb290Tm9kZS0+Zmlyc3RDaGlsZCgpOwotCi0gICAgaWYgKGlzSXRlbUNhY2hlVmFsaWQp
IHsKLSAgICAgICAgaWYgKGluZGV4ID09IGxhc3RJdGVtT2Zmc2V0KSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gbGFzdEl0ZW07Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPiBsYXN0SXRlbU9mZnNl
dCkgewotICAgICAgICAgICAgbiA9IGxhc3RJdGVtOwotICAgICAgICAgICAgcG9zID0gbGFzdEl0
ZW1PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobiAmJiBwb3MgPCBpbmRl
eCkgewotICAgICAgICBuID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgcG9zKys7Ci0gICAg
fQotCi0gICAgaWYgKG4pIHsKLSAgICAgICAgbGFzdEl0ZW0gPSBuOwotICAgICAgICBsYXN0SXRl
bU9mZnNldCA9IHBvczsKLSAgICAgICAgaXNJdGVtQ2FjaGVWYWxpZCA9IHRydWU7Ci0gICAgICAg
IHJldHVybiBuOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIENoaWxkTm9kZUxp
c3RJbXBsOjpub2RlTWF0Y2hlcyhOb2RlSW1wbCAqdGVzdE5vZGUpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIHRlc3ROb2RlLT5wYXJlbnROb2RlKCkgPT0gcm9vdE5vZGU7Ci19Ci0KLVRhZ05vZGVMaXN0
SW1wbDo6VGFnTm9kZUxpc3RJbXBsKE5vZGVJbXBsICpuLCBjb25zdCBBdG9taWNTdHJpbmcmIG5h
bWVzcGFjZVVSSSwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUpCi0gICAgOiBOb2RlTGlz
dEltcGwobiksIAotICAgICAgbV9uYW1lc3BhY2VVUkkobmFtZXNwYWNlVVJJKSwgCi0gICAgICBt
X2xvY2FsTmFtZShsb2NhbE5hbWUpCi17Ci19Ci0KLXVuc2lnbmVkIFRhZ05vZGVMaXN0SW1wbDo6
bGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVjdXJzaXZlTGVuZ3RoKCk7Ci19Ci0KLU5v
ZGVJbXBsICpUYWdOb2RlTGlzdEltcGw6Oml0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIHJlY3Vyc2l2ZUl0ZW0oaW5kZXgpOwotfQotCi1ib29sIFRhZ05vZGVMaXN0SW1w
bDo6bm9kZU1hdGNoZXMoTm9kZUltcGwgKnRlc3ROb2RlKSBjb25zdAotewotICAgIGlmICghdGVz
dE5vZGUtPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYg
KG1fbmFtZXNwYWNlVVJJICE9IHN0YXJBdG9tICYmIG1fbmFtZXNwYWNlVVJJICE9IHRlc3ROb2Rl
LT5uYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIHJldHVy
biBtX2xvY2FsTmFtZSA9PSBzdGFyQXRvbSB8fCBtX2xvY2FsTmFtZSA9PSB0ZXN0Tm9kZS0+bG9j
YWxOYW1lKCk7Ci19Ci0KLU5hbWVOb2RlTGlzdEltcGw6Ok5hbWVOb2RlTGlzdEltcGwoTm9kZUlt
cGwgKm4sIGNvbnN0IERPTVN0cmluZyAmdCApCi0gIDogTm9kZUxpc3RJbXBsKG4pLCBub2RlTmFt
ZSh0KQotewotfQotCi11bnNpZ25lZCBOYW1lTm9kZUxpc3RJbXBsOjpsZW5ndGgoKSBjb25zdAot
ewotICAgIHJldHVybiByZWN1cnNpdmVMZW5ndGgoKTsKLX0KLQotTm9kZUltcGwgKk5hbWVOb2Rl
TGlzdEltcGw6Oml0ZW0gKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJl
Y3Vyc2l2ZUl0ZW0oIGluZGV4ICk7Ci19Ci0KLWJvb2wgTmFtZU5vZGVMaXN0SW1wbDo6bm9kZU1h
dGNoZXMoTm9kZUltcGwgKnRlc3ROb2RlKSBjb25zdAotewotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxFbGVtZW50SW1wbCAqPih0ZXN0Tm9kZSktPmdldEF0dHJpYnV0ZShuYW1lQXR0cikgPT0gbm9k
ZU5hbWU7Ci19Ci0KIH0KSW5kZXg6IGtodG1sL3htbC9kb21fbm9kZWltcGwuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIGtodG1sL3htbC9kb21fbm9kZWltcGwuY3BwCShyZXZpc2lvbiAxMjA4NikKKysrIGto
dG1sL3htbC9kb21fbm9kZWltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMwNjUgKzAsMCBA
QAotLyoqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGZv
ciBLREUuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5v
cmcpCi0gKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5v
cmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcp
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgQXBwbGUgQ29tcHV0ZXIsIEluYy4KLSAqCi0gKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
Ci0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAs
Ci0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmln
LmgiCi0jaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgotCi0jaW5jbHVkZSAiZG9tL2RvbV9l
eGNlcHRpb24uaCIKLSNpbmNsdWRlICJkb20vZG9tMl9ldmVudHMuaCIKLSNpbmNsdWRlICJ4bWwv
ZG9tX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgotI2luY2x1
ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKLSNp
bmNsdWRlICJET01JbXBsZW1lbnRhdGlvbkltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX3Bvc2l0
aW9uLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfcmFuZ2VpbXBsLmgiCi0jaW5jbHVkZSAieG1sL0V2
ZW50TmFtZXMuaCIKLSNpbmNsdWRlICJjc3MvY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAiY3NzL2Nz
c3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJlZGl0aW5nL2h0bWxlZGl0aW5nLmgiCi0jaW5j
bHVkZSAiZWRpdGluZy9odG1sX2ludGVyY2hhbmdlLmgiCi0jaW5jbHVkZSAiZWRpdGluZy9TZWxl
Y3Rpb25Db250cm9sbGVyLmgiCi0KLSNpbmNsdWRlIDxrZGVidWcuaD4KLQotI2luY2x1ZGUgInJl
bmRlcmluZy9yZW5kZXJfb2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgotI2lu
Y2x1ZGUgInJlbmRlcl90aGVtZS5oIgotCi0jaW5jbHVkZSAiZWNtYS9ranNfYmluZGluZy5oIgot
I2luY2x1ZGUgImVjbWEva2pzX3Byb3h5LmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5j
bHVkZSAiRnJhbWUuaCIKLQotLy8gRklYTUU6IFNob3VsZCBub3QgaGF2ZSB0byBpbmNsdWRlIHRo
aXMuICBDdXQgdGhlIEhUTUwgZGVwZW5kZW5jeSEKLSNpbmNsdWRlICJodG1sbmFtZXMuaCIKLQot
I2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2JpbmRpbmdfbWFuYWdlci5o
IgotI2VuZGlmCi0KLSNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+Ci0jaW5jbHVkZSAi
S1dRTG9nZ2luZy5oIgotCi11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci0KLW5hbWVzcGFjZSBET00g
ewotCi11c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFt
ZXM7Ci0KLS8qKgotICogTm9kZUxpc3Qgd2hpY2ggbGlzdHMgYWxsIE5vZGVzIGluIGEgZG9jdW1l
bnQgd2l0aCBhIGdpdmVuIHRhZyBuYW1lCi0gKi8KLWNsYXNzIFRhZ05vZGVMaXN0SW1wbCA6IHB1
YmxpYyBOb2RlTGlzdEltcGwKLXsKLXB1YmxpYzoKLSAgICBUYWdOb2RlTGlzdEltcGwoTm9kZUlt
cGwgKm4sIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBBdG9taWNTdHJp
bmcmIGxvY2FsTmFtZSk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBh
cmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIE5vZGVJbXBsICppdGVtICh1bnNpZ25lZCBpbmRleCkgY29uc3Q7Ci0KLSAgICAvLyBP
dGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFs
IGJvb2wgbm9kZU1hdGNoZXMoTm9kZUltcGwgKnRlc3ROb2RlKSBjb25zdDsKLQotICAgIEF0b21p
Y1N0cmluZyBtX25hbWVzcGFjZVVSSTsKLSAgICBBdG9taWNTdHJpbmcgbV9sb2NhbE5hbWU7Ci19
OwotCi0jaWZuZGVmIE5ERUJVRwotc3RydWN0IE5vZGVJbXBsQ291bnRlciB7IAotICAgIHN0YXRp
YyBpbnQgY291bnQ7IAotICAgIH5Ob2RlSW1wbENvdW50ZXIoKSB7IC8qIGlmIChjb3VudCAhPSAw
KSBmcHJpbnRmKHN0ZGVyciwgIkxFQUs6ICVkIE5vZGVJbXBsXG4iLCBjb3VudCk7ICovIH0KLX07
Ci1pbnQgTm9kZUltcGxDb3VudGVyOjpjb3VudCA9IDA7Ci1zdGF0aWMgTm9kZUltcGxDb3VudGVy
IG5vZGVJbXBsQ291bnRlcjsKLQotc3RhdGljIGludCBnRXZlbnREaXNwYXRjaEZvcmJpZGRlbjsK
LSNkZWZpbmUgZm9yYmlkRXZlbnREaXNwYXRjaCgpIGdFdmVudERpc3BhdGNoRm9yYmlkZGVuICs9
IDEKLSNkZWZpbmUgYWxsb3dFdmVudERpc3BhdGNoKCkgYXNzZXJ0KGdFdmVudERpc3BhdGNoRm9y
YmlkZGVuID4gMCk7IGdFdmVudERpc3BhdGNoRm9yYmlkZGVuIC09IDEKLSNkZWZpbmUgZXZlbnRE
aXNwYXRjaEZvcmJpZGRlbigpIChnRXZlbnREaXNwYXRjaEZvcmJpZGRlbiA+IDApCi0jZWxzZQot
Ci0jZGVmaW5lIGZvcmJpZEV2ZW50RGlzcGF0Y2goKQotI2RlZmluZSBhbGxvd0V2ZW50RGlzcGF0
Y2goKQotI2RlZmluZSBldmVudERpc3BhdGNoRm9yYmlkZGVuKCkKLSNlbmRpZiBOREVCVUcKLQot
Tm9kZUltcGw6Ok5vZGVJbXBsKERvY3VtZW50SW1wbCAqZG9jKQotICAgIDogZG9jdW1lbnQoZG9j
KSwKLSAgICAgIG1fcHJldmlvdXMoMCksCi0gICAgICBtX25leHQoMCksCi0gICAgICBtX3JlbmRl
cigwKSwKLSAgICAgIG1fcmVnZExpc3RlbmVycygwKSwKLSAgICAgIG1fbm9kZUxpc3RzKDApLAot
ICAgICAgbV90YWJJbmRleCgwKSwKLSAgICAgIG1faGFzSWQoZmFsc2UpLAotICAgICAgbV9oYXND
bGFzcyhmYWxzZSksCi0gICAgICBtX2hhc1N0eWxlKGZhbHNlKSwKLSAgICAgIG1fYXR0YWNoZWQo
ZmFsc2UpLAotICAgICAgbV9jaGFuZ2VkKGZhbHNlKSwKLSAgICAgIG1faGFzQ2hhbmdlZENoaWxk
KGZhbHNlKSwKLSAgICAgIG1faW5Eb2N1bWVudChmYWxzZSksCi0gICAgICBtX2lzTGluayhmYWxz
ZSksCi0gICAgICBtX3NwZWNpZmllZChmYWxzZSksCi0gICAgICBtX2ZvY3VzZWQoZmFsc2UpLAot
ICAgICAgbV9hY3RpdmUoZmFsc2UpLAotICAgICAgbV9ob3ZlcmVkKGZhbHNlKSwKLSAgICAgIG1f
aW5BY3RpdmVDaGFpbihmYWxzZSksCi0gICAgICBtX3N0eWxlRWxlbWVudChmYWxzZSksCi0gICAg
ICBtX2ltcGxpY2l0KGZhbHNlKSwKLSAgICAgIG1faW5EZXRhY2goZmFsc2UpCi17Ci0jaWZuZGVm
IE5ERUJVRwotICAgICsrTm9kZUltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRpZgotfQotCi12b2lk
IE5vZGVJbXBsOjpzZXREb2N1bWVudChEb2N1bWVudEltcGwgKmRvYykKLXsKLSAgICBpZiAoaW5E
b2N1bWVudCgpKQotCXJldHVybjsKLSAgICAKLSAgICBkb2N1bWVudCA9IGRvYzsKLX0KLQotTm9k
ZUltcGw6On5Ob2RlSW1wbCgpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIC0tTm9kZUltcGxDb3Vu
dGVyOjpjb3VudDsKLSNlbmRpZgotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgZGV0YWNoKCk7
Ci0gICAgaWYgKG1fcmVnZExpc3RlbmVycyAmJiAhbV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5KCkg
JiYgZ2V0RG9jdW1lbnQoKSAmJiAhaW5Eb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVudCgp
LT51bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsKLSAg
ICBkZWxldGUgbV9yZWdkTGlzdGVuZXJzOwotICAgIGRlbGV0ZSBtX25vZGVMaXN0czsKLSAgICBp
ZiAobV9wcmV2aW91cykKLSAgICAgICAgbV9wcmV2aW91cy0+c2V0TmV4dFNpYmxpbmcoMCk7Ci0g
ICAgaWYgKG1fbmV4dCkKLSAgICAgICAgbV9uZXh0LT5zZXRQcmV2aW91c1NpYmxpbmcoMCk7Ci19
Ci0KLURPTVN0cmluZyBOb2RlSW1wbDo6bm9kZVZhbHVlKCkgY29uc3QKLXsKLSAgcmV0dXJuIERP
TVN0cmluZygpOwotfQotCi12b2lkIE5vZGVJbXBsOjpzZXROb2RlVmFsdWUoIGNvbnN0IERPTVN0
cmluZyAmLypfbm9kZVZhbHVlKi8sIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgLy8gTk9f
TU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25s
eQotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4
Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgLy8gYmUgZGVmYXVsdCBub2RlVmFsdWUgaXMgbnVsbCwgc28gc2V0dGluZyBp
dCBoYXMgbm8gZWZmZWN0Ci19Ci0KLVJlZlB0cjxOb2RlTGlzdEltcGw+IE5vZGVJbXBsOjpjaGls
ZE5vZGVzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPE5vZGVMaXN0SW1wbD4obmV3IENoaWxkTm9k
ZUxpc3RJbXBsKHRoaXMpKTsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpmaXJzdENoaWxkKCkg
Y29uc3QKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6bGFzdENoaWxk
KCkgY29uc3QKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6bGFzdERl
c2NlbmRhbnQoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpuID0gY29uc3RfY2FzdDxOb2RlSW1w
bCAqPih0aGlzKTsKLSAgICB3aGlsZSAobiAmJiBuLT5sYXN0Q2hpbGQoKSkKLSAgICAgICAgbiA9
IG4tPmxhc3RDaGlsZCgpOwotICAgIHJldHVybiBuOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6
Omluc2VydEJlZm9yZSggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKQotewotICAgIG5ld0NoaWxkLT5yZWYoKTsKLSAgICBuZXdDaGlsZC0+ZGVyZWYo
KTsKLSAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9F
UlI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6cmVwbGFjZUNoaWxk
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICosIGludCAmZXhjZXB0aW9uY29kZSApCi17
Ci0gIG5ld0NoaWxkLT5yZWYoKTsKLSAgbmV3Q2hpbGQtPmRlcmVmKCk7Ci0gIGV4Y2VwdGlvbmNv
ZGUgPSBET01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgcmV0dXJuIDA7Ci19
Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6cmVtb3ZlQ2hpbGQoIE5vZGVJbXBsICosIGludCAmZXhj
ZXB0aW9uY29kZSApCi17Ci0gIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VO
RF9FUlI7Ci0gIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OmFwcGVuZENoaWxk
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgbmV3Q2hp
bGQtPnJlZigpOwotICAgIG5ld0NoaWxkLT5kZXJlZigpOwotICAgIGV4Y2VwdGlvbmNvZGUgPSBE
T01FeGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICByZXR1cm4gMDsKLX0KLQot
dm9pZCBOb2RlSW1wbDo6cmVtb3ZlKGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICByZWYoKTsK
LSAgICBpZiAoTm9kZUltcGwgKnAgPSBwYXJlbnROb2RlKCkpCi0gICAgICAgIHAtPnJlbW92ZUNo
aWxkKHRoaXMsIGV4Y2VwdGlvbmNvZGUpOwotICAgIGVsc2UKLSAgICAgICAgZXhjZXB0aW9uY29k
ZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgIGRlcmVmKCk7Ci19
Ci0KLWJvb2wgTm9kZUltcGw6Omhhc0NoaWxkTm9kZXMoICApIGNvbnN0Ci17Ci0gIHJldHVybiBm
YWxzZTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6bm9ybWFsaXplICgpCi17Ci0gICAgaW50IGV4Y2Vw
dGlvbmNvZGUgPSAwOwotICAgIE5vZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLQotICAg
IGlmIChpc0VsZW1lbnROb2RlKCkpIHsKLSAgICAgICAgLy8gTm9ybWFsaXplIGFueSBhdHRyaWJ1
dGUgY2hpbGRyZW4gd2UgbWlnaHQgaGF2ZSAKLSAgICAgICAgRWxlbWVudEltcGwgKmVsZW1lbnQg
PSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPih0aGlzKTsKLSAgICAgICAgTmFtZWRBdHRyTWFw
SW1wbCAqYXR0ck1hcCA9IGVsZW1lbnQtPmF0dHJpYnV0ZXMoKTsKLSAgICAgICAgCi0gICAgICAg
IGlmIChhdHRyTWFwKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBudW1BdHRycyA9IGF0dHJNYXAt
Pmxlbmd0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbnVtQXR0cnM7IGkrKykgewotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgKmF0
dHJpYnV0ZSA9IGF0dHJNYXAtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgQXR0
ckltcGwgKmF0dHIgPSBhdHRyaWJ1dGUtPmF0dHJJbXBsKCk7Ci0gICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgaWYgKGF0dHIpCi0gICAgICAgICAgICAgICAgICAgIGF0dHItPm5vcm1h
bGl6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIFJl
Y3Vyc2l2ZWx5IGdvIHRocm91Z2ggdGhlIHN1YnRyZWUgYmVuZWF0aCB1cywgbm9ybWFsaXppbmcg
YWxsIG5vZGVzLiBJbiB0aGUgY2FzZQotICAgIC8vIHdoZXJlIHRoZXJlIGFyZSB0d28gYWRqYWNl
bnQgdGV4dCBub2RlcywgdGhleSBhcmUgbWVyZ2VkIHRvZ2V0aGVyCi0gICAgd2hpbGUgKGNoaWxk
KSB7Ci0gICAgICAgIE5vZGVJbXBsICpuZXh0Q2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsK
LQotICAgICAgICBpZiAobmV4dENoaWxkICYmIGNoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OlRF
WFRfTk9ERSAmJiBuZXh0Q2hpbGQtPm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RFKSB7Ci0g
ICAgICAgICAgICAvLyBDdXJyZW50IGNoaWxkIGFuZCB0aGUgbmV4dCBvbmUgYXJlIGJvdGggdGV4
dCBub2Rlcy4uLiBtZXJnZSB0aGVtCi0gICAgICAgICAgICBUZXh0SW1wbCAqY3VycmVudFRleHQg
PSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KGNoaWxkKTsKLSAgICAgICAgICAgIFRleHRJbXBsICpu
ZXh0VGV4dCA9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4obmV4dENoaWxkKTsKLQotICAgICAgICAg
ICAgY3VycmVudFRleHQtPmFwcGVuZERhdGEobmV4dFRleHQtPmRhdGEoKSxleGNlcHRpb25jb2Rl
KTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICAgICAgbmV4dENoaWxkLT5yZW1vdmUoZXhjZXB0aW9uY29kZSk7Ci0gICAg
ICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjaGlsZC0+bm9ybWFsaXplKCk7Ci0g
ICAgICAgICAgICBjaGlsZCA9IG5leHRDaGlsZDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAg
ICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgc2luZ2xlIGVtcHR5IHRleHQgbm9kZSBsZWZ0IGFuZCBy
ZW1vdmUgaXQgaWYgc28KLSAgICBjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoY2hpbGQg
JiYgIWNoaWxkLT5uZXh0U2libGluZygpICYmIGNoaWxkLT5pc1RleHROb2RlKCkpIHsKLSAgICAg
ICAgVGV4dEltcGwgKnRleHQgPSBzdGF0aWNfY2FzdDxUZXh0SW1wbCo+KGNoaWxkKTsKLSAgICAg
ICAgaWYgKHRleHQtPmRhdGEoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjaGlsZC0+cmVtb3Zl
KGV4Y2VwdGlvbmNvZGUpOwotICAgIH0KLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBOb2RlSW1w
bDo6cHJlZml4KCkgY29uc3QKLXsKLSAgICAvLyBGb3Igbm9kZXMgb3RoZXIgdGhhbiBlbGVtZW50
cyBhbmQgYXR0cmlidXRlcywgdGhlIHByZWZpeCBpcyBhbHdheXMgbnVsbAotICAgIHJldHVybiBu
dWxsQXRvbTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmlu
ZyAmLypfcHJlZml4Ki8sIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgLy8gVGhlIHNwZWMg
c2F5cyB0aGF0IGZvciBub2RlcyBvdGhlciB0aGFuIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBw
cmVmaXggaXMgYWx3YXlzIG51bGwuCi0gICAgLy8gSXQgZG9lcyBub3Qgc2F5IHdoYXQgdG8gZG8g
d2hlbiB0aGUgdXNlciB0cmllcyB0byBzZXQgdGhlIHByZWZpeCBvbiBhbm90aGVyIHR5cGUgb2YK
LSAgICAvLyBub2RlLCBob3dldmVyIG1vemlsbGEgdGhyb3dzIGEgTkFNRVNQQUNFX0VSUiBleGNl
cHRpb24KLSAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwot
fQotCi1jb25zdCBBdG9taWNTdHJpbmcmIE5vZGVJbXBsOjpsb2NhbE5hbWUoKSBjb25zdAotewot
ICAgIHJldHVybiBlbXB0eUF0b207Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgTm9kZUltcGw6
Om5hbWVzcGFjZVVSSSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG51bGxBdG9tOwotfQotCi12b2lk
IE5vZGVJbXBsOjpzZXRGaXJzdENoaWxkKE5vZGVJbXBsICopCi17Ci19Ci0KLXZvaWQgTm9kZUlt
cGw6OnNldExhc3RDaGlsZChOb2RlSW1wbCAqKQotewotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6
OmFkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCkKLXsKLSAgICBSZWZQdHI8Tm9kZUltcGw+IHBy
b3RlY3ROZXdDaGlsZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJl
ZidkIGFuZCBkZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLSAgICByZXR1cm4gMDsKLX0KLQot
Ym9vbCBOb2RlSW1wbDo6aXNDb250ZW50RWRpdGFibGUoKSBjb25zdAotewotICAgIHJldHVybiBw
YXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNDb250ZW50RWRpdGFibGUoKTsKLX0KLQotSW50UmVjdCBO
b2RlSW1wbDo6Z2V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgaW50IF94LCBfeTsKLSAgICBpZihtX3Jl
bmRlciAmJiBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlvbihfeCwgX3kpKQotICAgICAgICByZXR1
cm4gSW50UmVjdCggX3gsIF95LCBtX3JlbmRlci0+d2lkdGgoKSwgbV9yZW5kZXItPmhlaWdodCgp
ICk7Ci0KLSAgICByZXR1cm4gSW50UmVjdCgpOwotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRDaGFu
Z2VkKGJvb2wgYikKLXsKLSAgICBpZiAoYiAmJiAhYXR0YWNoZWQoKSkgLy8gY2hhbmdlZCBjb21w
YXJlZCB0byB3aGF0PwotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2NoYW5nZWQgPSBiOwotICAg
IGlmICggYiApIHsKLQlOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUoKTsKLQl3aGlsZSAoIHAgKSB7
Ci0JICAgIHAtPnNldEhhc0NoYW5nZWRDaGlsZCggdHJ1ZSApOwotCSAgICBwID0gcC0+cGFyZW50
Tm9kZSgpOwotCX0KLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRy
dWUpOwotICAgIH0KLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNGb2N1c2FibGUoKSBjb25zdAotewot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNLZXlib2FyZEZvY3VzYWJs
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzRm9jdXNhYmxlKCk7Ci19Ci0KLWJvb2wgTm9kZUlt
cGw6OmlzTW91c2VGb2N1c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiBpc0ZvY3VzYWJsZSgp
OwotfQotCi11bnNpZ25lZCBOb2RlSW1wbDo6bm9kZUluZGV4KCkgY29uc3QKLXsKLSAgICBOb2Rl
SW1wbCAqX3RlbXBOb2RlID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgdW5zaWduZWQgY291bnQ9
MDsKLSAgICBmb3IoIGNvdW50PTA7IF90ZW1wTm9kZTsgY291bnQrKyApCi0gICAgICAgIF90ZW1w
Tm9kZSA9IF90ZW1wTm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgcmV0dXJuIGNvdW50Owot
fQotCi12b2lkIE5vZGVJbXBsOjphZGRFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAm
ZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgY29uc3QgYm9vbCB1c2VDYXB0dXJl
KQotewotICAgIGlmIChnZXREb2N1bWVudCgpICYmICFnZXREb2N1bWVudCgpLT5hdHRhY2hlZCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBEb2N1bWVudEltcGw6Okxpc3RlbmVyVHlwZSB0eXBl
ID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnRJbXBsOjpMaXN0ZW5lclR5cGU+KDApOwotICAgIGlmIChl
dmVudFR5cGUgPT0gRE9NU3VidHJlZU1vZGlmaWVkRXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1
bWVudEltcGw6OkRPTVNVQlRSRUVNT0RJRklFRF9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVu
dFR5cGUgPT0gRE9NTm9kZUluc2VydGVkRXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVudElt
cGw6OkRPTU5PREVJTlNFUlRFRF9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0g
RE9NTm9kZVJlbW92ZWRFdmVudCkKLSAgICAgICAgdHlwZSA9IERvY3VtZW50SW1wbDo6RE9NTk9E
RVJFTU9WRURfTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERPTU5vZGVSZW1v
dmVkRnJvbURvY3VtZW50RXZlbnQpCi0gICAgICAgIHR5cGUgPSBEb2N1bWVudEltcGw6OkRPTU5P
REVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9
PSBET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnRFdmVudCkKLSAgICAgICAgdHlwZSA9IERvY3Vt
ZW50SW1wbDo6RE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RFTkVSOwotICAgIGVsc2Ug
aWYgKGV2ZW50VHlwZSA9PSBET01BdHRyTW9kaWZpZWRFdmVudCkKLSAgICAgICAgdHlwZSA9IERv
Y3VtZW50SW1wbDo6RE9NQVRUUk1PRElGSUVEX0xJU1RFTkVSOwotICAgIGVsc2UgaWYgKGV2ZW50
VHlwZSA9PSBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRFdmVudCkKLSAgICAgICAgdHlwZSA9IERv
Y3VtZW50SW1wbDo6RE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSOwotICAgIGlmICh0
eXBlKQotICAgICAgICBnZXREb2N1bWVudCgpLT5hZGRMaXN0ZW5lclR5cGUodHlwZSk7Ci0KLSAg
ICBpZiAoIW1fcmVnZExpc3RlbmVycykgewotICAgICAgICBtX3JlZ2RMaXN0ZW5lcnMgPSBuZXcg
UVB0ckxpc3Q8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+OwotCW1fcmVnZExpc3RlbmVycy0+c2V0
QXV0b0RlbGV0ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBsaXN0ZW5lci0+cmVmKCk7Ci0KLSAgICAv
LyBSZW1vdmUgZXhpc3RpbmcgaWRlbnRpY2FsIGxpc3RlbmVyIHNldCB3aXRoIGlkZW50aWNhbCBh
cmd1bWVudHMuCi0gICAgLy8gVGhlIERPTTIgc3BlYyBzYXlzIHRoYXQgImR1cGxpY2F0ZSBpbnN0
YW5jZXMgYXJlIGRpc2NhcmRlZCIgaW4gdGhpcyBjYXNlLgotICAgIHJlbW92ZUV2ZW50TGlzdGVu
ZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7Ci0KLSAgICAvLyBhZGRpbmcgdGhl
IGZpcnN0IG9uZQotICAgIGlmIChtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAmJiBnZXREb2N1
bWVudCgpICYmICFpbkRvY3VtZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPnJlZ2lzdGVy
RGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsKLSAgICAgICAgCi0gICAg
bV9yZWdkTGlzdGVuZXJzLT5hcHBlbmQobmV3IFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyKGV2ZW50
VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpKTsKLQotICAgIGxpc3RlbmVyLT5kZXJlZigpOwot
fQotCi12b2lkIE5vZGVJbXBsOjpyZW1vdmVFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmlu
ZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKQot
ewotICAgIGlmICghbV9yZWdkTGlzdGVuZXJzKSAvLyBub3RoaW5nIHRvIHJlbW92ZQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lciBybChldmVudFR5cGUsIGxp
c3RlbmVyLCB1c2VDYXB0dXJlKTsKLQotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2
ZW50TGlzdGVuZXI+IGl0KCptX3JlZ2RMaXN0ZW5lcnMpOwotICAgIGZvciAoOyBpdC5jdXJyZW50
KCk7ICsraXQpCi0gICAgICAgIGlmICgqKGl0LmN1cnJlbnQoKSkgPT0gcmwpIHsKLSAgICAgICAg
ICAgIG1fcmVnZExpc3RlbmVycy0+cmVtb3ZlUmVmKGl0LmN1cnJlbnQoKSk7Ci0gICAgICAgICAg
ICAvLyByZW1vdmVkIGxhc3QKLSAgICAgICAgICAgIGlmIChtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1w
dHkoKSAmJiBnZXREb2N1bWVudCgpICYmICFpbkRvY3VtZW50KCkpCi0gICAgICAgICAgICAgICAg
Z2V0RG9jdW1lbnQoKS0+dW5yZWdpc3RlckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5l
cnModGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQotdm9pZCBOb2Rl
SW1wbDo6cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKQotewotICAgIGRlbGV0ZSBtX3JlZ2RMaXN0
ZW5lcnM7Ci0gICAgbV9yZWdkTGlzdGVuZXJzID0gMDsKLX0KLQotdm9pZCBOb2RlSW1wbDo6cmVt
b3ZlSFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0g
ICAgaWYgKCFtX3JlZ2RMaXN0ZW5lcnMpIC8vIG5vdGhpbmcgdG8gcmVtb3ZlCi0gICAgICAgIHJl
dHVybjsKLQotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGl0
KCptX3JlZ2RMaXN0ZW5lcnMpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAg
ICAgIGlmIChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSAmJiBpdC5jdXJy
ZW50KCktPmxpc3RlbmVyKCktPmV2ZW50TGlzdGVuZXJUeXBlKCkgPT0gIl9raHRtbF9IVE1MRXZl
bnRMaXN0ZW5lciIpIHsKLSAgICAgICAgICAgIG1fcmVnZExpc3RlbmVycy0+cmVtb3ZlUmVmKGl0
LmN1cnJlbnQoKSk7Ci0gICAgICAgICAgICAvLyByZW1vdmVkIGxhc3QKLSAgICAgICAgICAgIGlm
IChtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAmJiBnZXREb2N1bWVudCgpICYmICFpbkRvY3Vt
ZW50KCkpCi0gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnQoKS0+dW5yZWdpc3RlckRpc2Nvbm5l
Y3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnModGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3Qg
QXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKQotewotICAg
IC8vIEluIGNhc2Ugd2UgYXJlIHRoZSBvbmx5IG9uZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0
LCB3ZSBkb24ndCB3YW50IHJlbW92ZUhUTUxFdmVudExpc3RlbmVyIHRvIGRlc3Ryb3kgaXQuCi0g
ICAgaWYgKGxpc3RlbmVyKQotICAgICAgICBsaXN0ZW5lci0+cmVmKCk7Ci0gICAgcmVtb3ZlSFRN
TEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKTsKLSAgICBpZiAobGlzdGVuZXIpIHsKLSAgICAgICAg
YWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7Ci0gICAgICAgIGxp
c3RlbmVyLT5kZXJlZigpOwotICAgIH0KLX0KLQotRXZlbnRMaXN0ZW5lciAqTm9kZUltcGw6Omdl
dEhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKQotewotICAg
IGlmICghbV9yZWdkTGlzdGVuZXJzKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFFQdHJMaXN0
SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGl0KCptX3JlZ2RMaXN0ZW5lcnMpOwot
ICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIGlmIChpdC5jdXJyZW50KCkt
PmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSAmJiBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCktPmV2
ZW50TGlzdGVuZXJUeXBlKCkgPT0gIl9raHRtbF9IVE1MRXZlbnRMaXN0ZW5lciIpCi0gICAgICAg
ICAgICByZXR1cm4gaXQuY3VycmVudCgpLT5saXN0ZW5lcigpOwotICAgIHJldHVybiAwOwotfQot
Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoRXZlbnQoRXZlbnRJbXBsICpldnQsIGludCAmZXhj
ZXB0aW9uY29kZSwgYm9vbCB0ZW1wRXZlbnQpCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNo
Rm9yYmlkZGVuKCkpOwotICAgIGlmICghZXZ0IHx8IGV2dC0+dHlwZSgpLmlzRW1wdHkoKSkgeyAK
LSAgICAgICAgZXhjZXB0aW9uY29kZSA9IEV2ZW50RXhjZXB0aW9uOjpfRVhDRVBUSU9OX09GRlNF
VCArIEV2ZW50RXhjZXB0aW9uOjpVTlNQRUNJRklFRF9FVkVOVF9UWVBFX0VSUjsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGV2dC0+cmVmKCk7Ci0KLSAgICBldnQtPnNldFRh
cmdldCh0aGlzKTsKLQotICAgIC8vIFdlJ3ZlIGhhZCBhdCBsZWFzdCBvbmUgcmVwb3J0IG9mIGEg
Y3Jhc2ggb24gYSBwYWdlIHdoZXJlIGRvY3VtZW50IGlzIG51bGwgaGVyZS4KLSAgICAvLyBVbmZv
cnR1bmF0ZWx5IHRoYXQgcGFnZSBubyBsb25nZXIgZXhpc3RzLCBidXQgd2UnbGwgbWFrZSB0aGlz
IGNvZGUgcm9idXN0IGFnYWluc3QKLSAgICAvLyB0aGF0IGFueXdheS4KLSAgICAvLyBGSVhNRTog
TXVjaCBjb2RlIGluIHRoaXMgY2xhc3MgYXNzdW1lcyBkb2N1bWVudCBpcyBub24tbnVsbDsgaXQg
d291bGQgYmUgYmV0dGVyIHRvCi0gICAgLy8gZW5zdXJlIHRoYXQgZG9jdW1lbnQgY2FuIG5ldmVy
IGJlIG51bGwuCi0gICAgRnJhbWUgKmZyYW1lID0gMDsKLSAgICBLSFRNTFZpZXcgKnZpZXcgPSAw
OwotCi0gICAgaWYgKERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9jdW1lbnQoKSkgewotICAgICAg
ICBmcmFtZSA9IGRvYy0+ZnJhbWUoKTsKLSAgICAgICAgdmlldyA9IGRvYy0+dmlldygpOwotICAg
ICAgICAvLyBTaW5jZSBldmVudCBoYW5kbGluZyBjb2RlIGNvdWxkIGNhdXNlIHRoaXMgb2JqZWN0
IHRvIGJlIGRlbGV0ZWQsIGdyYWIgYSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgbm93Ci0gICAgICAg
IGlmICh2aWV3KQotICAgICAgICAgICAgdmlldy0+cmVmKCk7Ci0gICAgfSAgICAKLQotICAgIGJv
b2wgcmV0ID0gZGlzcGF0Y2hHZW5lcmljRXZlbnQoIGV2dCwgZXhjZXB0aW9uY29kZSApOwotCi0g
ICAgLy8gSWYgdGVtcEV2ZW50IGlzIHRydWUsIHRoaXMgbWVhbnMgdGhhdCB0aGUgRE9NIGltcGxl
bWVudGF0aW9uIHdpbGwgbm90IGJlIHN0b3JpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50LCBp
LmUuCi0gICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIHJldHJpZXZlIGl0IGZyb20gamF2YXNjcmlw
dCBpZiBhIHNjcmlwdCBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYSByZWZlcmVuY2UgdG8gaXQgaW4g
YSB2YXJpYWJsZS4KLSAgICAvLyBTbyB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgaW50ZXJwcmV0
ZXIgdG8ga2VlcCB0aGUgZXZlbnQgaW4gaXQncyBjYWNoZQotICAgIGlmICh0ZW1wRXZlbnQgJiYg
ZnJhbWUgJiYgZnJhbWUtPmpTY3JpcHQoKSkKLSAgICAgICAgZnJhbWUtPmpTY3JpcHQoKS0+Zmlu
aXNoZWRXaXRoRXZlbnQoZXZ0KTsKLQotICAgIGlmICh2aWV3KQotICAgICAgICB2aWV3LT5kZXJl
ZigpOwotCi0gICAgZXZ0LT5kZXJlZigpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotYm9vbCBO
b2RlSW1wbDo6ZGlzcGF0Y2hHZW5lcmljRXZlbnQoIEV2ZW50SW1wbCAqZXZ0LCBpbnQgJi8qZXhj
ZXB0aW9uY29kZSAqLykKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7
Ci0gICAgYXNzZXJ0KGV2dC0+dGFyZ2V0KCkpOwotCi0gICAgZXZ0LT5yZWYoKTsKLQotICAgIC8v
ICMjIyBjaGVjayB0aGF0IHR5cGUgc3BlY2lmaWVkCi0KLSAgICAvLyB3b3JrIG91dCB3aGF0IG5v
ZGVzIHRvIHNlbmQgZXZlbnQgdG8KLSAgICBRUHRyTGlzdDxOb2RlSW1wbD4gbm9kZUNoYWluOwot
ICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IHRoaXM7IG47IG4gPSBuLT5wYXJlbnROb2Rl
KCkpIHsKLSAgICAgICAgbi0+cmVmKCk7Ci0gICAgICAgIG5vZGVDaGFpbi5wcmVwZW5kKG4pOwot
ICAgIH0KLQotICAgIAotICAgIFFQdHJMaXN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0KG5vZGVDaGFp
bik7Ci0gICAgCi0gICAgLy8gQmVmb3JlIHdlIGJlZ2luIGRpc3BhdGNoaW5nIGV2ZW50cywgZ2l2
ZSB0aGUgdGFyZ2V0IG5vZGUgYSBjaGFuY2UgdG8gZG8gc29tZSB3b3JrIHByaW9yCi0gICAgLy8g
dG8gdGhlIERPTSBldmVudCBoYW5kbGVycyBnZXR0aW5nIGEgY3JhY2suCi0gICAgdm9pZCogZGF0
YSA9IHByZURpc3BhdGNoRXZlbnRIYW5kbGVyKGV2dCk7Ci0KLSAgICAvLyB0cmlnZ2VyIGFueSBj
YXB0dXJpbmcgZXZlbnQgaGFuZGxlcnMgb24gb3VyIHdheSBkb3duCi0gICAgZXZ0LT5zZXRFdmVu
dFBoYXNlKEV2ZW50OjpDQVBUVVJJTkdfUEhBU0UpOwotICAgIGl0LnRvRmlyc3QoKTsKLSAgICBm
b3IgKDsgaXQuY3VycmVudCgpICYmIGl0LmN1cnJlbnQoKSAhPSB0aGlzICYmICFldnQtPnByb3Bh
Z2F0aW9uU3RvcHBlZCgpOyArK2l0KSB7Ci0gICAgICAgIGV2dC0+c2V0Q3VycmVudFRhcmdldChp
dC5jdXJyZW50KCkpOwotICAgICAgICBpdC5jdXJyZW50KCktPmhhbmRsZUxvY2FsRXZlbnRzKGV2
dCx0cnVlKTsKLSAgICB9Ci0KLSAgICAvLyBkaXNwYXRjaCB0byB0aGUgYWN0dWFsIHRhcmdldCBu
b2RlCi0gICAgaXQudG9MYXN0KCk7Ci0gICAgaWYgKCFldnQtPnByb3BhZ2F0aW9uU3RvcHBlZCgp
KSB7Ci0gICAgICAgIGV2dC0+c2V0RXZlbnRQaGFzZShFdmVudDo6QVRfVEFSR0VUKTsKLSAgICAg
ICAgZXZ0LT5zZXRDdXJyZW50VGFyZ2V0KGl0LmN1cnJlbnQoKSk7Ci0KLQlpZiAoIWV2dC0+cHJv
cGFnYXRpb25TdG9wcGVkKCkpCi0gICAgICAgICAgICBpdC5jdXJyZW50KCktPmhhbmRsZUxvY2Fs
RXZlbnRzKGV2dCxmYWxzZSk7Ci0gICAgfQotICAgIC0taXQ7Ci0KLSAgICAvLyBvaywgbm93IGJ1
YmJsZSB1cCBhZ2FpbiAob25seSBub24tY2FwdHVyaW5nIGV2ZW50IGhhbmRsZXJzIHdpbGwgYmUg
Y2FsbGVkKQotICAgIC8vICMjIyByZWNhbGN1bGF0ZSB0aGUgbm9kZSBjaGFpbiBoZXJlPyAoZS5n
LiBpZiB0YXJnZXQgbm9kZSBtb3ZlZCBpbiBkb2N1bWVudCBieSBwcmV2aW91cyBldmVudCBoYW5k
bGVycykKLSAgICAvLyBuby4gdGhlIERPTSBzcGVjcyBzYXlzOgotICAgIC8vIFRoZSBjaGFpbiBv
ZiBFdmVudFRhcmdldHMgZnJvbSB0aGUgZXZlbnQgdGFyZ2V0IHRvIHRoZSB0b3Agb2YgdGhlIHRy
ZWUKLSAgICAvLyBpcyBkZXRlcm1pbmVkIGJlZm9yZSB0aGUgaW5pdGlhbCBkaXNwYXRjaCBvZiB0
aGUgZXZlbnQuCi0gICAgLy8gSWYgbW9kaWZpY2F0aW9ucyBvY2N1ciB0byB0aGUgdHJlZSBkdXJp
bmcgZXZlbnQgcHJvY2Vzc2luZywKLSAgICAvLyBldmVudCBmbG93IHdpbGwgcHJvY2VlZCBiYXNl
ZCBvbiB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgdHJlZS4KLSAgICAvLwotICAgIC8vIHNpbmNl
IHRoZSBpbml0aWFsIGRpc3BhdGNoIGlzIGJlZm9yZSB0aGUgY2FwdHVyaW5nIHBoYXNlLAotICAg
IC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgbm9kZSBjaGFpbi4KLSAgICAv
LyAodG9iaWFzKQotCi0gICAgaWYgKGV2dC0+YnViYmxlcygpKSB7Ci0gICAgICAgIGV2dC0+c2V0
RXZlbnRQaGFzZShFdmVudDo6QlVCQkxJTkdfUEhBU0UpOwotICAgICAgICBmb3IgKDsgaXQuY3Vy
cmVudCgpICYmICFldnQtPnByb3BhZ2F0aW9uU3RvcHBlZCgpICYmICFldnQtPmdldENhbmNlbEJ1
YmJsZSgpOyAtLWl0KSB7Ci0gICAgICAgICAgICBldnQtPnNldEN1cnJlbnRUYXJnZXQoaXQuY3Vy
cmVudCgpKTsKLSAgICAgICAgICAgIGl0LmN1cnJlbnQoKS0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0
LGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGV2dC0+c2V0Q3VycmVudFRhcmdldCgw
KTsKLSAgICBldnQtPnNldEV2ZW50UGhhc2UoMCk7IC8vIEkgZ3Vlc3MgdGhpcyBpcyBjb3JyZWN0
LCB0aGUgc3BlYyBkb2VzIG5vdCBzZWVtIHRvIHNheQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gYW55dGhpbmcgYWJvdXQgdGhlIGRlZmF1bHQgZXZlbnQgaGFuZGxlciBwaGFzZS4KLQot
Ci0gICAgLy8gTm93IGNhbGwgdGhlIHBvc3QgZGlzcGF0Y2guCi0gICAgcG9zdERpc3BhdGNoRXZl
bnRIYW5kbGVyKGV2dCwgZGF0YSk7Ci0gICAgCi0gICAgaWYgKGV2dC0+YnViYmxlcygpKSB7Ci0J
Ly8gbm93IHdlIGNhbGwgYWxsIGRlZmF1bHQgZXZlbnQgaGFuZGxlcnMgKHRoaXMgaXMgbm90IHBh
cnQgb2YgRE9NIC0gaXQgaXMgaW50ZXJuYWwgdG8ga2h0bWwpCi0KLQlpdC50b0xhc3QoKTsKLQlm
b3IgKDsgaXQuY3VycmVudCgpICYmICFldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhZXZ0LT5k
ZWZhdWx0SGFuZGxlZCgpOyAtLWl0KQotCSAgICBpdC5jdXJyZW50KCktPmRlZmF1bHRFdmVudEhh
bmRsZXIoZXZ0KTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZGVyZWYgYWxsIG5vZGVzIGluIGNoYWlu
Ci0gICAgaXQudG9GaXJzdCgpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAg
ICAgIGl0LmN1cnJlbnQoKS0+ZGVyZWYoKTsgLy8gdGhpcyBtYXkgZGVsZXRlIHVzCi0KLSAgICBE
b2N1bWVudEltcGw6OnVwZGF0ZURvY3VtZW50c1JlbmRlcmluZygpOwotCi0gICAgYm9vbCBkZWZh
dWx0UHJldmVudGVkID0gZXZ0LT5kZWZhdWx0UHJldmVudGVkKCk7Ci0KLSAgICBldnQtPmRlcmVm
KCk7Ci0KLSAgICByZXR1cm4gIWRlZmF1bHRQcmV2ZW50ZWQ7IC8vICMjIyB3aGF0IGlmIGRlZmF1
bHRQcmV2ZW50ZWQgd2FzIGNhbGxlZCBiZWZvcmUgZGlzcGF0Y2hFdmVudD8KLX0KLQotYm9vbCBO
b2RlSW1wbDo6ZGlzcGF0Y2hIVE1MRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUs
IGJvb2wgY2FuQnViYmxlQXJnLCBib29sIGNhbmNlbGFibGVBcmcpCi17Ci0gICAgYXNzZXJ0KCFl
dmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAg
ICByZXR1cm4gZGlzcGF0Y2hFdmVudChuZXcgRXZlbnRJbXBsKGV2ZW50VHlwZSwgY2FuQnViYmxl
QXJnLCBjYW5jZWxhYmxlQXJnKSwgZXhjZXB0aW9uY29kZSwgdHJ1ZSk7Ci19Ci0KLWJvb2wgTm9k
ZUltcGw6OmRpc3BhdGNoV2luZG93RXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUs
IGJvb2wgY2FuQnViYmxlQXJnLCBib29sIGNhbmNlbGFibGVBcmcpCi17Ci0gICAgYXNzZXJ0KCFl
dmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLSAg
ICBSZWZQdHI8RXZlbnRJbXBsPiBldnQgPSBuZXcgRXZlbnRJbXBsKGV2ZW50VHlwZSwgY2FuQnVi
YmxlQXJnLCBjYW5jZWxhYmxlQXJnKTsKLSAgICBSZWZQdHI8RG9jdW1lbnRJbXBsPiBkb2MgPSBn
ZXREb2N1bWVudCgpOwotICAgIGV2dC0+c2V0VGFyZ2V0KGRvYy5nZXQoKSk7Ci0gICAgYm9vbCBy
ID0gZGlzcGF0Y2hHZW5lcmljRXZlbnQoZXZ0LmdldCgpLCBleGNlcHRpb25jb2RlKTsKLSAgICBp
ZiAoIWV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpICYmIGRvYykKLSAJZG9jLT5kZWZhdWx0RXZlbnRI
YW5kbGVyKGV2dC5nZXQoKSk7Ci0KLSAgICBpZiAoZXZlbnRUeXBlID09IGxvYWRFdmVudCAmJiAh
ZXZ0LT5wcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBkb2MpIHsKLSAgICAgICAgLy8gRm9yIG9ubG9h
ZCBldmVudHMsIHNlbmQgdGhlbSB0byB0aGUgZW5jbG9zaW5nIGZyYW1lIG9ubHkuCi0gICAgICAg
IC8vIFRoaXMgaXMgYSBET00gZXh0ZW5zaW9uIGFuZCBpcyBpbmRlcGVuZGVudCBvZiBidWJibGlu
Zy9jYXB0dXJpbmcgcnVsZXMgb2YKLSAgICAgICAgLy8gdGhlIERPTS4gIFlvdSBzZW5kIHRoZSBl
dmVudCBvbmx5IHRvIHRoZSBlbmNsb3NpbmcgZnJhbWUuICBJdCBkb2VzIG5vdAotICAgICAgICAv
LyBidWJibGUgdGhyb3VnaCB0aGUgcGFyZW50IGRvY3VtZW50LgotICAgICAgICBFbGVtZW50SW1w
bCogZWx0ID0gZG9jLT5vd25lckVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsdCAmJiAoZWx0LT5n
ZXREb2N1bWVudCgpLT5kb21haW4oKS5pc051bGwoKSB8fAotICAgICAgICAgICAgICAgICAgICBl
bHQtPmdldERvY3VtZW50KCktPmRvbWFpbigpID09IGRvYy0+ZG9tYWluKCkpKSB7Ci0gICAgICAg
ICAgICAvLyBXZSBhbHNvIGRvIGEgc2VjdXJpdHkgY2hlY2ssIHNpbmNlIHdlIGRvbid0IHdhbnQg
dG8gYWxsb3cgdGhlIGVuY2xvc2luZwotICAgICAgICAgICAgLy8gaWZyYW1lIHRvIHNlZSBsb2Fk
cyBvZiBjaGlsZCBkb2N1bWVudHMgaW4gb3RoZXIgZG9tYWlucy4KLSAgICAgICAgICAgIGV2dC0+
c2V0Q3VycmVudFRhcmdldChlbHQpOwotCi0gICAgICAgICAgICAvLyBDYXB0dXJpbmcgZmlyc3Qu
Ci0gICAgICAgICAgICBlbHQtPmhhbmRsZUxvY2FsRXZlbnRzKGV2dC5nZXQoKSwgdHJ1ZSk7Ci0K
LSAgICAgICAgICAgIC8vIEJ1YmJsaW5nIHNlY29uZC4KLSAgICAgICAgICAgIGlmICghZXZ0LT5w
cm9wYWdhdGlvblN0b3BwZWQoKSkKLSAgICAgICAgICAgICAgICBlbHQtPmhhbmRsZUxvY2FsRXZl
bnRzKGV2dC5nZXQoKSwgZmFsc2UpOwotICAgICAgICAgICAgciA9ICFldnQtPmRlZmF1bHRQcmV2
ZW50ZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByOwotfQotCi1ib29sIE5v
ZGVJbXBsOjpkaXNwYXRjaE1vdXNlRXZlbnQoUU1vdXNlRXZlbnQgKl9tb3VzZSwgY29uc3QgQXRv
bWljU3RyaW5nICZvdmVycmlkZVR5cGUsIGludCBvdmVycmlkZURldGFpbCkKLXsKLSAgICBhc3Nl
cnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaW50IGRldGFpbCA9IG92ZXJyaWRl
RGV0YWlsOyAvLyBkZWZhdWx0cyB0byAwCi0gICAgQXRvbWljU3RyaW5nIGV2ZW50VHlwZTsKLSAg
ICBpZiAoIW92ZXJyaWRlVHlwZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZXZlbnRUeXBlID0gb3Zl
cnJpZGVUeXBlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoX21vdXNlLT50eXBlKCkp
IHsKLSAgICAgICAgICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvblByZXNzOgotICAgICAgICAg
ICAgICAgIGV2ZW50VHlwZSA9IG1vdXNlZG93bkV2ZW50OwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZToKLSAgICAgICAg
ICAgICAgICBldmVudFR5cGUgPSBtb3VzZXVwRXZlbnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25EYmxDbGljazoKLSAgICAgICAg
ICAgICAgICBldmVudFR5cGUgPSBjbGlja0V2ZW50OwotICAgICAgICAgICAgICAgIGRldGFpbCA9
IF9tb3VzZS0+Y2xpY2tDb3VudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgY2FzZSBRRXZlbnQ6Ok1vdXNlTW92ZToKLSAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBt
b3VzZW1vdmVFdmVudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQg
Y2xpZW50WCA9IDA7Ci0gICAgaW50IGNsaWVudFkgPSAwOwotICAgIGlmIChLSFRNTFZpZXcgKnZp
ZXcgPSBnZXREb2N1bWVudCgpLT52aWV3KCkpCi0gICAgICAgIHZpZXctPnZpZXdwb3J0VG9Db250
ZW50cyhfbW91c2UtPngoKSwgX21vdXNlLT55KCksIGNsaWVudFgsIGNsaWVudFkpOwotICAgIGlu
dCBzY3JlZW5YID0gX21vdXNlLT5nbG9iYWxYKCk7Ci0gICAgaW50IHNjcmVlblkgPSBfbW91c2Ut
Pmdsb2JhbFkoKTsKLQotICAgIGludCBidXR0b24gPSAtMTsKLSAgICBzd2l0Y2ggKF9tb3VzZS0+
YnV0dG9uKCkpIHsKLSAgICAgICAgY2FzZSBRdDo6TGVmdEJ1dHRvbjoKLSAgICAgICAgICAgIGJ1
dHRvbiA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRdDo6TWlkQnV0dG9u
OgotICAgICAgICAgICAgYnV0dG9uID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFF0OjpSaWdodEJ1dHRvbjoKLSAgICAgICAgICAgIGJ1dHRvbiA9IDI7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQot
ICAgIGJvb2wgY3RybEtleSA9IChfbW91c2UtPnN0YXRlKCkgJiBRdDo6Q29udHJvbEJ1dHRvbik7
Ci0gICAgYm9vbCBhbHRLZXkgPSAoX21vdXNlLT5zdGF0ZSgpICYgUXQ6OkFsdEJ1dHRvbik7Ci0g
ICAgYm9vbCBzaGlmdEtleSA9IChfbW91c2UtPnN0YXRlKCkgJiBRdDo6U2hpZnRCdXR0b24pOwot
ICAgIGJvb2wgbWV0YUtleSA9IChfbW91c2UtPnN0YXRlKCkgJiBRdDo6TWV0YUJ1dHRvbik7Ci0g
ICAgCi0gICAgcmV0dXJuIGRpc3BhdGNoTW91c2VFdmVudChldmVudFR5cGUsIGJ1dHRvbiwgZGV0
YWlsLAotICAgICAgICBjbGllbnRYLCBjbGllbnRZLCBzY3JlZW5YLCBzY3JlZW5ZLAotICAgICAg
ICBjdHJsS2V5LCBhbHRLZXksIHNoaWZ0S2V5LCBtZXRhS2V5KTsKLX0KLQotYm9vbCBOb2RlSW1w
bDo6ZGlzcGF0Y2hTaW11bGF0ZWRNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRU
eXBlKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICAvLyBM
aWtlIEdlY2tvLCB3ZSBqdXN0IHBhc3MgMCBmb3IgZXZlcnl0aGluZyB3aGVuIHdlIG1ha2UgYSBm
YWtlIG1vdXNlIGV2ZW50LgotICAgIC8vIEludGVybmV0IEV4cGxvcmVyIGluc3RlYWQgZ2l2ZXMg
dGhlIGN1cnJlbnQgbW91c2UgcG9zaXRpb24gYW5kIHN0YXRlLgotICAgIHJldHVybiBkaXNwYXRj
aE1vdXNlRXZlbnQoZXZlbnRUeXBlLCAwLCAwLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZh
bHNlLCBmYWxzZSk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoTW91c2VFdmVudChjb25z
dCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgaW50IGJ1dHRvbiwgaW50IGRldGFpbCwKLSAgICBp
bnQgY2xpZW50WCwgaW50IGNsaWVudFksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwKLSAgICBi
b29sIGN0cmxLZXksIGJvb2wgYWx0S2V5LCBib29sIHNoaWZ0S2V5LCBib29sIG1ldGFLZXkpCi17
Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGlmIChkaXNhYmxl
ZCgpKSAvLyBEb24ndCBldmVuIHNlbmQgRE9NIGV2ZW50cyBmb3IgZGlzYWJsZWQgY29udHJvbHMu
LgotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChldmVudFR5cGUuaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFNob3VsZG4ndCBoYXBwZW4uCi0KLSAgICAvLyBEaXNw
YXRjaGluZyB0aGUgZmlyc3QgZXZlbnQgY2FuIGVhc2lseSByZXN1bHQgaW4gdGhpcyBub2RlIGJl
aW5nIGRlc3Ryb3llZC4KLSAgICAvLyBTaW5jZSB3ZSBkaXNwYXRjaCB1cCB0byB0aHJlZSBldmVu
dHMgaGVyZSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UncmUgcmVmZXJlbmNlZAotICAgIC8vIHNv
IHRoZSBwb2ludGVyIHdpbGwgYmUgZ29vZCBmb3IgdGhlIHR3byBzdWJzZXF1ZW50IG9uZXMuCi0g
ICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0KHRoaXMpOwotCi0gICAgYm9vbCBjYW5jZWxhYmxl
ID0gZXZlbnRUeXBlICE9IG1vdXNlbW92ZUV2ZW50OwotICAgIAotICAgIGludCBleGNlcHRpb25j
b2RlID0gMDsKLQotICAgIGJvb2wgc3dhbGxvd0V2ZW50ID0gZmFsc2U7Ci0KLSAgICBFdmVudElt
cGwgKm1lID0gbmV3IE1vdXNlRXZlbnRJbXBsKGV2ZW50VHlwZSx0cnVlLGNhbmNlbGFibGUsZ2V0
RG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwKLSAgICAgICAgICAgICAgICAgICBkZXRhaWwsc2Ny
ZWVuWCxzY3JlZW5ZLGNsaWVudFgsY2xpZW50WSxjdHJsS2V5LGFsdEtleSxzaGlmdEtleSxtZXRh
S2V5LAotICAgICAgICAgICAgICAgICAgIGJ1dHRvbiwwKTsKLSAgICBtZS0+cmVmKCk7Ci0gICAg
ZGlzcGF0Y2hFdmVudChtZSwgZXhjZXB0aW9uY29kZSwgdHJ1ZSk7Ci0gICAgYm9vbCBkZWZhdWx0
SGFuZGxlZCA9IG1lLT5kZWZhdWx0SGFuZGxlZCgpOwotICAgIGJvb2wgZGVmYXVsdFByZXZlbnRl
ZCA9IG1lLT5kZWZhdWx0UHJldmVudGVkKCk7Ci0gICAgaWYgKGRlZmF1bHRIYW5kbGVkIHx8IGRl
ZmF1bHRQcmV2ZW50ZWQpCi0gICAgICAgIHN3YWxsb3dFdmVudCA9IHRydWU7Ci0gICAgbWUtPmRl
cmVmKCk7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2U6IElmIGl0J3MgYSBkb3VibGUgY2xpY2sgZXZl
bnQsIHdlIGFsc28gc2VuZCB0aGUgS0hUTUxfREJMQ0xJQ0sgZXZlbnQuIFRoaXMgaXMgbm90IHBh
cnQKLSAgICAvLyBvZiB0aGUgRE9NIHNwZWNzLCBidXQgaXMgdXNlZCBmb3IgY29tcGF0aWJpbGl0
eSB3aXRoIHRoZSBvbmRibGNsaWNrPSIiIGF0dHJpYnV0ZS4gIFRoaXMgaXMgdHJlYXRlZAotICAg
IC8vIGFzIGEgc2VwYXJhdGUgZXZlbnQgaW4gb3RoZXIgRE9NLWNvbXBsaWFudCBicm93c2VycyBs
aWtlIEZpcmVmb3gsIGFuZCBzbyB3ZSBkbyB0aGUgc2FtZS4KLSAgICBpZiAoZXZlbnRUeXBlID09
IGNsaWNrRXZlbnQgJiYgZGV0YWlsID09IDIpIHsKLSAgICAgICAgbWUgPSBuZXcgTW91c2VFdmVu
dEltcGwoa2h0bWxEYmxjbGlja0V2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0cnVlLGNhbmNlbGFibGUsZ2V0RG9jdW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLHNjcmVlblgsc2NyZWVuWSxjbGllbnRYLGNs
aWVudFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxLZXksYWx0S2V5LHNo
aWZ0S2V5LG1ldGFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiww
KTsKLSAgICAgICAgbWUtPnJlZigpOwotICAgICAgICBpZiAoZGVmYXVsdEhhbmRsZWQpCi0gICAg
ICAgICAgICBtZS0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgZGlzcGF0Y2hFdmVudCht
ZSxleGNlcHRpb25jb2RlLHRydWUpOwotICAgICAgICBpZiAobWUtPmRlZmF1bHRIYW5kbGVkKCkg
fHwgbWUtPmRlZmF1bHRQcmV2ZW50ZWQoKSkKLSAgICAgICAgICAgIHN3YWxsb3dFdmVudCA9IHRy
dWU7Ci0gICAgICAgIG1lLT5kZXJlZigpOwotICAgIH0KLQotICAgIC8vIEFsc28gc2VuZCBhIERP
TUFjdGl2YXRlIGV2ZW50LCB3aGljaCBjYXVzZXMgdGhpbmdzIGxpa2UgZm9ybSBzdWJtaXNzaW9u
cyB0byBvY2N1ci4KLSAgICBpZiAoZXZlbnRUeXBlID09IGNsaWNrRXZlbnQgJiYgIWRlZmF1bHRQ
cmV2ZW50ZWQpCi0gICAgICAgIGRpc3BhdGNoVUlFdmVudChET01BY3RpdmF0ZUV2ZW50LCBkZXRh
aWwpOwotCi0gICAgcmV0dXJuIHN3YWxsb3dFdmVudDsKLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlz
cGF0Y2hVSUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBpbnQgZGV0YWlsKQot
ewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBhc3NlcnQgKCEo
IChldmVudFR5cGUgIT0gRE9NRm9jdXNJbkV2ZW50ICYmCi0gICAgICAgICAgICAgICAgZXZlbnRU
eXBlICE9IERPTUZvY3VzT3V0RXZlbnQgJiYKLSAgICAgICAgICAgICAgICBldmVudFR5cGUgIT0g
RE9NQWN0aXZhdGVFdmVudCkpKTsKLQotICAgIGlmICghZ2V0RG9jdW1lbnQoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBjYW5jZWxhYmxlID0gZmFsc2U7Ci0gICAgaWYgKGV2
ZW50VHlwZSA9PSBET01BY3RpdmF0ZUV2ZW50KQotICAgICAgICBjYW5jZWxhYmxlID0gdHJ1ZTsK
LQotICAgIGludCBleGNlcHRpb25jb2RlID0gMDsKLQotICAgIFVJRXZlbnRJbXBsICpldnQgPSBu
ZXcgVUlFdmVudEltcGwoZXZlbnRUeXBlLCB0cnVlLCBjYW5jZWxhYmxlLCBnZXREb2N1bWVudCgp
LT5kZWZhdWx0VmlldygpLCBkZXRhaWwpOwotICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KGV2dCxl
eGNlcHRpb25jb2RlLHRydWUpOwotfQotCi12b2lkIE5vZGVJbXBsOjpyZWdpc3Rlck5vZGVMaXN0
KE5vZGVMaXN0SW1wbCAqbGlzdCkKLXsKLSAgICBpZiAoIW1fbm9kZUxpc3RzKSB7Ci0gICAgICAg
IG1fbm9kZUxpc3RzID0gbmV3IFFQdHJEaWN0PE5vZGVMaXN0SW1wbD47Ci0gICAgfQotCi0gICAg
bV9ub2RlTGlzdHMtPmluc2VydChsaXN0LCBsaXN0KTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6dW5y
ZWdpc3Rlck5vZGVMaXN0KE5vZGVMaXN0SW1wbCAqbGlzdCkKLXsKLSAgICBpZiAoIW1fbm9kZUxp
c3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX25vZGVMaXN0cy0+cmVtb3ZlKGxpc3QpOwot
fQotCi12b2lkIE5vZGVJbXBsOjpub3RpZnlMb2NhbE5vZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQo
KQotewotICAgIGlmICghbV9ub2RlTGlzdHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFQdHJE
aWN0SXRlcmF0b3I8Tm9kZUxpc3RJbXBsPiBpKCptX25vZGVMaXN0cyk7Ci0KLSAgICB3aGlsZSAo
Tm9kZUxpc3RJbXBsICpsaXN0ID0gaS5jdXJyZW50KCkpIHsKLSAgICAgICAgbGlzdC0+cm9vdE5v
ZGVBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0gICAgICAgICsraTsKLSAgICB9Ci19Ci0KLXZvaWQgTm9k
ZUltcGw6Om5vdGlmeU5vZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQoKQotewotICAgIGZvciAoTm9k
ZUltcGwgKm4gPSB0aGlzOyBuOyBuID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIG4tPm5v
dGlmeUxvY2FsTm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpOwotICAgIH0KLX0KLQotdm9pZCBO
b2RlSW1wbDo6bm90aWZ5TG9jYWxOb2RlTGlzdHNDaGlsZHJlbkNoYW5nZWQoKQotewotICAgIGlm
ICghbV9ub2RlTGlzdHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFQdHJEaWN0SXRlcmF0b3I8
Tm9kZUxpc3RJbXBsPiBpKCptX25vZGVMaXN0cyk7Ci0KLSAgICB3aGlsZSAoTm9kZUxpc3RJbXBs
ICpsaXN0ID0gaS5jdXJyZW50KCkpIHsKLSAgICAgICAgbGlzdC0+cm9vdE5vZGVDaGlsZHJlbkNo
YW5nZWQoKTsKLSAgICAgICAgKytpOwotICAgIH0KLX0KLQotdm9pZCBOb2RlSW1wbDo6bm90aWZ5
Tm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBmb3IgKE5vZGVJbXBsICpuID0gdGhp
czsgbjsgbiA9IG4tPnBhcmVudE5vZGUoKSkgewotICAgICAgICBuLT5ub3RpZnlMb2NhbE5vZGVM
aXN0c0NoaWxkcmVuQ2hhbmdlZCgpOwotICAgIH0KLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0
Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudChib29sIHNlbmRDaGlsZHJlbkNoYW5nZWQpCi17Ci0gICAg
YXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotCi0gICAgLy8gRklYTUU6IFB1bGwg
dGhpcyB3aG9sZSBpZiBjbGF1c2Ugb3V0IG9mIHRoaXMgZnVuY3Rpb24uCi0gICAgaWYgKHNlbmRD
aGlsZHJlbkNoYW5nZWQpIHsKLSAgICAgICAgbm90aWZ5Tm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2Vk
KCk7Ci0gICAgICAgIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIH0gZWxzZQotICAgICAgICBub3Rp
ZnlOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCk7IC8vIEZJWE1FOiBDYW4gZG8gYmV0dGVyIHNv
bWUgZGF5LiBSZWFsbHkgb25seSBjYXJlIGFib3V0IHRoZSBuYW1lIGF0dHJpYnV0ZSBjaGFuZ2lu
Zy4KLQotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50SW1w
bDo6RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaW50
IGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlv
bkV2ZW50SW1wbChET01TdWJ0cmVlTW9kaWZpZWRFdmVudCwKLQkJCSB0cnVlLGZhbHNlLDAsRE9N
U3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9uY29kZSx0cnVlKTsK
LX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0Y2hLZXlFdmVudChRS2V5RXZlbnQgKmtleSkKLXsK
LSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaW50IGV4Y2VwdGlv
bmNvZGUgPSAwOwotICAgIC8va2REZWJ1Zyg2MDEwKSA8PCAiRE9NOjpOb2RlSW1wbDogZGlzcGF0
Y2hpbmcga2V5Ym9hcmQgZXZlbnQiIDw8IGVuZGw7Ci0gICAgS2V5Ym9hcmRFdmVudEltcGwgKmtl
eWJvYXJkRXZlbnRJbXBsID0gbmV3IEtleWJvYXJkRXZlbnRJbXBsKGtleSwgZ2V0RG9jdW1lbnQo
KS0+ZGVmYXVsdFZpZXcoKSk7Ci0gICAga2V5Ym9hcmRFdmVudEltcGwtPnJlZigpOwotICAgIGJv
b2wgciA9IGRpc3BhdGNoRXZlbnQoa2V5Ym9hcmRFdmVudEltcGwsZXhjZXB0aW9uY29kZSx0cnVl
KTsKLQotICAgIC8vIHdlIHdhbnQgdG8gcmV0dXJuIGZhbHNlIGlmIGRlZmF1bHQgaXMgcHJldmVu
dGVkIChhbHJlYWR5IHRha2VuIGNhcmUgb2YpCi0gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaXMg
ZGVmYXVsdC1oYW5kbGVkIGJ5IHRoZSBET00uIE90aGVyd2lzZSB3ZSBsZXQgaXQganVzdAotICAg
IC8vIGxldCBpdCBnZXQgaGFuZGxlZCBieSBBcHBLaXQgCi0gICAgaWYgKGtleWJvYXJkRXZlbnRJ
bXBsLT5kZWZhdWx0SGFuZGxlZCgpKQotICAgICAgciA9IGZhbHNlOwotCi0gICAga2V5Ym9hcmRF
dmVudEltcGwtPmRlcmVmKCk7Ci0gICAgcmV0dXJuIHI7Ci0KLX0KLQotdm9pZCBOb2RlSW1wbDo6
ZGlzcGF0Y2hXaGVlbEV2ZW50KFFXaGVlbEV2ZW50ICplKQotewotICAgIGFzc2VydCghZXZlbnRE
aXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpZiAoZS0+ZGVsdGEoKSA9PSAwKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYg
KCFkb2MpCi0gICAgICAgIHJldHVybjsKLQotICAgIEtIVE1MVmlldyAqdmlldyA9IGdldERvY3Vt
ZW50KCktPnZpZXcoKTsKLSAgICBpZiAoIXZpZXcpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlu
dCB4OwotICAgIGludCB5OwotICAgIHZpZXctPnZpZXdwb3J0VG9Db250ZW50cyhlLT54KCksIGUt
PnkoKSwgeCwgeSk7Ci0KLSAgICBpbnQgc3RhdGUgPSBlLT5zdGF0ZSgpOwotCi0gICAgV2hlZWxF
dmVudEltcGwgKndlID0gbmV3IFdoZWVsRXZlbnRJbXBsKGUtPm9yaWVudGF0aW9uKCkgPT0gUXQ6
Okhvcml6b250YWwsIGUtPmRlbHRhKCksCi0gICAgICAgIGdldERvY3VtZW50KCktPmRlZmF1bHRW
aWV3KCksIGUtPmdsb2JhbFgoKSwgZS0+Z2xvYmFsWSgpLCB4LCB5LAotICAgICAgICBzdGF0ZSAm
IFF0OjpDb250cm9sQnV0dG9uLCBzdGF0ZSAmIFF0OjpBbHRCdXR0b24sIHN0YXRlICYgUXQ6OlNo
aWZ0QnV0dG9uLCBzdGF0ZSAmIFF0OjpNZXRhQnV0dG9uKTsKLQotICAgIGludCBleGNlcHRpb25D
b2RlID0gMDsKLSAgICBpZiAoIWRpc3BhdGNoRXZlbnQod2UsIGV4Y2VwdGlvbkNvZGUsIHRydWUp
KQotICAgICAgICBlLT5hY2NlcHQoKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6aGFuZGxlTG9jYWxF
dmVudHMoRXZlbnRJbXBsICpldnQsIGJvb2wgdXNlQ2FwdHVyZSkKLXsKLSAgICBpZiAoIW1fcmVn
ZExpc3RlbmVycykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGRpc2FibGVkKCkgJiYgZXZ0
LT5pc01vdXNlRXZlbnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVB0ckxpc3Q8UmVnaXN0
ZXJlZEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyc0NvcHkgPSAqbV9yZWdkTGlzdGVuZXJzOwotICAg
IFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGl0KGxpc3RlbmVyc0Nv
cHkpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIGlmIChpdC5jdXJy
ZW50KCktPmV2ZW50VHlwZSgpID09IGV2dC0+dHlwZSgpICYmIGl0LmN1cnJlbnQoKS0+dXNlQ2Fw
dHVyZSgpID09IHVzZUNhcHR1cmUpCi0gICAgICAgICAgICBpdC5jdXJyZW50KCktPmxpc3RlbmVy
KCktPmhhbmRsZUV2ZW50SW1wbChldnQsIGZhbHNlKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6ZGVm
YXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCkKLXsKLX0KLQotdW5zaWduZWQgTm9kZUlt
cGw6OmNoaWxkTm9kZUNvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUlt
cGwgKk5vZGVJbXBsOjpjaGlsZE5vZGUodW5zaWduZWQgLyppbmRleCovKQotewotICAgIHJldHVy
biAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnRyYXZlcnNlTmV4dE5vZGUoY29uc3QgTm9k
ZUltcGwgKnN0YXlXaXRoaW4pIGNvbnN0Ci17Ci0gICAgaWYgKGZpcnN0Q2hpbGQoKSkgewotICAg
ICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgZmlyc3RDaGlsZCgpLT5pc0FuY2VzdG9yKHN0YXlX
aXRoaW4pKTsKLQlyZXR1cm4gZmlyc3RDaGlsZCgpOwotICAgIH0KLSAgICBpZiAodGhpcyA9PSBz
dGF5V2l0aGluKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAobmV4dFNpYmxpbmcoKSkgewot
ICAgICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgbmV4dFNpYmxpbmcoKS0+aXNBbmNlc3Rvcihz
dGF5V2l0aGluKSk7Ci0JcmV0dXJuIG5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIGNvbnN0IE5v
ZGVJbXBsICpuID0gdGhpczsKLSAgICB3aGlsZSAobiAmJiAhbi0+bmV4dFNpYmxpbmcoKSAmJiAo
IXN0YXlXaXRoaW4gfHwgbi0+cGFyZW50Tm9kZSgpICE9IHN0YXlXaXRoaW4pKQotICAgICAgICBu
ID0gbi0+cGFyZW50Tm9kZSgpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdp
dGhpbiB8fCAhbi0+bmV4dFNpYmxpbmcoKSB8fCBuLT5uZXh0U2libGluZygpLT5pc0FuY2VzdG9y
KHN0YXlXaXRoaW4pKTsKLSAgICAgICAgcmV0dXJuIG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgfQot
ICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnRyYXZlcnNlTmV4dFNpYmxp
bmcoY29uc3QgTm9kZUltcGwgKnN0YXlXaXRoaW4pIGNvbnN0Ci17Ci0gICAgaWYgKHRoaXMgPT0g
c3RheVdpdGhpbikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG5leHRTaWJsaW5nKCkpIHsK
LSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8IG5leHRTaWJsaW5nKCktPmlzQW5jZXN0b3Io
c3RheVdpdGhpbikpOwotCXJldHVybiBuZXh0U2libGluZygpOwotICAgIH0KLSAgICBjb25zdCBO
b2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgd2hpbGUgKG4gJiYgIW4tPm5leHRTaWJsaW5nKCkgJiYg
KCFzdGF5V2l0aGluIHx8IG4tPnBhcmVudE5vZGUoKSAhPSBzdGF5V2l0aGluKSkKLSAgICAgICAg
biA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICBpZiAobikgewotICAgICAgICBhc3NlcnQoIXN0YXlX
aXRoaW4gfHwgIW4tPm5leHRTaWJsaW5nKCkgfHwgbi0+bmV4dFNpYmxpbmcoKS0+aXNBbmNlc3Rv
cihzdGF5V2l0aGluKSk7Ci0gICAgICAgIHJldHVybiBuLT5uZXh0U2libGluZygpOwotICAgIH0K
LSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjp0cmF2ZXJzZVByZXZpb3Vz
Tm9kZSgpIGNvbnN0Ci17Ci0gICAgaWYgKHByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgIE5v
ZGVJbXBsICpuID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIHdoaWxlIChuLT5sYXN0Q2hp
bGQoKSkKLSAgICAgICAgICAgIG4gPSBuLT5sYXN0Q2hpbGQoKTsKLSAgICAgICAgcmV0dXJuIG47
Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudE5vZGUoKSkgewotICAgICAgICByZXR1cm4gcGFy
ZW50Tm9kZSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
fQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnRyYXZlcnNlUHJldmlvdXNOb2RlUG9zdE9yZGVyKGNv
bnN0IE5vZGVJbXBsICpzdGF5V2l0aGluKSBjb25zdAotewotICAgIGlmIChsYXN0Q2hpbGQoKSkg
ewotICAgICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgbGFzdENoaWxkKCktPmlzQW5jZXN0b3Io
c3RheVdpdGhpbikpOwotCXJldHVybiBsYXN0Q2hpbGQoKTsKLSAgICB9Ci0gICAgaWYgKHRoaXMg
PT0gc3RheVdpdGhpbikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHByZXZpb3VzU2libGlu
ZygpKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCBwcmV2aW91c1NpYmxpbmcoKS0+
aXNBbmNlc3RvcihzdGF5V2l0aGluKSk7Ci0JcmV0dXJuIHByZXZpb3VzU2libGluZygpOwotICAg
IH0KLSAgICBjb25zdCBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgd2hpbGUgKG4gJiYgIW4tPnBy
ZXZpb3VzU2libGluZygpICYmICghc3RheVdpdGhpbiB8fCBuLT5wYXJlbnROb2RlKCkgIT0gc3Rh
eVdpdGhpbikpCi0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKG4pIHsKLSAg
ICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8ICFuLT5wcmV2aW91c1NpYmxpbmcoKSB8fCBuLT5w
cmV2aW91c1NpYmxpbmcoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGluKSk7Ci0gICAgICAgIHJldHVy
biBuLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OmNoZWNrU2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgaW50
ICZleGNlcHRpb25jb2RlKQotewotICAgIC8vIFBlcmZvcm0gZXJyb3IgY2hlY2tpbmcgYXMgcmVx
dWlyZWQgYnkgc3BlYyBmb3Igc2V0dGluZyBOb2RlLnByZWZpeC4gVXNlZCBieQotICAgIC8vIEVs
ZW1lbnRJbXBsOjpzZXRQcmVmaXgoKSBhbmQgQXR0ckltcGw6OnNldFByZWZpeCgpCi0KLSAgICAv
LyBGSVhNRTogSW1wbGVtZW50IHN1cHBvcnQgZm9yIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFp
c2VkIGlmIHRoZSBzcGVjaWZpZWQgcHJlZml4IGNvbnRhaW5zIGFuIGlsbGVnYWwgY2hhcmFjdGVy
LgotICAgIAotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRo
aXMgbm9kZSBpcyByZWFkb25seS4KLSAgICBpZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGV4
Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgTkFNRVNQ
QUNFX0VSUjogLSBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBwcmVmaXggaXMgbWFsZm9ybWVkCi0g
ICAgLy8gV2UgaGF2ZSB0byBjb21tZW50IHRoaXMgb3V0LCBzaW5jZSBpdCdzIHVzZWQgZm9yIGF0
dHJpYnV0ZXMgYW5kIHRhZyBuYW1lcywgYW5kIHdlJ3ZlIG9ubHkKLSAgICAvLyBzd2l0Y2hlZCBv
bmUgb3Zlci4KLSAgICAvKgotICAgIC8vIC0gaWYgdGhlIG5hbWVzcGFjZVVSSSBvZiB0aGlzIG5v
ZGUgaXMgbnVsbCwKLSAgICAvLyAtIGlmIHRoZSBzcGVjaWZpZWQgcHJlZml4IGlzICJ4bWwiIGFu
ZCB0aGUgbmFtZXNwYWNlVVJJIG9mIHRoaXMgbm9kZSBpcyBkaWZmZXJlbnQgZnJvbQotICAgIC8v
ICAgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCi0gICAgLy8gLSBpZiB0
aGlzIG5vZGUgaXMgYW4gYXR0cmlidXRlIGFuZCB0aGUgc3BlY2lmaWVkIHByZWZpeCBpcyAieG1s
bnMiIGFuZAotICAgIC8vICAgdGhlIG5hbWVzcGFjZVVSSSBvZiB0aGlzIG5vZGUgaXMgZGlmZmVy
ZW50IGZyb20gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwKLSAgICAvLyAtIG9yIGlm
IHRoaXMgbm9kZSBpcyBhbiBhdHRyaWJ1dGUgYW5kIHRoZSBxdWFsaWZpZWROYW1lIG9mIHRoaXMg
bm9kZSBpcyAieG1sbnMiIFtOYW1lc3BhY2VzXS4KLSAgICBpZiAoKG5hbWVzcGFjZVBhcnQoaWQo
KSkgPT0gbm9OYW1lc3BhY2UgJiYgaWQoKSA+IElEX0xBU1RfVEFHKSB8fAotICAgICAgICAoX3By
ZWZpeCA9PSAieG1sIiAmJiBET01TdHJpbmcoZ2V0RG9jdW1lbnQoKS0+bmFtZXNwYWNlVVJJKGlk
KCkpKSAhPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIikpIHsKLSAgICAg
ICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNFX0VSUjsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0qLwotfQotCi12b2lkIE5vZGVJbXBsOjpjaGVja0FkZENoaWxkKE5vZGVJ
bXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIC8vIFBlcmZvcm0gZXJy
b3IgY2hlY2tpbmcgYXMgcmVxdWlyZWQgYnkgc3BlYyBmb3IgYWRkaW5nIGEgbmV3IGNoaWxkLiBV
c2VkIGJ5Ci0gICAgLy8gYXBwZW5kQ2hpbGQoKSwgcmVwbGFjZUNoaWxkKCkgYW5kIGluc2VydEJl
Zm9yZSgpCi0KLSAgICAvLyBOb3QgbWVudGlvbmVkIGluIHNwZWM6IHRocm93IE5PVF9GT1VORF9F
UlIgaWYgbmV3Q2hpbGQgaXMgbnVsbAotICAgIGlmICghbmV3Q2hpbGQpIHsKLSAgICAgICAgZXhj
ZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlm
IHRoaXMgbm9kZSBpcyByZWFkb25seQotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAg
ZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJS
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBzaG91bGRBZG9wdENoaWxkID0g
ZmFsc2U7Ci0KLSAgICAvLyBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiBuZXdDaGlsZCB3
YXMgY3JlYXRlZCBmcm9tIGEgZGlmZmVyZW50IGRvY3VtZW50IHRoYW4gdGhlIG9uZSB0aGF0Ci0g
ICAgLy8gY3JlYXRlZCB0aGlzIG5vZGUuCi0gICAgLy8gV2UgYXNzdW1lIHRoYXQgaWYgbmV3Q2hp
bGQgaXMgYSBEb2N1bWVudEZyYWdtZW50LCBhbGwgY2hpbGRyZW4gYXJlIGNyZWF0ZWQgZnJvbSB0
aGUgc2FtZSBkb2N1bWVudAotICAgIC8vIGFzIHRoZSBmcmFnbWVudCBpdHNlbGYgKG90aGVyd2lz
ZSB0aGV5IGNvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQgYXMgY2hpbGRyZW4pCi0gICAgaWYgKG5l
d0NoaWxkLT5nZXREb2N1bWVudCgpICE9IGdldERvY3VtZW50KCkpIHsKLQkvLyBidXQgaWYgdGhl
IGNoaWxkIGlzIG5vdCBpbiBhIGRvY3VtZW50IHlldCB0aGVuIGxvb3NlbiB0aGUKLQkvLyByZXN0
cmljdGlvbiwgc28gdGhhdCBlLmcuIGNyZWF0aW5nIGFuIGVsZW1lbnQgd2l0aCB0aGUgT3B0aW9u
KCkKLQkvLyBjb25zdHJ1Y3RvciBhbmQgdGhlbiBhZGRpbmcgaXQgdG8gYSBkaWZmZXJlbnQgZG9j
dW1lbnQgd29ya3MsCi0JLy8gYXMgaXQgZG9lcyBpbiBNb3ppbGxhIGFuZCBNYWMgSUUuCi0JaWYg
KCFuZXdDaGlsZC0+aW5Eb2N1bWVudCgpKSB7Ci0JICAgIHNob3VsZEFkb3B0Q2hpbGQgPSB0cnVl
OwotCX0gZWxzZSB7Ci0JICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OldST05HX0RP
Q1VNRU5UX0VSUjsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICAvLyBISUVSQVJDSFlf
UkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBu
b3QgYWxsb3cgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgdGhlCi0gICAgLy8gbmV3Q2hpbGQgbm9k
ZSwgb3IgaWYgdGhlIG5vZGUgdG8gYXBwZW5kIGlzIG9uZSBvZiB0aGlzIG5vZGUncyBhbmNlc3Rv
cnMuCi0KLSAgICAvLyBjaGVjayBmb3IgYW5jZXN0b3Ivc2FtZSBub2RlCi0gICAgaWYgKG5ld0No
aWxkID09IHRoaXMgfHwgaXNBbmNlc3RvcihuZXdDaGlsZCkpIHsKLSAgICAgICAgZXhjZXB0aW9u
Y29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIAotICAgIGlmIChuZXdDaGlsZC0+bm9kZVR5cGUoKSAhPSBOb2RlOjpE
T0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7Ci0gICAgICAgIGlmICghY2hpbGRUeXBlQWxsb3dlZChu
ZXdDaGlsZC0+bm9kZVR5cGUoKSkpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01F
eGNlcHRpb246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChOb2RlSW1wbCAqbiA9IG5l
d0NoaWxkLT5maXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAg
ICAgICBpZiAoIWNoaWxkVHlwZUFsbG93ZWQobi0+bm9kZVR5cGUoKSkpIHsKLSAgICAgICAgICAg
ICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9FUlI7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotICAgIAotICAgIC8vIGNoYW5nZSB0aGUgZG9jdW1lbnQgcG9pbnRlciBvZiBuZXdDaGlsZCBh
bmQgYWxsIG9mIGl0cyBjaGlsZHJlbiB0byBiZSB0aGUgbmV3IGRvY3VtZW50Ci0gICAgaWYgKHNo
b3VsZEFkb3B0Q2hpbGQpIHsKLSAgICAgICAgZm9yIChOb2RlSW1wbCogbm9kZSA9IG5ld0NoaWxk
OyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShuZXdDaGlsZCkpIHsKLSAgICAg
ICAgICAgIEtKUzo6U2NyaXB0SW50ZXJwcmV0ZXI6OnVwZGF0ZURPTU5vZGVEb2N1bWVudChub2Rl
LCBub2RlLT5nZXREb2N1bWVudCgpLCBnZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgIG5vZGUt
PnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1ib29s
IE5vZGVJbXBsOjppc0FuY2VzdG9yKGNvbnN0IE5vZGVJbXBsICpvdGhlcikgY29uc3QKLXsKLSAg
ICAvLyBSZXR1cm4gdHJ1ZSBpZiBvdGhlciBpcyBhbiBhbmNlc3RvciBvZiB0aGlzLCBvdGhlcndp
c2UgZmFsc2UKLSAgICBpZiAoIW90aGVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZm9y
IChjb25zdCBOb2RlSW1wbCAqbiA9IHBhcmVudE5vZGUoKTsgbjsgbiA9IG4tPnBhcmVudE5vZGUo
KSkgewotICAgICAgICBpZiAobiA9PSBvdGhlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmNoaWxkQWxsb3dl
ZCggTm9kZUltcGwgKm5ld0NoaWxkICkKLXsKLSAgICByZXR1cm4gY2hpbGRUeXBlQWxsb3dlZChu
ZXdDaGlsZC0+bm9kZVR5cGUoKSk7Ci19Ci0KLU5vZGVJbXBsOjpTdHlsZUNoYW5nZSBOb2RlSW1w
bDo6ZGlmZigga2h0bWw6OlJlbmRlclN0eWxlICpzMSwga2h0bWw6OlJlbmRlclN0eWxlICpzMiAp
IGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlz
IGp1c3QgdG90YWxseSB3cm9uZy4gIEl0IGRvZXNuJ3QgaGFuZGxlCi0gICAgLy8gZXhwbGljaXQg
aW5oZXJpdGFuY2Ugb2Ygbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGFuZCBzbyB5b3UgZW5kIHVw
IG5vdCByZS1yZXNvbHZpbmcKLSAgICAvLyBzdHlsZSBpbiBjYXNlcyB3aGVyZSB5b3UgbmVlZCB0
by4KLSAgICBTdHlsZUNoYW5nZSBjaCA9IE5vSW5oZXJpdDsKLSAgICBFRGlzcGxheSBkaXNwbGF5
MSA9IHMxID8gczEtPmRpc3BsYXkoKSA6IE5PTkU7Ci0gICAgYm9vbCBmbDEgPSBzMSA/IHMxLT5o
YXNQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6RklSU1RfTEVUVEVSKSA6IGZhbHNlOwotICAgIEVE
aXNwbGF5IGRpc3BsYXkyID0gczIgPyBzMi0+ZGlzcGxheSgpIDogTk9ORTsKLSAgICBib29sIGZs
MiA9IHMyID8gczItPmhhc1BzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpGSVJTVF9MRVRURVIpIDog
ZmFsc2U7Ci0gICAgaWYgKGRpc3BsYXkxICE9IGRpc3BsYXkyIHx8IGZsMSAhPSBmbDIpCi0gICAg
ICAgIGNoID0gRGV0YWNoOwotICAgIGVsc2UgaWYgKCAhczEgfHwgIXMyICkKLQljaCA9IEluaGVy
aXQ7Ci0gICAgZWxzZSBpZiAoICpzMSA9PSAqczIgKQotIAljaCA9IE5vQ2hhbmdlOwotICAgIGVs
c2UgaWYgKCBzMS0+aW5oZXJpdGVkTm90RXF1YWwoIHMyICkgKQotCWNoID0gSW5oZXJpdDsKLSAg
ICByZXR1cm4gY2g7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIE5vZGVJbXBsOjpkdW1wKFFU
ZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kKSBjb25zdAotewotICAgIC8vICMjIyBpbXBs
ZW1lbnQgZHVtcCgpIGZvciBhbGwgYXBwcm9wcmlhdGUgc3ViY2xhc3NlcwotCi0gICAgaWYgKG1f
aGFzSWQpIHsgKnN0cmVhbSA8PCAiIGhhc0lkIjsgfQotICAgIGlmIChtX2hhc0NsYXNzKSB7ICpz
dHJlYW0gPDwgIiBoYXNDbGFzcyI7IH0KLSAgICBpZiAobV9oYXNTdHlsZSkgeyAqc3RyZWFtIDw8
ICIgaGFzU3R5bGUiOyB9Ci0gICAgaWYgKG1fc3BlY2lmaWVkKSB7ICpzdHJlYW0gPDwgIiBzcGVj
aWZpZWQiOyB9Ci0gICAgaWYgKG1fZm9jdXNlZCkgeyAqc3RyZWFtIDw8ICIgZm9jdXNlZCI7IH0K
LSAgICBpZiAobV9hY3RpdmUpIHsgKnN0cmVhbSA8PCAiIGFjdGl2ZSI7IH0KLSAgICBpZiAobV9z
dHlsZUVsZW1lbnQpIHsgKnN0cmVhbSA8PCAiIHN0eWxlRWxlbWVudCI7IH0KLSAgICBpZiAobV9p
bXBsaWNpdCkgeyAqc3RyZWFtIDw8ICIgaW1wbGljaXQiOyB9Ci0KLSAgICAqc3RyZWFtIDw8ICIg
dGFiSW5kZXg9IiA8PCBtX3RhYkluZGV4OwotICAgIGlmIChtX3JlZ2RMaXN0ZW5lcnMpCi0JKnN0
cmVhbSA8PCAiICNyZWdkTGlzdGVuZXJzPSIgPDwgbV9yZWdkTGlzdGVuZXJzLT5jb3VudCgpOyAv
LyAjIyMgbW9yZSBkZXRhaWwKLSAgICAqc3RyZWFtIDw8IGVuZGw7Ci0KLSAgICBOb2RlSW1wbCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUoY2hpbGQpIHsKLQkqc3RyZWFtIDw8IGlu
ZCA8PCBjaGlsZC0+bm9kZU5hbWUoKS5xc3RyaW5nKCkuYXNjaWkoKSA8PCAiOiAiOwotICAgICAg
ICBjaGlsZC0+ZHVtcChzdHJlYW0saW5kKyIgICIpOwotICAgICAgICBjaGlsZCA9IGNoaWxkLT5u
ZXh0U2libGluZygpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIE5vZGVJbXBsOjphdHRhY2go
KQotewotICAgIGFzc2VydCghYXR0YWNoZWQoKSk7Ci0gICAgYXNzZXJ0KCFtX3JlbmRlciB8fCAo
bV9yZW5kZXItPnN0eWxlKCkgJiYgbV9yZW5kZXItPnBhcmVudCgpKSk7Ci0gICAgZ2V0RG9jdW1l
bnQoKS0+aW5jRE9NVHJlZVZlcnNpb24oKTsKLSAgICBtX2F0dGFjaGVkID0gdHJ1ZTsKLX0KLQot
dm9pZCBOb2RlSW1wbDo6d2lsbFJlbW92ZSgpCi17Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmRldGFj
aCgpCi17Ci0gICAgbV9pbkRldGFjaCA9IHRydWU7Ci0vLyAgICBhc3NlcnQobV9hdHRhY2hlZCk7
Ci0KLSAgICBpZiAobV9yZW5kZXIpCi0gICAgICAgIG1fcmVuZGVyLT5kZXN0cm95KCk7Ci0gICAg
bV9yZW5kZXIgPSAwOwotCi0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwot
ICAgIGlmIChkb2MpCi0gICAgICAgIGRvYy0+aW5jRE9NVHJlZVZlcnNpb24oKTsKLSAgICBtX2F0
dGFjaGVkID0gZmFsc2U7Ci0gICAgbV9pbkRldGFjaCA9IGZhbHNlOwotfQotCi1ib29sIE5vZGVJ
bXBsOjptYWludGFpbnNTdGF0ZSgpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1RU3RyaW5n
IE5vZGVJbXBsOjpzdGF0ZSgpCi17Ci0gICAgcmV0dXJuIFFTdHJpbmc6Om51bGw7Ci19Ci0KLXZv
aWQgTm9kZUltcGw6OnJlc3RvcmVTdGF0ZShRU3RyaW5nTGlzdCAmLypzdGF0ZXMqLykKLXsKLX0K
LQotdm9pZCBOb2RlSW1wbDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIGlmIChtX3Jl
Z2RMaXN0ZW5lcnMgJiYgIW1fcmVnZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3VtZW50
KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0
aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotCi0gICAgc2V0SW5Eb2N1bWVudCh0cnVlKTsKLSAgICAK
LSAgICBpbnNlcnRlZEludG9UcmVlKGZhbHNlKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6cmVtb3Zl
ZEZyb21Eb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fcmVnZExpc3RlbmVycyAmJiAhbV9yZWdkTGlz
dGVuZXJzLT5pc0VtcHR5KCkgJiYgZ2V0RG9jdW1lbnQoKSkKLSAgICAgICAgZ2V0RG9jdW1lbnQo
KS0+cmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKHRoaXMpOwotCi0g
ICAgc2V0SW5Eb2N1bWVudChmYWxzZSk7Ci0gICAgCi0gICAgcmVtb3ZlZEZyb21UcmVlKGZhbHNl
KTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLX0KLQotYm9vbCBO
b2RlSW1wbDo6ZGlzYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9v
bCBOb2RlSW1wbDo6aXNSZWFkT25seSgpCi17Ci0gICAgLy8gRW50aXR5ICYgRW50aXR5IFJlZmVy
ZW5jZSBub2RlcyBhbmQgdGhlaXIgZGVzY2VuZGFudHMgYXJlIHJlYWQtb25seQotICAgIE5vZGVJ
bXBsICpuID0gdGhpczsKLSAgICB3aGlsZSAobikgewotCWlmIChuLT5ub2RlVHlwZSgpID09IE5v
ZGU6OkVOVElUWV9OT0RFIHx8Ci0JICAgIG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6RU5USVRZX1JF
RkVSRU5DRV9OT0RFKQotCSAgICByZXR1cm4gdHJ1ZTsKLQluID0gbi0+cGFyZW50Tm9kZSgpOwot
ICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6cHJldmlv
dXNFZGl0YWJsZSgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBwcmV2aW91c0xlYWZO
b2RlKCk7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKG5vZGUtPmlzQ29udGVudEVk
aXRhYmxlKCkpCi0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgbm9kZSA9IG5vZGUt
PnByZXZpb3VzTGVhZk5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBs
ICpOb2RlSW1wbDo6bmV4dEVkaXRhYmxlKCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbm9kZSA9
IG5leHRMZWFmTm9kZSgpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChub2RlLT5p
c0NvbnRlbnRFZGl0YWJsZSgpKQotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIG5v
ZGUgPSBub2RlLT5uZXh0TGVhZk5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVJl
bmRlck9iamVjdCAqIE5vZGVJbXBsOjpwcmV2aW91c1JlbmRlcmVyKCkKLXsKLSAgICBmb3IgKE5v
ZGVJbXBsICpuID0gcHJldmlvdXNTaWJsaW5nKCk7IG47IG4gPSBuLT5wcmV2aW91c1NpYmxpbmco
KSkgewotICAgICAgICBpZiAobi0+cmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBuLT5y
ZW5kZXJlcigpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotUmVuZGVyT2JqZWN0ICogTm9k
ZUltcGw6Om5leHRSZW5kZXJlcigpCi17Ci0gICAgLy8gQXZvaWQgYW4gTyhuXjIpIHByb2JsZW0g
d2l0aCB0aGlzIGZ1bmN0aW9uIGJ5IG5vdCBjaGVja2luZyBmb3IgbmV4dFJlbmRlcmVyKCkgd2hl
biB0aGUgcGFyZW50IGVsZW1lbnQgaGFzbid0IGV2ZW4gCi0gICAgLy8gYmVlbiBhdHRhY2hlZCB5
ZXQuCi0gICAgaWYgKHBhcmVudCgpICYmICFwYXJlbnQoKS0+YXR0YWNoZWQoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBmb3IgKE5vZGVJbXBsICpuID0gbmV4dFNpYmxpbmcoKTsgbjsgbiA9
IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKG4tPnJlbmRlcmVyKCkpCi0gICAgICAg
ICAgICByZXR1cm4gbi0+cmVuZGVyZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8v
IEZJWE1FOiBUaGlzIGNvZGUgaXMgdXNlZCBieSBlZGl0aW5nLiAgU2VlbXMgbGlrZSBpdCBjb3Vs
ZCBtb3ZlIG92ZXIgdGhlcmUgYW5kIG5vdCBwb2xsdXRlIE5vZGVJbXBsLgotTm9kZUltcGwgKk5v
ZGVJbXBsOjpwcmV2aW91c05vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCkgY29uc3QKLXsKLSAg
ICBpZiAocHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm4gPSBwcmV2aW91
c1NpYmxpbmcoKTsKLSAgICAgICAgd2hpbGUgKCFpc0F0b21pY05vZGUobikgJiYgbi0+bGFzdENo
aWxkKCkpCi0gICAgICAgICAgICBuID0gbi0+bGFzdENoaWxkKCk7Ci0gICAgICAgIHJldHVybiBu
OwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnROb2RlKCkpIHsKLSAgICAgICAgcmV0dXJuIHBh
cmVudE5vZGUoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0K
LX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpuZXh0Tm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMo
KSBjb25zdAotewotICAgIGlmICghaXNBdG9taWNOb2RlKHRoaXMpICYmIGZpcnN0Q2hpbGQoKSkK
LQlyZXR1cm4gZmlyc3RDaGlsZCgpOwotICAgIGlmIChuZXh0U2libGluZygpKQotCXJldHVybiBu
ZXh0U2libGluZygpOwotICAgIGNvbnN0IE5vZGVJbXBsICpuID0gdGhpczsKLSAgICB3aGlsZSAo
biAmJiAhbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAg
ICBpZiAobikKLSAgICAgICAgcmV0dXJuIG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6cHJldmlvdXNMZWFmTm9kZSgpIGNvbnN0Ci17Ci0g
ICAgTm9kZUltcGwgKm5vZGUgPSBwcmV2aW91c05vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCk7
Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKGlzQXRvbWljTm9kZShub2RlKSkKLSAg
ICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICBub2RlID0gbm9kZS0+cHJldmlvdXNOb2Rl
Q29uc2lkZXJpbmdBdG9taWNOb2RlcygpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotTm9k
ZUltcGwgKk5vZGVJbXBsOjpuZXh0TGVhZk5vZGUoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpu
b2RlID0gbmV4dE5vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCk7Ci0gICAgd2hpbGUgKG5vZGUp
IHsKLSAgICAgICAgaWYgKGlzQXRvbWljTm9kZShub2RlKSkKLSAgICAgICAgICAgIHJldHVybiBu
b2RlOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dE5vZGVDb25zaWRlcmluZ0F0b21pY05vZGVz
KCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5vZGVJbXBsOjpjcmVhdGVSZW5k
ZXJlcklmTmVlZGVkKCkKLXsKLQotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+c2hvdWxkQ3JlYXRl
UmVuZGVyZXJzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgYXNzZXJ0KCFhdHRh
Y2hlZCgpKTsKLSAgICBhc3NlcnQoIW1fcmVuZGVyKTsKLSAgICAKLSAgICBOb2RlSW1wbCAqcGFy
ZW50ID0gcGFyZW50Tm9kZSgpOyAgICAKLSAgICBhc3NlcnQocGFyZW50KTsKLSAgICAgICAgCi0g
ICAgUmVuZGVyT2JqZWN0ICpwYXJlbnRSZW5kZXJlciA9IHBhcmVudC0+cmVuZGVyZXIoKTsKLSAg
ICBpZiAocGFyZW50UmVuZGVyZXIgJiYgcGFyZW50UmVuZGVyZXItPmNhbkhhdmVDaGlsZHJlbigp
Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICAgICAgJiYgcGFyZW50LT5jaGlsZFNob3VsZENyZWF0ZVJl
bmRlcmVyKHRoaXMpCi0jZW5kaWYKLSAgICAgICAgKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlICpz
dHlsZSA9IHN0eWxlRm9yUmVuZGVyZXIocGFyZW50UmVuZGVyZXIpOwotICAgICAgICBzdHlsZS0+
cmVmKCk7Ci0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICBib29sIHJlc29sdmVTdHlsZSA9
IGZhbHNlOwotICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+YmluZGluZ01hbmFnZXIoKS0+bG9h
ZEJpbmRpbmdzKHRoaXMsIHN0eWxlLT5iaW5kaW5nVVJJcygpLCB0cnVlLCAmcmVzb2x2ZVN0eWxl
KSAmJiAKLSAgICAgICAgICAgIHJlbmRlcmVySXNOZWVkZWQoc3R5bGUpKSB7Ci0gICAgICAgICAg
ICBpZiAocmVzb2x2ZVN0eWxlKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUtPmRlcmVmKCk7Ci0g
ICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZUZvclJlbmRlcmVyKHBhcmVudFJlbmRlcmVyKTsK
LSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmIChyZW5kZXJlcklzTmVlZGVkKHN0eWxl
KSkgewotI2VuZGlmCi0gICAgICAgICAgICBtX3JlbmRlciA9IGNyZWF0ZVJlbmRlcmVyKGdldERv
Y3VtZW50KCktPnJlbmRlckFyZW5hKCksIHN0eWxlKTsKLSAgICAgICAgICAgIGlmIChtX3JlbmRl
cikgewotICAgICAgICAgICAgICAgIG1fcmVuZGVyLT5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAg
ICAgICAgICAgcGFyZW50UmVuZGVyZXItPmFkZENoaWxkKG1fcmVuZGVyLCBuZXh0UmVuZGVyZXIo
KSk7Ci0gICAgICAgICAgICB9Ci0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgICAgICB9IC8vIGF2
b2lkIGNvbmZ1c2luZyB0aGUgY2hhbmdlIGxvZyBjb2RlIHBhcnNlciBieSBoYXZpbmcgdHdvIGNs
b3NlIGJyYWNlcyB0byBtYXRjaCB0aGUgdHdvIG9wZW4gYnJhY2VzIGFib3ZlCi0jZWxzZQotICAg
ICAgICB9Ci0jZW5kaWYKLSAgICAgICAgc3R5bGUtPmRlcmVmKGdldERvY3VtZW50KCktPnJlbmRl
ckFyZW5hKCkpOwotICAgIH0KLX0KLQotUmVuZGVyU3R5bGUgKk5vZGVJbXBsOjpzdHlsZUZvclJl
bmRlcmVyKFJlbmRlck9iamVjdCAqcGFyZW50KQotewotICAgIHJldHVybiBwYXJlbnQtPnN0eWxl
KCk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKnN0
eWxlKQotewotICAgIHJldHVybiAoZ2V0RG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0g
dGhpcykgfHwgKHN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORSk7Ci19Ci0KLVJlbmRlck9iamVjdCAq
Tm9kZUltcGw6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUg
KnN0eWxlKQotewotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBO
b2RlSW1wbDo6bWF4T2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gMTsKLX0KLQotLy8gRklY
TUU6IFNob3VsZG4ndCB0aGVzZSBmdW5jdGlvbnMgYmUgaW4gdGhlIGVkaXRpbmcgY29kZT8gIENv
ZGUgdGhhdCBhc2tzIHF1ZXN0aW9ucyBhYm91dCBIVE1MIGluIHRoZSBjb3JlIERPTSBjbGFzcwot
Ly8gaXMgb2J2aW91c2x5IG1pc3BsYWNlZC4KLWludCBOb2RlSW1wbDo6Y2FyZXRNaW5PZmZzZXQo
KSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIoKS0+Y2FyZXRNaW5P
ZmZzZXQoKSA6IDA7Ci19Ci0KLWludCBOb2RlSW1wbDo6Y2FyZXRNYXhPZmZzZXQoKSBjb25zdAot
ewotICAgIHJldHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIoKS0+Y2FyZXRNYXhPZmZzZXQoKSA6
IDE7Ci19Ci0KLXVuc2lnbmVkIE5vZGVJbXBsOjpjYXJldE1heFJlbmRlcmVkT2Zmc2V0KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPmNhcmV0TWF4UmVuZGVy
ZWRPZmZzZXQoKSA6IDE7Ci19Ci0KLWludCBOb2RlSW1wbDo6cHJldmlvdXNPZmZzZXQgKGludCBj
dXJyZW50KSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIoKS0+cHJl
dmlvdXNPZmZzZXQoY3VycmVudCkgOiBjdXJyZW50IC0gMTsKLX0KLQotaW50IE5vZGVJbXBsOjpu
ZXh0T2Zmc2V0IChpbnQgY3VycmVudCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSA/
IHJlbmRlcmVyKCktPm5leHRPZmZzZXQoY3VycmVudCkgOiBjdXJyZW50ICsgMTsKLX0KLQotYm9v
bCBOb2RlSW1wbDo6aXNCbG9ja0Zsb3coKSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigp
ICYmIHJlbmRlcmVyKCktPmlzQmxvY2tGbG93KCk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzQmxv
Y2tGbG93T3JCbG9ja1RhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKSAmJiAo
cmVuZGVyZXIoKS0+aXNCbG9ja0Zsb3coKSB8fCByZW5kZXJlcigpLT5pc1RhYmxlKCkgJiYgIXJl
bmRlcmVyKCktPmlzSW5saW5lKCkpOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0VkaXRhYmxlQmxv
Y2soKSBjb25zdAotewotICAgIHJldHVybiBpc0NvbnRlbnRFZGl0YWJsZSgpICYmIGlzQmxvY2tG
bG93KCk7Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2RlSW1wbDo6ZW5jbG9zaW5nQmxvY2tGbG93T3JU
YWJsZUVsZW1lbnQoKSBjb25zdAotewotICAgIE5vZGVJbXBsICpuID0gY29uc3RfY2FzdDxOb2Rl
SW1wbCAqPih0aGlzKTsKLSAgICBpZiAoaXNCbG9ja0Zsb3dPckJsb2NrVGFibGUoKSkKLSAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwotCi0gICAgd2hpbGUgKDEp
IHsKLSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKCFuKQotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChuLT5pc0Jsb2NrRmxvd09yQmxvY2tUYWJsZSgpIHx8
IG4tPmhhc1RhZ05hbWUoYm9keVRhZykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RWxlbWVudEltcGwgKj4obik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1FbGVtZW50SW1w
bCAqTm9kZUltcGw6OmVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKSBjb25zdAotewotICAgIE5v
ZGVJbXBsICpuID0gY29uc3RfY2FzdDxOb2RlSW1wbCAqPih0aGlzKTsKLSAgICBpZiAoaXNCbG9j
a0Zsb3coKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4pOwot
Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsKLSAgICAgICAg
aWYgKCFuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChuLT5pc0Jsb2NrRmxvdygp
IHx8IG4tPmhhc1RhZ05hbWUoYm9keVRhZykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8RWxlbWVudEltcGwgKj4obik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1FbGVtZW50
SW1wbCAqTm9kZUltcGw6OmVuY2xvc2luZ0lubGluZUVsZW1lbnQoKSBjb25zdAotewotICAgIE5v
ZGVJbXBsICpuID0gY29uc3RfY2FzdDxOb2RlSW1wbCAqPih0aGlzKTsKLSAgICBOb2RlSW1wbCAq
cDsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHAgPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAg
ICAgIGlmICghcCB8fCBwLT5pc0Jsb2NrRmxvdygpIHx8IHAtPmhhc1RhZ05hbWUoYm9keVRhZykp
Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0gICAg
ICAgIC8vIEFsc28gc3RvcCBpZiBhbnkgcHJldmlvdXMgc2libGluZyBpcyBhIGJsb2NrCi0gICAg
ICAgIGZvciAoTm9kZUltcGwgKnNpYmxpbmcgPSBuLT5wcmV2aW91c1NpYmxpbmcoKTsgc2libGlu
Zzsgc2libGluZyA9IHNpYmxpbmctPnByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgICAgICBp
ZiAoc2libGluZy0+aXNCbG9ja0Zsb3coKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0gICAgICAgIH0KLSAgICAgICAgbiA9IHA7Ci0gICAg
fQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwotfQotCi1FbGVtZW50
SW1wbCAqTm9kZUltcGw6OnJvb3RFZGl0YWJsZUVsZW1lbnQoKSBjb25zdAotewotICAgIGlmICgh
aXNDb250ZW50RWRpdGFibGUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBOb2RlSW1wbCAq
biA9IGNvbnN0X2Nhc3Q8Tm9kZUltcGwgKj4odGhpcyk7Ci0gICAgaWYgKG4tPmhhc1RhZ05hbWUo
Ym9keVRhZykpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsK
LQotICAgIE5vZGVJbXBsICpyZXN1bHQgPSBuLT5pc0VkaXRhYmxlQmxvY2soKSA/IG4gOiAwOwot
ICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlm
ICghbiB8fCAhbi0+aXNDb250ZW50RWRpdGFibGUoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBpZiAobi0+aGFzVGFnTmFtZShib2R5VGFnKSkgewotICAgICAgICAgICAgcmVzdWx0ID0g
bjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuLT5pc0Jsb2Nr
RmxvdygpKQotICAgICAgICAgICAgcmVzdWx0ID0gbjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRp
Y19jYXN0PEVsZW1lbnRJbXBsICo+KHJlc3VsdCk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmluU2Ft
ZVJvb3RFZGl0YWJsZUVsZW1lbnQoTm9kZUltcGwgKm4pCi17Ci0gICAgcmV0dXJuIG4gPyByb290
RWRpdGFibGVFbGVtZW50KCkgPT0gbi0+cm9vdEVkaXRhYmxlRWxlbWVudCgpIDogZmFsc2U7Ci19
Ci0KLWJvb2wgTm9kZUltcGw6OmluU2FtZUNvbnRhaW5pbmdCbG9ja0Zsb3dFbGVtZW50KE5vZGVJ
bXBsICpuKQotewotICAgIHJldHVybiBuID8gZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgpID09
IG4tPmVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoKSA6IGZhbHNlOwotfQotCi0vLyBGSVhNRTog
RW5kIG9mIG9idmlvdXNseSBtaXNwbGFjZWQgSFRNTCBlZGl0aW5nIGZ1bmN0aW9ucy4gIFRyeSB0
byBtb3ZlIHRoZXNlIG91dCBvZiBOb2RlSW1wbC4KLQotUmVmUHRyPE5vZGVMaXN0SW1wbD4gTm9k
ZUltcGw6OmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VV
UkksIGNvbnN0IERPTVN0cmluZyAmbG9jYWxOYW1lKQotewotICAgIGlmIChuYW1lc3BhY2VVUkku
aXNOdWxsKCkgfHwgbG9jYWxOYW1lLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gUmVmUHRyPE5v
ZGVMaXN0SW1wbD4oKTsgLy8gRklYTUU6IFdobyBjYXJlcyBhYm91dCB0aGlzIGFkZGl0aW9uYWwg
Y2hlY2s/Ci0gICAgCi0gICAgRE9NU3RyaW5nIG5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgaWYgKGdl
dERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgIG5hbWUgPSBsb2NhbE5hbWUu
bG93ZXIoKTsKLSAgICByZXR1cm4gUmVmUHRyPE5vZGVMaXN0SW1wbD4obmV3IFRhZ05vZGVMaXN0
SW1wbCh0aGlzLCBBdG9taWNTdHJpbmcobmFtZXNwYWNlVVJJKSwgQXRvbWljU3RyaW5nKG5hbWUp
KSk7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzU3VwcG9ydGVkKGNvbnN0IERPTVN0cmluZyAmZmVh
dHVyZSwgY29uc3QgRE9NU3RyaW5nICZ2ZXJzaW9uKQotewotICAgIHJldHVybiBET01JbXBsZW1l
bnRhdGlvbkltcGw6Omluc3RhbmNlKCktPmhhc0ZlYXR1cmUoZmVhdHVyZSwgdmVyc2lvbik7Ci19
Ci0KLURvY3VtZW50SW1wbCAqTm9kZUltcGw6Om93bmVyRG9jdW1lbnQoKSBjb25zdAotewotICAg
IERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICByZXR1cm4gZG9jID09IHRo
aXMgPyAwIDogZG9jOwotfQotCi1ib29sIE5vZGVJbXBsOjpoYXNBdHRyaWJ1dGVzKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLU5hbWVkQXR0ck1hcEltcGwgKk5vZGVJbXBsOjph
dHRyaWJ1dGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBOb2RlSW1wbDo6
aXNFcXVhbE5vZGUoTm9kZUltcGwgKm90aGVyKSBjb25zdAotewotICAgIGlmICghb3RoZXIpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobm9kZVR5cGUoKSAhPSBvdGhlci0+
bm9kZVR5cGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChub2RlTmFt
ZSgpICE9IG90aGVyLT5ub2RlTmFtZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0g
ICAgaWYgKGxvY2FsTmFtZSgpICE9IG90aGVyLT5sb2NhbE5hbWUoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIAotICAgIGlmIChuYW1lc3BhY2VVUkkoKSAhPSBvdGhlci0+bmFtZXNwYWNl
VVJJKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAocHJlZml4KCkgIT0g
b3RoZXItPnByZWZpeCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG5v
ZGVWYWx1ZSgpICE9IG90aGVyLT5ub2RlVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIAotICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gYXR0cmlidXRlcygpOwotICAgIE5h
bWVkQXR0ck1hcEltcGwgKm90aGVyQXR0cnMgPSBvdGhlci0+YXR0cmlidXRlcygpOwotICAgIAot
ICAgIGlmICghYXR0cnMgJiYgb3RoZXJBdHRycykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IAotICAgIGlmIChhdHRycyAmJiAhYXR0cnMtPm1hcHNFcXVpdmFsZW50KG90aGVyQXR0cnMpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUltcGwgKmNoaWxkID0gZmlyc3RD
aGlsZCgpOwotICAgIE5vZGVJbXBsICpvdGhlckNoaWxkID0gb3RoZXItPmZpcnN0Q2hpbGQoKTsK
LSAgICAKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgICAgaWYgKCFjaGlsZC0+aXNFcXVhbE5v
ZGUob3RoZXJDaGlsZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAg
ICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICBvdGhlckNoaWxkID0g
b3RoZXJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG90aGVyQ2hp
bGQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAvLyBGSVhNRTogRm9yIERvY3Vt
ZW50VHlwZSBub2RlcyB3ZSBzaG91bGQgY2hlY2sgZXF1YWxpdHkgb24KLSAgICAvLyB0aGUgZW50
aXRpZXMgYW5kIG5vdGF0aW9ucyBOYW1lZE5vZGVNYXBzIGFzIHdlbGwuCi0gICAgCi0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzRGVmYXVsdE5hbWVzcGFjZShjb25zdCBE
T01TdHJpbmcgJm5hbWVzcGFjZVVSSSkgY29uc3QKLXsKLSAgICAvLyBJbXBsZW1lbnRlZCBhY2Nv
cmRpbmcgdG8KLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwt
My1Db3JlLTIwMDQwNDA3L25hbWVzcGFjZXMtYWxnb3JpdGhtcy5odG1sI2lzRGVmYXVsdE5hbWVz
cGFjZUFsZ28KLSAgICAKLSAgICBzd2l0Y2ggKG5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBO
b2RlOjpFTEVNRU5UX05PREU6IHsKLSAgICAgICAgICAgIGNvbnN0IEVsZW1lbnRJbXBsICplbGVt
ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxlbWVudEltcGwgKj4odGhpcyk7Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIGlmIChlbGVtLT5wcmVmaXgoKS5pc051bGwoKSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZWxlbS0+bmFtZXNwYWNlVVJJKCkgPT0gbmFtZXNwYWNlVVJJOwotCi0gICAgICAg
ICAgICBpZiAoZWxlbS0+aGFzQXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgTmFtZWRB
dHRyTWFwSW1wbCAqYXR0cnMgPSBlbGVtLT5hdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGF0dHJzLT5sZW5ndGgo
KTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgKmF0dHIgPSBhdHRy
cy0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgICAgIGlmIChhdHRyLT5sb2NhbE5hbWUoKSA9PSAieG1sbnMiKQotICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGF0dHItPnZhbHVlKCkgPT0gbmFtZXNwYWNlVVJJOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKEVs
ZW1lbnRJbXBsICphbmNlc3RvciA9IGdldEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBhbmNlc3Rvci0+aXNEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7Ci0K
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGU6
OkRPQ1VNRU5UX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGNvbnN0IERv
Y3VtZW50SW1wbCAqPih0aGlzKS0+ZG9jdW1lbnRFbGVtZW50KCktPmlzRGVmYXVsdE5hbWVzcGFj
ZShuYW1lc3BhY2VVUkkpOwotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAg
ICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRf
VFlQRV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6Ci0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05P
REU6IHsKLSAgICAgICAgICAgIGNvbnN0IEF0dHJJbXBsICphdHRyID0gc3RhdGljX2Nhc3Q8Y29u
c3QgQXR0ckltcGwgKj4odGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhdHRy
LT5vd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci0+b3duZXJFbGVt
ZW50KCktPmlzRGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAg
ICAgICAgICAgIGlmIChFbGVtZW50SW1wbCAqYW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQo
KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3ItPmlzRGVmYXVsdE5hbWVzcGFjZShu
YW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotfQotCi1ET01TdHJpbmcgTm9kZUltcGw6Omxvb2t1cFByZWZpeChjb25zdCBET01TdHJp
bmcgJm5hbWVzcGFjZVVSSSkgY29uc3QKLXsKLSAgICAvLyBJbXBsZW1lbnRlZCBhY2NvcmRpbmcg
dG8KLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1Db3Jl
LTIwMDQwNDA3L25hbWVzcGFjZXMtYWxnb3JpdGhtcy5odG1sI2xvb2t1cE5hbWVzcGFjZVByZWZp
eEFsZ28KLSAgICAKLSAgICBpZiAobmFtZXNwYWNlVVJJLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuIERPTVN0cmluZygpOwotICAgIAotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkgewotICAgICAg
ICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBsb29rdXBOYW1l
c3BhY2VQcmVmaXgobmFtZXNwYWNlVVJJLCBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50SW1wbCAq
Pih0aGlzKSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERToKLSAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBEb2N1bWVudEltcGwgKj4odGhpcyktPmRvY3VtZW50
RWxlbWVudCgpLT5sb29rdXBQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgY2FzZSBOb2Rl
OjpFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpOT1RBVElPTl9OT0RFOgotICAgICAg
ICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6
RE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAg
ICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBBdHRy
SW1wbCAqYXR0ciA9IHN0YXRpY19jYXN0PGNvbnN0IEF0dHJJbXBsICo+KHRoaXMpOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGF0dHItPm93bmVyRWxlbWVudCgpLT5sb29rdXBQcmVmaXgobmFtZXNwYWNl
VVJJKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAg
ICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoRWxlbWVudEltcGwgKmFu
Y2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFu
Y2VzdG9yLT5sb29rdXBQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIE5vZGVJbXBs
Ojpsb29rdXBOYW1lc3BhY2VVUkkoY29uc3QgRE9NU3RyaW5nICZwcmVmaXgpIGNvbnN0Ci17Ci0g
ICAgLy8gSW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcv
VFIvMjAwNC9SRUMtRE9NLUxldmVsLTMtQ29yZS0yMDA0MDQwNy9uYW1lc3BhY2VzLWFsZ29yaXRo
bXMuaHRtbCNsb29rdXBOYW1lc3BhY2VVUklBbGdvCi0gICAgCi0gICAgaWYgKCFwcmVmaXguaXNO
dWxsKCkgJiYgcHJlZml4LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwot
ICAgIAotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkgewotICAgICAgICBjYXNlIE5vZGU6OkVMRU1F
TlRfTk9ERTogewotICAgICAgICAgICAgY29uc3QgRWxlbWVudEltcGwgKmVsZW0gPSBzdGF0aWNf
Y2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgaWYgKCFlbGVtLT5uYW1lc3BhY2VVUkkoKS5pc051bGwoKSAmJiBlbGVtLT5wcmVmaXgoKSA9
PSBwcmVmaXgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0tPm5hbWVzcGFjZVVSSSgpOwot
ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZWxlbS0+aGFzQXR0cmlidXRlcygpKSB7Ci0g
ICAgICAgICAgICAgICAgTmFtZWRBdHRyTWFwSW1wbCAqYXR0cnMgPSBlbGVtLT5hdHRyaWJ1dGVz
KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGF0dHJzLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJp
YnV0ZUltcGwgKmF0dHIgPSBhdHRycy0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLT5wcmVmaXgoKSA9PSAieG1sbnMi
ICYmIGF0dHItPmxvY2FsTmFtZSgpID09IHByZWZpeCkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKGF0dHItPmxvY2FsTmFtZSgpID09ICJ4bWxucyIgJiYgcHJlZml4Lmlz
TnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNF
bXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT52YWx1ZSgp
OwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChFbGVtZW50SW1w
bCAqYW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gYW5jZXN0b3ItPmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgCi0g
ICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBO
b2RlOjpET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0
IERvY3VtZW50SW1wbCAqPih0aGlzKS0+ZG9jdW1lbnRFbGVtZW50KCktPmxvb2t1cE5hbWVzcGFj
ZVVSSShwcmVmaXgpOwotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBj
YXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfVFlQ
RV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6Ci0gICAg
ICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRF
X05PREU6IHsKLSAgICAgICAgICAgIGNvbnN0IEF0dHJJbXBsICphdHRyID0gc3RhdGljX2Nhc3Q8
Y29uc3QgQXR0ckltcGwgKj4odGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChh
dHRyLT5vd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci0+b3duZXJF
bGVtZW50KCktPmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBk
ZWZhdWx0OgotICAgICAgICAgICAgaWYgKEVsZW1lbnRJbXBsICphbmNlc3RvciA9IGdldEFuY2Vz
dG9yRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBhbmNlc3Rvci0+bG9va3VwTmFt
ZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBET01T
dHJpbmcoKTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBOb2RlSW1wbDo6bG9va3VwTmFtZXNwYWNl
UHJlZml4KGNvbnN0IERPTVN0cmluZyAmX25hbWVzcGFjZVVSSSwgY29uc3QgRWxlbWVudEltcGwg
Km9yaWdpbmFsRWxlbWVudCkgY29uc3QKLXsKLSAgICBpZiAoX25hbWVzcGFjZVVSSS5pc051bGwo
KSkKLSAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgICAgICAgICAgCi0gICAgaWYgKG9y
aWdpbmFsRWxlbWVudC0+bG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCgpKSA9PSBfbmFtZXNwYWNl
VVJJKQotICAgICAgICByZXR1cm4gcHJlZml4KCk7Ci0gICAgCi0gICAgaWYgKGhhc0F0dHJpYnV0
ZXMoKSkgewotICAgICAgICBOYW1lZEF0dHJNYXBJbXBsICphdHRycyA9IGF0dHJpYnV0ZXMoKTsK
LSAgICAgICAgCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhdHRycy0+bGVuZ3Ro
KCk7IGkrKykgewotICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAqYXR0ciA9IGF0dHJzLT5hdHRy
aWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ci0+cHJlZml4
KCkgPT0gInhtbG5zIiAmJgotICAgICAgICAgICAgICAgIGF0dHItPnZhbHVlKCkgPT0gX25hbWVz
cGFjZVVSSSAmJgotICAgICAgICAgICAgICAgIG9yaWdpbmFsRWxlbWVudC0+bG9va3VwTmFtZXNw
YWNlVVJJKGF0dHItPmxvY2FsTmFtZSgpKSA9PSBfbmFtZXNwYWNlVVJJKQotICAgICAgICAgICAg
ICAgIHJldHVybiBhdHRyLT5sb2NhbE5hbWUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAg
ICBpZiAoRWxlbWVudEltcGwgKmFuY2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAg
ICAgIHJldHVybiBhbmNlc3Rvci0+bG9va3VwTmFtZXNwYWNlUHJlZml4KF9uYW1lc3BhY2VVUkks
IG9yaWdpbmFsRWxlbWVudCk7Ci0gICAgCi0gICAgcmV0dXJuIERPTVN0cmluZygpOwotfQotCi1E
T01TdHJpbmcgTm9kZUltcGw6OnRleHRDb250ZW50KCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG5v
ZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpURVhUX05PREU6Ci0gICAgICAgIGNhc2Ug
Tm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9E
RToKLSAgICAgICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAg
ICAgICAgICByZXR1cm4gbm9kZVZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICBjYXNlIE5vZGU6
OkVMRU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERToKLSAgICAg
ICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVG
RVJFTkNFX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERTog
ewotICAgICAgICAgICAgRE9NU3RyaW5nIHMgPSAiIjsKLSAgICAgICAgCi0gICAgICAgICAgICBm
b3IgKE5vZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQt
Pm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPm5vZGVUeXBlKCkg
PT0gTm9kZTo6Q09NTUVOVF9OT0RFIHx8IAotICAgICAgICAgICAgICAgICAgICBjaGlsZC0+bm9k
ZVR5cGUoKSA9PSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpCi0gICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcyArPSBj
aGlsZC0+dGV4dENvbnRlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAg
ICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2FzZSBOb2RlOjpET0NV
TUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAg
ICAgY2FzZSBOb2RlOjpOT1RBVElPTl9OT0RFOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAg
ICAgcmV0dXJuIERPTVN0cmluZygpOyAgICAgICAgICAgIAotICAgIH0KLX0KLQotdm9pZCBOb2Rl
SW1wbDo6c2V0VGV4dENvbnRlbnQoY29uc3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4Y2VwdGlv
bikKLXsgICAgICAgICAgIAotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkgewotICAgICAgICBjYXNl
IE5vZGU6OlRFWFRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREU6
Ci0gICAgICAgIGNhc2UgTm9kZTo6Q09NTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OlBS
T0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgICAgIHNldE5vZGVWYWx1ZSh0ZXh0
LCBleGNlcHRpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTm9kZTo6RUxF
TUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOgotICAgICAgICBj
YXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9SRUZFUkVO
Q0VfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiB7Ci0g
ICAgICAgICAgICBDb250YWluZXJOb2RlSW1wbCAqY29udGFpbmVyID0gc3RhdGljX2Nhc3Q8Q29u
dGFpbmVyTm9kZUltcGwgKj4odGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRh
aW5lci0+cmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCF0
ZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZChnZXREb2N1bWVudCgp
LT5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERToKLSAgICAgICAgY2Fz
ZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05f
Tk9ERToKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotRWxlbWVudEltcGwgKk5vZGVJbXBsOjpnZXRBbmNl
c3RvckVsZW1lbnQoKSBjb25zdAotewotICAgIC8vIEluIHRoZW9yeSwgdGhlcmUgY2FuIGJlIEVu
dGl0eVJlZmVyZW5jZSBub2RlcyBiZXR3ZWVuIGVsZW1lbnRzCi0gICAgLy8gYnV0IHRoaXMgaXMg
Y3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0gICAgZm9yIChOb2RlSW1wbCAqbiA9IHBhcmVudE5v
ZGUoKTsgbjsgbiA9IG4tPnBhcmVudE5vZGUoKSkgewotICAgICAgICBpZiAobi0+aXNFbGVtZW50
Tm9kZSgpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4p
OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBOREVCVUcKLQotc3Rh
dGljIHZvaWQgYXBwZW5kQXR0cmlidXRlRGVzYyhjb25zdCBOb2RlSW1wbCAqbm9kZSwgRE9NU3Ry
aW5nICZzdHJpbmcsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFFTdHJpbmcgYXR0ckRlc2Mp
Ci17Ci0gICAgaWYgKG5vZGUtPmlzRWxlbWVudE5vZGUoKSkgewotICAgICAgICBET01TdHJpbmcg
YXR0ciA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KG5vZGUpLT5nZXRBdHRyaWJ1
dGUobmFtZSk7Ci0gICAgICAgIGlmICghYXR0ci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0
cmluZyArPSBhdHRyRGVzYzsKLSAgICAgICAgICAgIHN0cmluZyArPSBhdHRyOwotICAgICAgICB9
Ci0gICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpzaG93Tm9kZShjb25zdCBjaGFyICpwcmVmaXgp
IGNvbnN0Ci17Ci0gICAgaWYgKCFwcmVmaXgpCi0gICAgICAgIHByZWZpeCA9ICIiOwotICAgIGlm
IChpc1RleHROb2RlKCkpIHsKLSAgICAgICAgUVN0cmluZyB2YWx1ZSA9IG5vZGVWYWx1ZSgpLnFz
dHJpbmcoKTsKLSAgICAgICAgdmFsdWUucmVwbGFjZSgnXFwnLCAiXFxcXCIpOwotICAgICAgICB2
YWx1ZS5yZXBsYWNlKCdcbicsICJcXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVz
XHQlcCBcIiVzXCJcbiIsIHByZWZpeCwgbm9kZU5hbWUoKS5xc3RyaW5nKCkudXRmOCgpLmRhdGEo
KSwgdGhpcywgdmFsdWUudXRmOCgpLmRhdGEoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRE9N
U3RyaW5nIGF0dHJzID0gIiI7Ci0gICAgICAgIGFwcGVuZEF0dHJpYnV0ZURlc2ModGhpcywgYXR0
cnMsIGNsYXNzQXR0ciwgIiBDTEFTUz0iKTsKLSAgICAgICAgYXBwZW5kQXR0cmlidXRlRGVzYyh0
aGlzLCBhdHRycywgc3R5bGVBdHRyLCAiIFNUWUxFPSIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVy
ciwgIiVzJXNcdCVwJXNcbiIsIHByZWZpeCwgbm9kZU5hbWUoKS5xc3RyaW5nKCkudXRmOCgpLmRh
dGEoKSwgdGhpcywgYXR0cnMucXN0cmluZygpLmFzY2lpKCkpOwotICAgIH0KLX0KLQotdm9pZCBO
b2RlSW1wbDo6c2hvd1RyZWUoKSBjb25zdAotewotICAgIHNob3dUcmVlQW5kTWFyaygoTm9kZUlt
cGwgKil0aGlzLCAiKiIsIE5VTEwsIE5VTEwpOwotfQotCi12b2lkIE5vZGVJbXBsOjpzaG93VHJl
ZUFuZE1hcmsoTm9kZUltcGwgKiBtYXJrZWROb2RlMSwgY29uc3QgY2hhciAqIG1hcmtlZExhYmVs
MSwgTm9kZUltcGwgKiBtYXJrZWROb2RlMiwgY29uc3QgY2hhciAqIG1hcmtlZExhYmVsMikgY29u
c3QKLXsKLSAgICBOb2RlSW1wbCAqcm9vdE5vZGU7Ci0gICAgTm9kZUltcGwgKm5vZGUgPSAoTm9k
ZUltcGwgKil0aGlzOwotICAgIHdoaWxlIChub2RlLT5wYXJlbnROb2RlKCkgJiYgIW5vZGUtPmhh
c1RhZ05hbWUoYm9keVRhZykpCi0gICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCk7Ci0g
ICAgcm9vdE5vZGUgPSBub2RlOwotCQotICAgIGZvciAobm9kZSA9IHJvb3ROb2RlOyBub2RlOyBu
b2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgICAgIE5vZGVJbXBsICp0bXBO
b2RlOwotCQkKLSAgICAgICAgaWYgKG5vZGUgPT0gbWFya2VkTm9kZTEpCi0gICAgICAgICAgICBm
cHJpbnRmKHN0ZGVyciwgIiVzIiwgbWFya2VkTGFiZWwxKTsKLSAgICAgICAgaWYgKG5vZGUgPT0g
bWFya2VkTm9kZTIpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWFya2VkTGFi
ZWwyKTsKLQkJCQotICAgICAgICBmb3IgKHRtcE5vZGUgPSBub2RlOyB0bXBOb2RlICYmIHRtcE5v
ZGUgIT0gcm9vdE5vZGU7IHRtcE5vZGUgPSB0bXBOb2RlLT5wYXJlbnROb2RlKCkpCi0gICAgICAg
ICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0Iik7Ci0gICAgICAgIG5vZGUtPnNob3dOb2RlKDApOwot
ICAgIH0KLX0KLQotdm9pZCBOb2RlSW1wbDo6Zm9ybWF0Rm9yRGVidWdnZXIoY2hhciAqYnVmZmVy
LCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHJlc3VsdDsKLSAgICBE
T01TdHJpbmcgczsKLSAgICAKLSAgICBzID0gbm9kZU5hbWUoKTsKLSAgICBpZiAocy5sZW5ndGgo
KSA9PSAwKQotICAgICAgICByZXN1bHQgKz0gIjxub25lPiI7Ci0gICAgZWxzZQotICAgICAgICBy
ZXN1bHQgKz0gczsKLSAgICAgICAgICAKLSAgICBzdHJuY3B5KGJ1ZmZlciwgcmVzdWx0LnFzdHJp
bmcoKS5sYXRpbjEoKSwgbGVuZ3RoIC0gMSk7Ci19Ci0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotQ29udGFpbmVyTm9kZUltcGw6OkNvbnRhaW5lck5vZGVJbXBsKERvY3VtZW50SW1w
bCAqZG9jKQotICAgIDogTm9kZUltcGwoZG9jKQotewotICAgIF9maXJzdCA9IF9sYXN0ID0gMDsK
LX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6cmVtb3ZlQWxsQ2hpbGRyZW4oKQotewotICAg
IC8va2REZWJ1ZyggNjAyMCApIDw8ICJDb250YWluZXJOb2RlSW1wbCBkZXN0cnVjdG9yIiA8PCBl
bmRsOwotCi0gICAgLy8gQXZvaWQgZGVlcCByZWN1cnNpb24gd2hlbiBkZXN0cm95aW5nIHRoZSBu
b2RlIHRyZWUuCi0gICAgc3RhdGljIGJvb2wgYWxyZWFkeUluc2lkZURlc3RydWN0b3I7IAotICAg
IGJvb2wgdG9wTGV2ZWwgPSAhYWxyZWFkeUluc2lkZURlc3RydWN0b3I7Ci0gICAgaWYgKHRvcExl
dmVsKQotICAgICAgICBhbHJlYWR5SW5zaWRlRGVzdHJ1Y3RvciA9IHRydWU7Ci0gICAgCi0gICAg
Ly8gTGlzdCBvZiBub2RlcyB0byBiZSBkZWxldGVkLgotICAgIHN0YXRpYyBOb2RlSW1wbCAqaGVh
ZDsKLSAgICBzdGF0aWMgTm9kZUltcGwgKnRhaWw7Ci0gICAgCi0gICAgLy8gV2UgaGF2ZSB0byB0
ZWxsIGFsbCBjaGlsZHJlbiB0aGF0IHRoZWlyIHBhcmVudCBoYXMgZGllZC4KLSAgICBOb2RlSW1w
bCAqbjsKLSAgICBOb2RlSW1wbCAqbmV4dDsKLQotICAgIGZvciggbiA9IF9maXJzdDsgbiAhPSAw
OyBuID0gbmV4dCApIHsKLSAgICAgICAgbmV4dCA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
IG4tPnNldFByZXZpb3VzU2libGluZygwKTsKLSAgICAgICAgbi0+c2V0TmV4dFNpYmxpbmcoMCk7
Ci0gICAgICAgIG4tPnNldFBhcmVudCgwKTsKLSAgICAgICAgCi0JaWYgKCAhbi0+cmVmQ291bnQo
KSApIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgbGlzdCBvZiBub2RlcyB0
byBiZSBkZWxldGVkLgotICAgICAgICAgICAgLy8gUmV1c2UgdGhlIG5leHRTaWJsaW5nIHBvaW50
ZXIgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgICAgICAgIGlmICh0YWlsKQotICAgICAgICAgICAg
ICAgIHRhaWwtPnNldE5leHRTaWJsaW5nKG4pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIGhlYWQgPSBuOwotICAgICAgICAgICAgdGFpbCA9IG47Ci0gICAgICAgIH0gZWxzZSBp
ZiAobi0+aW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgbi0+cmVtb3ZlZEZyb21Eb2N1bWVudCgp
OwotICAgIH0KLSAgICAKLSAgICAvLyBPbmx5IGZvciB0aGUgdG9wIGxldmVsIGNhbGwsIGRvIHRo
ZSBhY3R1YWwgZGVsZXRpbmcuCi0gICAgaWYgKHRvcExldmVsKSB7Ci0gICAgICAgIHdoaWxlICgo
biA9IGhlYWQpICE9IDApIHsKLSAgICAgICAgICAgIG5leHQgPSBuLT5uZXh0U2libGluZygpOwot
ICAgICAgICAgICAgbi0+c2V0TmV4dFNpYmxpbmcoMCk7Ci0KLSAgICAgICAgICAgIGhlYWQgPSBu
ZXh0OwotICAgICAgICAgICAgaWYgKG5leHQgPT0gMCkKLSAgICAgICAgICAgICAgICB0YWlsID0g
MDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGVsZXRlIG47Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGFscmVhZHlJbnNpZGVEZXN0cnVjdG9yID0gZmFsc2U7Ci0gICAgICAgIF9m
aXJzdCA9IDA7Ci0gICAgICAgIF9sYXN0ID0gMDsKLSAgICB9Ci19Ci0KLUNvbnRhaW5lck5vZGVJ
bXBsOjp+Q29udGFpbmVyTm9kZUltcGwoKQotewotICAgIHJlbW92ZUFsbENoaWxkcmVuKCk7Ci19
Ci0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpmaXJzdENoaWxkKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gX2ZpcnN0OwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6Omxh
c3RDaGlsZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIF9sYXN0OwotfQotCi1Ob2RlSW1wbCAqQ29u
dGFpbmVyTm9kZUltcGw6Omluc2VydEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUlt
cGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4Y2VwdGlvbmNvZGUg
PSAwOwotCi0gICAgLy8gaW5zZXJ0QmVmb3JlKC4uLixudWxsKSBpcyBlcXVpdmFsZW50IHRvIGFw
cGVuZENoaWxkKCkKLSAgICBpZighcmVmQ2hpbGQpCi0gICAgICAgIHJldHVybiBhcHBlbmRDaGls
ZChuZXdDaGlsZCwgZXhjZXB0aW9uY29kZSk7Ci0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3Rl
Y3ROZXdDaGlsZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidk
IGFuZCBkZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQKLQotICAgIC8vIE1ha2Ugc3VyZSBhZGRp
bmcgdGhlIG5ldyBjaGlsZCBpcyBvawotICAgIGNoZWNrQWRkQ2hpbGQobmV3Q2hpbGQsIGV4Y2Vw
dGlvbmNvZGUpOwotICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIC8vIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiByZWZDaGlsZCBpcyBub3QgYSBjaGlsZCBv
ZiB0aGlzIG5vZGUKLSAgICBpZiAocmVmQ2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0g
ICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2wgaXNGcmFnbWVudCA9IG5ld0NoaWxkLT5u
b2RlVHlwZSgpID09IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU7Ci0KLSAgICAvLyBJZiBu
ZXdDaGlsZCBpcyBhIERvY3VtZW50RnJhZ21lbnQgd2l0aCBubyBjaGlsZHJlbi4uLi4gdGhlcmUn
cyBub3RoaW5nIHRvIGRvLgotICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBkb2N1bWVudCBmcmFnbWVu
dAotICAgIGlmIChpc0ZyYWdtZW50ICYmICFuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpKQotICAgICAg
ICByZXR1cm4gKG5ld0NoaWxkLT5oYXNPbmVSZWYoKSAmJiAhbmV3Q2hpbGQtPnBhcmVudCgpKSA/
IDAgOiBuZXdDaGlsZDsKLQotICAgIC8vIE5vdyBhY3R1YWxseSBhZGQgdGhlIGNoaWxkKHJlbikK
LSAgICBOb2RlSW1wbCAqbmV4dENoaWxkOwotICAgIE5vZGVJbXBsICpjaGlsZCA9IGlzRnJhZ21l
bnQgPyBuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpIDogbmV3Q2hpbGQ7Ci0KLSAgICBOb2RlSW1wbCAq
cHJldiA9IHJlZkNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICBpZiAoIHByZXYgPT0gbmV3
Q2hpbGQgfHwgcmVmQ2hpbGQgPT0gbmV3Q2hpbGQgKSAvLyBub3RoaW5nIHRvIGRvCi0JcmV0dXJu
IG5ld0NoaWxkOwotICAgIAotICAgIHdoaWxlIChjaGlsZCkgewotICAgICAgICBuZXh0Q2hpbGQg
PSBpc0ZyYWdtZW50ID8gY2hpbGQtPm5leHRTaWJsaW5nKCkgOiAwOwotCi0gICAgICAgIC8vIElm
IGNoaWxkIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgdHJlZSwgZmlyc3QgcmVtb3ZlIGl0Ci0g
ICAgICAgIE5vZGVJbXBsICpuZXdQYXJlbnQgPSBjaGlsZC0+cGFyZW50Tm9kZSgpOwotICAgICAg
ICBpZiAobmV3UGFyZW50KQotICAgICAgICAgICAgbmV3UGFyZW50LT5yZW1vdmVDaGlsZCggY2hp
bGQsIGV4Y2VwdGlvbmNvZGUgKTsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAg
ICAgICByZXR1cm4gMDsKLQotICAgICAgICAvLyBBZGQgY2hpbGQgaW4gdGhlIGNvcnJlY3QgcG9z
aXRpb24KLSAgICAgICAgZm9yYmlkRXZlbnREaXNwYXRjaCgpOwotICAgICAgICBpZiAocHJldikK
LSAgICAgICAgICAgIHByZXYtPnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgX2ZpcnN0ID0gY2hpbGQ7Ci0gICAgICAgIHJlZkNoaWxkLT5zZXRQcmV2aW91
c1NpYmxpbmcoY2hpbGQpOwotICAgICAgICBjaGlsZC0+c2V0UGFyZW50KHRoaXMpOwotICAgICAg
ICBjaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotICAgICAgICBjaGlsZC0+c2V0TmV4
dFNpYmxpbmcocmVmQ2hpbGQpOwotICAgICAgICBhbGxvd0V2ZW50RGlzcGF0Y2goKTsKLQotICAg
ICAgICAvLyBBZGQgY2hpbGQgdG8gdGhlIHJlbmRlcmluZyB0cmVlCi0gICAgICAgIC8vICMjIyBz
aG91bGQgd2UgZGV0YWNoKCkgaXQgZmlyc3QgaWYgaXQncyBhbHJlYWR5IGF0dGFjaGVkPwotICAg
ICAgICBpZiAoYXR0YWNoZWQoKSAmJiAhY2hpbGQtPmF0dGFjaGVkKCkpCi0gICAgICAgICAgICBj
aGlsZC0+YXR0YWNoKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBEaXNwYXRjaCB0aGUgbXV0YXRp
b24gZXZlbnRzCi0gICAgICAgIGRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyhjaGlsZCxleGNl
cHRpb25jb2RlKTsKLQotICAgICAgICBwcmV2ID0gY2hpbGQ7Ci0gICAgICAgIGNoaWxkID0gbmV4
dENoaWxkOwotICAgIH0KLQotICAgIGdldERvY3VtZW50KCktPnNldERvY3VtZW50Q2hhbmdlZCh0
cnVlKTsKLSAgICBkaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KCk7Ci0gICAgcmV0dXJuIG5l
d0NoaWxkOwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OnJlcGxhY2VDaGlsZCAo
IE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNv
ZGUgKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBw
cm90ZWN0TmV3Q2hpbGQobmV3Q2hpbGQpOyAvLyBtYWtlIHN1cmUgdGhlIG5ldyBjaGlsZCBpcyBy
ZWYnZCBhbmQgZGVyZWYnZCBzbyB3ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICBpZiAoIG9sZENoaWxk
ID09IG5ld0NoaWxkICkgLy8gbm90aGluZyB0byBkbwotCXJldHVybiBvbGRDaGlsZDsKLSAgICAK
LSAgICAvLyBNYWtlIHN1cmUgYWRkaW5nIHRoZSBuZXcgY2hpbGQgaXMgb2sKLSAgICBjaGVja0Fk
ZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiAoZXhjZXB0aW9uY29kZSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBOT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgb2xk
Q2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLgotICAgIGlmICghb2xkQ2hpbGQgfHwg
b2xkQ2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUg
PSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0K
LQotICAgIGJvb2wgaXNGcmFnbWVudCA9IG5ld0NoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OkRP
Q1VNRU5UX0ZSQUdNRU5UX05PREU7Ci0gICAgTm9kZUltcGwgKm5leHRDaGlsZDsKLSAgICBOb2Rl
SW1wbCAqY2hpbGQgPSBpc0ZyYWdtZW50ID8gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKSA6IG5ld0No
aWxkOwotCi0gICAgLy8gUmVtb3ZlIHRoZSBvbGQgY2hpbGQKLSAgICBOb2RlSW1wbCAqcHJldiA9
IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICBOb2RlSW1wbCAqbmV4dCA9IG9sZENo
aWxkLT5uZXh0U2libGluZygpOwotCi0gICAgcmVtb3ZlQ2hpbGQob2xkQ2hpbGQsIGV4Y2VwdGlv
bmNvZGUpOwotICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IC8vIElmIHRoZSBuZXcgY2hpbGQgd2FzIHJpZ2h0IGJlZm9yZSBvciByaWdodCBhZnRlciB0aGUg
b2xkIGNoaWxkLCBub3RoaW5nIGVsc2UgbmVlZHMgdG8gY2hhbmdlCi0gICAgaWYgKHByZXYgPT0g
Y2hpbGQgfHwgbmV4dCA9PSBjaGlsZCkKLSAgICAgICAgY2hpbGQgPSAwOwotICAgIC8vIEFkZCB0
aGUgbmV3IGNoaWxkKHJlbikKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgICAgbmV4dENoaWxk
ID0gaXNGcmFnbWVudCA/IGNoaWxkLT5uZXh0U2libGluZygpIDogMDsKLQotICAgICAgICAvLyBJ
ZiBjaGlsZCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHRyZWUsIGZpcnN0IHJlbW92ZSBpdAot
ICAgICAgICBOb2RlSW1wbCAqbmV3UGFyZW50ID0gY2hpbGQtPnBhcmVudE5vZGUoKTsKLSAgICAg
ICAgaWYgKG5ld1BhcmVudCkKLSAgICAgICAgICAgIG5ld1BhcmVudC0+cmVtb3ZlQ2hpbGQoIGNo
aWxkLCBleGNlcHRpb25jb2RlICk7Ci0gICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxkIGluIHRoZSBjb3JyZWN0IHBv
c2l0aW9uCi0gICAgICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLSAgICAgICAgaWYgKHByZXYp
IHByZXYtPnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgICAgaWYgKG5leHQpIG5leHQtPnNl
dFByZXZpb3VzU2libGluZyhjaGlsZCk7Ci0gICAgICAgIGlmKCFwcmV2KSBfZmlyc3QgPSBjaGls
ZDsKLSAgICAgICAgaWYoIW5leHQpIF9sYXN0ID0gY2hpbGQ7Ci0gICAgICAgIGNoaWxkLT5zZXRQ
YXJlbnQodGhpcyk7Ci0gICAgICAgIGNoaWxkLT5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0g
ICAgICAgIGNoaWxkLT5zZXROZXh0U2libGluZyhuZXh0KTsKLSAgICAgICAgYWxsb3dFdmVudERp
c3BhdGNoKCk7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxkIHRvIHRoZSByZW5kZXJpbmcgdHJlZQot
ICAgICAgICAvLyAjIyMgc2hvdWxkIHdlIGRldGFjaCgpIGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFk
eSBhdHRhY2hlZD8KLSAgICAgICAgaWYgKGF0dGFjaGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgp
KQotICAgICAgICAgICAgY2hpbGQtPmF0dGFjaCgpOwotCi0gICAgICAgIC8vIERpc3BhdGNoIHRo
ZSBtdXRhdGlvbiBldmVudHMKLSAgICAgICAgZGlzcGF0Y2hDaGlsZEluc2VydGVkRXZlbnRzKGNo
aWxkLGV4Y2VwdGlvbmNvZGUpOwotCi0gICAgICAgIHByZXYgPSBjaGlsZDsKLSAgICAgICAgY2hp
bGQgPSBuZXh0Q2hpbGQ7Ci0gICAgfQotCi0gICAgLy8gIyMjIHNldCBzdHlsZSBpbiBjYXNlIGl0
J3MgYXR0YWNoZWQKLSAgICBnZXREb2N1bWVudCgpLT5zZXREb2N1bWVudENoYW5nZWQodHJ1ZSk7
Ci0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwotICAgIHJldHVybiBvbGRDaGls
ZDsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6d2lsbFJlbW92ZSgpCi17Ci0gICAgZm9y
IChOb2RlSW1wbCAqbiA9IF9maXJzdDsgbiAhPSAwOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewot
ICAgICAgICBuLT53aWxsUmVtb3ZlKCk7Ci0gICAgfQotfQotCi1pbnQgQ29udGFpbmVyTm9kZUlt
cGw6OndpbGxSZW1vdmVDaGlsZChOb2RlSW1wbCAqY2hpbGQpCi17Ci0gICAgaW50IGV4Y2VwdGlv
bkNvZGUgPSAwOwotCi0gICAgLy8gZmlyZSByZW1vdmVkIGZyb20gZG9jdW1lbnQgbXV0YXRpb24g
ZXZlbnRzLgotICAgIGRpc3BhdGNoQ2hpbGRSZW1vdmFsRXZlbnRzKGNoaWxkLCBleGNlcHRpb25D
b2RlKTsKLSAgICBpZiAoZXhjZXB0aW9uQ29kZSkKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbkNv
ZGU7Ci0KLSAgICBpZiAoY2hpbGQtPmF0dGFjaGVkKCkpCi0gICAgICAgIGNoaWxkLT53aWxsUmVt
b3ZlKCk7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpDb250YWluZXJOb2Rl
SW1wbDo6cmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApCi17Ci0gICAgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICAvLyBOT19NT0RJRklDQVRJT05f
QUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgaWYgKGlz
UmVhZE9ubHkoKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT19N
T0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAg
IC8vIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiBvbGRDaGlsZCBpcyBub3QgYSBjaGlsZCBvZiB0
aGlzIG5vZGUuCi0gICAgaWYgKCFvbGRDaGlsZCB8fCBvbGRDaGlsZC0+cGFyZW50Tm9kZSgpICE9
IHRoaXMpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX0ZPVU5E
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8vIHVwZGF0ZSBhdXhp
bGlhcnkgZG9jIGluZm8gKGUuZy4gaXRlcmF0b3JzKSB0byBub3RlIHRoYXQgbm9kZSBpcyBiZWlu
ZyByZW1vdmVkCi0gICAgLy8gRklYOiBUaGlzIGxvb2tzIHJlZHVuZGFudCB3aXRoIHNhbWUgY2Fs
bCBmcm9tIGRpc3BhdGNoQ2hpbGRSZW1vdmFsRXZlbnRzIGluIHdpbGxSZW1vdmVDaGlsZAotLy8g
IGdldERvY3VtZW50KCktPm5vdGlmeUJlZm9yZU5vZGVSZW1vdmFsKG9sZENoaWxkKTsgLy8gIyMj
IHVzZSBldmVudHMgaW5zdGVhZAotCi0gICAgLy8gZGlzcGF0Y2ggcHJlLXJlbW92YWwgbXV0YXRp
b24gZXZlbnRzCi0gICAgaWYgKGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVu
dEltcGw6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSKSkgewotCW9sZENoaWxkLT5kaXNwYXRjaEV2
ZW50KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlUmVtb3ZlZEV2ZW50LAotCQkJICAgICB0
cnVlLGZhbHNlLHRoaXMsRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhj
ZXB0aW9uY29kZSx0cnVlKTsKLQlpZiAoZXhjZXB0aW9uY29kZSkKLQkgICAgcmV0dXJuIDA7Ci0g
ICAgfQotCi0gICAgZXhjZXB0aW9uY29kZSA9IHdpbGxSZW1vdmVDaGlsZChvbGRDaGlsZCk7Ci0g
ICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yYmlkRXZl
bnREaXNwYXRjaCgpOwotCi0gICAgLy8gUmVtb3ZlIGZyb20gcmVuZGVyaW5nIHRyZWUKLSAgICBp
ZiAob2xkQ2hpbGQtPmF0dGFjaGVkKCkpCi0gICAgICAgIG9sZENoaWxkLT5kZXRhY2goKTsKLQot
ICAgIC8vIFJlbW92ZSB0aGUgY2hpbGQKLSAgICBOb2RlSW1wbCAqcHJldiwgKm5leHQ7Ci0gICAg
cHJldiA9IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICBuZXh0ID0gb2xkQ2hpbGQt
Pm5leHRTaWJsaW5nKCk7Ci0KLSAgICBpZihuZXh0KSBuZXh0LT5zZXRQcmV2aW91c1NpYmxpbmco
cHJldik7Ci0gICAgaWYocHJldikgcHJldi0+c2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0gICAgaWYo
X2ZpcnN0ID09IG9sZENoaWxkKSBfZmlyc3QgPSBuZXh0OwotICAgIGlmKF9sYXN0ID09IG9sZENo
aWxkKSBfbGFzdCA9IHByZXY7Ci0KLSAgICBvbGRDaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKDAp
OwotICAgIG9sZENoaWxkLT5zZXROZXh0U2libGluZygwKTsKLSAgICBvbGRDaGlsZC0+c2V0UGFy
ZW50KDApOwotCi0gICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICBnZXREb2N1bWVudCgp
LT5zZXREb2N1bWVudENoYW5nZWQodHJ1ZSk7Ci0KLSAgICAvLyBEaXNwYXRjaCBwb3N0LXJlbW92
YWwgbXV0YXRpb24gZXZlbnRzCi0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwot
Ci0gICAgaWYgKG9sZENoaWxkLT5pbkRvY3VtZW50KCkpCi0gICAgICAgIG9sZENoaWxkLT5yZW1v
dmVkRnJvbURvY3VtZW50KCk7Ci0gICAgZWxzZQotICAgICAgICBvbGRDaGlsZC0+cmVtb3ZlZEZy
b21UcmVlKHRydWUpOwotCi0gICAgcmV0dXJuIG9sZENoaWxkOwotfQotCi0vLyB0aGlzIGRpZmZl
cnMgZnJvbSBvdGhlciByZW1vdmUgZnVuY3Rpb25zIGJlY2F1c2UgaXQgZm9yY2libHkgcmVtb3Zl
cyBhbGwgdGhlIGNoaWxkcmVuLAotLy8gcmVnYXJkbGVzcyBvZiByZWFkLW9ubHkgc3RhdHVzIG9y
IGV2ZW50IGV4Y2VwdGlvbnMsIGUuZy4KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZUNo
aWxkcmVuKCkKLXsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICAKLSAgICBpZiAoIV9maXJzdCkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gZG8gYW55IHByZXAgd29yayBuZWVkZWQgYmVmb3JlIGFj
dHVhbGx5IHN0YXJ0aW5nIHRvIGRldGFjaAotICAgIC8vIGFuZCByZW1vdmUuLi4gZS5nLiBzdG9w
IGxvYWRpbmcgZnJhbWVzLCBmaXJlIHVubG9hZCBldmVudHMKLSAgICBmb3IgKG4gPSBfZmlyc3Q7
IG4gIT0gMDsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIHdpbGxSZW1vdmVDaGlsZChu
KTsKLSAgICAKLSAgICBmb3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAgd2hpbGUgKChuID0gX2Zp
cnN0KSAhPSAwKSB7Ci0gICAgICAgIE5vZGVJbXBsICpuZXh0ID0gbi0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgCi0gICAgICAgIG4tPnJlZigpOwotCi0gICAgICAgIGlmIChuLT5hdHRhY2hlZCgp
KQotICAgICAgICAgICAgbi0+ZGV0YWNoKCk7Ci0gICAgICAgIG4tPnNldFByZXZpb3VzU2libGlu
ZygwKTsKLSAgICAgICAgbi0+c2V0TmV4dFNpYmxpbmcoMCk7Ci0gICAgICAgIG4tPnNldFBhcmVu
dCgwKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChuLT5pbkRvY3VtZW50KCkpCi0gICAgICAgICAg
ICBuLT5yZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0KLSAgICAgICAgbi0+ZGVyZWYoKTsKLQotICAg
ICAgICBfZmlyc3QgPSBuZXh0OwotICAgIH0KLSAgICBfbGFzdCA9IDA7Ci0gICAgYWxsb3dFdmVu
dERpc3BhdGNoKCk7Ci0gICAgCi0gICAgLy8gRGlzcGF0Y2ggYSBzaW5nbGUgcG9zdC1yZW1vdmFs
IG11dGF0aW9uIGV2ZW50IGRlbm90aW5nIGEgbW9kaWZpZWQgc3VidHJlZS4KLSAgICBkaXNwYXRj
aFN1YnRyZWVNb2RpZmllZEV2ZW50KCk7Ci19Ci0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJ
bXBsOjphcHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICBleGNlcHRpb25jb2RlID0gMDsKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJv
dGVjdE5ld0NoaWxkKG5ld0NoaWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVm
J2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgLy8gTWFrZSBzdXJlIGFk
ZGluZyB0aGUgbmV3IGNoaWxkIGlzIG9rCi0gICAgY2hlY2tBZGRDaGlsZChuZXdDaGlsZCwgZXhj
ZXB0aW9uY29kZSk7Ci0gICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJldHVybiAwOwot
ICAgIAotICAgIGlmICggbmV3Q2hpbGQgPT0gX2xhc3QgKSAvLyBub3RoaW5nIHRvIGRvCi0JcmV0
dXJuIG5ld0NoaWxkOwotCi0gICAgYm9vbCBpc0ZyYWdtZW50ID0gbmV3Q2hpbGQtPm5vZGVUeXBl
KCkgPT0gTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQotICAgIC8vIElmIG5ld0NoaWxk
IGlzIGEgRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGNoaWxkcmVuLi4uLiB0aGVyZSdzIG5vdGhp
bmcgdG8gZG8uCi0gICAgLy8gSnVzdCByZXR1cm4gdGhlIGRvY3VtZW50IGZyYWdtZW50Ci0gICAg
aWYgKGlzRnJhZ21lbnQgJiYgIW5ld0NoaWxkLT5maXJzdENoaWxkKCkpCi0gICAgICAgIHJldHVy
biBuZXdDaGlsZDsKLQotICAgIC8vIE5vdyBhY3R1YWxseSBhZGQgdGhlIGNoaWxkKHJlbikKLSAg
ICBOb2RlSW1wbCAqbmV4dENoaWxkOwotICAgIE5vZGVJbXBsICpjaGlsZCA9IGlzRnJhZ21lbnQg
PyBuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpIDogbmV3Q2hpbGQ7Ci0KLSAgICB3aGlsZSAoY2hpbGQp
IHsKLSAgICAgICAgbmV4dENoaWxkID0gaXNGcmFnbWVudCA/IGNoaWxkLT5uZXh0U2libGluZygp
IDogMDsKLQotICAgICAgICAvLyBJZiBjaGlsZCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHRy
ZWUsIGZpcnN0IHJlbW92ZSBpdAotICAgICAgICBOb2RlSW1wbCAqb2xkUGFyZW50ID0gY2hpbGQt
PnBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYob2xkUGFyZW50KSB7Ci0gICAgICAgICAgICBvbGRQ
YXJlbnQtPnJlbW92ZUNoaWxkKCBjaGlsZCwgZXhjZXB0aW9uY29kZSApOwotICAgICAgICAgICAg
aWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBBcHBlbmQgY2hpbGQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAotICAgICAg
ICBmb3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAgICAgIGNoaWxkLT5zZXRQYXJlbnQodGhpcyk7
Ci0gICAgICAgIGlmIChfbGFzdCkgewotICAgICAgICAgICAgY2hpbGQtPnNldFByZXZpb3VzU2li
bGluZyhfbGFzdCk7Ci0gICAgICAgICAgICBfbGFzdC0+c2V0TmV4dFNpYmxpbmcoY2hpbGQpOwot
ICAgICAgICAgICAgX2xhc3QgPSBjaGlsZDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBf
Zmlyc3QgPSBfbGFzdCA9IGNoaWxkOwotICAgICAgICBhbGxvd0V2ZW50RGlzcGF0Y2goKTsKLQot
ICAgICAgICAvLyBBZGQgY2hpbGQgdG8gdGhlIHJlbmRlcmluZyB0cmVlCi0gICAgICAgIC8vICMj
IyBzaG91bGQgd2UgZGV0YWNoKCkgaXQgZmlyc3QgaWYgaXQncyBhbHJlYWR5IGF0dGFjaGVkPwot
ICAgICAgICBpZiAoYXR0YWNoZWQoKSAmJiAhY2hpbGQtPmF0dGFjaGVkKCkpCi0gICAgICAgICAg
ICBjaGlsZC0+YXR0YWNoKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBEaXNwYXRjaCB0aGUgbXV0
YXRpb24gZXZlbnRzCi0gICAgICAgIGRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyhjaGlsZCxl
eGNlcHRpb25jb2RlKTsKLQotICAgICAgICBjaGlsZCA9IG5leHRDaGlsZDsKLSAgICB9Ci0KLSAg
ICBnZXREb2N1bWVudCgpLT5zZXREb2N1bWVudENoYW5nZWQodHJ1ZSk7Ci0gICAgLy8gIyMjIHNl
dCBzdHlsZSBpbiBjYXNlIGl0J3MgYXR0YWNoZWQKLSAgICBkaXNwYXRjaFN1YnRyZWVNb2RpZmll
ZEV2ZW50KCk7Ci0gICAgcmV0dXJuIG5ld0NoaWxkOwotfQotCi1ib29sIENvbnRhaW5lck5vZGVJ
bXBsOjpoYXNDaGlsZE5vZGVzICggICkgY29uc3QKLXsKLSAgICByZXR1cm4gX2ZpcnN0ICE9IDA7
Ci19Ci0KLS8vIG5vdCBwYXJ0IG9mIHRoZSBET00KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnNl
dEZpcnN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKQotewotICAgIF9maXJzdCA9IGNoaWxkOwotfQot
Ci12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpzZXRMYXN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKQot
ewotICAgIF9sYXN0ID0gY2hpbGQ7Ci19Ci0KLS8vIGNoZWNrIGZvciBzYW1lIHNvdXJjZSBkb2N1
bWVudDoKLWJvb2wgQ29udGFpbmVyTm9kZUltcGw6OmNoZWNrU2FtZURvY3VtZW50KCBOb2RlSW1w
bCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgZXhjZXB0aW9uY29kZSA9
IDA7Ci0gICAgRG9jdW1lbnRJbXBsICpvd25lckRvY1RoaXMgPSBnZXREb2N1bWVudCgpOwotICAg
IC8vIEZJWE1FOiBEb2ghIFRoaXMgbmV4dCBsaW5lIGlzbid0IGdldHRpbmcgbmV3Q2hpbGQsIHNv
IGl0J3MgbmV2ZXIgZ29pbmcgdG8gd29yayEKLSAgICBEb2N1bWVudEltcGwgKm93bmVyRG9jTmV3
ID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZihvd25lckRvY1RoaXMgIT0gb3duZXJEb2NOZXcpIHsK
LSAgICAgICAga2REZWJ1Zyg2MDEwKTw8ICJub3Qgc2FtZSBkb2N1bWVudCwgbmV3Q2hpbGQgPSAi
IDw8IG5ld0NoaWxkIDw8ICJkb2N1bWVudCA9ICIgPDwgZ2V0RG9jdW1lbnQoKSA8PCBlbmRsOwot
ICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpXUk9OR19ET0NVTUVOVF9FUlI7
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8v
IGNoZWNrIGZvciBiZWluZyBjaGlsZDoKLWJvb2wgQ29udGFpbmVyTm9kZUltcGw6OmNoZWNrSXND
aGlsZCggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGlm
KCFvbGRDaGlsZCB8fCBvbGRDaGlsZC0+cGFyZW50Tm9kZSgpICE9IHRoaXMpIHsKLSAgICAgICAg
ZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotTm9kZUltcGwgKkNvbnRh
aW5lck5vZGVJbXBsOjphZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpCi17Ci0gICAgLy8gZG8g
bm90IGFkZCBhcHBseUNoYW5nZXMgaGVyZSEgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZHVy
aW5nIHBhcnNpbmcKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVjdE5ld0NoaWxkKG5ld0No
aWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28g
d2UgZG9uJ3QgbGVhayBpdAotCi0gICAgLy8gc2hvcnQgY2hlY2sgZm9yIGNvbnNpc3RlbmN5IHdp
dGggRFRECi0gICAgaWYgKGdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkgJiYgIWNoaWxk
QWxsb3dlZChuZXdDaGlsZCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8ganVzdCBhZGQg
aXQuLi4KLSAgICBmb3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAgbmV3Q2hpbGQtPnNldFBhcmVu
dCh0aGlzKTsKLSAgICBpZihfbGFzdCkgewotICAgICAgICBuZXdDaGlsZC0+c2V0UHJldmlvdXNT
aWJsaW5nKF9sYXN0KTsKLSAgICAgICAgX2xhc3QtPnNldE5leHRTaWJsaW5nKG5ld0NoaWxkKTsK
LSAgICAgICAgX2xhc3QgPSBuZXdDaGlsZDsKLSAgICB9IGVsc2UKLSAgICAgICAgX2ZpcnN0ID0g
X2xhc3QgPSBuZXdDaGlsZDsKLSAgICBhbGxvd0V2ZW50RGlzcGF0Y2goKTsKLQotICAgIGlmIChp
bkRvY3VtZW50KCkpCi0gICAgICAgIG5ld0NoaWxkLT5pbnNlcnRlZEludG9Eb2N1bWVudCgpOwot
ICAgIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIAotICAgIGlmKG5ld0NoaWxkLT5ub2RlVHlwZSgp
ID09IE5vZGU6OkVMRU1FTlRfTk9ERSkKLSAgICAgICAgcmV0dXJuIG5ld0NoaWxkOwotICAgIHJl
dHVybiB0aGlzOwotfQotCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjphdHRhY2goKQotewotICAg
IE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsKLSAgICB3aGlsZShjaGlsZCAhPSAwKQotICAgIHsK
LSAgICAgICAgY2hpbGQtPmF0dGFjaCgpOwotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2li
bGluZygpOwotICAgIH0KLSAgICBOb2RlSW1wbDo6YXR0YWNoKCk7Ci19Ci0KLXZvaWQgQ29udGFp
bmVyTm9kZUltcGw6OmRldGFjaCgpCi17Ci0gICAgTm9kZUltcGwgKmNoaWxkID0gX2ZpcnN0Owot
ICAgIHdoaWxlKGNoaWxkICE9IDApCi0gICAgewotICAgICAgICBOb2RlSW1wbCogcHJldiA9IGNo
aWxkOwotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICBwcmV2
LT5kZXRhY2goKTsKLSAgICB9Ci0gICAgTm9kZUltcGw6OmRldGFjaCgpOwotfQotCi12b2lkIENv
bnRhaW5lck5vZGVJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgTm9kZUltcGw6
Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBfZmly
c3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQotICAgICAgICBjaGlsZC0+
aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6cmVt
b3ZlZEZyb21Eb2N1bWVudCgpCi17Ci0gICAgTm9kZUltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQo
KTsKLSAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsgY2hpbGQ7IGNoaWxkID0gY2hp
bGQtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGNoaWxkLT5yZW1vdmVkRnJvbURvY3VtZW50KCk7
Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6Omluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVw
KQotewotICAgIE5vZGVJbXBsOjppbnNlcnRlZEludG9UcmVlKGRlZXApOwotICAgIGlmIChkZWVw
KSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKmNoaWxkID0gX2ZpcnN0OyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIGNoaWxkLT5pbnNlcnRlZEludG9U
cmVlKGRlZXApOwotICAgIH0KLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6cmVtb3ZlZEZy
b21UcmVlKGJvb2wgZGVlcCkKLXsKLSAgICBOb2RlSW1wbDo6cmVtb3ZlZEZyb21UcmVlKGRlZXAp
OwotICAgIGlmIChkZWVwKSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKmNoaWxkID0gX2ZpcnN0
OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIGNoaWxk
LT5yZW1vdmVkRnJvbVRyZWUoZGVlcCk7Ci0gICAgfQotfQotCi12b2lkIENvbnRhaW5lck5vZGVJ
bXBsOjpjbG9uZUNoaWxkTm9kZXMoTm9kZUltcGwgKmNsb25lKQotewotICAgIGludCBleGNlcHRp
b25jb2RlID0gMDsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IobiA9IGZpcnN0Q2hpbGQoKTsg
biAmJiAhZXhjZXB0aW9uY29kZTsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAg
ICBjbG9uZS0+YXBwZW5kQ2hpbGQobi0+Y2xvbmVOb2RlKHRydWUpLGV4Y2VwdGlvbmNvZGUpOwot
ICAgIH0KLX0KLQotYm9vbCBDb250YWluZXJOb2RlSW1wbDo6Z2V0VXBwZXJMZWZ0Q29ybmVyKGlu
dCAmeFBvcywgaW50ICZ5UG9zKSBjb25zdAotewotICAgIGlmICghbV9yZW5kZXIpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICBSZW5kZXJPYmplY3QgKm8gPSBtX3JlbmRlcjsKLSAgICBSZW5k
ZXJPYmplY3QgKnAgPSBvOwotCi0gICAgeFBvcyA9IHlQb3MgPSAwOwotICAgIGlmICghby0+aXNJ
bmxpbmUoKSB8fCBvLT5pc1JlcGxhY2VkKCkpIHsKLSAgICAgICAgby0+YWJzb2x1dGVQb3NpdGlv
biggeFBvcywgeVBvcyApOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBm
aW5kIHRoZSBuZXh0IHRleHQvaW1hZ2UgY2hpbGQsIHRvIGdldCBhIHBvc2l0aW9uCi0gICAgd2hp
bGUobykgewotICAgICAgICBwID0gbzsKLSAgICAgICAgaWYoby0+Zmlyc3RDaGlsZCgpKQotICAg
ICAgICAgICAgbyA9IG8tPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgZWxzZSBpZihvLT5uZXh0U2li
bGluZygpKQotICAgICAgICAgICAgbyA9IG8tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGVsc2Ug
ewotICAgICAgICAgICAgbyA9IG8tPnBhcmVudCgpOwotICAgICAgICAgICAgaWYgKG8pIAotICAg
ICAgICAgICAgICAgIG8gPSBvLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgaWYgKCFvKQot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvLT5pc0lu
bGluZSgpIHx8IG8tPmlzUmVwbGFjZWQoKSkgewotICAgICAgICAgICAgby0+YWJzb2x1dGVQb3Np
dGlvbiggeFBvcywgeVBvcyApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAocC0+ZWxlbWVudCgpICYmIHAtPmVsZW1lbnQoKSA9PSB0aGlzICYmIG8t
PmlzVGV4dCgpICYmICFvLT5pc0JSKCkgJiYgIXN0YXRpY19jYXN0PFJlbmRlclRleHQqPihvKS0+
Zmlyc3RUZXh0Qm94KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIC0gc2tpcCB1
bnJlbmRlcmVkIHdoaXRlc3BhY2UgdGhhdCBpcyBhIGNoaWxkIG9yIG5leHQgc2libGluZyBvZiB0
aGUgYW5jaG9yCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZigoby0+aXNUZXh0KCkgJiYgIW8t
PmlzQlIoKSkgfHwgby0+aXNSZXBsYWNlZCgpKSB7Ci0gICAgICAgICAgICBvLT5jb250YWluZXIo
KS0+YWJzb2x1dGVQb3NpdGlvbiggeFBvcywgeVBvcyApOwotICAgICAgICAgICAgaWYgKG8tPmlz
VGV4dCgpICYmIHN0YXRpY19jYXN0PFJlbmRlclRleHQgKj4obyktPmZpcnN0VGV4dEJveCgpKSB7
Ci0gICAgICAgICAgICAgICAgeFBvcyArPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0ICo+KG8pLT5t
aW5YUG9zKCk7Ci0gICAgICAgICAgICAgICAgeVBvcyArPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0
ICo+KG8pLT5maXJzdFRleHRCb3goKS0+cm9vdCgpLT50b3BPdmVyZmxvdygpOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgeFBvcyArPSBvLT54UG9z
KCk7Ci0gICAgICAgICAgICAgICAgeVBvcyArPSBvLT55UG9zKCk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBJ
ZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gb3Igc2libGluZ3MgdGhhdCBj
b3VsZCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3ZSBtdXN0IGJl
Ci0gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuICBTY3JvbGwgdG8gdGhlIGJvdHRv
bS4KLSAgICBpZiAoIW8pIHsKLSAgICAgICAgeVBvcyArPSBnZXREb2N1bWVudCgpLT52aWV3KCkt
PmNvbnRlbnRzSGVpZ2h0KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ29udGFpbmVyTm9kZUltcGw6OmdldExvd2VyUmlnaHRDb3Ju
ZXIoaW50ICZ4UG9zLCBpbnQgJnlQb3MpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3JlbmRlcikKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgUmVuZGVyT2JqZWN0ICpvID0gbV9yZW5kZXI7Ci0g
ICAgeFBvcyA9IHlQb3MgPSAwOwotICAgIGlmICghby0+aXNJbmxpbmUoKSB8fCBvLT5pc1JlcGxh
Y2VkKCkpCi0gICAgewotICAgICAgICBvLT5hYnNvbHV0ZVBvc2l0aW9uKCB4UG9zLCB5UG9zICk7
Ci0gICAgICAgIHhQb3MgKz0gby0+d2lkdGgoKTsKLSAgICAgICAgeVBvcyArPSBvLT5oZWlnaHQo
KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIGZpbmQgdGhlIGxhc3QgdGV4
dC9pbWFnZSBjaGlsZCwgdG8gZ2V0IGEgcG9zaXRpb24KLSAgICB3aGlsZShvKSB7Ci0gICAgICAg
IGlmKG8tPmxhc3RDaGlsZCgpKQotICAgICAgICAgICAgbyA9IG8tPmxhc3RDaGlsZCgpOwotICAg
ICAgICBlbHNlIGlmKG8tPnByZXZpb3VzU2libGluZygpKQotICAgICAgICAgICAgbyA9IG8tPnBy
ZXZpb3VzU2libGluZygpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJlbmRlck9iamVj
dCAqcHJldiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSghcHJldikgewotICAgICAgICAgICAgICAg
IG8gPSBvLT5wYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZighbykgcmV0dXJuIGZhbHNlOwot
ICAgICAgICAgICAgICAgIHByZXYgPSBvLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIG8gPSBwcmV2OwotICAgICAgICB9Ci0gICAgICAgIGlmKG8tPmlzVGV4
dCgpIHx8IG8tPmlzUmVwbGFjZWQoKSkgewotICAgICAgICAgICAgby0+Y29udGFpbmVyKCktPmFi
c29sdXRlUG9zaXRpb24oeFBvcywgeVBvcyk7Ci0gICAgICAgICAgICBpZiAoby0+aXNUZXh0KCkp
Ci0gICAgICAgICAgICAgICAgeFBvcyArPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0ICo+KG8pLT5t
aW5YUG9zKCkgKyBvLT53aWR0aCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IHhQb3MgKz0gby0+eFBvcygpK28tPndpZHRoKCk7Ci0gICAgICAgICAgICB5UG9zICs9IG8tPnlQ
b3MoKStvLT5oZWlnaHQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0g
ICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1JbnRSZWN0IENvbnRhaW5lck5vZGVJbXBsOjpn
ZXRSZWN0KCkgY29uc3QKLXsKLSAgICBpbnQgeFBvcyA9IDAsIHlQb3MgPSAwLCB4RW5kID0gMCwg
eUVuZCA9IDA7Ci0gICAgYm9vbCBmb3VuZFVwcGVyTGVmdCA9IGdldFVwcGVyTGVmdENvcm5lcih4
UG9zLHlQb3MpOwotICAgIGJvb2wgZm91bmRMb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodENvcm5l
cih4RW5kLHlFbmQpOwotICAgIAotICAgIC8vIElmIHdlJ3ZlIGZvdW5kIG9uZSBjb3JuZXIsIGJ1
dCBub3QgdGhlIG90aGVyLAotICAgIC8vIHRoZW4gd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIGEgcG9p
bnQgYXQgdGhlIGNvcm5lciB0aGF0IHdlIGRpZCBmaW5kLgotICAgIGlmIChmb3VuZFVwcGVyTGVm
dCAhPSBmb3VuZExvd2VyUmlnaHQpCi0gICAgewotICAgICAgICBpZiAoZm91bmRVcHBlckxlZnQp
IHsKLSAgICAgICAgICAgIHhFbmQgPSB4UG9zOwotICAgICAgICAgICAgeUVuZCA9IHlQb3M7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4UG9zID0geEVuZDsKLSAgICAgICAgICAgIHlQ
b3MgPSB5RW5kOwotICAgICAgICB9Ci0gICAgfSAKLQotICAgIGlmICh4RW5kIDwgeFBvcykKLSAg
ICAgICAgeEVuZCA9IHhQb3M7Ci0gICAgaWYgKHlFbmQgPCB5UG9zKQotICAgICAgICB5RW5kID0g
eVBvczsKLSAgICAgICAgCi0gICAgcmV0dXJuIEludFJlY3QoeFBvcywgeVBvcywgeEVuZCAtIHhQ
b3MsIHlFbmQgLSB5UG9zKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0Rm9jdXMo
Ym9vbCByZWNlaXZlZCkKLXsKLSAgICBpZiAobV9mb2N1c2VkID09IHJlY2VpdmVkKSByZXR1cm47
Ci0KLSAgICBOb2RlSW1wbDo6c2V0Rm9jdXMocmVjZWl2ZWQpOwotCi0gICAgLy8gbm90ZSB0aGF0
IHdlIG5lZWQgdG8gcmVjYWxjIHRoZSBzdHlsZQotICAgIHNldENoYW5nZWQoKTsKLX0KLQotdm9p
ZCBDb250YWluZXJOb2RlSW1wbDo6c2V0QWN0aXZlKGJvb2wgZG93biwgYm9vbCBwYXVzZSkKLXsK
LSAgICBpZiAoZG93biA9PSBhY3RpdmUoKSkgcmV0dXJuOwotCi0gICAgTm9kZUltcGw6OnNldEFj
dGl2ZShkb3duKTsKLQotICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2FsYyB0aGUgc3R5
bGUKLSAgICAvLyBGSVhNRTogTW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlmIChtX3JlbmRlcikg
ewotICAgICAgICBib29sIHJlYWN0c1RvUHJlc3MgPSBtX3JlbmRlci0+c3R5bGUoKS0+YWZmZWN0
ZWRCeUFjdGl2ZVJ1bGVzKCk7Ci0gICAgICAgIGlmIChyZWFjdHNUb1ByZXNzKQotICAgICAgICAg
ICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5z
dHlsZSgpLT5oYXNBcHBlYXJhbmNlKCkpIHsKLSAgICAgICAgICAgIGlmICh0aGVtZSgpLT5zdGF0
ZUNoYW5nZWQocmVuZGVyZXIoKSwgUHJlc3NlZFN0YXRlKSkKLSAgICAgICAgICAgICAgICByZWFj
dHNUb1ByZXNzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhY3RzVG9QcmVzcyAm
JiBwYXVzZSkgewotICAgICAgICAgICAgLy8gVGhlIGRlbGF5IGhlcmUgaXMgc3VidGxlLiAgSXQg
cmVsaWVzIG9uIGFuIGFzc3VtcHRpb24sIG5hbWVseSB0aGF0IHRoZSBhbW91bnQgb2YgdGltZSBp
dCB0YWtlcwotICAgICAgICAgICAgLy8gdG8gcmVwYWludCB0aGUgImRvd24iIHN0YXRlIG9mIHRo
ZSBjb250cm9sIGlzIGFib3V0IHRoZSBzYW1lIHRpbWUgYXMgaXQgd291bGQgdGFrZSB0byByZXBh
aW50IHRoZQotICAgICAgICAgICAgLy8gInVwIiBzdGF0ZS4gIE9uY2UgeW91IGFzc3VtZSB0aGlz
LCB5b3UgY2FuIGp1c3QgZGVsYXkgZm9yIDEwMG1zIC0gdGhhdCB0aW1lIChhc3N1bWluZyB0aGF0
IGFmdGVyIHlvdQotICAgICAgICAgICAgLy8gbGVhdmUgdGhpcyBtZXRob2QsIGl0IHdpbGwgYmUg
YWJvdXQgdGhhdCBsb25nIGJlZm9yZSB0aGUgZmx1c2ggb2YgdGhlIHVwIHN0YXRlIGhhcHBlbnMg
YWdhaW4pLgotICAgICAgICAgICAgUVRpbWUgc3RhcnRUaW1lOwotICAgICAgICAgICAgc3RhcnRU
aW1lLnJlc3RhcnQoKTsKLQotICAgICAgICAgICAgLy8gRG8gYW4gaW1tZWRpYXRlIHJlcGFpbnQu
Ci0gICAgICAgICAgICBtX3JlbmRlci0+cmVwYWludCh0cnVlKTsKLSAgICAgICAgICAgIAotI2lm
ICFXSU4zMgotICAgICAgICAgICAgLy8gRklYTUU6IEZpbmQgYSBzdWJzdGl0dXRlIGZvciB1c2xl
ZXAuICBCZXR0ZXIgeWV0LCBjb21lIHVwIHdpdGggYSB3YXkgb2YgZG9pbmcgdGhpcyB0aGF0IAot
ICAgICAgICAgICAgLy8gZG9lc24ndCB1c2UgdXNsZWVwIGF0IGFsbC4KLSAgICAgICAgICAgIGlu
dCByZW1haW5pbmdUaW1lID0gMTAwIC0gc3RhcnRUaW1lLmVsYXBzZWQoKTsKLSAgICAgICAgICAg
IAotICAgICAgICAgICAgLy8gTm93IHBhdXNlIGZvciBhIHNtYWxsIGFtb3VudCBvZiB0aW1lICgx
LzEwdGggb2YgYSBzZWNvbmQgZnJvbSBiZWZvcmUgd2UgcmVwYWludGVkIGluIHRoZSBwcmVzc2Vk
IHN0YXRlKQotICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWUgPiAwKQotICAgICAgICAgICAg
ICAgIHVzbGVlcChyZW1haW5pbmdUaW1lICogMTAwMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAg
IH0KLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0SG92ZXJlZChib29sIG92ZXIpCi17
Ci0gICAgaWYgKG92ZXIgPT0gaG92ZXJlZCgpKSByZXR1cm47Ci0KLSAgICBOb2RlSW1wbDo6c2V0
SG92ZXJlZChvdmVyKTsKLQotICAgIC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2FsYyB0aGUg
c3R5bGUKLSAgICAvLyBGSVhNRTogTW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlmIChtX3JlbmRl
cikgewotICAgICAgICBpZiAobV9yZW5kZXItPnN0eWxlKCktPmFmZmVjdGVkQnlIb3ZlclJ1bGVz
KCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYm
IHJlbmRlcmVyKCktPnN0eWxlKCktPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgIHRoZW1l
KCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBIb3ZlclN0YXRlKTsKLSAgICB9Ci19Ci0KLXVu
c2lnbmVkIENvbnRhaW5lck5vZGVJbXBsOjpjaGlsZE5vZGVDb3VudCgpIGNvbnN0Ci17Ci0gICAg
dW5zaWduZWQgY291bnQgPSAwOwotICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0
Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGNvdW50Kys7Ci0gICAg
cmV0dXJuIGNvdW50OwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OmNoaWxkTm9k
ZSh1bnNpZ25lZCBpbmRleCkKLXsKLSAgICB1bnNpZ25lZCBpOwotICAgIE5vZGVJbXBsICpuID0g
Zmlyc3RDaGlsZCgpOwotICAgIGZvciAoaSA9IDA7IG4gIT0gMCAmJiBpIDwgaW5kZXg7IGkrKykK
LSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXZvaWQg
Q29udGFpbmVyTm9kZUltcGw6OmRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyggTm9kZUltcGwg
KmNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRj
aEZvcmJpZGRlbigpKTsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBjaGlsZC0+aW5z
ZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICAgIGNoaWxkLT5pbnNlcnRlZElu
dG9UcmVlKHRydWUpOwotCi0gICAgaWYgKGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShE
b2N1bWVudEltcGw6OkRPTU5PREVJTlNFUlRFRF9MSVNURU5FUikpIHsKLSAgICAgICAgY2hpbGQt
PmRpc3BhdGNoRXZlbnQobmV3IE11dGF0aW9uRXZlbnRJbXBsKERPTU5vZGVJbnNlcnRlZEV2ZW50
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1
ZSxmYWxzZSx0aGlzLERPTVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2Vw
dGlvbmNvZGUsdHJ1ZSk7Ci0gICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlSW5zZXJ0ZWRJbnRv
RG9jdW1lbnQgZXZlbnQgdG8gYWxsIGRlc2NlbmRhbnRzCi0gICAgYm9vbCBoYXNJbnNlcnRlZExp
c3RlbmVycyA9IGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRP
TU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUik7Ci0KLSAgICBpZiAoaGFzSW5zZXJ0
ZWRMaXN0ZW5lcnMgJiYgaW5Eb2N1bWVudCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKmMg
PSBjaGlsZDsgYzsgYyA9IGMtPnRyYXZlcnNlTmV4dE5vZGUoY2hpbGQpKSB7Ci0gICAgICAgICAg
ICBjLT5kaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlSW5zZXJ0ZWRJ
bnRvRG9jdW1lbnRFdmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGZhbHNlLGZhbHNlLDAsRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3Ry
aW5nKCksMCksZXhjZXB0aW9uY29kZSx0cnVlKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25j
b2RlKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8g
YmFzZSBjbGFzcyBmb3Igbm9kZXMgdGhhdCBtYXkgaGF2ZSBjaGlsZHJlbgotdm9pZCBDb250YWlu
ZXJOb2RlSW1wbDo6ZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwg
aW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICAvLyB1cGRhdGUgYXV4aWxpYXJ5IGRvYyBpbmZv
IChlLmcuIGl0ZXJhdG9ycykgdG8gbm90ZSB0aGF0IG5vZGUgaXMgYmVpbmcgcmVtb3ZlZAotICAg
IGdldERvY3VtZW50KCktPm5vdGlmeUJlZm9yZU5vZGVSZW1vdmFsKGNoaWxkKTsgLy8gIyMjIHVz
ZSBldmVudHMgaW5zdGVhZAotCi0gICAgLy8gZGlzcGF0Y2ggcHJlLXJlbW92YWwgbXV0YXRpb24g
ZXZlbnRzCi0gICAgaWYgKGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudElt
cGw6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSKSkgewotCWNoaWxkLT5kaXNwYXRjaEV2ZW50KG5l
dyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlUmVtb3ZlZEV2ZW50LAotCQkJICAgICB0cnVlLGZh
bHNlLHRoaXMsRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9u
Y29kZSx0cnVlKTsKLQlpZiAoZXhjZXB0aW9uY29kZSkKLQkgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGJvb2wgaGFzUmVtb3ZhbExpc3RlbmVycyA9IGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVy
VHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsK
LQotICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCBldmVudCB0
byBhbGwgZGVzY2VuZGFudHMKLSAgICBpZiAoaW5Eb2N1bWVudCgpKSB7Ci0JZm9yIChOb2RlSW1w
bCAqYyA9IGNoaWxkOyBjOyBjID0gYy0+dHJhdmVyc2VOZXh0Tm9kZShjaGlsZCkpIHsKLQkgICAg
aWYgKGhhc1JlbW92YWxMaXN0ZW5lcnMpIHsKLQkJYy0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRp
b25FdmVudEltcGwoRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCwKLQkJCQkgZmFsc2Us
ZmFsc2UsMCxET01TdHJpbmcoKSxET01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNlcHRpb25j
b2RlLHRydWUpOwotCQlpZiAoZXhjZXB0aW9uY29kZSkKLQkJICAgIHJldHVybjsKLQkgICAgfQot
CX0KLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLU5vZGVMaXN0SW1wbDo6
Tm9kZUxpc3RJbXBsKE5vZGVJbXBsICpfcm9vdE5vZGUpCi0gICAgOiByb290Tm9kZShfcm9vdE5v
ZGUpLAotICAgICAgaXNMZW5ndGhDYWNoZVZhbGlkKGZhbHNlKSwKLSAgICAgIGlzSXRlbUNhY2hl
VmFsaWQoZmFsc2UpCi17Ci0gICAgcm9vdE5vZGUtPnJlZigpOwotICAgIHJvb3ROb2RlLT5yZWdp
c3Rlck5vZGVMaXN0KHRoaXMpOwotfSAgICAKLQotTm9kZUxpc3RJbXBsOjp+Tm9kZUxpc3RJbXBs
KCkKLXsKLSAgICByb290Tm9kZS0+dW5yZWdpc3Rlck5vZGVMaXN0KHRoaXMpOwotICAgIHJvb3RO
b2RlLT5kZXJlZigpOwotfQotCi11bnNpZ25lZCBOb2RlTGlzdEltcGw6OnJlY3Vyc2l2ZUxlbmd0
aCggTm9kZUltcGwgKnN0YXJ0ICkgY29uc3QKLXsKLSAgICBpZiAoIXN0YXJ0KQotCXN0YXJ0ID0g
cm9vdE5vZGU7Ci0KLSAgICBpZiAoaXNMZW5ndGhDYWNoZVZhbGlkICYmIHN0YXJ0ID09IHJvb3RO
b2RlKSB7Ci0gICAgICAgIHJldHVybiBjYWNoZWRMZW5ndGg7Ci0gICAgfQotCi0gICAgdW5zaWdu
ZWQgbGVuID0gMDsKLQotICAgIGZvcihOb2RlSW1wbCAqbiA9IHN0YXJ0LT5maXJzdENoaWxkKCk7
IG4gIT0gMDsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCBuLT5ub2RlVHlw
ZSgpID09IE5vZGU6OkVMRU1FTlRfTk9ERSApIHsKLSAgICAgICAgICAgIGlmIChub2RlTWF0Y2hl
cyhuKSkKLSAgICAgICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgIGxlbis9IHJlY3Vyc2l2
ZUxlbmd0aChuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdGFydCA9PSByb290Tm9k
ZSkgewotICAgICAgICBjYWNoZWRMZW5ndGggPSBsZW47Ci0gICAgICAgIGlzTGVuZ3RoQ2FjaGVW
YWxpZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotTm9kZUltcGwgKk5v
ZGVMaXN0SW1wbDo6cmVjdXJzaXZlSXRlbSAoIHVuc2lnbmVkIG9mZnNldCwgTm9kZUltcGwgKnN0
YXJ0KSBjb25zdAotewotICAgIGludCByZW1haW5pbmdPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgaWYg
KCFzdGFydCkgewotICAgICAgICBzdGFydCA9IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7Ci0gICAg
ICAgIGlmIChpc0l0ZW1DYWNoZVZhbGlkKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID09IGxh
c3RJdGVtT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RJdGVtOwotICAgICAg
ICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPiBsYXN0SXRlbU9mZnNldCkgewotICAgICAgICAgICAg
ICAgIHN0YXJ0ID0gbGFzdEl0ZW07Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nT2Zmc2V0IC09
IGxhc3RJdGVtT2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAg
Tm9kZUltcGwgKm4gPSBzdGFydDsKLQotICAgIHdoaWxlIChuKSB7Ci0gICAgICAgIGlmICggbi0+
bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUgKSB7Ci0gICAgICAgICAgICBpZiAobm9k
ZU1hdGNoZXMobikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlbWFpbmluZ09mZnNldCkgewot
ICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IG47Ci0gICAgICAgICAgICAgICAgICAgIGxh
c3RJdGVtT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBpc0l0ZW1DYWNoZVZh
bGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIHJlbWFpbmluZ09mZnNldC0tOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUocm9vdE5vZGUpOwot
ICAgIH0KLQotICAgIHJldHVybiAwOyAvLyBubyBtYXRjaGluZyBub2RlIGluIHRoaXMgc3VidHJl
ZQotfQotCi1Ob2RlSW1wbCAqTm9kZUxpc3RJbXBsOjppdGVtQnlJZCAoY29uc3QgRE9NU3RyaW5n
JiBlbGVtZW50SWQpIGNvbnN0Ci17Ci0gICAgaWYgKHJvb3ROb2RlLT5pc0RvY3VtZW50Tm9kZSgp
IHx8IHJvb3ROb2RlLT5pbkRvY3VtZW50KCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSBy
b290Tm9kZS0+Z2V0RG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKLQotICAg
ICAgICBpZiAobm9kZSA9PSBOVUxMIHx8ICFub2RlTWF0Y2hlcyhub2RlKSkKLSAgICAgICAgICAg
IHJldHVybiAwOwotCi0gICAgICAgIGZvciAoTm9kZUltcGwgKnAgPSBub2RlLT5wYXJlbnROb2Rl
KCk7IHA7IHAgPSBwLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgICAgIGlmIChwID09IHJvb3RO
b2RlKQotICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0KLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbCA9IGxlbmd0aCgpOwotCi0gICAgZm9y
ICggdW5zaWduZWQgaSA9IDA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgIE5vZGVJbXBsICpub2Rl
ID0gaXRlbShpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICggc3RhdGljX2Nhc3Q8RWxlbWVudElt
cGwgKj4obm9kZSktPmdldElEQXR0cmlidXRlKCkgPT0gZWxlbWVudElkICkgewotICAgICAgICAg
ICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQot
Ci12b2lkIE5vZGVMaXN0SW1wbDo6cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKQotewotICAgIGlz
TGVuZ3RoQ2FjaGVWYWxpZCA9IGZhbHNlOwotICAgIGlzSXRlbUNhY2hlVmFsaWQgPSBmYWxzZTsg
ICAgIAotICAgIGxhc3RJdGVtID0gMDsKLX0KLQotQ2hpbGROb2RlTGlzdEltcGw6OkNoaWxkTm9k
ZUxpc3RJbXBsKCBOb2RlSW1wbCAqbiApCi0gICAgOiBOb2RlTGlzdEltcGwobikKLXsKLX0KLQot
dW5zaWduZWQgQ2hpbGROb2RlTGlzdEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaWYgKGlz
TGVuZ3RoQ2FjaGVWYWxpZCkKLSAgICAgICAgcmV0dXJuIGNhY2hlZExlbmd0aDsKLQotICAgIHVu
c2lnbmVkIGxlbiA9IDA7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSByb290Tm9kZS0+
Zmlyc3RDaGlsZCgpOyBuICE9IDA7IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBsZW4r
KzsKLQotICAgIGNhY2hlZExlbmd0aCA9IGxlbjsKLSAgICBpc0xlbmd0aENhY2hlVmFsaWQgPSB0
cnVlOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotTm9kZUltcGwgKkNoaWxkTm9kZUxpc3RJbXBs
OjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdAotewotICAgIHVuc2lnbmVkIGludCBwb3Mg
PSAwOwotICAgIE5vZGVJbXBsICpuID0gcm9vdE5vZGUtPmZpcnN0Q2hpbGQoKTsKLQotICAgIGlm
IChpc0l0ZW1DYWNoZVZhbGlkKSB7Ci0gICAgICAgIGlmIChpbmRleCA9PSBsYXN0SXRlbU9mZnNl
dCkgewotICAgICAgICAgICAgcmV0dXJuIGxhc3RJdGVtOwotICAgICAgICB9IGVsc2UgaWYgKGlu
ZGV4ID4gbGFzdEl0ZW1PZmZzZXQpIHsKLSAgICAgICAgICAgIG4gPSBsYXN0SXRlbTsKLSAgICAg
ICAgICAgIHBvcyA9IGxhc3RJdGVtT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hp
bGUgKG4gJiYgcG9zIDwgaW5kZXgpIHsKLSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0g
ICAgICAgIHBvcysrOwotICAgIH0KLQotICAgIGlmIChuKSB7Ci0gICAgICAgIGxhc3RJdGVtID0g
bjsKLSAgICAgICAgbGFzdEl0ZW1PZmZzZXQgPSBwb3M7Ci0gICAgICAgIGlzSXRlbUNhY2hlVmFs
aWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0K
LQotYm9vbCBDaGlsZE5vZGVMaXN0SW1wbDo6bm9kZU1hdGNoZXMoTm9kZUltcGwgKnRlc3ROb2Rl
KSBjb25zdAotewotICAgIHJldHVybiB0ZXN0Tm9kZS0+cGFyZW50Tm9kZSgpID09IHJvb3ROb2Rl
OwotfQotCi1UYWdOb2RlTGlzdEltcGw6OlRhZ05vZGVMaXN0SW1wbChOb2RlSW1wbCAqbiwgY29u
c3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxO
YW1lKQotICAgIDogTm9kZUxpc3RJbXBsKG4pLCAKLSAgICAgIG1fbmFtZXNwYWNlVVJJKG5hbWVz
cGFjZVVSSSksIAotICAgICAgbV9sb2NhbE5hbWUobG9jYWxOYW1lKQotewotfQotCi11bnNpZ25l
ZCBUYWdOb2RlTGlzdEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlY3Vyc2l2
ZUxlbmd0aCgpOwotfQotCi1Ob2RlSW1wbCAqVGFnTm9kZUxpc3RJbXBsOjppdGVtKHVuc2lnbmVk
IGluZGV4KSBjb25zdAotewotICAgIHJldHVybiByZWN1cnNpdmVJdGVtKGluZGV4KTsKLX0KLQot
Ym9vbCBUYWdOb2RlTGlzdEltcGw6Om5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29u
c3QKLXsKLSAgICBpZiAoIXRlc3ROb2RlLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIGlmIChtX25hbWVzcGFjZVVSSSAhPSBzdGFyQXRvbSAmJiBtX25hbWVz
cGFjZVVSSSAhPSB0ZXN0Tm9kZS0+bmFtZXNwYWNlVVJJKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAKLSAgICByZXR1cm4gbV9sb2NhbE5hbWUgPT0gc3RhckF0b20gfHwgbV9sb2NhbE5h
bWUgPT0gdGVzdE5vZGUtPmxvY2FsTmFtZSgpOwotfQotCi1OYW1lTm9kZUxpc3RJbXBsOjpOYW1l
Tm9kZUxpc3RJbXBsKE5vZGVJbXBsICpuLCBjb25zdCBET01TdHJpbmcgJnQgKQotICA6IE5vZGVM
aXN0SW1wbChuKSwgbm9kZU5hbWUodCkKLXsKLX0KLQotdW5zaWduZWQgTmFtZU5vZGVMaXN0SW1w
bDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVjdXJzaXZlTGVuZ3RoKCk7Ci19Ci0K
LU5vZGVJbXBsICpOYW1lTm9kZUxpc3RJbXBsOjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25z
dAotewotICAgIHJldHVybiByZWN1cnNpdmVJdGVtKCBpbmRleCApOwotfQotCi1ib29sIE5hbWVO
b2RlTGlzdEltcGw6Om5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3QKLXsKLSAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4odGVzdE5vZGUpLT5nZXRBdHRyaWJ1
dGUobmFtZUF0dHIpID09IG5vZGVOYW1lOwotfQotCi19CkluZGV4OiBraHRtbC94bWwvRG9jdW1l
bnRUeXBlSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9Eb2N1bWVudFR5cGVJbXBsLmgJ
KHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwveG1sL0RvY3VtZW50VHlwZUltcGwuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjUsMTAgKzI1LDExIEBACiAjaWZuZGVmIERPTV9Eb2N1bWVudFR5cGVJbXBs
X2gKICNkZWZpbmUgRE9NX0RvY3VtZW50VHlwZUltcGxfaAogCi0jaW5jbHVkZSAiZG9tX25vZGVp
bXBsLmgiCisjaW5jbHVkZSAiTm9kZUltcGwuaCIKIAogbmFtZXNwYWNlIERPTSB7CiAKK2NsYXNz
IE5hbWVkTm9kZU1hcEltcGw7CiBjbGFzcyBET01JbXBsZW1lbnRhdGlvbkltcGw7CiAKIGNsYXNz
IERvY3VtZW50VHlwZUltcGwgOiBwdWJsaWMgTm9kZUltcGwKSW5kZXg6IGtodG1sL3htbC9Ob2Rl
SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL05vZGVJbXBsLmNwcAkocmV2aXNpb24g
MTIwNjMpCisrKyBraHRtbC94bWwvTm9kZUltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw0
NCArMjMsMzIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAieG1sL2Rv
bV9ub2RlaW1wbC5oIgotCi0jaW5jbHVkZSAiZG9tL2RvbV9leGNlcHRpb24uaCIKLSNpbmNsdWRl
ICJkb20vZG9tMl9ldmVudHMuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX2VsZW1lbnRpbXBsLmgiCi0j
aW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2lt
cGwuaCIKKyNpbmNsdWRlICJOb2RlSW1wbC5oIgogI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgog
I2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uSW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21fcG9z
aXRpb24uaCIKLSNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwuaCIKLSNpbmNsdWRlICJ4bWwv
RXZlbnROYW1lcy5oIgotI2luY2x1ZGUgImNzcy9jc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJjc3Mv
Y3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImVkaXRpbmcvaHRtbGVkaXRpbmcuaCIKLSNp
bmNsdWRlICJlZGl0aW5nL2h0bWxfaW50ZXJjaGFuZ2UuaCIKLSNpbmNsdWRlICJlZGl0aW5nL1Nl
bGVjdGlvbkNvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotCi0jaW5jbHVkZSAi
cmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuaCIKLSNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCi0j
aW5jbHVkZSAicmVuZGVyX3RoZW1lLmgiCi0KLSNpbmNsdWRlICJlY21hL2tqc19iaW5kaW5nLmgi
Ci0jaW5jbHVkZSAiZWNtYS9ranNfcHJveHkuaCIKKyNpbmNsdWRlICJkb21fZXhjZXB0aW9uLmgi
CisjaW5jbHVkZSAiZG9tX25vZGUuaCIKKyNpbmNsdWRlICJkb20yX2V2ZW50cy5oIgorI2luY2x1
ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgorI2luY2x1ZGUgImRvbV9hdG9taWNzdHJpbmcuaCIKKyNp
bmNsdWRlICJDaGlsZE5vZGVMaXN0SW1wbC5oIgorI2luY2x1ZGUgImRvbV90ZXh0aW1wbC5oIgor
I2luY2x1ZGUgInJlbmRlcl9vYmplY3QuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNs
dWRlICJGcmFtZS5oIgogCi0vLyBGSVhNRTogU2hvdWxkIG5vdCBoYXZlIHRvIGluY2x1ZGUgdGhp
cy4gIEN1dCB0aGUgSFRNTCBkZXBlbmRlbmN5IQorI2luY2x1ZGUgImtqc19wcm94eS5oIgorI2lu
Y2x1ZGUgImtqc19iaW5kaW5nLmgiCisKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5jbHVk
ZSAiaHRtbG5hbWVzLmgiCiAKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0jaW5jbHVkZSAieGJsL3hi
bF9iaW5kaW5nX21hbmFnZXIuaCIKLSNlbmRpZgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisK
KyNpbmNsdWRlICJxcHRybGlzdC5oIgorI2luY2x1ZGUgInF0ZXh0c3RyZWFtLmgiCiAKICNpbmNs
dWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+Ci0jaW5jbHVkZSAiS1dRTG9nZ2luZy5oIgogCiB1
c2luZyBuYW1lc3BhY2Uga2h0bWw7CiAKQEAgLTkwLDYgKzc4LDM1IEBAIHByb3RlY3RlZDoKICAg
ICBBdG9taWNTdHJpbmcgbV9sb2NhbE5hbWU7CiB9OwogCitUYWdOb2RlTGlzdEltcGw6OlRhZ05v
ZGVMaXN0SW1wbChOb2RlSW1wbCAqbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkks
IGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKQorICAgIDogTm9kZUxpc3RJbXBsKG4pLCAK
KyAgICAgIG1fbmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSksIAorICAgICAgbV9sb2NhbE5hbWUo
bG9jYWxOYW1lKQoreworfQorCit1bnNpZ25lZCBUYWdOb2RlTGlzdEltcGw6Omxlbmd0aCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHJlY3Vyc2l2ZUxlbmd0aCgpOworfQorCitOb2RlSW1wbCAqVGFn
Tm9kZUxpc3RJbXBsOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBy
ZWN1cnNpdmVJdGVtKGluZGV4KTsKK30KKworYm9vbCBUYWdOb2RlTGlzdEltcGw6Om5vZGVNYXRj
aGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3QKK3sKKyAgICBpZiAoIXRlc3ROb2RlLT5pc0Vs
ZW1lbnROb2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX25hbWVzcGFj
ZVVSSSAhPSBzdGFyQXRvbSAmJiBtX25hbWVzcGFjZVVSSSAhPSB0ZXN0Tm9kZS0+bmFtZXNwYWNl
VVJJKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICByZXR1cm4gbV9sb2NhbE5h
bWUgPT0gc3RhckF0b20gfHwgbV9sb2NhbE5hbWUgPT0gdGVzdE5vZGUtPmxvY2FsTmFtZSgpOwor
fQorCisKICNpZm5kZWYgTkRFQlVHCiBzdHJ1Y3QgTm9kZUltcGxDb3VudGVyIHsgCiAgICAgc3Rh
dGljIGludCBjb3VudDsgCkBAIC05OCwxNSArMTE1LDcgQEAgc3RydWN0IE5vZGVJbXBsQ291bnRl
ciB7IAogaW50IE5vZGVJbXBsQ291bnRlcjo6Y291bnQgPSAwOwogc3RhdGljIE5vZGVJbXBsQ291
bnRlciBub2RlSW1wbENvdW50ZXI7CiAKLXN0YXRpYyBpbnQgZ0V2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW47Ci0jZGVmaW5lIGZvcmJpZEV2ZW50RGlzcGF0Y2goKSBnRXZlbnREaXNwYXRjaEZvcmJpZGRl
biArPSAxCi0jZGVmaW5lIGFsbG93RXZlbnREaXNwYXRjaCgpIGFzc2VydChnRXZlbnREaXNwYXRj
aEZvcmJpZGRlbiA+IDApOyBnRXZlbnREaXNwYXRjaEZvcmJpZGRlbiAtPSAxCi0jZGVmaW5lIGV2
ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSAoZ0V2ZW50RGlzcGF0Y2hGb3JiaWRkZW4gPiAwKQotI2Vs
c2UKLQotI2RlZmluZSBmb3JiaWRFdmVudERpc3BhdGNoKCkKLSNkZWZpbmUgYWxsb3dFdmVudERp
c3BhdGNoKCkKLSNkZWZpbmUgZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpCitpbnQgZ0V2ZW50RGlz
cGF0Y2hGb3JiaWRkZW4gPSAwOwogI2VuZGlmIE5ERUJVRwogCiBOb2RlSW1wbDo6Tm9kZUltcGwo
RG9jdW1lbnRJbXBsICpkb2MpCkBAIC0zNDcsMTMgKzM1NiwxMyBAQCBib29sIE5vZGVJbXBsOjpp
c0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0CiAgICAgcmV0dXJuIHBhcmVudCgpICYmIHBhcmVudCgp
LT5pc0NvbnRlbnRFZGl0YWJsZSgpOwogfQogCi1RUmVjdCBOb2RlSW1wbDo6Z2V0UmVjdCgpIGNv
bnN0CitJbnRSZWN0IE5vZGVJbXBsOjpnZXRSZWN0KCkgY29uc3QKIHsKICAgICBpbnQgX3gsIF95
OwogICAgIGlmKG1fcmVuZGVyICYmIG1fcmVuZGVyLT5hYnNvbHV0ZVBvc2l0aW9uKF94LCBfeSkp
Ci0gICAgICAgIHJldHVybiBRUmVjdCggX3gsIF95LCBtX3JlbmRlci0+d2lkdGgoKSwgbV9yZW5k
ZXItPmhlaWdodCgpICk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KCBfeCwgX3ksIG1fcmVuZGVy
LT53aWR0aCgpLCBtX3JlbmRlci0+aGVpZ2h0KCkgKTsKIAotICAgIHJldHVybiBRUmVjdCgpOwor
ICAgIHJldHVybiBJbnRSZWN0KCk7CiB9CiAKIHZvaWQgTm9kZUltcGw6OnNldENoYW5nZWQoYm9v
bCBiKQpAQCAtMjAxMywxMDUzICsyMDIyLDQgQEAgdm9pZCBOb2RlSW1wbDo6Zm9ybWF0Rm9yRGVi
dWdnZXIoY2hhciAqYgogCiAjZW5kaWYKIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvbnRhaW5l
ck5vZGVJbXBsOjpDb250YWluZXJOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYykKLSAgICA6IE5v
ZGVJbXBsKGRvYykKLXsKLSAgICBfZmlyc3QgPSBfbGFzdCA9IDA7Ci19Ci0KLXZvaWQgQ29udGFp
bmVyTm9kZUltcGw6OnJlbW92ZUFsbENoaWxkcmVuKCkKLXsKLSAgICAvL2tkRGVidWcoIDYwMjAg
KSA8PCAiQ29udGFpbmVyTm9kZUltcGwgZGVzdHJ1Y3RvciIgPDwgZW5kbDsKLQotICAgIC8vIEF2
b2lkIGRlZXAgcmVjdXJzaW9uIHdoZW4gZGVzdHJveWluZyB0aGUgbm9kZSB0cmVlLgotICAgIHN0
YXRpYyBib29sIGFscmVhZHlJbnNpZGVEZXN0cnVjdG9yOyAKLSAgICBib29sIHRvcExldmVsID0g
IWFscmVhZHlJbnNpZGVEZXN0cnVjdG9yOwotICAgIGlmICh0b3BMZXZlbCkKLSAgICAgICAgYWxy
ZWFkeUluc2lkZURlc3RydWN0b3IgPSB0cnVlOwotICAgIAotICAgIC8vIExpc3Qgb2Ygbm9kZXMg
dG8gYmUgZGVsZXRlZC4KLSAgICBzdGF0aWMgTm9kZUltcGwgKmhlYWQ7Ci0gICAgc3RhdGljIE5v
ZGVJbXBsICp0YWlsOwotICAgIAotICAgIC8vIFdlIGhhdmUgdG8gdGVsbCBhbGwgY2hpbGRyZW4g
dGhhdCB0aGVpciBwYXJlbnQgaGFzIGRpZWQuCi0gICAgTm9kZUltcGwgKm47Ci0gICAgTm9kZUlt
cGwgKm5leHQ7Ci0KLSAgICBmb3IoIG4gPSBfZmlyc3Q7IG4gIT0gMDsgbiA9IG5leHQgKSB7Ci0g
ICAgICAgIG5leHQgPSBuLT5uZXh0U2libGluZygpOwotICAgICAgICBuLT5zZXRQcmV2aW91c1Np
YmxpbmcoMCk7Ci0gICAgICAgIG4tPnNldE5leHRTaWJsaW5nKDApOwotICAgICAgICBuLT5zZXRQ
YXJlbnQoMCk7Ci0gICAgICAgIAotCWlmICggIW4tPnJlZkNvdW50KCkgKSB7Ci0gICAgICAgICAg
ICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gYmUgZGVsZXRlZC4KLSAg
ICAgICAgICAgIC8vIFJldXNlIHRoZSBuZXh0U2libGluZyBwb2ludGVyIGZvciB0aGlzIHB1cnBv
c2UuCi0gICAgICAgICAgICBpZiAodGFpbCkKLSAgICAgICAgICAgICAgICB0YWlsLT5zZXROZXh0
U2libGluZyhuKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBoZWFkID0gbjsK
LSAgICAgICAgICAgIHRhaWwgPSBuOwotICAgICAgICB9IGVsc2UgaWYgKG4tPmluRG9jdW1lbnQo
KSkKLSAgICAgICAgICAgIG4tPnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gT25seSBmb3IgdGhlIHRvcCBsZXZlbCBjYWxsLCBkbyB0aGUgYWN0dWFsIGRlbGV0aW5n
LgotICAgIGlmICh0b3BMZXZlbCkgewotICAgICAgICB3aGlsZSAoKG4gPSBoZWFkKSAhPSAwKSB7
Ci0gICAgICAgICAgICBuZXh0ID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIG4tPnNl
dE5leHRTaWJsaW5nKDApOwotCi0gICAgICAgICAgICBoZWFkID0gbmV4dDsKLSAgICAgICAgICAg
IGlmIChuZXh0ID09IDApCi0gICAgICAgICAgICAgICAgdGFpbCA9IDA7Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIGRlbGV0ZSBuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhbHJl
YWR5SW5zaWRlRGVzdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICBfZmlyc3QgPSAwOwotICAgICAg
ICBfbGFzdCA9IDA7Ci0gICAgfQotfQotCi1Db250YWluZXJOb2RlSW1wbDo6fkNvbnRhaW5lck5v
ZGVJbXBsKCkKLXsKLSAgICByZW1vdmVBbGxDaGlsZHJlbigpOwotfQotCi0KLU5vZGVJbXBsICpD
b250YWluZXJOb2RlSW1wbDo6Zmlyc3RDaGlsZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIF9maXJz
dDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpsYXN0Q2hpbGQoKSBjb25zdAot
ewotICAgIHJldHVybiBfbGFzdDsKLX0KLQotTm9kZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpp
bnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGlsZCwgaW50
ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBleGNlcHRpb25jb2RlID0gMDsKLQotICAgIC8vIGlu
c2VydEJlZm9yZSguLi4sbnVsbCkgaXMgZXF1aXZhbGVudCB0byBhcHBlbmRDaGlsZCgpCi0gICAg
aWYoIXJlZkNoaWxkKQotICAgICAgICByZXR1cm4gYXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2Vw
dGlvbmNvZGUpOwotCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0TmV3Q2hpbGQobmV3Q2hp
bGQpOyAvLyBtYWtlIHN1cmUgdGhlIG5ldyBjaGlsZCBpcyByZWYnZCBhbmQgZGVyZWYnZCBzbyB3
ZSBkb24ndCBsZWFrIGl0Ci0KLSAgICAvLyBNYWtlIHN1cmUgYWRkaW5nIHRoZSBuZXcgY2hpbGQg
aXMgb2sKLSAgICBjaGVja0FkZENoaWxkKG5ld0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBp
ZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBOT1RfRk9VTkRf
RVJSOiBSYWlzZWQgaWYgcmVmQ2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlCi0gICAg
aWYgKHJlZkNoaWxkLT5wYXJlbnROb2RlKCkgIT0gdGhpcykgewotICAgICAgICBleGNlcHRpb25j
b2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0KLSAgICBib29sIGlzRnJhZ21lbnQgPSBuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2Rl
OjpET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwotCi0gICAgLy8gSWYgbmV3Q2hpbGQgaXMgYSBEb2N1
bWVudEZyYWdtZW50IHdpdGggbm8gY2hpbGRyZW4uLi4uIHRoZXJlJ3Mgbm90aGluZyB0byBkby4K
LSAgICAvLyBKdXN0IHJldHVybiB0aGUgZG9jdW1lbnQgZnJhZ21lbnQKLSAgICBpZiAoaXNGcmFn
bWVudCAmJiAhbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIChuZXdDaGls
ZC0+aGFzT25lUmVmKCkgJiYgIW5ld0NoaWxkLT5wYXJlbnQoKSkgPyAwIDogbmV3Q2hpbGQ7Ci0K
LSAgICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRoZSBjaGlsZChyZW4pCi0gICAgTm9kZUltcGwgKm5l
eHRDaGlsZDsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBpc0ZyYWdtZW50ID8gbmV3Q2hpbGQtPmZp
cnN0Q2hpbGQoKSA6IG5ld0NoaWxkOwotCi0gICAgTm9kZUltcGwgKnByZXYgPSByZWZDaGlsZC0+
cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYgKCBwcmV2ID09IG5ld0NoaWxkIHx8IHJlZkNoaWxk
ID09IG5ld0NoaWxkICkgLy8gbm90aGluZyB0byBkbwotCXJldHVybiBuZXdDaGlsZDsKLSAgICAK
LSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgICAgbmV4dENoaWxkID0gaXNGcmFnbWVudCA/IGNo
aWxkLT5uZXh0U2libGluZygpIDogMDsKLQotICAgICAgICAvLyBJZiBjaGlsZCBpcyBhbHJlYWR5
IHByZXNlbnQgaW4gdGhlIHRyZWUsIGZpcnN0IHJlbW92ZSBpdAotICAgICAgICBOb2RlSW1wbCAq
bmV3UGFyZW50ID0gY2hpbGQtPnBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKG5ld1BhcmVudCkK
LSAgICAgICAgICAgIG5ld1BhcmVudC0+cmVtb3ZlQ2hpbGQoIGNoaWxkLCBleGNlcHRpb25jb2Rl
ICk7Ci0gICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICAgICAgLy8gQWRkIGNoaWxkIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uCi0gICAgICAgIGZv
cmJpZEV2ZW50RGlzcGF0Y2goKTsKLSAgICAgICAgaWYgKHByZXYpCi0gICAgICAgICAgICBwcmV2
LT5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9maXJz
dCA9IGNoaWxkOwotICAgICAgICByZWZDaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsK
LSAgICAgICAgY2hpbGQtPnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgY2hpbGQtPnNldFByZXZp
b3VzU2libGluZyhwcmV2KTsKLSAgICAgICAgY2hpbGQtPnNldE5leHRTaWJsaW5nKHJlZkNoaWxk
KTsKLSAgICAgICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICAgICAgLy8gQWRkIGNoaWxk
IHRvIHRoZSByZW5kZXJpbmcgdHJlZQotICAgICAgICAvLyAjIyMgc2hvdWxkIHdlIGRldGFjaCgp
IGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFkeSBhdHRhY2hlZD8KLSAgICAgICAgaWYgKGF0dGFjaGVk
KCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICAgICAgY2hpbGQtPmF0dGFjaCgpOwot
ICAgICAgICAKLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIG11dGF0aW9uIGV2ZW50cwotICAgICAg
ICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoY2hpbGQsZXhjZXB0aW9uY29kZSk7Ci0KLSAg
ICAgICAgcHJldiA9IGNoaWxkOwotICAgICAgICBjaGlsZCA9IG5leHRDaGlsZDsKLSAgICB9Ci0K
LSAgICBnZXREb2N1bWVudCgpLT5zZXREb2N1bWVudENoYW5nZWQodHJ1ZSk7Ci0gICAgZGlzcGF0
Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwotICAgIHJldHVybiBuZXdDaGlsZDsKLX0KLQotTm9k
ZUltcGwgKkNvbnRhaW5lck5vZGVJbXBsOjpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hp
bGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBleGNl
cHRpb25jb2RlID0gMDsKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVjdE5ld0NoaWxkKG5l
d0NoaWxkKTsgLy8gbWFrZSBzdXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qg
c28gd2UgZG9uJ3QgbGVhayBpdAotCi0gICAgaWYgKCBvbGRDaGlsZCA9PSBuZXdDaGlsZCApIC8v
IG5vdGhpbmcgdG8gZG8KLQlyZXR1cm4gb2xkQ2hpbGQ7Ci0gICAgCi0gICAgLy8gTWFrZSBzdXJl
IGFkZGluZyB0aGUgbmV3IGNoaWxkIGlzIG9rCi0gICAgY2hlY2tBZGRDaGlsZChuZXdDaGlsZCwg
ZXhjZXB0aW9uY29kZSk7Ci0gICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgLy8gTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIG9sZENoaWxkIGlzIG5vdCBhIGNo
aWxkIG9mIHRoaXMgbm9kZS4KLSAgICBpZiAoIW9sZENoaWxkIHx8IG9sZENoaWxkLT5wYXJlbnRO
b2RlKCkgIT0gdGhpcykgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpO
T1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGlzRnJh
Z21lbnQgPSBuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpET0NVTUVOVF9GUkFHTUVOVF9O
T0RFOwotICAgIE5vZGVJbXBsICpuZXh0Q2hpbGQ7Ci0gICAgTm9kZUltcGwgKmNoaWxkID0gaXNG
cmFnbWVudCA/IG5ld0NoaWxkLT5maXJzdENoaWxkKCkgOiBuZXdDaGlsZDsKLQotICAgIC8vIFJl
bW92ZSB0aGUgb2xkIGNoaWxkCi0gICAgTm9kZUltcGwgKnByZXYgPSBvbGRDaGlsZC0+cHJldmlv
dXNTaWJsaW5nKCk7Ci0gICAgTm9kZUltcGwgKm5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmco
KTsKLQotICAgIHJlbW92ZUNoaWxkKG9sZENoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICBpZiAo
ZXhjZXB0aW9uY29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJZiB0aGUgbmV3IGNo
aWxkIHdhcyByaWdodCBiZWZvcmUgb3IgcmlnaHQgYWZ0ZXIgdGhlIG9sZCBjaGlsZCwgbm90aGlu
ZyBlbHNlIG5lZWRzIHRvIGNoYW5nZQotICAgIGlmIChwcmV2ID09IGNoaWxkIHx8IG5leHQgPT0g
Y2hpbGQpCi0gICAgICAgIGNoaWxkID0gMDsKLSAgICAvLyBBZGQgdGhlIG5ldyBjaGlsZChyZW4p
Ci0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIG5leHRDaGlsZCA9IGlzRnJhZ21lbnQgPyBj
aGlsZC0+bmV4dFNpYmxpbmcoKSA6IDA7Ci0KLSAgICAgICAgLy8gSWYgY2hpbGQgaXMgYWxyZWFk
eSBwcmVzZW50IGluIHRoZSB0cmVlLCBmaXJzdCByZW1vdmUgaXQKLSAgICAgICAgTm9kZUltcGwg
Km5ld1BhcmVudCA9IGNoaWxkLT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChuZXdQYXJlbnQp
Ci0gICAgICAgICAgICBuZXdQYXJlbnQtPnJlbW92ZUNoaWxkKCBjaGlsZCwgZXhjZXB0aW9uY29k
ZSApOwotICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSkKLSAgICAgICAgICAgIHJldHVybiAwOwot
Ci0gICAgICAgIC8vIEFkZCBjaGlsZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbgotICAgICAgICBm
b3JiaWRFdmVudERpc3BhdGNoKCk7Ci0gICAgICAgIGlmIChwcmV2KSBwcmV2LT5zZXROZXh0U2li
bGluZyhjaGlsZCk7Ci0gICAgICAgIGlmIChuZXh0KSBuZXh0LT5zZXRQcmV2aW91c1NpYmxpbmco
Y2hpbGQpOwotICAgICAgICBpZighcHJldikgX2ZpcnN0ID0gY2hpbGQ7Ci0gICAgICAgIGlmKCFu
ZXh0KSBfbGFzdCA9IGNoaWxkOwotICAgICAgICBjaGlsZC0+c2V0UGFyZW50KHRoaXMpOwotICAg
ICAgICBjaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotICAgICAgICBjaGlsZC0+c2V0
TmV4dFNpYmxpbmcobmV4dCk7Ci0gICAgICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAg
ICAgIC8vIEFkZCBjaGlsZCB0byB0aGUgcmVuZGVyaW5nIHRyZWUKLSAgICAgICAgLy8gIyMjIHNo
b3VsZCB3ZSBkZXRhY2goKSBpdCBmaXJzdCBpZiBpdCdzIGFscmVhZHkgYXR0YWNoZWQ/Ci0gICAg
ICAgIGlmIChhdHRhY2hlZCgpICYmICFjaGlsZC0+YXR0YWNoZWQoKSkKLSAgICAgICAgICAgIGNo
aWxkLT5hdHRhY2goKTsKLQotICAgICAgICAvLyBEaXNwYXRjaCB0aGUgbXV0YXRpb24gZXZlbnRz
Ci0gICAgICAgIGRpc3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyhjaGlsZCxleGNlcHRpb25jb2Rl
KTsKLQotICAgICAgICBwcmV2ID0gY2hpbGQ7Ci0gICAgICAgIGNoaWxkID0gbmV4dENoaWxkOwot
ICAgIH0KLQotICAgIC8vICMjIyBzZXQgc3R5bGUgaW4gY2FzZSBpdCdzIGF0dGFjaGVkCi0gICAg
Z2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwotICAgIGRpc3BhdGNoU3Vi
dHJlZU1vZGlmaWVkRXZlbnQoKTsKLSAgICByZXR1cm4gb2xkQ2hpbGQ7Ci19Ci0KLXZvaWQgQ29u
dGFpbmVyTm9kZUltcGw6OndpbGxSZW1vdmUoKQotewotICAgIGZvciAoTm9kZUltcGwgKm4gPSBf
Zmlyc3Q7IG4gIT0gMDsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgbi0+d2lsbFJl
bW92ZSgpOwotICAgIH0KLX0KLQotaW50IENvbnRhaW5lck5vZGVJbXBsOjp3aWxsUmVtb3ZlQ2hp
bGQoTm9kZUltcGwgKmNoaWxkKQotewotICAgIGludCBleGNlcHRpb25Db2RlID0gMDsKLQotICAg
IC8vIGZpcmUgcmVtb3ZlZCBmcm9tIGRvY3VtZW50IG11dGF0aW9uIGV2ZW50cy4KLSAgICBkaXNw
YXRjaENoaWxkUmVtb3ZhbEV2ZW50cyhjaGlsZCwgZXhjZXB0aW9uQ29kZSk7Ci0gICAgaWYgKGV4
Y2VwdGlvbkNvZGUpCi0gICAgICAgIHJldHVybiBleGNlcHRpb25Db2RlOwotCi0gICAgaWYgKGNo
aWxkLT5hdHRhY2hlZCgpKQotICAgICAgICBjaGlsZC0+d2lsbFJlbW92ZSgpOwotICAgIAotICAg
IHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZUNoaWxk
ICggTm9kZUltcGwgKm9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4Y2Vw
dGlvbmNvZGUgPSAwOwotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlz
ZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAg
ICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FUSU9OX0FMTE9X
RURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOT1RfRk9VTkRfRVJS
OiBSYWlzZWQgaWYgb2xkQ2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLgotICAgIGlm
ICghb2xkQ2hpbGQgfHwgb2xkQ2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAg
IGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJl
dHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvLyB1cGRhdGUgYXV4aWxpYXJ5IGRvYyBpbmZvIChl
LmcuIGl0ZXJhdG9ycykgdG8gbm90ZSB0aGF0IG5vZGUgaXMgYmVpbmcgcmVtb3ZlZAotICAgIC8v
IEZJWDogVGhpcyBsb29rcyByZWR1bmRhbnQgd2l0aCBzYW1lIGNhbGwgZnJvbSBkaXNwYXRjaENo
aWxkUmVtb3ZhbEV2ZW50cyBpbiB3aWxsUmVtb3ZlQ2hpbGQKLS8vICBnZXREb2N1bWVudCgpLT5u
b3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChvbGRDaGlsZCk7IC8vICMjIyB1c2UgZXZlbnRzIGluc3Rl
YWQKLQotICAgIC8vIGRpc3BhdGNoIHByZS1yZW1vdmFsIG11dGF0aW9uIGV2ZW50cwotICAgIGlm
IChnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnRJbXBsOjpET01OT0RFUkVN
T1ZFRF9MSVNURU5FUikpIHsKLQlvbGRDaGlsZC0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25F
dmVudEltcGwoRE9NTm9kZVJlbW92ZWRFdmVudCwKLQkJCSAgICAgdHJ1ZSxmYWxzZSx0aGlzLERP
TVN0cmluZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7
Ci0JaWYgKGV4Y2VwdGlvbmNvZGUpCi0JICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGV4Y2Vw
dGlvbmNvZGUgPSB3aWxsUmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotICAgIGlmIChleGNlcHRpb25j
b2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvcmJpZEV2ZW50RGlzcGF0Y2goKTsKLQot
ICAgIC8vIFJlbW92ZSBmcm9tIHJlbmRlcmluZyB0cmVlCi0gICAgaWYgKG9sZENoaWxkLT5hdHRh
Y2hlZCgpKQotICAgICAgICBvbGRDaGlsZC0+ZGV0YWNoKCk7Ci0KLSAgICAvLyBSZW1vdmUgdGhl
IGNoaWxkCi0gICAgTm9kZUltcGwgKnByZXYsICpuZXh0OwotICAgIHByZXYgPSBvbGRDaGlsZC0+
cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwot
Ci0gICAgaWYobmV4dCkgbmV4dC0+c2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotICAgIGlmKHBy
ZXYpIHByZXYtPnNldE5leHRTaWJsaW5nKG5leHQpOwotICAgIGlmKF9maXJzdCA9PSBvbGRDaGls
ZCkgX2ZpcnN0ID0gbmV4dDsKLSAgICBpZihfbGFzdCA9PSBvbGRDaGlsZCkgX2xhc3QgPSBwcmV2
OwotCi0gICAgb2xkQ2hpbGQtPnNldFByZXZpb3VzU2libGluZygwKTsKLSAgICBvbGRDaGlsZC0+
c2V0TmV4dFNpYmxpbmcoMCk7Ci0gICAgb2xkQ2hpbGQtPnNldFBhcmVudCgwKTsKLQotICAgIGFs
bG93RXZlbnREaXNwYXRjaCgpOwotCi0gICAgZ2V0RG9jdW1lbnQoKS0+c2V0RG9jdW1lbnRDaGFu
Z2VkKHRydWUpOwotCi0gICAgLy8gRGlzcGF0Y2ggcG9zdC1yZW1vdmFsIG11dGF0aW9uIGV2ZW50
cwotICAgIGRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoKTsKLQotICAgIGlmIChvbGRDaGls
ZC0+aW5Eb2N1bWVudCgpKQotICAgICAgICBvbGRDaGlsZC0+cmVtb3ZlZEZyb21Eb2N1bWVudCgp
OwotICAgIGVsc2UKLSAgICAgICAgb2xkQ2hpbGQtPnJlbW92ZWRGcm9tVHJlZSh0cnVlKTsKLQot
ICAgIHJldHVybiBvbGRDaGlsZDsKLX0KLQotLy8gdGhpcyBkaWZmZXJzIGZyb20gb3RoZXIgcmVt
b3ZlIGZ1bmN0aW9ucyBiZWNhdXNlIGl0IGZvcmNpYmx5IHJlbW92ZXMgYWxsIHRoZSBjaGlsZHJl
biwKLS8vIHJlZ2FyZGxlc3Mgb2YgcmVhZC1vbmx5IHN0YXR1cyBvciBldmVudCBleGNlcHRpb25z
LCBlLmcuCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpyZW1vdmVDaGlsZHJlbigpCi17Ci0gICAg
Tm9kZUltcGwgKm47Ci0gICAgCi0gICAgaWYgKCFfZmlyc3QpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIC8vIGRvIGFueSBwcmVwIHdvcmsgbmVlZGVkIGJlZm9yZSBhY3R1YWxseSBzdGFydGluZyB0
byBkZXRhY2gKLSAgICAvLyBhbmQgcmVtb3ZlLi4uIGUuZy4gc3RvcCBsb2FkaW5nIGZyYW1lcywg
ZmlyZSB1bmxvYWQgZXZlbnRzCi0gICAgZm9yIChuID0gX2ZpcnN0OyBuICE9IDA7IG4gPSBuLT5u
ZXh0U2libGluZygpKQotICAgICAgICB3aWxsUmVtb3ZlQ2hpbGQobik7Ci0gICAgCi0gICAgZm9y
YmlkRXZlbnREaXNwYXRjaCgpOwotICAgIHdoaWxlICgobiA9IF9maXJzdCkgIT0gMCkgewotICAg
ICAgICBOb2RlSW1wbCAqbmV4dCA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIAotICAgICAg
ICBuLT5yZWYoKTsKLQotICAgICAgICBpZiAobi0+YXR0YWNoZWQoKSkKLSAgICAgICAgICAgIG4t
PmRldGFjaCgpOwotICAgICAgICBuLT5zZXRQcmV2aW91c1NpYmxpbmcoMCk7Ci0gICAgICAgIG4t
PnNldE5leHRTaWJsaW5nKDApOwotICAgICAgICBuLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIAot
ICAgICAgICBpZiAobi0+aW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgbi0+cmVtb3ZlZEZyb21E
b2N1bWVudCgpOwotCi0gICAgICAgIG4tPmRlcmVmKCk7Ci0KLSAgICAgICAgX2ZpcnN0ID0gbmV4
dDsKLSAgICB9Ci0gICAgX2xhc3QgPSAwOwotICAgIGFsbG93RXZlbnREaXNwYXRjaCgpOwotICAg
IAotICAgIC8vIERpc3BhdGNoIGEgc2luZ2xlIHBvc3QtcmVtb3ZhbCBtdXRhdGlvbiBldmVudCBk
ZW5vdGluZyBhIG1vZGlmaWVkIHN1YnRyZWUuCi0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRF
dmVudCgpOwotfQotCi0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6YXBwZW5kQ2hpbGQg
KCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgZXhjZXB0
aW9uY29kZSA9IDA7Ci0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3ROZXdDaGlsZChuZXdD
aGlsZCk7IC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidkIGFuZCBkZXJlZidkIHNv
IHdlIGRvbid0IGxlYWsgaXQKLQotICAgIC8vIE1ha2Ugc3VyZSBhZGRpbmcgdGhlIG5ldyBjaGls
ZCBpcyBvawotICAgIGNoZWNrQWRkQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAg
IGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoIG5l
d0NoaWxkID09IF9sYXN0ICkgLy8gbm90aGluZyB0byBkbwotCXJldHVybiBuZXdDaGlsZDsKLQot
ICAgIGJvb2wgaXNGcmFnbWVudCA9IG5ld0NoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OkRPQ1VN
RU5UX0ZSQUdNRU5UX05PREU7Ci0KLSAgICAvLyBJZiBuZXdDaGlsZCBpcyBhIERvY3VtZW50RnJh
Z21lbnQgd2l0aCBubyBjaGlsZHJlbi4uLi4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgotICAgIC8v
IEp1c3QgcmV0dXJuIHRoZSBkb2N1bWVudCBmcmFnbWVudAotICAgIGlmIChpc0ZyYWdtZW50ICYm
ICFuZXdDaGlsZC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV3Q2hpbGQ7Ci0KLSAg
ICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRoZSBjaGlsZChyZW4pCi0gICAgTm9kZUltcGwgKm5leHRD
aGlsZDsKLSAgICBOb2RlSW1wbCAqY2hpbGQgPSBpc0ZyYWdtZW50ID8gbmV3Q2hpbGQtPmZpcnN0
Q2hpbGQoKSA6IG5ld0NoaWxkOwotCi0gICAgd2hpbGUgKGNoaWxkKSB7Ci0gICAgICAgIG5leHRD
aGlsZCA9IGlzRnJhZ21lbnQgPyBjaGlsZC0+bmV4dFNpYmxpbmcoKSA6IDA7Ci0KLSAgICAgICAg
Ly8gSWYgY2hpbGQgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSB0cmVlLCBmaXJzdCByZW1vdmUg
aXQKLSAgICAgICAgTm9kZUltcGwgKm9sZFBhcmVudCA9IGNoaWxkLT5wYXJlbnROb2RlKCk7Ci0g
ICAgICAgIGlmKG9sZFBhcmVudCkgewotICAgICAgICAgICAgb2xkUGFyZW50LT5yZW1vdmVDaGls
ZCggY2hpbGQsIGV4Y2VwdGlvbmNvZGUgKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2Rl
KQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBw
ZW5kIGNoaWxkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLSAgICAgICAgZm9yYmlkRXZlbnREaXNw
YXRjaCgpOwotICAgICAgICBjaGlsZC0+c2V0UGFyZW50KHRoaXMpOwotICAgICAgICBpZiAoX2xh
c3QpIHsKLSAgICAgICAgICAgIGNoaWxkLT5zZXRQcmV2aW91c1NpYmxpbmcoX2xhc3QpOwotICAg
ICAgICAgICAgX2xhc3QtPnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgICAgICAgIF9sYXN0
ID0gY2hpbGQ7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgX2ZpcnN0ID0gX2xhc3QgPSBj
aGlsZDsKLSAgICAgICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICAgICAgLy8gQWRkIGNo
aWxkIHRvIHRoZSByZW5kZXJpbmcgdHJlZQotICAgICAgICAvLyAjIyMgc2hvdWxkIHdlIGRldGFj
aCgpIGl0IGZpcnN0IGlmIGl0J3MgYWxyZWFkeSBhdHRhY2hlZD8KLSAgICAgICAgaWYgKGF0dGFj
aGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgpKQotICAgICAgICAgICAgY2hpbGQtPmF0dGFjaCgp
OwotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIG11dGF0aW9uIGV2ZW50cwotICAg
ICAgICBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMoY2hpbGQsZXhjZXB0aW9uY29kZSk7Ci0K
LSAgICAgICAgY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0gICAgfQotCi0gICAgZ2V0RG9jdW1lbnQoKS0+
c2V0RG9jdW1lbnRDaGFuZ2VkKHRydWUpOwotICAgIC8vICMjIyBzZXQgc3R5bGUgaW4gY2FzZSBp
dCdzIGF0dGFjaGVkCi0gICAgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwotICAgIHJl
dHVybiBuZXdDaGlsZDsKLX0KLQotYm9vbCBDb250YWluZXJOb2RlSW1wbDo6aGFzQ2hpbGROb2Rl
cyAoICApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIF9maXJzdCAhPSAwOwotfQotCi0vLyBub3QgcGFy
dCBvZiB0aGUgRE9NCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpzZXRGaXJzdENoaWxkKE5vZGVJ
bXBsICpjaGlsZCkKLXsKLSAgICBfZmlyc3QgPSBjaGlsZDsKLX0KLQotdm9pZCBDb250YWluZXJO
b2RlSW1wbDo6c2V0TGFzdENoaWxkKE5vZGVJbXBsICpjaGlsZCkKLXsKLSAgICBfbGFzdCA9IGNo
aWxkOwotfQotCi0vLyBjaGVjayBmb3Igc2FtZSBzb3VyY2UgZG9jdW1lbnQ6Ci1ib29sIENvbnRh
aW5lck5vZGVJbXBsOjpjaGVja1NhbWVEb2N1bWVudCggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQg
JmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotICAgIERvY3VtZW50
SW1wbCAqb3duZXJEb2NUaGlzID0gZ2V0RG9jdW1lbnQoKTsKLSAgICAvLyBGSVhNRTogRG9oISBU
aGlzIG5leHQgbGluZSBpc24ndCBnZXR0aW5nIG5ld0NoaWxkLCBzbyBpdCdzIG5ldmVyIGdvaW5n
IHRvIHdvcmshCi0gICAgRG9jdW1lbnRJbXBsICpvd25lckRvY05ldyA9IGdldERvY3VtZW50KCk7
Ci0gICAgaWYob3duZXJEb2NUaGlzICE9IG93bmVyRG9jTmV3KSB7Ci0gICAgICAgIGtkRGVidWco
NjAxMCk8PCAibm90IHNhbWUgZG9jdW1lbnQsIG5ld0NoaWxkID0gIiA8PCBuZXdDaGlsZCA8PCAi
ZG9jdW1lbnQgPSAiIDw8IGdldERvY3VtZW50KCkgPDwgZW5kbDsKLSAgICAgICAgZXhjZXB0aW9u
Y29kZSA9IERPTUV4Y2VwdGlvbjo6V1JPTkdfRE9DVU1FTlRfRVJSOwotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBjaGVjayBmb3IgYmVpbmcg
Y2hpbGQ6Ci1ib29sIENvbnRhaW5lck5vZGVJbXBsOjpjaGVja0lzQ2hpbGQoIE5vZGVJbXBsICpv
bGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgICBpZighb2xkQ2hpbGQgfHwgb2xk
Q2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBE
T01FeGNlcHRpb246Ok5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLU5vZGVJbXBsICpDb250YWluZXJOb2RlSW1wbDo6YWRk
Q2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkKQotewotICAgIC8vIGRvIG5vdCBhZGQgYXBwbHlDaGFu
Z2VzIGhlcmUhIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGR1cmluZyBwYXJzaW5nCi0KLSAg
ICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3ROZXdDaGlsZChuZXdDaGlsZCk7IC8vIG1ha2Ugc3Vy
ZSB0aGUgbmV3IGNoaWxkIGlzIHJlZidkIGFuZCBkZXJlZidkIHNvIHdlIGRvbid0IGxlYWsgaXQK
LQotICAgIC8vIHNob3J0IGNoZWNrIGZvciBjb25zaXN0ZW5jeSB3aXRoIERURAotICAgIGlmIChn
ZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpICYmICFjaGlsZEFsbG93ZWQobmV3Q2hpbGQp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIGp1c3QgYWRkIGl0Li4uCi0gICAgZm9yYmlk
RXZlbnREaXNwYXRjaCgpOwotICAgIG5ld0NoaWxkLT5zZXRQYXJlbnQodGhpcyk7Ci0gICAgaWYo
X2xhc3QpIHsKLSAgICAgICAgbmV3Q2hpbGQtPnNldFByZXZpb3VzU2libGluZyhfbGFzdCk7Ci0g
ICAgICAgIF9sYXN0LT5zZXROZXh0U2libGluZyhuZXdDaGlsZCk7Ci0gICAgICAgIF9sYXN0ID0g
bmV3Q2hpbGQ7Ci0gICAgfSBlbHNlCi0gICAgICAgIF9maXJzdCA9IF9sYXN0ID0gbmV3Q2hpbGQ7
Ci0gICAgYWxsb3dFdmVudERpc3BhdGNoKCk7Ci0KLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAg
ICAgICBuZXdDaGlsZC0+aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICBjaGlsZHJlbkNoYW5n
ZWQoKTsKLSAgICAKLSAgICBpZihuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5U
X05PREUpCi0gICAgICAgIHJldHVybiBuZXdDaGlsZDsKLSAgICByZXR1cm4gdGhpczsKLX0KLQot
dm9pZCBDb250YWluZXJOb2RlSW1wbDo6YXR0YWNoKCkKLXsKLSAgICBOb2RlSW1wbCAqY2hpbGQg
PSBfZmlyc3Q7Ci0gICAgd2hpbGUoY2hpbGQgIT0gMCkKLSAgICB7Ci0gICAgICAgIGNoaWxkLT5h
dHRhY2goKTsKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0g
ICAgTm9kZUltcGw6OmF0dGFjaCgpOwotfQotCi12b2lkIENvbnRhaW5lck5vZGVJbXBsOjpkZXRh
Y2goKQotewotICAgIE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsKLSAgICB3aGlsZShjaGlsZCAh
PSAwKQotICAgIHsKLSAgICAgICAgTm9kZUltcGwqIHByZXYgPSBjaGlsZDsKLSAgICAgICAgY2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgcHJldi0+ZGV0YWNoKCk7Ci0gICAg
fQotICAgIE5vZGVJbXBsOjpkZXRhY2goKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6
aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIE5vZGVJbXBsOjppbnNlcnRlZEludG9Eb2N1
bWVudCgpOwotICAgIGZvciAoTm9kZUltcGwgKmNoaWxkID0gX2ZpcnN0OyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgY2hpbGQtPmluc2VydGVkSW50b0RvY3Vt
ZW50KCk7Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZWRGcm9tRG9jdW1lbnQo
KQotewotICAgIE5vZGVJbXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0gICAgZm9yIChOb2Rl
SW1wbCAqY2hpbGQgPSBfZmlyc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
KQotICAgICAgICBjaGlsZC0+cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotfQotCi12b2lkIENvbnRh
aW5lck5vZGVJbXBsOjppbnNlcnRlZEludG9UcmVlKGJvb2wgZGVlcCkKLXsKLSAgICBOb2RlSW1w
bDo6aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsKLSAgICBpZiAoZGVlcCkgewotICAgICAgICBmb3Ig
KE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJs
aW5nKCkpCi0gICAgICAgICAgICBjaGlsZC0+aW5zZXJ0ZWRJbnRvVHJlZShkZWVwKTsKLSAgICB9
Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnJlbW92ZWRGcm9tVHJlZShib29sIGRlZXAp
Ci17Ci0gICAgTm9kZUltcGw6OnJlbW92ZWRGcm9tVHJlZShkZWVwKTsKLSAgICBpZiAoZGVlcCkg
ewotICAgICAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IF9maXJzdDsgY2hpbGQ7IGNoaWxkID0g
Y2hpbGQtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICBjaGlsZC0+cmVtb3ZlZEZyb21UcmVl
KGRlZXApOwotICAgIH0KLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6Y2xvbmVDaGlsZE5v
ZGVzKE5vZGVJbXBsICpjbG9uZSkKLXsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAg
Tm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSBmaXJzdENoaWxkKCk7IG4gJiYgIWV4Y2VwdGlvbmNv
ZGU7IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgIHsKLSAgICAgICAgY2xvbmUtPmFwcGVuZENo
aWxkKG4tPmNsb25lTm9kZSh0cnVlKSxleGNlcHRpb25jb2RlKTsKLSAgICB9Ci19Ci0KLWJvb2wg
Q29udGFpbmVyTm9kZUltcGw6OmdldFVwcGVyTGVmdENvcm5lcihpbnQgJnhQb3MsIGludCAmeVBv
cykgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVuZGVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgUmVuZGVyT2JqZWN0ICpvID0gbV9yZW5kZXI7Ci0gICAgUmVuZGVyT2JqZWN0ICpwID0gbzsK
LQotICAgIHhQb3MgPSB5UG9zID0gMDsKLSAgICBpZiAoIW8tPmlzSW5saW5lKCkgfHwgby0+aXNS
ZXBsYWNlZCgpKSB7Ci0gICAgICAgIG8tPmFic29sdXRlUG9zaXRpb24oIHhQb3MsIHlQb3MgKTsK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gZmluZCB0aGUgbmV4dCB0ZXh0
L2ltYWdlIGNoaWxkLCB0byBnZXQgYSBwb3NpdGlvbgotICAgIHdoaWxlKG8pIHsKLSAgICAgICAg
cCA9IG87Ci0gICAgICAgIGlmKG8tPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIG8gPSBvLT5m
aXJzdENoaWxkKCk7Ci0gICAgICAgIGVsc2UgaWYoby0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAg
ICAgIG8gPSBvLT5uZXh0U2libGluZygpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG8g
PSBvLT5wYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChvKSAKLSAgICAgICAgICAgICAgICBvID0g
by0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGlmICghbykKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghby0+aXNJbmxpbmUoKSB8fCBvLT5pc1Jl
cGxhY2VkKCkpIHsKLSAgICAgICAgICAgIG8tPmFic29sdXRlUG9zaXRpb24oIHhQb3MsIHlQb3Mg
KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAt
PmVsZW1lbnQoKSAmJiBwLT5lbGVtZW50KCkgPT0gdGhpcyAmJiBvLT5pc1RleHQoKSAmJiAhby0+
aXNCUigpICYmICFzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Kj4obyktPmZpcnN0VGV4dEJveCgpKSB7
Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyAtIHNraXAgdW5yZW5kZXJlZCB3aGl0ZXNw
YWNlIHRoYXQgaXMgYSBjaGlsZCBvciBuZXh0IHNpYmxpbmcgb2YgdGhlIGFuY2hvcgotICAgICAg
ICB9Ci0gICAgICAgIGVsc2UgaWYoKG8tPmlzVGV4dCgpICYmICFvLT5pc0JSKCkpIHx8IG8tPmlz
UmVwbGFjZWQoKSkgewotICAgICAgICAgICAgby0+Y29udGFpbmVyKCktPmFic29sdXRlUG9zaXRp
b24oIHhQb3MsIHlQb3MgKTsKLSAgICAgICAgICAgIGlmIChvLT5pc1RleHQoKSAmJiBzdGF0aWNf
Y2FzdDxSZW5kZXJUZXh0ICo+KG8pLT5maXJzdFRleHRCb3goKSkgewotICAgICAgICAgICAgICAg
IHhQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+bWluWFBvcygpOwotICAgICAg
ICAgICAgICAgIHlQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+Zmlyc3RUZXh0
Qm94KCktPnJvb3QoKS0+dG9wT3ZlcmZsb3coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGVsc2UgewotICAgICAgICAgICAgICAgIHhQb3MgKz0gby0+eFBvcygpOwotICAgICAgICAgICAg
ICAgIHlQb3MgKz0gby0+eVBvcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgdGhlIHRhcmdldCBkb2Vz
bid0IGhhdmUgYW55IGNoaWxkcmVuIG9yIHNpYmxpbmdzIHRoYXQgY291bGQgYmUgdXNlZCB0byBj
YWxjdWxhdGUgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2UgbXVzdCBiZQotICAgIC8vIGF0IHRoZSBl
bmQgb2YgdGhlIGRvY3VtZW50LiAgU2Nyb2xsIHRvIHRoZSBib3R0b20uCi0gICAgaWYgKCFvKSB7
Ci0gICAgICAgIHlQb3MgKz0gZ2V0RG9jdW1lbnQoKS0+dmlldygpLT5jb250ZW50c0hlaWdodCgp
OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIENvbnRhaW5lck5vZGVJbXBsOjpnZXRMb3dlclJpZ2h0Q29ybmVyKGludCAmeFBvcywgaW50
ICZ5UG9zKSBjb25zdAotewotICAgIGlmICghbV9yZW5kZXIpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIFJlbmRlck9iamVjdCAqbyA9IG1fcmVuZGVyOwotICAgIHhQb3MgPSB5UG9zID0g
MDsKLSAgICBpZiAoIW8tPmlzSW5saW5lKCkgfHwgby0+aXNSZXBsYWNlZCgpKQotICAgIHsKLSAg
ICAgICAgby0+YWJzb2x1dGVQb3NpdGlvbiggeFBvcywgeVBvcyApOwotICAgICAgICB4UG9zICs9
IG8tPndpZHRoKCk7Ci0gICAgICAgIHlQb3MgKz0gby0+aGVpZ2h0KCk7Ci0gICAgICAgIHJldHVy
biB0cnVlOwotICAgIH0KLSAgICAvLyBmaW5kIHRoZSBsYXN0IHRleHQvaW1hZ2UgY2hpbGQsIHRv
IGdldCBhIHBvc2l0aW9uCi0gICAgd2hpbGUobykgewotICAgICAgICBpZihvLT5sYXN0Q2hpbGQo
KSkKLSAgICAgICAgICAgIG8gPSBvLT5sYXN0Q2hpbGQoKTsKLSAgICAgICAgZWxzZSBpZihvLT5w
cmV2aW91c1NpYmxpbmcoKSkKLSAgICAgICAgICAgIG8gPSBvLT5wcmV2aW91c1NpYmxpbmcoKTsK
LSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QgKnByZXYgPSAwOwotICAg
ICAgICAgICAgd2hpbGUoIXByZXYpIHsKLSAgICAgICAgICAgICAgICBvID0gby0+cGFyZW50KCk7
Ci0gICAgICAgICAgICAgICAgaWYoIW8pIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBw
cmV2ID0gby0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBv
ID0gcHJldjsKLSAgICAgICAgfQotICAgICAgICBpZihvLT5pc1RleHQoKSB8fCBvLT5pc1JlcGxh
Y2VkKCkpIHsKLSAgICAgICAgICAgIG8tPmNvbnRhaW5lcigpLT5hYnNvbHV0ZVBvc2l0aW9uKHhQ
b3MsIHlQb3MpOwotICAgICAgICAgICAgaWYgKG8tPmlzVGV4dCgpKQotICAgICAgICAgICAgICAg
IHhQb3MgKz0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCAqPihvKS0+bWluWFBvcygpICsgby0+d2lk
dGgoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB4UG9zICs9IG8tPnhQb3Mo
KStvLT53aWR0aCgpOwotICAgICAgICAgICAgeVBvcyArPSBvLT55UG9zKCkrby0+aGVpZ2h0KCk7
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotUVJlY3QgQ29udGFpbmVyTm9kZUltcGw6OmdldFJlY3QoKSBjb25zdAotewot
ICAgIGludCB4UG9zID0gMCwgeVBvcyA9IDAsIHhFbmQgPSAwLCB5RW5kID0gMDsKLSAgICBib29s
IGZvdW5kVXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0Q29ybmVyKHhQb3MseVBvcyk7Ci0gICAgYm9v
bCBmb3VuZExvd2VyUmlnaHQgPSBnZXRMb3dlclJpZ2h0Q29ybmVyKHhFbmQseUVuZCk7Ci0gICAg
Ci0gICAgLy8gSWYgd2UndmUgZm91bmQgb25lIGNvcm5lciwgYnV0IG5vdCB0aGUgb3RoZXIsCi0g
ICAgLy8gdGhlbiB3ZSBzaG91bGQganVzdCByZXR1cm4gYSBwb2ludCBhdCB0aGUgY29ybmVyIHRo
YXQgd2UgZGlkIGZpbmQuCi0gICAgaWYgKGZvdW5kVXBwZXJMZWZ0ICE9IGZvdW5kTG93ZXJSaWdo
dCkKLSAgICB7Ci0gICAgICAgIGlmIChmb3VuZFVwcGVyTGVmdCkgewotICAgICAgICAgICAgeEVu
ZCA9IHhQb3M7Ci0gICAgICAgICAgICB5RW5kID0geVBvczsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIHhQb3MgPSB4RW5kOwotICAgICAgICAgICAgeVBvcyA9IHlFbmQ7Ci0gICAgICAg
IH0KLSAgICB9IAotCi0gICAgaWYgKHhFbmQgPCB4UG9zKQotICAgICAgICB4RW5kID0geFBvczsK
LSAgICBpZiAoeUVuZCA8IHlQb3MpCi0gICAgICAgIHlFbmQgPSB5UG9zOwotICAgICAgICAKLSAg
ICByZXR1cm4gUVJlY3QoeFBvcywgeVBvcywgeEVuZCAtIHhQb3MsIHlFbmQgLSB5UG9zKTsKLX0K
LQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6c2V0Rm9jdXMoYm9vbCByZWNlaXZlZCkKLXsKLSAg
ICBpZiAobV9mb2N1c2VkID09IHJlY2VpdmVkKSByZXR1cm47Ci0KLSAgICBOb2RlSW1wbDo6c2V0
Rm9jdXMocmVjZWl2ZWQpOwotCi0gICAgLy8gbm90ZSB0aGF0IHdlIG5lZWQgdG8gcmVjYWxjIHRo
ZSBzdHlsZQotICAgIHNldENoYW5nZWQoKTsKLX0KLQotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6
c2V0QWN0aXZlKGJvb2wgZG93biwgYm9vbCBwYXVzZSkKLXsKLSAgICBpZiAoZG93biA9PSBhY3Rp
dmUoKSkgcmV0dXJuOwotCi0gICAgTm9kZUltcGw6OnNldEFjdGl2ZShkb3duKTsKLQotICAgIC8v
IG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2FsYyB0aGUgc3R5bGUKLSAgICAvLyBGSVhNRTogTW92
ZSB0byBFbGVtZW50SW1wbAotICAgIGlmIChtX3JlbmRlcikgewotICAgICAgICBib29sIHJlYWN0
c1RvUHJlc3MgPSBtX3JlbmRlci0+c3R5bGUoKS0+YWZmZWN0ZWRCeUFjdGl2ZVJ1bGVzKCk7Ci0g
ICAgICAgIGlmIChyZWFjdHNUb1ByZXNzKQotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAg
ICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpLT5oYXNBcHBlYXJhbmNl
KCkpIHsKLSAgICAgICAgICAgIGlmICh0aGVtZSgpLT5zdGF0ZUNoYW5nZWQocmVuZGVyZXIoKSwg
UHJlc3NlZFN0YXRlKSkKLSAgICAgICAgICAgICAgICByZWFjdHNUb1ByZXNzID0gdHJ1ZTsKLSAg
ICAgICAgfQotICAgICAgICBpZiAocmVhY3RzVG9QcmVzcyAmJiBwYXVzZSkgewotICAgICAgICAg
ICAgLy8gVGhlIGRlbGF5IGhlcmUgaXMgc3VidGxlLiAgSXQgcmVsaWVzIG9uIGFuIGFzc3VtcHRp
b24sIG5hbWVseSB0aGF0IHRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcwotICAgICAgICAgICAg
Ly8gdG8gcmVwYWludCB0aGUgImRvd24iIHN0YXRlIG9mIHRoZSBjb250cm9sIGlzIGFib3V0IHRo
ZSBzYW1lIHRpbWUgYXMgaXQgd291bGQgdGFrZSB0byByZXBhaW50IHRoZQotICAgICAgICAgICAg
Ly8gInVwIiBzdGF0ZS4gIE9uY2UgeW91IGFzc3VtZSB0aGlzLCB5b3UgY2FuIGp1c3QgZGVsYXkg
Zm9yIDEwMG1zIC0gdGhhdCB0aW1lIChhc3N1bWluZyB0aGF0IGFmdGVyIHlvdQotICAgICAgICAg
ICAgLy8gbGVhdmUgdGhpcyBtZXRob2QsIGl0IHdpbGwgYmUgYWJvdXQgdGhhdCBsb25nIGJlZm9y
ZSB0aGUgZmx1c2ggb2YgdGhlIHVwIHN0YXRlIGhhcHBlbnMgYWdhaW4pLgotICAgICAgICAgICAg
UVRpbWUgc3RhcnRUaW1lOwotICAgICAgICAgICAgc3RhcnRUaW1lLnJlc3RhcnQoKTsKLQotICAg
ICAgICAgICAgLy8gRG8gYW4gaW1tZWRpYXRlIHJlcGFpbnQuCi0gICAgICAgICAgICBtX3JlbmRl
ci0+cmVwYWludCh0cnVlKTsKLSAgICAgICAgICAgIAotI2lmICFXSU4zMgotICAgICAgICAgICAg
Ly8gRklYTUU6IEZpbmQgYSBzdWJzdGl0dXRlIGZvciB1c2xlZXAuICBCZXR0ZXIgeWV0LCBjb21l
IHVwIHdpdGggYSB3YXkgb2YgZG9pbmcgdGhpcyB0aGF0IAotICAgICAgICAgICAgLy8gZG9lc24n
dCB1c2UgdXNsZWVwIGF0IGFsbC4KLSAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1lID0gMTAw
IC0gc3RhcnRUaW1lLmVsYXBzZWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm93
IHBhdXNlIGZvciBhIHNtYWxsIGFtb3VudCBvZiB0aW1lICgxLzEwdGggb2YgYSBzZWNvbmQgZnJv
bSBiZWZvcmUgd2UgcmVwYWludGVkIGluIHRoZSBwcmVzc2VkIHN0YXRlKQotICAgICAgICAgICAg
aWYgKHJlbWFpbmluZ1RpbWUgPiAwKQotICAgICAgICAgICAgICAgIHVzbGVlcChyZW1haW5pbmdU
aW1lICogMTAwMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDb250YWlu
ZXJOb2RlSW1wbDo6c2V0SG92ZXJlZChib29sIG92ZXIpCi17Ci0gICAgaWYgKG92ZXIgPT0gaG92
ZXJlZCgpKSByZXR1cm47Ci0KLSAgICBOb2RlSW1wbDo6c2V0SG92ZXJlZChvdmVyKTsKLQotICAg
IC8vIG5vdGUgdGhhdCB3ZSBuZWVkIHRvIHJlY2FsYyB0aGUgc3R5bGUKLSAgICAvLyBGSVhNRTog
TW92ZSB0byBFbGVtZW50SW1wbAotICAgIGlmIChtX3JlbmRlcikgewotICAgICAgICBpZiAobV9y
ZW5kZXItPnN0eWxlKCktPmFmZmVjdGVkQnlIb3ZlclJ1bGVzKCkpCi0gICAgICAgICAgICBzZXRD
aGFuZ2VkKCk7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPnN0eWxlKCkt
Pmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5k
ZXJlcigpLCBIb3ZlclN0YXRlKTsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIENvbnRhaW5lck5vZGVJ
bXBsOjpjaGlsZE5vZGVDb3VudCgpIGNvbnN0Ci17Ci0gICAgdW5zaWduZWQgY291bnQgPSAwOwot
ICAgIE5vZGVJbXBsICpuOwotICAgIGZvciAobiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5l
eHRTaWJsaW5nKCkpCi0gICAgICAgIGNvdW50Kys7Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi1O
b2RlSW1wbCAqQ29udGFpbmVyTm9kZUltcGw6OmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCkKLXsK
LSAgICB1bnNpZ25lZCBpOwotICAgIE5vZGVJbXBsICpuID0gZmlyc3RDaGlsZCgpOwotICAgIGZv
ciAoaSA9IDA7IG4gIT0gMCAmJiBpIDwgaW5kZXg7IGkrKykKLSAgICAgICAgbiA9IG4tPm5leHRT
aWJsaW5nKCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgQ29udGFpbmVyTm9kZUltcGw6OmRp
c3BhdGNoQ2hpbGRJbnNlcnRlZEV2ZW50cyggTm9kZUltcGwgKmNoaWxkLCBpbnQgJmV4Y2VwdGlv
bmNvZGUgKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBp
ZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBjaGlsZC0+aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsK
LSAgICBlbHNlCi0gICAgICAgIGNoaWxkLT5pbnNlcnRlZEludG9UcmVlKHRydWUpOwotCi0gICAg
aWYgKGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVJ
TlNFUlRFRF9MSVNURU5FUikpIHsKLSAgICAgICAgY2hpbGQtPmRpc3BhdGNoRXZlbnQobmV3IE11
dGF0aW9uRXZlbnRJbXBsKERPTU5vZGVJbnNlcnRlZEV2ZW50LAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxmYWxzZSx0aGlzLERPTVN0cmlu
ZygpLERPTVN0cmluZygpLERPTVN0cmluZygpLDApLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci0gICAg
ICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnQgZXZlbnQgdG8gYWxs
IGRlc2NlbmRhbnRzCi0gICAgYm9vbCBoYXNJbnNlcnRlZExpc3RlbmVycyA9IGdldERvY3VtZW50
KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVJTlNFUlRFRElOVE9ET0NV
TUVOVF9MSVNURU5FUik7Ci0KLSAgICBpZiAoaGFzSW5zZXJ0ZWRMaXN0ZW5lcnMgJiYgaW5Eb2N1
bWVudCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZUltcGwgKmMgPSBjaGlsZDsgYzsgYyA9IGMtPnRy
YXZlcnNlTmV4dE5vZGUoY2hpbGQpKSB7Ci0gICAgICAgICAgICBjLT5kaXNwYXRjaEV2ZW50KG5l
dyBNdXRhdGlvbkV2ZW50SW1wbChET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnRFdmVudCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLGZh
bHNlLDAsRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9uY29k
ZSx0cnVlKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gYmFzZSBjbGFzcyBmb3Igbm9kZXMg
dGhhdCBtYXkgaGF2ZSBjaGlsZHJlbgotdm9pZCBDb250YWluZXJOb2RlSW1wbDo6ZGlzcGF0Y2hD
aGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBsICpjaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICkK
LXsKLSAgICAvLyB1cGRhdGUgYXV4aWxpYXJ5IGRvYyBpbmZvIChlLmcuIGl0ZXJhdG9ycykgdG8g
bm90ZSB0aGF0IG5vZGUgaXMgYmVpbmcgcmVtb3ZlZAotICAgIGdldERvY3VtZW50KCktPm5vdGlm
eUJlZm9yZU5vZGVSZW1vdmFsKGNoaWxkKTsgLy8gIyMjIHVzZSBldmVudHMgaW5zdGVhZAotCi0g
ICAgLy8gZGlzcGF0Y2ggcHJlLXJlbW92YWwgbXV0YXRpb24gZXZlbnRzCi0gICAgaWYgKGdldERv
Y3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRPTU5PREVSRU1PVkVEX0xJ
U1RFTkVSKSkgewotCWNoaWxkLT5kaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50SW1wbChE
T01Ob2RlUmVtb3ZlZEV2ZW50LAotCQkJICAgICB0cnVlLGZhbHNlLHRoaXMsRE9NU3RyaW5nKCks
RE9NU3RyaW5nKCksRE9NU3RyaW5nKCksMCksZXhjZXB0aW9uY29kZSx0cnVlKTsKLQlpZiAoZXhj
ZXB0aW9uY29kZSkKLQkgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgaGFzUmVtb3ZhbExp
c3RlbmVycyA9IGdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudEltcGw6OkRP
TU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsKLQotICAgIC8vIGRpc3BhdGNoIHRo
ZSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCBldmVudCB0byBhbGwgZGVzY2VuZGFudHMKLSAg
ICBpZiAoaW5Eb2N1bWVudCgpKSB7Ci0JZm9yIChOb2RlSW1wbCAqYyA9IGNoaWxkOyBjOyBjID0g
Yy0+dHJhdmVyc2VOZXh0Tm9kZShjaGlsZCkpIHsKLQkgICAgaWYgKGhhc1JlbW92YWxMaXN0ZW5l
cnMpIHsKLQkJYy0+ZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudEltcGwoRE9NTm9kZVJl
bW92ZWRGcm9tRG9jdW1lbnRFdmVudCwKLQkJCQkgZmFsc2UsZmFsc2UsMCxET01TdHJpbmcoKSxE
T01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNlcHRpb25jb2RlLHRydWUpOwotCQlpZiAoZXhj
ZXB0aW9uY29kZSkKLQkJICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi0KLU5vZGVMaXN0SW1wbDo6Tm9kZUxpc3RJbXBsKE5vZGVJbXBs
ICpfcm9vdE5vZGUpCi0gICAgOiByb290Tm9kZShfcm9vdE5vZGUpLAotICAgICAgaXNMZW5ndGhD
YWNoZVZhbGlkKGZhbHNlKSwKLSAgICAgIGlzSXRlbUNhY2hlVmFsaWQoZmFsc2UpCi17Ci0gICAg
cm9vdE5vZGUtPnJlZigpOwotICAgIHJvb3ROb2RlLT5yZWdpc3Rlck5vZGVMaXN0KHRoaXMpOwot
fSAgICAKLQotTm9kZUxpc3RJbXBsOjp+Tm9kZUxpc3RJbXBsKCkKLXsKLSAgICByb290Tm9kZS0+
dW5yZWdpc3Rlck5vZGVMaXN0KHRoaXMpOwotICAgIHJvb3ROb2RlLT5kZXJlZigpOwotfQotCi11
bnNpZ25lZCBOb2RlTGlzdEltcGw6OnJlY3Vyc2l2ZUxlbmd0aCggTm9kZUltcGwgKnN0YXJ0ICkg
Y29uc3QKLXsKLSAgICBpZiAoIXN0YXJ0KQotCXN0YXJ0ID0gcm9vdE5vZGU7Ci0KLSAgICBpZiAo
aXNMZW5ndGhDYWNoZVZhbGlkICYmIHN0YXJ0ID09IHJvb3ROb2RlKSB7Ci0gICAgICAgIHJldHVy
biBjYWNoZWRMZW5ndGg7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbGVuID0gMDsKLQotICAgIGZv
cihOb2RlSW1wbCAqbiA9IHN0YXJ0LT5maXJzdENoaWxkKCk7IG4gIT0gMDsgbiA9IG4tPm5leHRT
aWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCBuLT5ub2RlVHlwZSgpID09IE5vZGU6OkVMRU1FTlRf
Tk9ERSApIHsKLSAgICAgICAgICAgIGlmIChub2RlTWF0Y2hlcyhuKSkKLSAgICAgICAgICAgICAg
ICBsZW4rKzsKLSAgICAgICAgICAgIGxlbis9IHJlY3Vyc2l2ZUxlbmd0aChuKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIGlmIChzdGFydCA9PSByb290Tm9kZSkgewotICAgICAgICBjYWNoZWRM
ZW5ndGggPSBsZW47Ci0gICAgICAgIGlzTGVuZ3RoQ2FjaGVWYWxpZCA9IHRydWU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotTm9kZUltcGwgKk5vZGVMaXN0SW1wbDo6cmVjdXJzaXZl
SXRlbSAoIHVuc2lnbmVkIG9mZnNldCwgTm9kZUltcGwgKnN0YXJ0KSBjb25zdAotewotICAgIGlu
dCByZW1haW5pbmdPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgaWYgKCFzdGFydCkgewotICAgICAgICBz
dGFydCA9IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7Ci0gICAgICAgIGlmIChpc0l0ZW1DYWNoZVZh
bGlkKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID09IGxhc3RJdGVtT2Zmc2V0KSB7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuIGxhc3RJdGVtOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvZmZz
ZXQgPiBsYXN0SXRlbU9mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdEl0ZW07
Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nT2Zmc2V0IC09IGxhc3RJdGVtT2Zmc2V0OwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTm9kZUltcGwgKm4gPSBzdGFydDsK
LQotICAgIHdoaWxlIChuKSB7Ci0gICAgICAgIGlmICggbi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpF
TEVNRU5UX05PREUgKSB7Ci0gICAgICAgICAgICBpZiAobm9kZU1hdGNoZXMobikpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoIXJlbWFpbmluZ09mZnNldCkgewotICAgICAgICAgICAgICAgICAgICBs
YXN0SXRlbSA9IG47Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RJdGVtT2Zmc2V0ID0gb2Zmc2V0
OwotICAgICAgICAgICAgICAgICAgICBpc0l0ZW1DYWNoZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IHJlbWFpbmluZ09mZnNldC0tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
biA9IG4tPnRyYXZlcnNlTmV4dE5vZGUocm9vdE5vZGUpOwotICAgIH0KLQotICAgIHJldHVybiAw
OyAvLyBubyBtYXRjaGluZyBub2RlIGluIHRoaXMgc3VidHJlZQotfQotCi1Ob2RlSW1wbCAqTm9k
ZUxpc3RJbXBsOjppdGVtQnlJZCAoY29uc3QgRE9NU3RyaW5nJiBlbGVtZW50SWQpIGNvbnN0Ci17
Ci0gICAgaWYgKHJvb3ROb2RlLT5pc0RvY3VtZW50Tm9kZSgpIHx8IHJvb3ROb2RlLT5pbkRvY3Vt
ZW50KCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm5vZGUgPSByb290Tm9kZS0+Z2V0RG9jdW1lbnQo
KS0+Z2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKLQotICAgICAgICBpZiAobm9kZSA9PSBOVUxM
IHx8ICFub2RlTWF0Y2hlcyhub2RlKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAg
IGZvciAoTm9kZUltcGwgKnAgPSBub2RlLT5wYXJlbnROb2RlKCk7IHA7IHAgPSBwLT5wYXJlbnRO
b2RlKCkpIHsKLSAgICAgICAgICAgIGlmIChwID09IHJvb3ROb2RlKQotICAgICAgICAgICAgICAg
IHJldHVybiBub2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0g
ICAgdW5zaWduZWQgbCA9IGxlbmd0aCgpOwotCi0gICAgZm9yICggdW5zaWduZWQgaSA9IDA7IGkg
PCBsOyBpKysgKSB7Ci0gICAgICAgIE5vZGVJbXBsICpub2RlID0gaXRlbShpKTsKLSAgICAgICAg
Ci0gICAgICAgIGlmICggc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obm9kZSktPmdldElEQXR0
cmlidXRlKCkgPT0gZWxlbWVudElkICkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi12b2lkIE5vZGVMaXN0SW1wbDo6
cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKQotewotICAgIGlzTGVuZ3RoQ2FjaGVWYWxpZCA9IGZh
bHNlOwotICAgIGlzSXRlbUNhY2hlVmFsaWQgPSBmYWxzZTsgICAgIAotICAgIGxhc3RJdGVtID0g
MDsKLX0KLQotQ2hpbGROb2RlTGlzdEltcGw6OkNoaWxkTm9kZUxpc3RJbXBsKCBOb2RlSW1wbCAq
biApCi0gICAgOiBOb2RlTGlzdEltcGwobikKLXsKLX0KLQotdW5zaWduZWQgQ2hpbGROb2RlTGlz
dEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgaWYgKGlzTGVuZ3RoQ2FjaGVWYWxpZCkKLSAg
ICAgICAgcmV0dXJuIGNhY2hlZExlbmd0aDsKLQotICAgIHVuc2lnbmVkIGxlbiA9IDA7Ci0gICAg
Tm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSByb290Tm9kZS0+Zmlyc3RDaGlsZCgpOyBuICE9IDA7
IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICBsZW4rKzsKLQotICAgIGNhY2hlZExlbmd0
aCA9IGxlbjsKLSAgICBpc0xlbmd0aENhY2hlVmFsaWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIGxl
bjsKLX0KLQotTm9kZUltcGwgKkNoaWxkTm9kZUxpc3RJbXBsOjppdGVtICggdW5zaWduZWQgaW5k
ZXggKSBjb25zdAotewotICAgIHVuc2lnbmVkIGludCBwb3MgPSAwOwotICAgIE5vZGVJbXBsICpu
ID0gcm9vdE5vZGUtPmZpcnN0Q2hpbGQoKTsKLQotICAgIGlmIChpc0l0ZW1DYWNoZVZhbGlkKSB7
Ci0gICAgICAgIGlmIChpbmRleCA9PSBsYXN0SXRlbU9mZnNldCkgewotICAgICAgICAgICAgcmV0
dXJuIGxhc3RJdGVtOwotICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID4gbGFzdEl0ZW1PZmZzZXQp
IHsKLSAgICAgICAgICAgIG4gPSBsYXN0SXRlbTsKLSAgICAgICAgICAgIHBvcyA9IGxhc3RJdGVt
T2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKG4gJiYgcG9zIDwgaW5kZXgp
IHsKLSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHBvcysrOwotICAgIH0K
LQotICAgIGlmIChuKSB7Ci0gICAgICAgIGxhc3RJdGVtID0gbjsKLSAgICAgICAgbGFzdEl0ZW1P
ZmZzZXQgPSBwb3M7Ci0gICAgICAgIGlzSXRlbUNhY2hlVmFsaWQgPSB0cnVlOwotICAgICAgICBy
ZXR1cm4gbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBDaGlsZE5vZGVMaXN0
SW1wbDo6bm9kZU1hdGNoZXMoTm9kZUltcGwgKnRlc3ROb2RlKSBjb25zdAotewotICAgIHJldHVy
biB0ZXN0Tm9kZS0+cGFyZW50Tm9kZSgpID09IHJvb3ROb2RlOwotfQotCi1UYWdOb2RlTGlzdElt
cGw6OlRhZ05vZGVMaXN0SW1wbChOb2RlSW1wbCAqbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1l
c3BhY2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKQotICAgIDogTm9kZUxpc3RJ
bXBsKG4pLCAKLSAgICAgIG1fbmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSksIAotICAgICAgbV9s
b2NhbE5hbWUobG9jYWxOYW1lKQotewotfQotCi11bnNpZ25lZCBUYWdOb2RlTGlzdEltcGw6Omxl
bmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlY3Vyc2l2ZUxlbmd0aCgpOwotfQotCi1Ob2Rl
SW1wbCAqVGFnTm9kZUxpc3RJbXBsOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAotewotICAg
IHJldHVybiByZWN1cnNpdmVJdGVtKGluZGV4KTsKLX0KLQotYm9vbCBUYWdOb2RlTGlzdEltcGw6
Om5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3QKLXsKLSAgICBpZiAoIXRlc3RO
b2RlLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICht
X25hbWVzcGFjZVVSSSAhPSBzdGFyQXRvbSAmJiBtX25hbWVzcGFjZVVSSSAhPSB0ZXN0Tm9kZS0+
bmFtZXNwYWNlVVJJKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICByZXR1cm4g
bV9sb2NhbE5hbWUgPT0gc3RhckF0b20gfHwgbV9sb2NhbE5hbWUgPT0gdGVzdE5vZGUtPmxvY2Fs
TmFtZSgpOwotfQotCi1OYW1lTm9kZUxpc3RJbXBsOjpOYW1lTm9kZUxpc3RJbXBsKE5vZGVJbXBs
ICpuLCBjb25zdCBET01TdHJpbmcgJnQgKQotICA6IE5vZGVMaXN0SW1wbChuKSwgbm9kZU5hbWUo
dCkKLXsKLX0KLQotdW5zaWduZWQgTmFtZU5vZGVMaXN0SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gcmVjdXJzaXZlTGVuZ3RoKCk7Ci19Ci0KLU5vZGVJbXBsICpOYW1lTm9kZUxp
c3RJbXBsOjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdAotewotICAgIHJldHVybiByZWN1
cnNpdmVJdGVtKCBpbmRleCApOwotfQotCi1ib29sIE5hbWVOb2RlTGlzdEltcGw6Om5vZGVNYXRj
aGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RWxlbWVudEltcGwgKj4odGVzdE5vZGUpLT5nZXRBdHRyaWJ1dGUobmFtZUF0dHIpID09IG5vZGVO
YW1lOwotfQotCiB9CkluZGV4OiBraHRtbC94bWwvTmFtZU5vZGVMaXN0SW1wbC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIGtodG1sL3htbC9OYW1lTm9kZUxpc3RJbXBsLmgJKHJldmlzaW9uIDEyMDYzKQorKysg
a2h0bWwveG1sL05hbWVOb2RlTGlzdEltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMjIsNTk2ICsy
MiwxNCBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZuZGVm
IF9ET01fTm9kZUltcGxfaF8KLSNkZWZpbmUgX0RPTV9Ob2RlSW1wbF9oXworI2lmbmRlZiBET01f
TmFtZU5vZGVMaXN0SW1wbF9oCisjZGVmaW5lIERPTV9OYW1lTm9kZUxpc3RJbXBsX2gKIAotI2lu
Y2x1ZGUgImRvbS9kb21fc3RyaW5nLmgiCi0jaW5jbHVkZSAiZG9tL2RvbV9ub2RlLmgiCi0jaW5j
bHVkZSAibWlzYy9oZWxwZXIuaCIKLSNpbmNsdWRlICJtaXNjL3NoYXJlZC5oIgotI2luY2x1ZGUg
ImRvbV9hdG9taWNzdHJpbmcuaCIKLSNpbmNsdWRlICJEb2NQdHIuaCIKLQotY2xhc3MgUVBhaW50
ZXI7Ci10ZW1wbGF0ZSA8Y2xhc3MgdHlwZT4gY2xhc3MgUVB0ckxpc3Q7Ci10ZW1wbGF0ZSA8Y2xh
c3MgdHlwZT4gY2xhc3MgUVB0ckRpY3Q7Ci1jbGFzcyBLSFRNTFZpZXc7Ci1jbGFzcyBSZW5kZXJB
cmVuYTsKLWNsYXNzIFFSZWN0OwotY2xhc3MgUU1vdXNlRXZlbnQ7Ci1jbGFzcyBRS2V5RXZlbnQ7
Ci1jbGFzcyBRVGV4dFN0cmVhbTsKLWNsYXNzIFFTdHJpbmdMaXN0OwotY2xhc3MgUVdoZWVsRXZl
bnQ7Ci0KLW5hbWVzcGFjZSBraHRtbCB7Ci0gICAgY2xhc3MgUmVuZGVyT2JqZWN0OwotICAgIGNs
YXNzIFJlbmRlclN0eWxlOwotfTsKKyNpbmNsdWRlICJOb2RlTGlzdEltcGwuaCIKKyNpbmNsdWRl
ICJkb21fc3RyaW5nLmgiCiAKIG5hbWVzcGFjZSBET00gewogCi1jbGFzcyBBdG9taWNTdHJpbmc7
Ci1jbGFzcyBEb2N1bWVudEltcGw7Ci1jbGFzcyBFbGVtZW50SW1wbDsKLWNsYXNzIEV2ZW50SW1w
bDsKLWNsYXNzIEV2ZW50TGlzdGVuZXI7Ci1jbGFzcyBOb2RlTGlzdEltcGw7Ci1jbGFzcyBOYW1l
ZEF0dHJNYXBJbXBsOwotY2xhc3MgUXVhbGlmaWVkTmFtZTsKLWNsYXNzIFJlZ2lzdGVyZWRFdmVu
dExpc3RlbmVyOwotCi0vLyB0aGlzIGNsYXNzIGltcGxlbWVudHMgbm9kZXMsIHdoaWNoIGNhbiBo
YXZlIGEgcGFyZW50IGJ1dCBubyBjaGlsZHJlbjoKLWNsYXNzIE5vZGVJbXBsIDogcHVibGljIGto
dG1sOjpUcmVlU2hhcmVkPE5vZGVJbXBsPgotewotICAgIGZyaWVuZCBjbGFzcyBEb2N1bWVudElt
cGw7Ci1wdWJsaWM6Ci0gICAgTm9kZUltcGwoRG9jdW1lbnRJbXBsICpkb2MpOwotICAgIHZpcnR1
YWwgfk5vZGVJbXBsKCk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIE5v
ZGUKLSAgICB2aXJ0dWFsIGJvb2wgaGFzVGFnTmFtZShjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdO
YW1lKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5vZGVO
YW1lKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5vZGVWYWx1ZSgpIGNvbnN0
OwotICAgIHZpcnR1YWwgdm9pZCBzZXROb2RlVmFsdWUoIGNvbnN0IERPTVN0cmluZyAmX25vZGVW
YWx1ZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCBu
b2RlVHlwZSgpIGNvbnN0ID0gMDsKLSAgICBOb2RlSW1wbCAqcGFyZW50Tm9kZSgpIGNvbnN0IHsg
cmV0dXJuIHBhcmVudCgpOyB9Ci0gICAgTm9kZUltcGwgKnByZXZpb3VzU2libGluZygpIGNvbnN0
IHsgcmV0dXJuIG1fcHJldmlvdXM7IH0KLSAgICBOb2RlSW1wbCAqbmV4dFNpYmxpbmcoKSBjb25z
dCB7IHJldHVybiBtX25leHQ7IH0KLSAgICB2aXJ0dWFsIFJlZlB0cjxOb2RlTGlzdEltcGw+IGNo
aWxkTm9kZXMoKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpmaXJzdENoaWxkKCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqbGFzdENoaWxkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29s
IGhhc0F0dHJpYnV0ZXMoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5hbWVkQXR0ck1hcEltcGwgKmF0
dHJpYnV0ZXMoKSBjb25zdDsKLSAgICB2aXJ0dWFsIERvY3VtZW50SW1wbCAqb3duZXJEb2N1bWVu
dCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2VydEJlZm9yZSAoIE5vZGVJbXBs
ICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAg
ICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5v
ZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2Rl
SW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0aW9uY29k
ZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxkICggTm9kZUltcGwgKm5ld0No
aWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGludCAm
ZXhjZXB0aW9uY29kZSk7Ci0gICAgdmlydHVhbCBib29sIGhhc0NoaWxkTm9kZXMgKCAgKSBjb25z
dDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpjbG9uZU5vZGUgKCBib29sIGRlZXAgKSA9IDA7Ci0g
ICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lk
IHNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIGludCAmZXhjZXB0aW9uY29k
ZSk7Ci0gICAgdm9pZCBub3JtYWxpemUgKCk7Ci0gICAgc3RhdGljIGJvb2wgaXNTdXBwb3J0ZWQo
Y29uc3QgRE9NU3RyaW5nICZmZWF0dXJlLCBjb25zdCBET01TdHJpbmcgJnZlcnNpb24pOwotCi0g
ICAgYm9vbCBpc1NhbWVOb2RlKE5vZGVJbXBsICpvdGhlcikgY29uc3QgeyByZXR1cm4gdGhpcyA9
PSBvdGhlcjsgfQotICAgIGJvb2wgaXNFcXVhbE5vZGUoTm9kZUltcGwgKm90aGVyKSBjb25zdDsK
LSAgICBib29sIGlzRGVmYXVsdE5hbWVzcGFjZShjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVS
SSkgY29uc3Q7Ci0gICAgRE9NU3RyaW5nIGxvb2t1cFByZWZpeChjb25zdCBET01TdHJpbmcgJm5h
bWVzcGFjZVVSSSkgY29uc3Q7Ci0gICAgRE9NU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShjb25z
dCBET01TdHJpbmcgJnByZWZpeCkgY29uc3Q7Ci0gICAgCi0gICAgRE9NU3RyaW5nIHRleHRDb250
ZW50KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUZXh0Q29udGVudChjb25zdCBET01TdHJpbmcgJnRl
eHQsIGludCAmZXhjZXB0aW9uKTsKLSAgICAKLSAgICBOb2RlSW1wbCAqbGFzdERlc2NlbmRhbnQo
KSBjb25zdDsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICB2
aXJ0dWFsIGJvb2wgaXNFbGVtZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzSFRNTEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotI2lm
IFNWR19TVVBQT1JUCi0gICAgdmlydHVhbCBib29sIGlzU1ZHRWxlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9Ci0jZW5kaWYKLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHlsZWRFbGVtZW50KCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNBdHRyaWJ1dGVOb2Rl
KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUZXh0Tm9kZSgp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQ29tbWVudE5vZGUo
KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0RvY3VtZW50Tm9k
ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgYm9vbCBpc0Jsb2NrRmxvdygpIGNvbnN0
OwotICAgIGJvb2wgaXNCbG9ja0Zsb3dPckJsb2NrVGFibGUoKSBjb25zdDsKLSAgICAKLSAgICAv
LyBVc2VkIGJ5IDxmb3JtPiBlbGVtZW50cyB0byBpbmRpY2F0ZSBhIG1hbGZvcm1lZCBzdGF0ZSBv
ZiBzb21lIGtpbmQsIHR5cGljYWxseQotICAgIC8vIHVzZWQgdG8ga2VlcCBmcm9tIGFwcGx5aW5n
IHRoZSBib3R0b20gbWFyZ2luIG9mIHRoZSBmb3JtLgotICAgIHZpcnR1YWwgYm9vbCBpc01hbGZv
cm1lZCgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldE1hbGZvcm1lZChi
b29sIG1hbGZvcm1lZCkge307Ci0gICAgCi0gICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBub3QgYmVp
bmcgcGFydCBvZiB0aGUgRE9NCi0gICAgLy8gQXR0ZW50aW9uOiB0aGV5IGFzc3VtZSB0aGF0IHRo
ZSBjYWxsZXIgZGlkIHRoZSBjb25zaXN0ZW5jeSBjaGVja2luZyEKLSAgICB2b2lkIHNldFByZXZp
b3VzU2libGluZyhOb2RlSW1wbCAqcHJldmlvdXMpIHsgbV9wcmV2aW91cyA9IHByZXZpb3VzOyB9
Ci0gICAgdm9pZCBzZXROZXh0U2libGluZyhOb2RlSW1wbCAqbmV4dCkgeyBtX25leHQgPSBuZXh0
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rmlyc3RDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwot
ICAgIHZpcnR1YWwgdm9pZCBzZXRMYXN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKTsKLQotICAgIE5v
ZGVJbXBsICpwcmV2aW91c05vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCkgY29uc3Q7Ci0gICAg
Tm9kZUltcGwgKm5leHROb2RlQ29uc2lkZXJpbmdBdG9taWNOb2RlcygpIGNvbnN0OwotICAgIAot
ICAgIEVsZW1lbnRJbXBsICpnZXRBbmNlc3RvckVsZW1lbnQoKSBjb25zdDsKLSAgICBET01TdHJp
bmcgbG9va3VwTmFtZXNwYWNlUHJlZml4KGNvbnN0IERPTVN0cmluZyAmX25hbWVzcGFjZVVSSSwg
Y29uc3QgRWxlbWVudEltcGwgKm9yaWdpbmFsRWxlbWVudCkgY29uc3Q7Ci0gICAgCi0gICAgLyoq
IChOb3QgcGFydCBvZiB0aGUgb2ZmaWNpYWwgRE9NKQotICAgICAqIFJldHVybnMgdGhlIG5leHQg
bGVhZiBub2RlLgotICAgICAqCi0gICAgICogVXNpbmcgdGhpcyBmdW5jdGlvbiBkZWxpdmVycyBs
ZWFmIG5vZGVzIGFzIGlmIHRoZSB3aG9sZSBET00gdHJlZQotICAgICAqIHdlcmUgYSBsaW5lYXIg
Y2hhaW4gb2YgaXRzIGxlYWYgbm9kZXMuCi0gICAgICogQHJldHVybiBuZXh0IGxlYWYgbm9kZSBv
ciAwIGlmIHRoZXJlIGFyZSBubyBtb3JlLgotICAgICAqLwotICAgIE5vZGVJbXBsICpuZXh0TGVh
Zk5vZGUoKSBjb25zdDsKLQotICAgIC8qKiAoTm90IHBhcnQgb2YgdGhlIG9mZmljaWFsIERPTSkK
LSAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBsZWFmIG5vZGUuCi0gICAgICoKLSAgICAgKiBV
c2luZyB0aGlzIGZ1bmN0aW9uIGRlbGl2ZXJzIGxlYWYgbm9kZXMgYXMgaWYgdGhlIHdob2xlIERP
TSB0cmVlCi0gICAgICogd2VyZSBhIGxpbmVhciBjaGFpbiBvZiBpdHMgbGVhZiBub2Rlcy4KLSAg
ICAgKiBAcmV0dXJuIHByZXZpb3VzIGxlYWYgbm9kZSBvciAwIGlmIHRoZXJlIGFyZSBubyBtb3Jl
LgotICAgICAqLwotICAgIE5vZGVJbXBsICpwcmV2aW91c0xlYWZOb2RlKCkgY29uc3Q7Ci0KLSAg
ICBib29sIGlzRWRpdGFibGVCbG9jaygpIGNvbnN0OwotICAgIEVsZW1lbnRJbXBsICplbmNsb3Np
bmdCbG9ja0Zsb3dFbGVtZW50KCkgY29uc3Q7Ci0gICAgRWxlbWVudEltcGwgKmVuY2xvc2luZ0Js
b2NrRmxvd09yVGFibGVFbGVtZW50KCkgY29uc3Q7Ci0gICAgRWxlbWVudEltcGwgKmVuY2xvc2lu
Z0lubGluZUVsZW1lbnQoKSBjb25zdDsKLSAgICBFbGVtZW50SW1wbCAqcm9vdEVkaXRhYmxlRWxl
bWVudCgpIGNvbnN0OwotICAgIAotICAgIGJvb2wgaW5TYW1lUm9vdEVkaXRhYmxlRWxlbWVudChO
b2RlSW1wbCAqKTsKLSAgICBib29sIGluU2FtZUNvbnRhaW5pbmdCbG9ja0Zsb3dFbGVtZW50KE5v
ZGVJbXBsICopOwotICAgIAotICAgIC8vIHVzZWQgYnkgdGhlIHBhcnNlci4gQ2hlY2tzIGFnYWlu
c3QgdGhlIERURCwgdW5saWtlIERPTSBvcGVyYXRpb25zIGxpa2UKLSAgICAvLyBhcHBlbmRDaGls
ZCgpLCBhbmQgcmV0dXJucyB0aGUgbmV3IGNvbnRhaW5lciBub2RlIGZvciBmdXR1cmUgaW5zZXJ0
aW9ucyBhcyB5b3UgcGFyc2UuCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqYWRkQ2hpbGQoTm9kZUlt
cGwgKm5ld0NoaWxkKTsKLSAgICAKLSAgICAvLyBjYWxsZWQgYnkgdGhlIHBhcnNlciB3aGVuIHRo
aXMgZWxlbWVudCdzIGNsb3NlIHRhZyBpcyByZWFjaGVkLAotICAgIC8vIHNpZ25hbGxpbmcgdGhh
dCBhbGwgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhZGRlZC4KLSAgICAvLyBUaGlz
IGlzIG9ubHkgbmVlZGVkIGZvciA8YXBwbGV0PiBhbmQgPG9iamVjdD4gZWxlbWVudHMsIHdoaWNo
IGNhbid0IGxheSB0aGVtc2VsdmVzIG91dAotICAgIC8vIHVudGlsIHRoZXkga25vdyBhbGwgb2Yg
dGhlaXIgbmVzdGVkIDxwYXJhbT5zLiBbMzYwMzE5MSwgNDA0MDg0OF0KLSAgICB2aXJ0dWFsIHZv
aWQgY2xvc2VSZW5kZXJlcigpIHt9Ci0KLSAgICBlbnVtIE1vdXNlRXZlbnRUeXBlIHsKLSAgICAg
ICAgTW91c2VQcmVzcywKLSAgICAgICAgTW91c2VSZWxlYXNlLAotICAgICAgICBNb3VzZUNsaWNr
LAotICAgICAgICBNb3VzZURibENsaWNrLAotICAgICAgICBNb3VzZU1vdmUKLSAgICB9OwotCi0g
ICAgc3RydWN0IE1vdXNlRXZlbnQKLSAgICB7Ci0gICAgICAgIE1vdXNlRXZlbnQoIGludCBfYnV0
dG9uLCBNb3VzZUV2ZW50VHlwZSBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRE9N
U3RyaW5nICZfdXJsID0gRE9NU3RyaW5nKCksIGNvbnN0IERPTVN0cmluZyYgX3RhcmdldCA9IERP
TVN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICBOb2RlSW1wbCAqX2lubmVyTm9kZSA9IDAp
Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnV0dG9uID0gX2J1dHRvbjsgdHlwZSA9
IF90eXBlOwotICAgICAgICAgICAgICAgIHVybCA9IF91cmw7IHRhcmdldCA9IF90YXJnZXQ7Ci0g
ICAgICAgICAgICAgICAgaW5uZXJOb2RlID0gX2lubmVyTm9kZTsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICBpbnQgYnV0dG9uOwotICAgICAgICBNb3VzZUV2ZW50VHlwZSB0eXBlOwotICAgICAg
ICBET01TdHJpbmcgdXJsOyAvLyB1cmwgdW5kZXIgbW91c2Ugb3IgZW1wdHkKLSAgICAgICAgRE9N
U3RyaW5nIHRhcmdldDsKLSAgICAgICAgUmVmUHRyPE5vZGVJbXBsPiBpbm5lck5vZGU7Ci0gICAg
fTsKLQotICAgIC8vIGZvciBMSU5LIGFuZCBTVFlMRQotICAgIHZpcnR1YWwgdm9pZCBzaGVldExv
YWRlZCgpIHt9Ci0KLSAgICBib29sIGhhc0lEKCkgY29uc3QgICAgICB7IHJldHVybiBtX2hhc0lk
OyB9Ci0gICAgYm9vbCBoYXNDbGFzcygpIGNvbnN0ICAgeyByZXR1cm4gbV9oYXNDbGFzczsgfQot
ICAgIGJvb2wgaGFzU3R5bGUoKSBjb25zdCAgIHsgcmV0dXJuIG1faGFzU3R5bGU7IH0KLSAgICBi
b29sIGFjdGl2ZSgpIGNvbnN0ICAgICB7IHJldHVybiBtX2FjdGl2ZTsgfQotICAgIGJvb2wgaW5B
Y3RpdmVDaGFpbigpIGNvbnN0IHsgcmV0dXJuIG1faW5BY3RpdmVDaGFpbjsgfQotICAgIGJvb2wg
aG92ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1faG92ZXJlZDsgfQotICAgIGJvb2wgZm9jdXNlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fZm9jdXNlZDsgfQotICAgIGJvb2wgYXR0YWNoZWQoKSBjb25zdCAg
IHsgcmV0dXJuIG1fYXR0YWNoZWQ7IH0KLSAgICBib29sIGNoYW5nZWQoKSBjb25zdCAgICB7IHJl
dHVybiBtX2NoYW5nZWQ7IH0KLSAgICBib29sIGhhc0NoYW5nZWRDaGlsZCgpIGNvbnN0IHsgcmV0
dXJuIG1faGFzQ2hhbmdlZENoaWxkOyB9Ci0gICAgYm9vbCBpc0xpbmsoKSBjb25zdCB7IHJldHVy
biBtX2lzTGluazsgfQotICAgIC8vIGluRG9jdW1lbnQgc2hvdWxkIGFsc28gbWFrZSBzdXJlIGEg
ZG9jdW1lbnQgZXhpc3RzIGluIGNhc2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGRlc3Ryb3llZCBi
ZWZvcmUgdGhlIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudC4KLSAgICBib29sIGlu
RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBkb2N1bWVudC5nZXQoKSAmJiBtX2luRG9jdW1lbnQ7
IH0KLSAgICBib29sIHN0eWxlRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVFbGVtZW50
OyB9Ci0gICAgYm9vbCBpbXBsaWNpdE5vZGUoKSBjb25zdCB7IHJldHVybiBtX2ltcGxpY2l0OyB9
Ci0gICAgdm9pZCBzZXRIYXNJRChib29sIGI9dHJ1ZSkgeyBtX2hhc0lkID0gYjsgfQotICAgIHZv
aWQgc2V0SGFzQ2xhc3MoYm9vbCBiPXRydWUpIHsgbV9oYXNDbGFzcyA9IGI7IH0KLSAgICB2b2lk
IHNldEhhc1N0eWxlKGJvb2wgYj10cnVlKSB7IG1faGFzU3R5bGUgPSBiOyB9Ci0gICAgdm9pZCBz
ZXRIYXNDaGFuZ2VkQ2hpbGQoIGJvb2wgYiA9IHRydWUgKSB7IG1faGFzQ2hhbmdlZENoaWxkID0g
YjsgfQotICAgIHZvaWQgc2V0SW5Eb2N1bWVudChib29sIGI9dHJ1ZSkgeyBtX2luRG9jdW1lbnQg
PSBiOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldEZvY3VzKGJvb2wgYj10cnVlKSB7IG1fZm9jdXNl
ZCA9IGI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlKGJvb2wgYj10cnVlLCBib29sIHBh
dXNlPWZhbHNlKSB7IG1fYWN0aXZlID0gYjsgfQotICAgIHZvaWQgc2V0SW5BY3RpdmVDaGFpbihi
b29sIGI9dHJ1ZSkgeyBtX2luQWN0aXZlQ2hhaW4gPSBiOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNl
dEhvdmVyZWQoYm9vbCBiPXRydWUpIHsgbV9ob3ZlcmVkID0gYjsgfQotICAgIHZvaWQgc2V0Q2hh
bmdlZChib29sIGI9dHJ1ZSk7Ci0KLSAgICB1bnNpZ25lZCBzaG9ydCB0YWJJbmRleCgpIGNvbnN0
IHsgcmV0dXJuIG1fdGFiSW5kZXg7IH0KLSAgICB2b2lkIHNldFRhYkluZGV4KHVuc2lnbmVkIHNo
b3J0IF90YWJJbmRleCkgeyBtX3RhYkluZGV4ID0gX3RhYkluZGV4OyB9Ci0KLSAgICAvKioKLSAg
ICAgICAgKiB3aGV0aGVyIHRoaXMgbm9kZSBjYW4gcmVjZWl2ZSB0aGUga2V5Ym9hcmQgZm9jdXMu
Ci0gICAgICovCi0gICAgdmlydHVhbCBib29sIGlzRm9jdXNhYmxlKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBib29sIGlzS2V5Ym9hcmRGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wg
aXNNb3VzZUZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0NvbnRyb2woKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfSAvLyBFdmVudHVhbGx5IHRoZSBub3Rpb24gb2Ygd2hhdCBp
cyBhIGNvbnRyb2wgd2lsbCBiZSBleHRlbnNpYmxlLgotICAgIHZpcnR1YWwgYm9vbCBpc0VuYWJs
ZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzQ2hlY2tlZCgp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5kZXRlcm1pbmF0
ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDb250ZW50
RWRpdGFibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFFSZWN0IGdldFJlY3QoKSBjb25zdDsKLQot
ICAgIGVudW0gU3R5bGVDaGFuZ2UgeyBOb0NoYW5nZSwgTm9Jbmhlcml0LCBJbmhlcml0LCBEZXRh
Y2gsIEZvcmNlIH07Ci0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSA9
IE5vQ2hhbmdlICkge30KLSAgICBTdHlsZUNoYW5nZSBkaWZmKCBraHRtbDo6UmVuZGVyU3R5bGUg
KnMxLCBraHRtbDo6UmVuZGVyU3R5bGUgKnMyICkgY29uc3Q7Ci0KLSAgICB1bnNpZ25lZCBub2Rl
SW5kZXgoKSBjb25zdDsKLSAgICAvLyBSZXR1cm5zIHRoZSBkb2N1bWVudCB0aGF0IHRoaXMgbm9k
ZSBpcyBhc3NvY2lhdGVkIHdpdGguIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgYmUgbm9u
LW51bGwsIGFzIG9wcG9zZWQgdG8KLSAgICAvLyBET00ncyBvd25lckRvY3VtZW50KCkgd2hpY2gg
aXMgbnVsbCBmb3IgRG9jdW1lbnQgbm9kZXMgKGFuZCBzb21ldGltZXMgRG9jdW1lbnRUeXBlIG5v
ZGVzKS4KLSAgICBEb2N1bWVudEltcGwqIGdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gZG9j
dW1lbnQuZ2V0KCk7IH0KLQotICAgIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnRJbXBsICpkb2Mp
OwotCi0gICAgdm9pZCBhZGRFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRU
eXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKTsKLSAgICB2b2lk
IHJlbW92ZUV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50
TGlzdGVuZXIgKmxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUpOwotICAgIHZvaWQgcmVtb3ZlSFRN
TEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpOwotICAgIHZvaWQg
c2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50
TGlzdGVuZXIgKmxpc3RlbmVyKTsKLSAgICBFdmVudExpc3RlbmVyICpnZXRIVE1MRXZlbnRMaXN0
ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSk7Ci0gICAgdm9pZCByZW1vdmVBbGxF
dmVudExpc3RlbmVycygpOwotCi0gICAgYm9vbCBkaXNwYXRjaEV2ZW50KEV2ZW50SW1wbCAqZXZ0
LCBpbnQgJmV4Y2VwdGlvbmNvZGUsIGJvb2wgdGVtcEV2ZW50ID0gZmFsc2UpOwotICAgIGJvb2wg
ZGlzcGF0Y2hHZW5lcmljRXZlbnQoIEV2ZW50SW1wbCAqZXZ0LCBpbnQgJmV4Y2VwdGlvbmNvZGUp
OwotICAgIGJvb2wgZGlzcGF0Y2hIVE1MRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5
cGUsIGJvb2wgY2FuQnViYmxlQXJnLCBib29sIGNhbmNlbGFibGVBcmcpOwotICAgIGJvb2wgZGlz
cGF0Y2hXaW5kb3dFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgYm9vbCBjYW5C
dWJibGVBcmcsIGJvb2wgY2FuY2VsYWJsZUFyZyk7Ci0gICAgYm9vbCBkaXNwYXRjaE1vdXNlRXZl
bnQoUU1vdXNlRXZlbnQgKmUsIGNvbnN0IEF0b21pY1N0cmluZyAmb3ZlcnJpZGVUeXBlLCBpbnQg
b3ZlcnJpZGVEZXRhaWwgPSAwKTsKLSAgICBib29sIGRpc3BhdGNoU2ltdWxhdGVkTW91c2VFdmVu
dChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSk7Ci0gICAgYm9vbCBkaXNwYXRjaE1vdXNl
RXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIGludCBidXR0b24sIGludCBkZXRh
aWwsCi0gICAgICAgIGludCBjbGllbnRYLCBpbnQgY2xpZW50WSwgaW50IHNjcmVlblgsIGludCBz
Y3JlZW5ZLAotICAgICAgICBib29sIGN0cmxLZXksIGJvb2wgYWx0S2V5LCBib29sIHNoaWZ0S2V5
LCBib29sIG1ldGFLZXkpOwotICAgIGJvb2wgZGlzcGF0Y2hVSUV2ZW50KGNvbnN0IEF0b21pY1N0
cmluZyAmZXZlbnRUeXBlLCBpbnQgZGV0YWlsID0gMCk7Ci0gICAgYm9vbCBkaXNwYXRjaFN1YnRy
ZWVNb2RpZmllZEV2ZW50KGJvb2wgY2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZSk7Ci0gICAgYm9vbCBk
aXNwYXRjaEtleUV2ZW50KFFLZXlFdmVudCAqa2V5KTsKLSAgICB2b2lkIGRpc3BhdGNoV2hlZWxF
dmVudChRV2hlZWxFdmVudCAqKTsKLQotICAgIHZvaWQgaGFuZGxlTG9jYWxFdmVudHMoRXZlbnRJ
bXBsICpldnQsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0KLSAgICAvLyBIYW5kbGVycyB0byBkby91bmRv
IGFjdGlvbnMgb24gdGhlIHRhcmdldCBub2RlIGJlZm9yZSBhbiBldmVudCBpcyBkaXNwYXRjaGVk
IHRvIGl0IGFuZCBhZnRlciB0aGUgZXZlbnQKLSAgICAvLyBoYXMgYmVlbiBkaXNwYXRjaGVkLiAg
VGhlIGRhdGEgcG9pbnRlciBpcyBoYW5kZWQgYmFjayBieSB0aGUgcHJlRGlzcGF0Y2ggYW5kIHBh
c3NlZCB0byBwb3N0RGlzcGF0Y2guCi0gICAgdmlydHVhbCB2b2lkKiBwcmVEaXNwYXRjaEV2ZW50
SGFuZGxlcihFdmVudEltcGwgKmV2dCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgdm9pZCBw
b3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQsIHZvaWQqIGRhdGEpIHt9Ci0K
LSAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYW4gZXZlbnQg
ZS5nLiBzdWJtaXR0aW5nIGEgZm9ybQotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0
RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgZm9y
IGRpc2FibGVkIGZvcm0gZWxlbWVudHM7IGlmIHRydWUsIHByZXZlbnRzIG1vdXNlIGV2ZW50cyBm
cm9tIGJlaW5nIGRpc3BhdGNoZWQKLSAgICAgKiB0byBldmVudCBsaXN0ZW5lcnMsIGFuZCBwcmV2
ZW50cyBET01BY3RpdmF0ZSBldmVudHMgZnJvbSBiZWluZyBzZW50IGF0IGFsbC4KLSAgICAgKi8K
LSAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBp
c1JlYWRPbmx5KCk7Ci0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoIHVuc2lnbmVk
IHNob3J0IC8qdHlwZSovICkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHVuc2lnbmVk
IGNoaWxkTm9kZUNvdW50KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2hpbGROb2Rl
KHVuc2lnbmVkIGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIERvZXMgYSBwcmUtb3JkZXIgdHJh
dmVyc2FsIG9mIHRoZSB0cmVlIHRvIGZpbmQgdGhlIG5vZGUgbmV4dCBub2RlIGFmdGVyIHRoaXMg
b25lLiBUaGlzIHVzZXMgdGhlIHNhbWUgb3JkZXIgdGhhdAotICAgICAqIHRoZSB0YWdzIGFwcGVh
ciBpbiB0aGUgc291cmNlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RheVdpdGhpbiBJ
ZiBub3QgbnVsbCwgdGhlIHRyYXZlcnNhbCB3aWxsIHN0b3Agb25jZSB0aGUgc3BlY2lmaWVkIG5v
ZGUgaXMgcmVhY2hlZC4gVGhpcyBjYW4gYmUgdXNlZCB0bwotICAgICAqIHJlc3RyaWN0IHRyYXZl
cnNhbCB0byBhIHBhcnRpY3VsYXIgc3ViLXRyZWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRo
ZSBuZXh0IG5vZGUsIGluIGRvY3VtZW50IG9yZGVyCi0gICAgICoKLSAgICAgKiBzZWUgQHJlZiB0
cmF2ZXJzZVByZXZpb3VzTm9kZSgpCi0gICAgICovCi0gICAgTm9kZUltcGwgKnRyYXZlcnNlTmV4
dE5vZGUoY29uc3QgTm9kZUltcGwgKnN0YXlXaXRoaW4gPSAwKSBjb25zdDsKLSAgICAKLSAgICAv
KiBMaWtlIHRyYXZlcnNlTmV4dE5vZGUsIGJ1dCBza2lwcyBjaGlsZHJlbiBhbmQgc3RhcnRzIHdp
dGggdGhlIG5leHQgc2libGluZy4gKi8KLSAgICBOb2RlSW1wbCAqdHJhdmVyc2VOZXh0U2libGlu
Zyhjb25zdCBOb2RlSW1wbCAqc3RheVdpdGhpbiA9IDApIGNvbnN0OwotCi0gICAgLyoqCi0gICAg
ICogRG9lcyBhIHJldmVyc2UgcHJlLW9yZGVyIHRyYXZlcnNhbCB0byBmaW5kIHRoZSBub2RlIHRo
YXQgY29tZXMgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSBpbiBkb2N1bWVudCBvcmRlcgotICAgICAq
Ci0gICAgICogc2VlIEByZWYgdHJhdmVyc2VOZXh0Tm9kZSgpCi0gICAgICovCi0gICAgTm9kZUlt
cGwgKnRyYXZlcnNlUHJldmlvdXNOb2RlKCkgY29uc3Q7Ci0KLSAgICAvKiBMaWtlIHRyYXZlcnNl
UHJldmlvdXNOb2RlLCBidXQgdmlzaXRzIG5vZGVzIGJlZm9yZSB0aGVpciBjaGlsZHJlbi4gKi8K
LSAgICBOb2RlSW1wbCAqdHJhdmVyc2VQcmV2aW91c05vZGVQb3N0T3JkZXIoY29uc3QgTm9kZUlt
cGwgKnN0YXlXaXRoaW4gPSAwKSBjb25zdDsKLQotICAgIE5vZGVJbXBsICpwcmV2aW91c0VkaXRh
YmxlKCkgY29uc3Q7Ci0gICAgTm9kZUltcGwgKm5leHRFZGl0YWJsZSgpIGNvbnN0OwotICAgIC8v
Ym9vbCBpc0VkaXRhYmxlKCkgY29uc3Q7Ci0KLSAgICBraHRtbDo6UmVuZGVyT2JqZWN0ICpyZW5k
ZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fcmVuZGVyOyB9Ci0gICAga2h0bWw6OlJlbmRlck9iamVj
dCAqbmV4dFJlbmRlcmVyKCk7Ci0gICAga2h0bWw6OlJlbmRlck9iamVjdCAqcHJldmlvdXNSZW5k
ZXJlcigpOwotICAgIHZvaWQgc2V0UmVuZGVyZXIoa2h0bWw6OlJlbmRlck9iamVjdCogcmVuZGVy
ZXIpIHsgbV9yZW5kZXIgPSByZW5kZXJlcjsgfQotICAgIAotICAgIHZvaWQgY2hlY2tTZXRQcmVm
aXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAg
IGJvb2wgaXNBbmNlc3Rvcihjb25zdCBOb2RlSW1wbCAqKSBjb25zdDsKLQotCS8vIFRoZXNlIHR3
byBtZXRob2RzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBUaGUgZm9ybWVyIGlzIHVzZWQgdG8g
ZG8gc3RyaWN0IGVycm9yLWNoZWNraW5nCi0JLy8gd2hlbiBhZGRpbmcgY2hpbGRyZW4gdmlhIHRo
ZSBwdWJsaWMgRE9NIEFQSSAoZS5nLiwgYXBwZW5kQ2hpbGQoKSkuICBUaGUgbGF0dGVyIGlzIGNh
bGxlZCBvbmx5IHdoZW4gcGFyc2luZywgCi0JLy8gdG8gc2FuaXR5LWNoZWNrIGFnYWluc3QgdGhl
IERURCBmb3IgZXJyb3IgcmVjb3ZlcnkuCi0Jdm9pZCBjaGVja0FkZENoaWxkKE5vZGVJbXBsICpu
ZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlKTsgICAgLy8gRXJyb3ItY2hlY2tpbmcgd2hlbiBh
ZGRpbmcgdmlhIHRoZSBET00gQVBJCi0JdmlydHVhbCBib29sIGNoaWxkQWxsb3dlZChOb2RlSW1w
bCAqbmV3Q2hpbGQpOwkJCQkgICAvLyBFcnJvci1jaGVja2luZyBkdXJpbmcgcGFyc2luZyB0aGF0
IGNoZWNrcyB0aGUgRFRECi0JCi0gICAgdmlydHVhbCBpbnQgbWF4T2Zmc2V0KCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCBpbnQgY2FyZXRNaW5PZmZzZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBj
YXJldE1heE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdW5zaWduZWQgY2FyZXRNYXhSZW5k
ZXJlZE9mZnNldCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBpbnQgcHJldmlvdXNPZmZzZXQgKGlu
dCBjdXJyZW50KSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBuZXh0T2Zmc2V0IChpbnQgY3VycmVu
dCkgY29uc3Q7Ci0gICAgCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFU
ZXh0U3RyZWFtICpzdHJlYW0sIFFTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlmCi0KLSAg
ICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEludGVncmF0aW9uIHdpdGggcmVuZGVy
aW5nIHRyZWUKLQotICAgIC8qKgotICAgICAqIEF0dGFjaGVzIHRoaXMgbm9kZSB0byB0aGUgcmVu
ZGVyaW5nIHRyZWUuIFRoaXMgY2FsY3VsYXRlcyB0aGUgc3R5bGUgdG8gYmUgYXBwbGllZCB0byB0
aGUgbm9kZSBhbmQgY3JlYXRlcyBhbgotICAgICAqIGFwcHJvcHJpYXRlIFJlbmRlck9iamVjdCB3
aGljaCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIHRyZWUgKGV4Y2VwdCB3aGVuIHRoZSBzdHls
ZSBoYXMgZGlzcGxheTogbm9uZSkuIFRoaXMKLSAgICAgKiBtYWtlcyB0aGUgbm9kZSB2aXNpYmxl
IGluIHRoZSBLSFRNTFZpZXcuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwot
Ci0gICAgLyoqCi0gICAgICogRGV0YWNoZXMgdGhlIG5vZGUgZnJvbSB0aGUgcmVuZGVyaW5nIHRy
ZWUsIG1ha2luZyBpdCBpbnZpc2libGUgaW4gdGhlIHJlbmRlcmVkIHZpZXcuIFRoaXMgbWV0aG9k
IHdpbGwgcmVtb3ZlCi0gICAgICogdGhlIG5vZGUncyByZW5kZXJpbmcgb2JqZWN0IGZyb20gdGhl
IHJlbmRlcmluZyB0cmVlIGFuZCBkZWxldGUgaXQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lk
IGRldGFjaCgpOwotCi0gICAgdmlydHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2b2lkIGNy
ZWF0ZVJlbmRlcmVySWZOZWVkZWQoKTsKLSAgICB2aXJ0dWFsIGtodG1sOjpSZW5kZXJTdHlsZSAq
c3R5bGVGb3JSZW5kZXJlcihraHRtbDo6UmVuZGVyT2JqZWN0ICpwYXJlbnQpOwotICAgIHZpcnR1
YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGtodG1sOjpSZW5kZXJTdHlsZSAqKTsKLSNpZiBTVkdf
U1VQUE9SVAotICAgIHZpcnR1YWwgYm9vbCBjaGlsZFNob3VsZENyZWF0ZVJlbmRlcmVyKERPTTo6
Tm9kZUltcGwgKikgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotI2VuZGlmCi0gICAgdmlydHVhbCBr
aHRtbDo6UmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBraHRtbDo6
UmVuZGVyU3R5bGUgKik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1l
dGhvZHMgZm9yIG1haW50YWluaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZWxlbWVudCBiZXR3ZWVuIGhp
c3RvcnkgbmF2aWdhdGlvbgotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Ig
bm90IHRoaXMgdHlwZSBvZiBub2RlIG1haW50YWlucyBpdCdzIHN0YXRlLiBJZiBzbywgdGhlIHN0
YXRlIG9mIHRoZSBub2RlIHdpbGwgYmUgc3RvcmVkIHdoZW4KLSAgICAgKiB0aGUgdXNlciBnb2Vz
IHRvIGEgZGlmZmVyZW50IHBhZ2UgdXNpbmcgdGhlIHN0YXRlKCkgbWV0aG9kLCBhbmQgcmVzdG9y
ZWQgdXNpbmcgdGhlIHJlc3RvcmVTdGF0ZSgpIG1ldGhvZCBpZiB0aGUKLSAgICAgKiB1c2VyIHJl
dHVybnMgKGUuZy4gdXNpbmcgdGhlIGJhY2sgYnV0dG9uKS4gVGhpcyBpcyB1c2VkIHRvIGVuc3Vy
ZSB0aGF0IHVzZXItY2hhbmdlYWJsZSBlbGVtZW50cyBzdWNoIGFzIGZvcm0KLSAgICAgKiBjb250
cm9scyBtYWludGFpbiB0aGVpciBjb250ZW50cyB3aGVuIHRoZSB1c2VyIHJldHVybnMgdG8gYSBw
cmV2aW91cyBwYWdlIGluIHRoZSBoaXN0b3J5LgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBt
YWludGFpbnNTdGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2Yg
dGhpcyBub2RlIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLiBUaGlzIHN0cmluZyB3aWxsIGJlIHBh
c3NlZCB0byByZXN0b3JlU3RhdGUoKSBpZiB0aGUgdXNlcgotICAgICAqIHJldHVybnMgdG8gdGhl
IHBhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0YXRlIGluZm9ybWF0aW9uIGFib3V0IHRo
ZSBub2RlIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nCi0gICAgICovCi0gICAgdmlydHVhbCBRU3Ry
aW5nIHN0YXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZWxl
bWVudCBiYXNlZCBvbiBzdHJpbmdzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgc3RhdGUoKS4gVGhp
cyBpcyB1c2VkIHRvIGluaXRpYWxpemUgZm9ybQotICAgICAqIGNvbnRyb2xzIHdpdGggdGhlaXIg
b2xkIHZhbHVlcyB3aGVuIHRoZSB1c2VyIHJldHVybnMgdG8gdGhlIHBhZ2UgaW4gdGhlaXIgaGlz
dG9yeS4gIFRoZSByZWNlaXZlcgotICAgICAqIHNob3VsZCByZW1vdmUgdGhlIHN0cmluZyBmcm9t
IHRoZSBsaXN0IHRoYXQgaXQgdXNlcyBmb3IgaXRzIHJlc3RvcmUuCi0gICAgICoKLSAgICAgKiBA
cGFyYW0gc3RhdGVzIFRoZSBzdHJpbmdzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgbm9kZXMnIHN0
YXRlIG1ldGhvZHMuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVTdGF0ZShRU3Ry
aW5nTGlzdCAmc3RhdGVMaXN0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAg
Ly8gTm90aWZpY2F0aW9uIG9mIGRvY3VtZW50IHN0dWN0dXJlIGNoYW5nZXMKLQotICAgIC8qKgot
ICAgICAqIE5vdGlmaWVzIHRoZSBub2RlIHRoYXQgaXQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0
aGUgZG9jdW1lbnQuIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBkb2N1bWVudCBwYXJzaW5nLCBhbmQg
YWxzbwotICAgICAqIHdoZW4gYSBub2RlIGlzIGFkZGVkIHRocm91Z2ggdGhlIERPTSBtZXRob2Rz
IGluc2VydEJlZm9yZSgpLCBhcHBlbmRDaGlsZCgpIG9yIHJlcGxhY2VDaGlsZCgpLiBOb3RlIHRo
YXQgdGhpcyBvbmx5Ci0gICAgICogaGFwcGVucyB3aGVuIHRoZSBub2RlIGJlY29tZXMgcGFydCBv
ZiB0aGUgZG9jdW1lbnQgdHJlZSwgaS5lLiBvbmx5IHdoZW4gdGhlIGRvY3VtZW50IGlzIGFjdHVh
bGx5IGFuIGFuY2VzdG9yIG9mCi0gICAgICogdGhlIG5vZGUuIFRoZSBjYWxsIGhhcHBlbnMgX2Fm
dGVyXyB0aGUgbm9kZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdHJlZS4KLSAgICAgKgotICAgICAq
IFRoaXMgaXMgc2ltaWxhciB0byB0aGUgRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50IERPTSBl
dmVudCwgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG92ZXJoZWFkIG9mIGV2ZW50Ci0gICAgICog
ZGlzcGF0Y2hpbmcuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3Vt
ZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0IGl0IGlzIG5v
IGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0cmVlLCBpLmUuIHdoZW4gdGhlIGRvY3VtZW50
IGlzIG5vIGxvbmdlciBhbiBhbmNlc3RvcgotICAgICAqIG5vZGUuCi0gICAgICoKLSAgICAgKiBU
aGlzIGlzIHNpbWlsYXIgdG8gdGhlIERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50IERPTSBldmVu
dCwgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG92ZXJoZWFkIG9mIGV2ZW50Ci0gICAgICogZGlz
cGF0Y2hpbmcsIGFuZCBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgbm9kZSBpcyByZW1vdmVkIGZyb20g
dGhlIHRyZWUuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQo
KTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW5ldmVyIHlvdSBhcmUg
Y29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBmcm9tIGEgdHJlZS4gIFRoYXQgdHJlZSBtYXkgYmUg
dGhlIG1haW4KLSAgICAvLyBkb2N1bWVudCB0cmVlLCBvciBpdCBjb3VsZCBiZSBhbm90aGVyIGRp
c2Nvbm5lY3RlZCB0cmVlLiAgT3ZlcnJpZGUgdGhlc2UgZnVuY3Rpb25zIHRvIGRvIGFueSB3b3Jr
IHRoYXQgZGVwZW5kcwotICAgIC8vIG9uIGNvbm5lY3RlZG5lc3MgdG8gc29tZSBhbmNlc3RvciAo
ZS5nLiwgYW4gYW5jZXN0b3IgPGZvcm0+IGZvciBleGFtcGxlKS4KLSAgICB2aXJ0dWFsIHZvaWQg
aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApIHt9OwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVk
RnJvbVRyZWUoYm9vbCBkZWVwKSB7fTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoZSBu
b2RlIHRoYXQgaXQncyBsaXN0IG9mIGNoaWxkcmVuIGhhdmUgY2hhbmdlZCAoZWl0aGVyIGJ5IGFk
ZGluZyBvciByZW1vdmluZyBjaGlsZCBub2RlcyksIG9yIGEgY2hpbGQKLSAgICAgKiBub2RlIHRo
YXQgaXMgb2YgdGhlIHR5cGUgQ0RBVEFfU0VDVElPTl9OT0RFLCBURVhUX05PREUgb3IgQ09NTUVO
VF9OT0RFIGhhcyBjaGFuZ2VkIGl0cyB2YWx1ZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQg
Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0b1N0cmluZygpIGNv
bnN0ID0gMDsKLSAgICAKLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGZvcm1hdEZv
ckRlYnVnZ2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKLQotICAgIHZv
aWQgc2hvd05vZGUoY29uc3QgY2hhciAqcHJlZml4PSIiKSBjb25zdDsKLSAgICB2b2lkIHNob3dU
cmVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzaG93VHJlZUFuZE1hcmsoTm9kZUltcGwgKiBtYXJrZWRO
b2RlMSwgY29uc3QgY2hhciAqIG1hcmtlZExhYmVsMSwgTm9kZUltcGwgKiBtYXJrZWROb2RlMiwg
Y29uc3QgY2hhciAqIG1hcmtlZExhYmVsMikgY29uc3Q7Ci0JCi0jZW5kaWYKLQotICAgIHZvaWQg
cmVnaXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3QpOwotICAgIHZvaWQgdW5yZWdpc3Rl
ck5vZGVMaXN0KE5vZGVMaXN0SW1wbCAqbGlzdCk7Ci0gICAgdm9pZCBub3RpZnlOb2RlTGlzdHND
aGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2b2lkIG5vdGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRyZW5D
aGFuZ2VkKCk7Ci0gICAgdm9pZCBub3RpZnlOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0g
ICAgdm9pZCBub3RpZnlMb2NhbE5vZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQoKTsKLSAgICAKLSAg
ICBSZWZQdHI8Tm9kZUxpc3RJbXBsPiBnZXRFbGVtZW50c0J5VGFnTmFtZShjb25zdCBET01TdHJp
bmcgJm5hbWUpIHsgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBuYW1lKTsgfQot
ICAgIFJlZlB0cjxOb2RlTGlzdEltcGw+IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoY29uc3QgRE9N
U3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmbG9jYWxOYW1lKTsKLQotcHJp
dmF0ZTogLy8gbWVtYmVycwotICAgIERvY1B0cjxEb2N1bWVudEltcGw+IGRvY3VtZW50OwotICAg
IE5vZGVJbXBsICptX3ByZXZpb3VzOwotICAgIE5vZGVJbXBsICptX25leHQ7Ci1wcm90ZWN0ZWQ6
Ci0gICAga2h0bWw6OlJlbmRlck9iamVjdCAqbV9yZW5kZXI7Ci0gICAgUVB0ckxpc3Q8UmVnaXN0
ZXJlZEV2ZW50TGlzdGVuZXI+ICptX3JlZ2RMaXN0ZW5lcnM7Ci0gICAgUVB0ckRpY3Q8Tm9kZUxp
c3RJbXBsPiAqbV9ub2RlTGlzdHM7Ci0KLSAgICB1bnNpZ25lZCBzaG9ydCBtX3RhYkluZGV4IDog
MTU7Ci0gICAgYm9vbCBtX2hhc1RhYkluZGV4ICA6IDE7Ci0KLSAgICBib29sIG1faGFzSWQgOiAx
OwotICAgIGJvb2wgbV9oYXNDbGFzcyA6IDE7Ci0gICAgYm9vbCBtX2hhc1N0eWxlIDogMTsKLSAg
ICBib29sIG1fYXR0YWNoZWQgOiAxOwotICAgIGJvb2wgbV9jaGFuZ2VkIDogMTsKLSAgICBib29s
IG1faGFzQ2hhbmdlZENoaWxkIDogMTsKLSAgICBib29sIG1faW5Eb2N1bWVudCA6IDE7Ci0KLSAg
ICBib29sIG1faXNMaW5rIDogMTsKLSAgICBib29sIG1fc3BlY2lmaWVkIDogMTsgLy8gdXNlZCBp
biBBdHRySW1wbC4gQWNjZXNzb3IgZnVuY3Rpb25zIHRoZXJlCi0gICAgYm9vbCBtX2ZvY3VzZWQg
OiAxOwotICAgIGJvb2wgbV9hY3RpdmUgOiAxOwotICAgIGJvb2wgbV9ob3ZlcmVkIDogMTsKLSAg
ICBib29sIG1faW5BY3RpdmVDaGFpbiA6IDE7Ci0gICAgYm9vbCBtX3N0eWxlRWxlbWVudCA6IDE7
IC8vIGNvbnRhaW5zIHN0eWxlc2hlZXQgdGV4dAotICAgIGJvb2wgbV9pbXBsaWNpdCA6IDE7IC8v
IGltcGxpY2l0ZWx5IGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyCi0KLSAgICBib29sIG1faW5EZXRh
Y2ggOiAxOwotfTsKLQotY2xhc3MgQ29udGFpbmVyTm9kZUltcGwgOiBwdWJsaWMgTm9kZUltcGwK
LXsKLXB1YmxpYzoKLSAgICBDb250YWluZXJOb2RlSW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0g
ICAgdmlydHVhbCB+Q29udGFpbmVyTm9kZUltcGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92
ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpmaXJz
dENoaWxkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqbGFzdENoaWxkKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaW5zZXJ0QmVmb3JlICggTm9kZUltcGwgKm5ld0NoaWxk
LCBOb2RlSW1wbCAqcmVmQ2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKnJlcGxhY2VDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKm9s
ZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZW1v
dmVDaGlsZCAoIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAg
dmlydHVhbCBOb2RlSW1wbCAqYXBwZW5kQ2hpbGQgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAm
ZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZE5vZGVzICggICkgY29u
c3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdm9pZCB3
aWxsUmVtb3ZlKCk7Ci0gICAgaW50IHdpbGxSZW1vdmVDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwot
ICAgIHZvaWQgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsKLSAgICB2b2lkIHJlbW92ZUNoaWxkcmVuKCk7
Ci0gICAgdm9pZCBjbG9uZUNoaWxkTm9kZXMoTm9kZUltcGwgKmNsb25lKTsKLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRGaXJzdENoaWxkKE5vZGVJbXBsICpjaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lk
IHNldExhc3RDaGlsZChOb2RlSW1wbCAqY2hpbGQpOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFk
ZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwot
ICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgIHZpcnR1YWwgUVJlY3QgZ2V0UmVjdCgp
IGNvbnN0OwotICAgIGJvb2wgZ2V0VXBwZXJMZWZ0Q29ybmVyKGludCAmeFBvcywgaW50ICZ5UG9z
KSBjb25zdDsKLSAgICBib29sIGdldExvd2VyUmlnaHRDb3JuZXIoaW50ICZ4UG9zLCBpbnQgJnlQ
b3MpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHNldEZvY3VzKGJvb2w9dHJ1ZSk7Ci0gICAg
dmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSA9IHRydWUsIGJvb2wgcGF1c2UgPSBm
YWxzZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEhvdmVyZWQoYm9vbD10cnVlKTsKLSAgICB2aXJ0
dWFsIHVuc2lnbmVkIGNoaWxkTm9kZUNvdW50KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1w
bCAqY2hpbGROb2RlKHVuc2lnbmVkIGluZGV4KTsKLQotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRl
ZEludG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7
Ci0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJvb2wgZGVlcCk7Ci0KLS8vcHJvdGVjdGVkOgotICAg
IE5vZGVJbXBsICpfZmlyc3Q7Ci0gICAgTm9kZUltcGwgKl9sYXN0OwotCi0gICAgLy8gaGVscGVy
IGZ1bmN0aW9ucyBmb3IgaW5zZXJ0aW5nIGNoaWxkcmVuOgotCi0gICAgLy8gIyMjIHRoaXMgc2hv
dWxkIHZhbmlzaC4gZG8gaXQgaW4gZG9tLyAhCi0gICAgLy8gY2hlY2sgZm9yIHNhbWUgc291cmNl
IGRvY3VtZW50OgotICAgIGJvb2wgY2hlY2tTYW1lRG9jdW1lbnQoIE5vZGVJbXBsICpuZXdjaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgLy8gY2hlY2sgZm9yIGJlaW5nIGNoaWxkOgot
ICAgIGJvb2wgY2hlY2tJc0NoaWxkKCBOb2RlSW1wbCAqb2xkY2hpbGQsIGludCAmZXhjZXB0aW9u
Y29kZSApOwotICAgIC8vICMjIwotCi0gICAgLy8gZmluZCBvdXQgaWYgYSBub2RlIGlzIGFsbG93
ZWQgdG8gYmUgb3VyIGNoaWxkCi0gICAgdm9pZCBkaXNwYXRjaENoaWxkSW5zZXJ0ZWRFdmVudHMo
IE5vZGVJbXBsICpjaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdm9pZCBkaXNwYXRj
aENoaWxkUmVtb3ZhbEV2ZW50cyggTm9kZUltcGwgKmNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUg
KTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbGFzcyBOb2RlOwotY2xhc3MgTm9kZUlt
cGw7Ci0KLWNsYXNzIE5vZGVMaXN0SW1wbCA6IHB1YmxpYyBraHRtbDo6U2hhcmVkPE5vZGVMaXN0
SW1wbD4KLXsKLXB1YmxpYzoKLSAgICBOb2RlTGlzdEltcGwoIE5vZGVJbXBsICpfcm9vdE5vZGUg
KTsKLSAgICB2aXJ0dWFsIH5Ob2RlTGlzdEltcGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzICYg
YXR0cmlidXRlcyBmb3IgTm9kZUxpc3QKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCgpIGNv
bnN0ID0gMDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICppdGVtICggdW5zaWduZWQgaW5kZXggKSBj
b25zdCA9IDA7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqaXRlbUJ5SWQgKCBjb25zdCBET01TdHJp
bmcgJiBlbGVtZW50SWQgKSBjb25zdDsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0
IG9mIERPTSkKLQotICAgIHZpcnR1YWwgdm9pZCByb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpOwot
ICAgIHZpcnR1YWwgdm9pZCByb290Tm9kZUF0dHJpYnV0ZUNoYW5nZWQoKSB7fQotCi1wcm90ZWN0
ZWQ6Ci0gICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3Igc2VhcmNoaW5nIGFsbCBFbGVtZW50SW1w
bHMgaW4gYSB0cmVlCi0gICAgdW5zaWduZWQgcmVjdXJzaXZlTGVuZ3RoKE5vZGVJbXBsICpzdGFy
dCA9IDApIGNvbnN0OwotICAgIE5vZGVJbXBsICpyZWN1cnNpdmVJdGVtICggdW5zaWduZWQgb2Zm
c2V0LCBOb2RlSW1wbCAqc3RhcnQgPSAwICkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIG5vZGVN
YXRjaGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUgKSBjb25zdCA9IDA7Ci0KLSAgICBOb2RlSW1wbCAq
cm9vdE5vZGU7Ci0gICAgbXV0YWJsZSBpbnQgY2FjaGVkTGVuZ3RoOwotICAgIG11dGFibGUgTm9k
ZUltcGwgKmxhc3RJdGVtOwotICAgIG11dGFibGUgdW5zaWduZWQgbGFzdEl0ZW1PZmZzZXQ7Ci0g
ICAgbXV0YWJsZSBib29sIGlzTGVuZ3RoQ2FjaGVWYWxpZCA6IDE7Ci0gICAgbXV0YWJsZSBib29s
IGlzSXRlbUNhY2hlVmFsaWQgOiAxOwotfTsKLQotY2xhc3MgQ2hpbGROb2RlTGlzdEltcGwgOiBw
dWJsaWMgTm9kZUxpc3RJbXBsCi17Ci1wdWJsaWM6Ci0gICAgQ2hpbGROb2RlTGlzdEltcGwoIE5v
ZGVJbXBsICpuKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50
IGNsYXNzZXMKLQotICAgIHZpcnR1YWwgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBOb2RlSW1wbCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4ICkgY29uc3Q7Ci0KLXByb3RlY3Rl
ZDoKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZU1hdGNoZXMoIE5vZGVJbXBsICp0ZXN0Tm9kZSApIGNv
bnN0OwotfTsKLQogLyoqCiAgKiBOb2RlTGlzdCB3aGljaCBsaXN0cyBhbGwgTm9kZXMgaW4gYSBF
bGVtZW50IHdpdGggYSBnaXZlbiAibmFtZT0iIHRhZwogICovCkBAIC02MzUsMzQgKzUzLDUgQEAg
cHJvdGVjdGVkOgogICAgIERPTVN0cmluZyBub2RlTmFtZTsKIH07CiAKLQotLy8gR2VuZXJpYyBO
YW1lZE5vZGVNYXAgaW50ZXJmYWNlCi0vLyBPdGhlciBjbGFzc2VzIGltcGxlbWVudCB0aGlzIGZv
ciBtb3JlIHNwZWNpZmljIHNpdHVhdGlvbnMgZS5nLiBhdHRyaWJ1dGVzCi0vLyBvZiBhbiBlbGVt
ZW50Ci1jbGFzcyBOYW1lZE5vZGVNYXBJbXBsIDogcHVibGljIGtodG1sOjpTaGFyZWQ8TmFtZWRO
b2RlTWFwSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBOYW1lZE5vZGVNYXBJbXBsKCkge30KLSAgICB2
aXJ0dWFsIH5OYW1lZE5vZGVNYXBJbXBsKCkge30KLQotICAgIE5vZGVJbXBsICpnZXROYW1lZEl0
ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBjb25zdCB7IHJldHVybiBnZXROYW1lZEl0ZW1OUyhE
T01TdHJpbmcoKSwgbmFtZSk7IH0KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRl
bShjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9uKSB7IHJldHVybiByZW1vdmVO
YW1lZEl0ZW1OUyhET01TdHJpbmcoKSwgbmFtZSwgZXhjZXB0aW9uKTsgfQotCi0gICAgdmlydHVh
bCBOb2RlSW1wbCAqZ2V0TmFtZWRJdGVtTlMoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkks
IGNvbnN0IERPTVN0cmluZyAmbG9jYWxOYW1lKSBjb25zdCA9IDA7Ci0gICAgUmVmUHRyPE5vZGVJ
bXBsPiBzZXROYW1lZEl0ZW1OUyhOb2RlSW1wbCAqYXJnLCBpbnQgJmV4Y2VwdGlvbikgeyByZXR1
cm4gc2V0TmFtZWRJdGVtKGFyZywgZXhjZXB0aW9uKTsgfQotICAgIHZpcnR1YWwgUmVmUHRyPE5v
ZGVJbXBsPiByZW1vdmVOYW1lZEl0ZW1OUyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwg
Y29uc3QgRE9NU3RyaW5nICZsb2NhbE5hbWUsIGludCAmZXhjZXB0aW9uKSA9IDA7Ci0KLSAgICAv
LyBET00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIE5hbWVkTm9kZU1hcAotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKmdldE5hbWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSkgY29u
c3QgPSAwOwotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJbXBsPiByZW1vdmVOYW1lZEl0ZW0gKGNv
bnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpID0gMDsKLSAg
ICB2aXJ0dWFsIFJlZlB0cjxOb2RlSW1wbD4gc2V0TmFtZWRJdGVtIChOb2RlSW1wbCogYXJnLCBp
bnQgJmV4Y2VwdGlvbmNvZGUpID0gMDsKLQotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1
bnNpZ25lZCBpbmRleCApIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCgg
ICkgY29uc3QgPSAwOwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQot
ICAgIHZpcnR1YWwgYm9vbCBpc1JlYWRPbmx5KCkgeyByZXR1cm4gZmFsc2U7IH0KLX07Ci0KIH07
IC8vbmFtZXNwYWNlCiAjZW5kaWYKSW5kZXg6IGtodG1sL3htbC9kb21fdGV4dGltcGwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBraHRtbC94bWwvZG9tX3RleHRpbXBsLmgJKHJldmlzaW9uIDEyMDg2KQorKysg
a2h0bWwveG1sL2RvbV90ZXh0aW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMSwxOCArMjEsMTQg
QEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICoKICAqLwotI2lmbmRlZiBfRE9N
X0NoYXJhY3RlckRhdGFJbXBsX2hfCi0jZGVmaW5lIF9ET01fQ2hhcmFjdGVyRGF0YUltcGxfaF8K
KyNpZm5kZWYgRE9NX1RleHRJbXBsX2gKKyNkZWZpbmUgRE9NX1RleHRJbXBsX2gKIAotI2luY2x1
ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJkb20vZG9tX3N0cmluZy5oIgorI2lu
Y2x1ZGUgIk5vZGVJbXBsLmgiCiAKIG5hbWVzcGFjZSBET00gewogCi0gICAgY2xhc3MgRG9jdW1l
bnRJbXBsOwotICAgIGNsYXNzIENoYXJhY3RlckRhdGE7Ci0gICAgY2xhc3MgVGV4dDsKLQogY2xh
c3MgQ2hhcmFjdGVyRGF0YUltcGwgOiBwdWJsaWMgTm9kZUltcGwKIHsKIHB1YmxpYzoKSW5kZXg6
IGtodG1sL3htbC9Db250YWluZXJOb2RlSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1s
L0NvbnRhaW5lck5vZGVJbXBsLmNwcAkocmV2aXNpb24gMTIwNjMpCisrKyBraHRtbC94bWwvQ29u
dGFpbmVyTm9kZUltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMywxOTk3ICsyMywyNiBAQAog
ICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgi
Ci0KLSNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgotI2luY2x1ZGUgImRvbS9kb20yX2V2
ZW50cy5oIgotI2luY2x1ZGUgInhtbC9kb21fZWxlbWVudGltcGwuaCIKLSNpbmNsdWRlICJ4bWwv
ZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1
ZGUgIkRvY3VtZW50SW1wbC5oIgotI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uSW1wbC5oIgot
I2luY2x1ZGUgInhtbC9kb21fcG9zaXRpb24uaCIKLSNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWlt
cGwuaCIKLSNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgImNzcy9jc3NoZWxw
ZXIuaCIKLSNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImVkaXRp
bmcvaHRtbGVkaXRpbmcuaCIKLSNpbmNsdWRlICJlZGl0aW5nL2h0bWxfaW50ZXJjaGFuZ2UuaCIK
LSNpbmNsdWRlICJlZGl0aW5nL1NlbGVjdGlvbkNvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgPGtk
ZWJ1Zy5oPgotCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuaCIKLSNpbmNsdWRl
ICJJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAicmVuZGVyX3RoZW1lLmgiCi0KLSNpbmNsdWRl
ICJlY21hL2tqc19iaW5kaW5nLmgiCi0jaW5jbHVkZSAiZWNtYS9ranNfcHJveHkuaCIKLSNpbmNs
dWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotCi0vLyBGSVhNRTogU2hvdWxk
IG5vdCBoYXZlIHRvIGluY2x1ZGUgdGhpcy4gIEN1dCB0aGUgSFRNTCBkZXBlbmRlbmN5IQotI2lu
Y2x1ZGUgImh0bWxuYW1lcy5oIgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotI2luY2x1ZGUgInhi
bC94YmxfYmluZGluZ19tYW5hZ2VyLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGt4bWxjb3JlL0Fz
c2VydGlvbnMuaD4KLSNpbmNsdWRlICJLV1FMb2dnaW5nLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBr
aHRtbDsKLQotbmFtZXNwYWNlIERPTSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwot
dXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotLyoqCi0gKiBOb2RlTGlzdCB3aGljaCBsaXN0
cyBhbGwgTm9kZXMgaW4gYSBkb2N1bWVudCB3aXRoIGEgZ2l2ZW4gdGFnIG5hbWUKLSAqLwotY2xh
c3MgVGFnTm9kZUxpc3RJbXBsIDogcHVibGljIE5vZGVMaXN0SW1wbAotewotcHVibGljOgotICAg
IFRhZ05vZGVMaXN0SW1wbChOb2RlSW1wbCAqbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3Bh
Y2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKTsKLQotICAgIC8vIERPTSBtZXRo
b2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFsIHVuc2lnbmVk
IGxlbmd0aCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLQot
cHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBub2RlTWF0Y2hlcyhOb2RlSW1wbCAqdGVzdE5v
ZGUpIGNvbnN0OwotCi0gICAgQXRvbWljU3RyaW5nIG1fbmFtZXNwYWNlVVJJOwotICAgIEF0b21p
Y1N0cmluZyBtX2xvY2FsTmFtZTsKLX07Ci0KLSNpZm5kZWYgTkRFQlVHCi1zdHJ1Y3QgTm9kZUlt
cGxDb3VudGVyIHsgCi0gICAgc3RhdGljIGludCBjb3VudDsgCi0gICAgfk5vZGVJbXBsQ291bnRl
cigpIHsgLyogaWYgKGNvdW50ICE9IDApIGZwcmludGYoc3RkZXJyLCAiTEVBSzogJWQgTm9kZUlt
cGxcbiIsIGNvdW50KTsgKi8gfQotfTsKLWludCBOb2RlSW1wbENvdW50ZXI6OmNvdW50ID0gMDsK
LXN0YXRpYyBOb2RlSW1wbENvdW50ZXIgbm9kZUltcGxDb3VudGVyOwotCi1zdGF0aWMgaW50IGdF
dmVudERpc3BhdGNoRm9yYmlkZGVuOwotI2RlZmluZSBmb3JiaWRFdmVudERpc3BhdGNoKCkgZ0V2
ZW50RGlzcGF0Y2hGb3JiaWRkZW4gKz0gMQotI2RlZmluZSBhbGxvd0V2ZW50RGlzcGF0Y2goKSBh
c3NlcnQoZ0V2ZW50RGlzcGF0Y2hGb3JiaWRkZW4gPiAwKTsgZ0V2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW4gLT0gMQotI2RlZmluZSBldmVudERpc3BhdGNoRm9yYmlkZGVuKCkgKGdFdmVudERpc3BhdGNo
Rm9yYmlkZGVuID4gMCkKLSNlbHNlCi0KLSNkZWZpbmUgZm9yYmlkRXZlbnREaXNwYXRjaCgpCi0j
ZGVmaW5lIGFsbG93RXZlbnREaXNwYXRjaCgpCi0jZGVmaW5lIGV2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW4oKQotI2VuZGlmIE5ERUJVRwotCi1Ob2RlSW1wbDo6Tm9kZUltcGwoRG9jdW1lbnRJbXBsICpk
b2MpCi0gICAgOiBkb2N1bWVudChkb2MpLAotICAgICAgbV9wcmV2aW91cygwKSwKLSAgICAgIG1f
bmV4dCgwKSwKLSAgICAgIG1fcmVuZGVyKDApLAotICAgICAgbV9yZWdkTGlzdGVuZXJzKDApLAot
ICAgICAgbV9ub2RlTGlzdHMoMCksCi0gICAgICBtX3RhYkluZGV4KDApLAotICAgICAgbV9oYXNJ
ZChmYWxzZSksCi0gICAgICBtX2hhc0NsYXNzKGZhbHNlKSwKLSAgICAgIG1faGFzU3R5bGUoZmFs
c2UpLAotICAgICAgbV9hdHRhY2hlZChmYWxzZSksCi0gICAgICBtX2NoYW5nZWQoZmFsc2UpLAot
ICAgICAgbV9oYXNDaGFuZ2VkQ2hpbGQoZmFsc2UpLAotICAgICAgbV9pbkRvY3VtZW50KGZhbHNl
KSwKLSAgICAgIG1faXNMaW5rKGZhbHNlKSwKLSAgICAgIG1fc3BlY2lmaWVkKGZhbHNlKSwKLSAg
ICAgIG1fZm9jdXNlZChmYWxzZSksCi0gICAgICBtX2FjdGl2ZShmYWxzZSksCi0gICAgICBtX2hv
dmVyZWQoZmFsc2UpLAotICAgICAgbV9pbkFjdGl2ZUNoYWluKGZhbHNlKSwKLSAgICAgIG1fc3R5
bGVFbGVtZW50KGZhbHNlKSwKLSAgICAgIG1faW1wbGljaXQoZmFsc2UpLAotICAgICAgbV9pbkRl
dGFjaChmYWxzZSkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgKytOb2RlSW1wbENvdW50ZXI6OmNv
dW50OwotI2VuZGlmCi19Ci0KLXZvaWQgTm9kZUltcGw6OnNldERvY3VtZW50KERvY3VtZW50SW1w
bCAqZG9jKQotewotICAgIGlmIChpbkRvY3VtZW50KCkpCi0JcmV0dXJuOwotICAgIAotICAgIGRv
Y3VtZW50ID0gZG9jOwotfQotCi1Ob2RlSW1wbDo6fk5vZGVJbXBsKCkKLXsKLSNpZm5kZWYgTkRF
QlVHCi0gICAgLS1Ob2RlSW1wbENvdW50ZXI6OmNvdW50OwotI2VuZGlmCi0gICAgaWYgKG1fcmVu
ZGVyKQotICAgICAgICBkZXRhY2goKTsKLSAgICBpZiAobV9yZWdkTGlzdGVuZXJzICYmICFtX3Jl
Z2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAmJiBnZXREb2N1bWVudCgpICYmICFpbkRvY3VtZW50KCkp
Ci0gICAgICAgIGdldERvY3VtZW50KCktPnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2
ZW50TGlzdGVuZXJzKHRoaXMpOwotICAgIGRlbGV0ZSBtX3JlZ2RMaXN0ZW5lcnM7Ci0gICAgZGVs
ZXRlIG1fbm9kZUxpc3RzOwotICAgIGlmIChtX3ByZXZpb3VzKQotICAgICAgICBtX3ByZXZpb3Vz
LT5zZXROZXh0U2libGluZygwKTsKLSAgICBpZiAobV9uZXh0KQotICAgICAgICBtX25leHQtPnNl
dFByZXZpb3VzU2libGluZygwKTsKLX0KLQotRE9NU3RyaW5nIE5vZGVJbXBsOjpub2RlVmFsdWUo
KSBjb25zdAotewotICByZXR1cm4gRE9NU3RyaW5nKCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNl
dE5vZGVWYWx1ZSggY29uc3QgRE9NU3RyaW5nICYvKl9ub2RlVmFsdWUqLywgaW50ICZleGNlcHRp
b25jb2RlICkKLXsKLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3
aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAg
ICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklDQVRJT05fQUxMT1dFRF9F
UlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBiZSBkZWZhdWx0IG5vZGVWYWx1
ZSBpcyBudWxsLCBzbyBzZXR0aW5nIGl0IGhhcyBubyBlZmZlY3QKLX0KLQotUmVmUHRyPE5vZGVM
aXN0SW1wbD4gTm9kZUltcGw6OmNoaWxkTm9kZXMoKQotewotICAgIHJldHVybiBSZWZQdHI8Tm9k
ZUxpc3RJbXBsPihuZXcgQ2hpbGROb2RlTGlzdEltcGwodGhpcykpOwotfQotCi1Ob2RlSW1wbCAq
Tm9kZUltcGw6OmZpcnN0Q2hpbGQoKSBjb25zdAotewotICByZXR1cm4gMDsKLX0KLQotTm9kZUlt
cGwgKk5vZGVJbXBsOjpsYXN0Q2hpbGQoKSBjb25zdAotewotICByZXR1cm4gMDsKLX0KLQotTm9k
ZUltcGwgKk5vZGVJbXBsOjpsYXN0RGVzY2VuZGFudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwg
Km4gPSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMpOwotICAgIHdoaWxlIChuICYmIG4tPmxh
c3RDaGlsZCgpKQotICAgICAgICBuID0gbi0+bGFzdENoaWxkKCk7Ci0gICAgcmV0dXJuIG47Ci19
Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6aW5zZXJ0QmVmb3JlKCBOb2RlSW1wbCAqbmV3Q2hpbGQs
IE5vZGVJbXBsICosIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0gICAgbmV3Q2hpbGQtPnJlZigp
OwotICAgIG5ld0NoaWxkLT5kZXJlZigpOwotICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRp
b246OkhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwg
Kk5vZGVJbXBsOjpyZXBsYWNlQ2hpbGQoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKiwg
aW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgbmV3Q2hpbGQtPnJlZigpOwotICBuZXdDaGlsZC0+
ZGVyZWYoKTsKLSAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVF
U1RfRVJSOwotICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpyZW1vdmVDaGls
ZCggTm9kZUltcGwgKiwgaW50ICZleGNlcHRpb25jb2RlICkKLXsKLSAgZXhjZXB0aW9uY29kZSA9
IERPTUV4Y2VwdGlvbjo6Tk9UX0ZPVU5EX0VSUjsKLSAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBs
ICpOb2RlSW1wbDo6YXBwZW5kQ2hpbGQoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRp
b25jb2RlICkKLXsKLSAgICBuZXdDaGlsZC0+cmVmKCk7Ci0gICAgbmV3Q2hpbGQtPmRlcmVmKCk7
Ci0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJS
OwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5vZGVJbXBsOjpyZW1vdmUoaW50ICZleGNlcHRp
b25jb2RlKQotewotICAgIHJlZigpOwotICAgIGlmIChOb2RlSW1wbCAqcCA9IHBhcmVudE5vZGUo
KSkKLSAgICAgICAgcC0+cmVtb3ZlQ2hpbGQodGhpcywgZXhjZXB0aW9uY29kZSk7Ci0gICAgZWxz
ZQotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVT
VF9FUlI7Ci0gICAgZGVyZWYoKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aGFzQ2hpbGROb2Rlcygg
ICkgY29uc3QKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIE5vZGVJbXBsOjpub3JtYWxp
emUgKCkKLXsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgTm9kZUltcGwgKmNoaWxk
ID0gZmlyc3RDaGlsZCgpOwotCi0gICAgaWYgKGlzRWxlbWVudE5vZGUoKSkgewotICAgICAgICAv
LyBOb3JtYWxpemUgYW55IGF0dHJpYnV0ZSBjaGlsZHJlbiB3ZSBtaWdodCBoYXZlIAotICAgICAg
ICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KHRoaXMp
OwotICAgICAgICBOYW1lZEF0dHJNYXBJbXBsICphdHRyTWFwID0gZWxlbWVudC0+YXR0cmlidXRl
cygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGF0dHJNYXApIHsKLSAgICAgICAgICAgIHVuc2ln
bmVkIG51bUF0dHJzID0gYXR0ck1hcC0+bGVuZ3RoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1BdHRyczsgaSsrKSB7Ci0gICAgICAgICAg
ICAgICAgQXR0cmlidXRlSW1wbCAqYXR0cmlidXRlID0gYXR0ck1hcC0+YXR0cmlidXRlSXRlbShp
KTsKLSAgICAgICAgICAgICAgICBBdHRySW1wbCAqYXR0ciA9IGF0dHJpYnV0ZS0+YXR0ckltcGwo
KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoYXR0cikKLSAgICAgICAg
ICAgICAgICAgICAgYXR0ci0+bm9ybWFsaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgCi0gICAgLy8gUmVjdXJzaXZlbHkgZ28gdGhyb3VnaCB0aGUgc3VidHJlZSBi
ZW5lYXRoIHVzLCBub3JtYWxpemluZyBhbGwgbm9kZXMuIEluIHRoZSBjYXNlCi0gICAgLy8gd2hl
cmUgdGhlcmUgYXJlIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzLCB0aGV5IGFyZSBtZXJnZWQgdG9n
ZXRoZXIKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgICAgTm9kZUltcGwgKm5leHRDaGlsZCA9
IGNoaWxkLT5uZXh0U2libGluZygpOwotCi0gICAgICAgIGlmIChuZXh0Q2hpbGQgJiYgY2hpbGQt
Pm5vZGVUeXBlKCkgPT0gTm9kZTo6VEVYVF9OT0RFICYmIG5leHRDaGlsZC0+bm9kZVR5cGUoKSA9
PSBOb2RlOjpURVhUX05PREUpIHsKLSAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hpbGQgYW5kIHRo
ZSBuZXh0IG9uZSBhcmUgYm90aCB0ZXh0IG5vZGVzLi4uIG1lcmdlIHRoZW0KLSAgICAgICAgICAg
IFRleHRJbXBsICpjdXJyZW50VGV4dCA9IHN0YXRpY19jYXN0PFRleHRJbXBsKj4oY2hpbGQpOwot
ICAgICAgICAgICAgVGV4dEltcGwgKm5leHRUZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dEltcGwqPihu
ZXh0Q2hpbGQpOwotCi0gICAgICAgICAgICBjdXJyZW50VGV4dC0+YXBwZW5kRGF0YShuZXh0VGV4
dC0+ZGF0YSgpLGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBuZXh0Q2hpbGQtPnJlbW92
ZShleGNlcHRpb25jb2RlKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
IGNoaWxkLT5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgIGNoaWxkID0gbmV4dENoaWxkOwotICAg
ICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzaW5nbGUgZW1w
dHkgdGV4dCBub2RlIGxlZnQgYW5kIHJlbW92ZSBpdCBpZiBzbwotICAgIGNoaWxkID0gZmlyc3RD
aGlsZCgpOwotICAgIGlmIChjaGlsZCAmJiAhY2hpbGQtPm5leHRTaWJsaW5nKCkgJiYgY2hpbGQt
PmlzVGV4dE5vZGUoKSkgewotICAgICAgICBUZXh0SW1wbCAqdGV4dCA9IHN0YXRpY19jYXN0PFRl
eHRJbXBsKj4oY2hpbGQpOwotICAgICAgICBpZiAodGV4dC0+ZGF0YSgpLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGNoaWxkLT5yZW1vdmUoZXhjZXB0aW9uY29kZSk7Ci0gICAgfQotfQotCi1jb25z
dCBBdG9taWNTdHJpbmcmIE5vZGVJbXBsOjpwcmVmaXgoKSBjb25zdAotewotICAgIC8vIEZvciBu
b2RlcyBvdGhlciB0aGFuIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCB0aGUgcHJlZml4IGlzIGFs
d2F5cyBudWxsCi0gICAgcmV0dXJuIG51bGxBdG9tOwotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRQ
cmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICYvKl9wcmVmaXgqLywgaW50ICZleGNlcHRpb25jb2Rl
ICkKLXsKLSAgICAvLyBUaGUgc3BlYyBzYXlzIHRoYXQgZm9yIG5vZGVzIG90aGVyIHRoYW4gZWxl
bWVudHMgYW5kIGF0dHJpYnV0ZXMsIHByZWZpeCBpcyBhbHdheXMgbnVsbC4KLSAgICAvLyBJdCBk
b2VzIG5vdCBzYXkgd2hhdCB0byBkbyB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIHNldCB0aGUgcHJl
Zml4IG9uIGFub3RoZXIgdHlwZSBvZgotICAgIC8vIG5vZGUsIGhvd2V2ZXIgbW96aWxsYSB0aHJv
d3MgYSBOQU1FU1BBQ0VfRVJSIGV4Y2VwdGlvbgotICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNl
cHRpb246Ok5BTUVTUEFDRV9FUlI7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgTm9kZUltcGw6
OmxvY2FsTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGVtcHR5QXRvbTsKLX0KLQotY29uc3Qg
QXRvbWljU3RyaW5nJiBOb2RlSW1wbDo6bmFtZXNwYWNlVVJJKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbnVsbEF0b207Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnNldEZpcnN0Q2hpbGQoTm9kZUltcGwg
KikKLXsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2V0TGFzdENoaWxkKE5vZGVJbXBsICopCi17Ci19
Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6YWRkQ2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkKQotewot
ICAgIFJlZlB0cjxOb2RlSW1wbD4gcHJvdGVjdE5ld0NoaWxkKG5ld0NoaWxkKTsgLy8gbWFrZSBz
dXJlIHRoZSBuZXcgY2hpbGQgaXMgcmVmJ2QgYW5kIGRlcmVmJ2Qgc28gd2UgZG9uJ3QgbGVhayBp
dAotICAgIHJldHVybiAwOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0NvbnRlbnRFZGl0YWJsZSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0NvbnRlbnRFZGl0
YWJsZSgpOwotfQotCi1RUmVjdCBOb2RlSW1wbDo6Z2V0UmVjdCgpIGNvbnN0Ci17Ci0gICAgaW50
IF94LCBfeTsKLSAgICBpZihtX3JlbmRlciAmJiBtX3JlbmRlci0+YWJzb2x1dGVQb3NpdGlvbihf
eCwgX3kpKQotICAgICAgICByZXR1cm4gUVJlY3QoIF94LCBfeSwgbV9yZW5kZXItPndpZHRoKCks
IG1fcmVuZGVyLT5oZWlnaHQoKSApOwotCi0gICAgcmV0dXJuIFFSZWN0KCk7Ci19Ci0KLXZvaWQg
Tm9kZUltcGw6OnNldENoYW5nZWQoYm9vbCBiKQotewotICAgIGlmIChiICYmICFhdHRhY2hlZCgp
KSAvLyBjaGFuZ2VkIGNvbXBhcmVkIHRvIHdoYXQ/Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1f
Y2hhbmdlZCA9IGI7Ci0gICAgaWYgKCBiICkgewotCU5vZGVJbXBsICpwID0gcGFyZW50Tm9kZSgp
OwotCXdoaWxlICggcCApIHsKLQkgICAgcC0+c2V0SGFzQ2hhbmdlZENoaWxkKCB0cnVlICk7Ci0J
ICAgIHAgPSBwLT5wYXJlbnROb2RlKCk7Ci0JfQotICAgICAgICBnZXREb2N1bWVudCgpLT5zZXRE
b2N1bWVudENoYW5nZWQodHJ1ZSk7Ci0gICAgfQotfQotCi1ib29sIE5vZGVJbXBsOjppc0ZvY3Vz
YWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBsOjpp
c0tleWJvYXJkRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNGb2N1c2FibGUoKTsK
LX0KLQotYm9vbCBOb2RlSW1wbDo6aXNNb3VzZUZvY3VzYWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGlzRm9jdXNhYmxlKCk7Ci19Ci0KLXVuc2lnbmVkIE5vZGVJbXBsOjpub2RlSW5kZXgoKSBj
b25zdAotewotICAgIE5vZGVJbXBsICpfdGVtcE5vZGUgPSBwcmV2aW91c1NpYmxpbmcoKTsKLSAg
ICB1bnNpZ25lZCBjb3VudD0wOwotICAgIGZvciggY291bnQ9MDsgX3RlbXBOb2RlOyBjb3VudCsr
ICkKLSAgICAgICAgX3RlbXBOb2RlID0gX3RlbXBOb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAg
ICByZXR1cm4gY291bnQ7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OmFkZEV2ZW50TGlzdGVuZXIoY29u
c3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyLCBjb25z
dCBib29sIHVzZUNhcHR1cmUpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCkgJiYgIWdldERvY3Vt
ZW50KCktPmF0dGFjaGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIERvY3VtZW50SW1wbDo6
TGlzdGVuZXJUeXBlIHR5cGUgPSBzdGF0aWNfY2FzdDxEb2N1bWVudEltcGw6Okxpc3RlbmVyVHlw
ZT4oMCk7Ci0gICAgaWYgKGV2ZW50VHlwZSA9PSBET01TdWJ0cmVlTW9kaWZpZWRFdmVudCkKLSAg
ICAgICAgdHlwZSA9IERvY3VtZW50SW1wbDo6RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSOwot
ICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBET01Ob2RlSW5zZXJ0ZWRFdmVudCkKLSAgICAgICAg
dHlwZSA9IERvY3VtZW50SW1wbDo6RE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVSOwotICAgIGVsc2Ug
aWYgKGV2ZW50VHlwZSA9PSBET01Ob2RlUmVtb3ZlZEV2ZW50KQotICAgICAgICB0eXBlID0gRG9j
dW1lbnRJbXBsOjpET01OT0RFUkVNT1ZFRF9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChldmVudFR5
cGUgPT0gRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCkKLSAgICAgICAgdHlwZSA9IERv
Y3VtZW50SW1wbDo6RE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRfTElTVEVORVI7Ci0gICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IERPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudEV2ZW50KQotICAg
ICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01OT0RFSU5TRVJURURJTlRPRE9DVU1FTlRfTElT
VEVORVI7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERPTUF0dHJNb2RpZmllZEV2ZW50KQot
ICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01BVFRSTU9ESUZJRURfTElTVEVORVI7Ci0g
ICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IERPTUNoYXJhY3RlckRhdGFNb2RpZmllZEV2ZW50KQot
ICAgICAgICB0eXBlID0gRG9jdW1lbnRJbXBsOjpET01DSEFSQUNURVJEQVRBTU9ESUZJRURfTElT
VEVORVI7Ci0gICAgaWYgKHR5cGUpCi0gICAgICAgIGdldERvY3VtZW50KCktPmFkZExpc3RlbmVy
VHlwZSh0eXBlKTsKLQotICAgIGlmICghbV9yZWdkTGlzdGVuZXJzKSB7Ci0gICAgICAgIG1fcmVn
ZExpc3RlbmVycyA9IG5ldyBRUHRyTGlzdDxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj47Ci0JbV9y
ZWdkTGlzdGVuZXJzLT5zZXRBdXRvRGVsZXRlKHRydWUpOwotICAgIH0KLQotICAgIGxpc3RlbmVy
LT5yZWYoKTsKLQotICAgIC8vIFJlbW92ZSBleGlzdGluZyBpZGVudGljYWwgbGlzdGVuZXIgc2V0
IHdpdGggaWRlbnRpY2FsIGFyZ3VtZW50cy4KLSAgICAvLyBUaGUgRE9NMiBzcGVjIHNheXMgdGhh
dCAiZHVwbGljYXRlIGluc3RhbmNlcyBhcmUgZGlzY2FyZGVkIiBpbiB0aGlzIGNhc2UuCi0gICAg
cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKLQot
ICAgIC8vIGFkZGluZyB0aGUgZmlyc3Qgb25lCi0gICAgaWYgKG1fcmVnZExpc3RlbmVycy0+aXNF
bXB0eSgpICYmIGdldERvY3VtZW50KCkgJiYgIWluRG9jdW1lbnQoKSkKLSAgICAgICAgZ2V0RG9j
dW1lbnQoKS0+cmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKHRoaXMp
OwotICAgICAgICAKLSAgICBtX3JlZ2RMaXN0ZW5lcnMtPmFwcGVuZChuZXcgUmVnaXN0ZXJlZEV2
ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkpOwotCi0gICAgbGlz
dGVuZXItPmRlcmVmKCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6OnJlbW92ZUV2ZW50TGlzdGVuZXIo
Y29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyLCBi
b29sIHVzZUNhcHR1cmUpCi17Ci0gICAgaWYgKCFtX3JlZ2RMaXN0ZW5lcnMpIC8vIG5vdGhpbmcg
dG8gcmVtb3ZlCi0gICAgICAgIHJldHVybjsKLQotICAgIFJlZ2lzdGVyZWRFdmVudExpc3RlbmVy
IHJsKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOwotCi0gICAgUVB0ckxpc3RJdGVy
YXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQoKm1fcmVnZExpc3RlbmVycyk7Ci0gICAg
Zm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaWYgKCooaXQuY3VycmVudCgpKSA9
PSBybCkgewotICAgICAgICAgICAgbV9yZWdkTGlzdGVuZXJzLT5yZW1vdmVSZWYoaXQuY3VycmVu
dCgpKTsKLSAgICAgICAgICAgIC8vIHJlbW92ZWQgbGFzdAotICAgICAgICAgICAgaWYgKG1fcmVn
ZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3VtZW50KCkgJiYgIWluRG9jdW1lbnQoKSkK
LSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT51bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9k
ZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotfQotCi12b2lkIE5vZGVJbXBsOjpyZW1vdmVBbGxFdmVudExpc3RlbmVycygpCi17Ci0gICAg
ZGVsZXRlIG1fcmVnZExpc3RlbmVyczsKLSAgICBtX3JlZ2RMaXN0ZW5lcnMgPSAwOwotfQotCi12
b2lkIE5vZGVJbXBsOjpyZW1vdmVIVE1MRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcg
JmV2ZW50VHlwZSkKLXsKLSAgICBpZiAoIW1fcmVnZExpc3RlbmVycykgLy8gbm90aGluZyB0byBy
ZW1vdmUKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVk
RXZlbnRMaXN0ZW5lcj4gaXQoKm1fcmVnZExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJl
bnQoKTsgKytpdCkKLSAgICAgICAgaWYgKGl0LmN1cnJlbnQoKS0+ZXZlbnRUeXBlKCkgPT0gZXZl
bnRUeXBlICYmIGl0LmN1cnJlbnQoKS0+bGlzdGVuZXIoKS0+ZXZlbnRMaXN0ZW5lclR5cGUoKSA9
PSAiX2todG1sX0hUTUxFdmVudExpc3RlbmVyIikgewotICAgICAgICAgICAgbV9yZWdkTGlzdGVu
ZXJzLT5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsKLSAgICAgICAgICAgIC8vIHJlbW92ZWQgbGFz
dAotICAgICAgICAgICAgaWYgKG1fcmVnZExpc3RlbmVycy0+aXNFbXB0eSgpICYmIGdldERvY3Vt
ZW50KCkgJiYgIWluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgICAgICBnZXREb2N1bWVudCgpLT51
bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyh0aGlzKTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRIVE1MRXZl
bnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAq
bGlzdGVuZXIpCi17Ci0gICAgLy8gSW4gY2FzZSB3ZSBhcmUgdGhlIG9ubHkgb25lIGhvbGRpbmcg
YSByZWZlcmVuY2UgdG8gaXQsIHdlIGRvbid0IHdhbnQgcmVtb3ZlSFRNTEV2ZW50TGlzdGVuZXIg
dG8gZGVzdHJveSBpdC4KLSAgICBpZiAobGlzdGVuZXIpCi0gICAgICAgIGxpc3RlbmVyLT5yZWYo
KTsKLSAgICByZW1vdmVIVE1MRXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOwotICAgIGlmIChsaXN0
ZW5lcikgewotICAgICAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZh
bHNlKTsKLSAgICAgICAgbGlzdGVuZXItPmRlcmVmKCk7Ci0gICAgfQotfQotCi1FdmVudExpc3Rl
bmVyICpOb2RlSW1wbDo6Z2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZl
dmVudFR5cGUpCi17Ci0gICAgaWYgKCFtX3JlZ2RMaXN0ZW5lcnMpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQoKm1f
cmVnZExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAg
aWYgKGl0LmN1cnJlbnQoKS0+ZXZlbnRUeXBlKCkgPT0gZXZlbnRUeXBlICYmIGl0LmN1cnJlbnQo
KS0+bGlzdGVuZXIoKS0+ZXZlbnRMaXN0ZW5lclR5cGUoKSA9PSAiX2todG1sX0hUTUxFdmVudExp
c3RlbmVyIikKLSAgICAgICAgICAgIHJldHVybiBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCk7Ci0g
ICAgcmV0dXJuIDA7Ci19Ci0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0Y2hFdmVudChFdmVudElt
cGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlLCBib29sIHRlbXBFdmVudCkKLXsKLSAgICBhc3Nl
cnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaWYgKCFldnQgfHwgZXZ0LT50eXBl
KCkuaXNFbXB0eSgpKSB7IAotICAgICAgICBleGNlcHRpb25jb2RlID0gRXZlbnRFeGNlcHRpb246
Ol9FWENFUFRJT05fT0ZGU0VUICsgRXZlbnRFeGNlcHRpb246OlVOU1BFQ0lGSUVEX0VWRU5UX1RZ
UEVfRVJSOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZXZ0LT5yZWYoKTsK
LQotICAgIGV2dC0+c2V0VGFyZ2V0KHRoaXMpOwotCi0gICAgLy8gV2UndmUgaGFkIGF0IGxlYXN0
IG9uZSByZXBvcnQgb2YgYSBjcmFzaCBvbiBhIHBhZ2Ugd2hlcmUgZG9jdW1lbnQgaXMgbnVsbCBo
ZXJlLgotICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhhdCBwYWdlIG5vIGxvbmdlciBleGlzdHMsIGJ1
dCB3ZSdsbCBtYWtlIHRoaXMgY29kZSByb2J1c3QgYWdhaW5zdAotICAgIC8vIHRoYXQgYW55d2F5
LgotICAgIC8vIEZJWE1FOiBNdWNoIGNvZGUgaW4gdGhpcyBjbGFzcyBhc3N1bWVzIGRvY3VtZW50
IGlzIG5vbi1udWxsOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8KLSAgICAvLyBlbnN1cmUgdGhhdCBk
b2N1bWVudCBjYW4gbmV2ZXIgYmUgbnVsbC4KLSAgICBGcmFtZSAqZnJhbWUgPSAwOwotICAgIEtI
VE1MVmlldyAqdmlldyA9IDA7Ci0KLSAgICBpZiAoRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1
bWVudCgpKSB7Ci0gICAgICAgIGZyYW1lID0gZG9jLT5mcmFtZSgpOwotICAgICAgICB2aWV3ID0g
ZG9jLT52aWV3KCk7Ci0gICAgICAgIC8vIFNpbmNlIGV2ZW50IGhhbmRsaW5nIGNvZGUgY291bGQg
Y2F1c2UgdGhpcyBvYmplY3QgdG8gYmUgZGVsZXRlZCwgZ3JhYiBhIHJlZmVyZW5jZSB0byB0aGUg
dmlldyBub3cKLSAgICAgICAgaWYgKHZpZXcpCi0gICAgICAgICAgICB2aWV3LT5yZWYoKTsKLSAg
ICB9ICAgIAotCi0gICAgYm9vbCByZXQgPSBkaXNwYXRjaEdlbmVyaWNFdmVudCggZXZ0LCBleGNl
cHRpb25jb2RlICk7Ci0KLSAgICAvLyBJZiB0ZW1wRXZlbnQgaXMgdHJ1ZSwgdGhpcyBtZWFucyB0
aGF0IHRoZSBET00gaW1wbGVtZW50YXRpb24gd2lsbCBub3QgYmUgc3RvcmluZyBhIHJlZmVyZW5j
ZSB0byB0aGUgZXZlbnQsIGkuZS4KLSAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gcmV0cmlldmUg
aXQgZnJvbSBqYXZhc2NyaXB0IGlmIGEgc2NyaXB0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHJl
ZmVyZW5jZSB0byBpdCBpbiBhIHZhcmlhYmxlLgotICAgIC8vIFNvIHRoZXJlIGlzIG5vIG5lZWQg
Zm9yIHRoZSBpbnRlcnByZXRlciB0byBrZWVwIHRoZSBldmVudCBpbiBpdCdzIGNhY2hlCi0gICAg
aWYgKHRlbXBFdmVudCAmJiBmcmFtZSAmJiBmcmFtZS0+alNjcmlwdCgpKQotICAgICAgICBmcmFt
ZS0+alNjcmlwdCgpLT5maW5pc2hlZFdpdGhFdmVudChldnQpOwotCi0gICAgaWYgKHZpZXcpCi0g
ICAgICAgIHZpZXctPmRlcmVmKCk7Ci0KLSAgICBldnQtPmRlcmVmKCk7Ci0KLSAgICByZXR1cm4g
cmV0OwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaEdlbmVyaWNFdmVudCggRXZlbnRJbXBs
ICpldnQsIGludCAmLypleGNlcHRpb25jb2RlICovKQotewotICAgIGFzc2VydCghZXZlbnREaXNw
YXRjaEZvcmJpZGRlbigpKTsKLSAgICBhc3NlcnQoZXZ0LT50YXJnZXQoKSk7Ci0KLSAgICBldnQt
PnJlZigpOwotCi0gICAgLy8gIyMjIGNoZWNrIHRoYXQgdHlwZSBzcGVjaWZpZWQKLQotICAgIC8v
IHdvcmsgb3V0IHdoYXQgbm9kZXMgdG8gc2VuZCBldmVudCB0bwotICAgIFFQdHJMaXN0PE5vZGVJ
bXBsPiBub2RlQ2hhaW47Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gdGhpczsgbjsg
biA9IG4tPnBhcmVudE5vZGUoKSkgewotICAgICAgICBuLT5yZWYoKTsKLSAgICAgICAgbm9kZUNo
YWluLnByZXBlbmQobik7Ci0gICAgfQotCi0gICAgCi0gICAgUVB0ckxpc3RJdGVyYXRvcjxOb2Rl
SW1wbD4gaXQobm9kZUNoYWluKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgd2UgYmVnaW4gZGlzcGF0
Y2hpbmcgZXZlbnRzLCBnaXZlIHRoZSB0YXJnZXQgbm9kZSBhIGNoYW5jZSB0byBkbyBzb21lIHdv
cmsgcHJpb3IKLSAgICAvLyB0byB0aGUgRE9NIGV2ZW50IGhhbmRsZXJzIGdldHRpbmcgYSBjcmFj
ay4KLSAgICB2b2lkKiBkYXRhID0gcHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoZXZ0KTsKLQotICAg
IC8vIHRyaWdnZXIgYW55IGNhcHR1cmluZyBldmVudCBoYW5kbGVycyBvbiBvdXIgd2F5IGRvd24K
LSAgICBldnQtPnNldEV2ZW50UGhhc2UoRXZlbnQ6OkNBUFRVUklOR19QSEFTRSk7Ci0gICAgaXQu
dG9GaXJzdCgpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCkgJiYgaXQuY3VycmVudCgpICE9IHRo
aXMgJiYgIWV2dC0+cHJvcGFnYXRpb25TdG9wcGVkKCk7ICsraXQpIHsKLSAgICAgICAgZXZ0LT5z
ZXRDdXJyZW50VGFyZ2V0KGl0LmN1cnJlbnQoKSk7Ci0gICAgICAgIGl0LmN1cnJlbnQoKS0+aGFu
ZGxlTG9jYWxFdmVudHMoZXZ0LHRydWUpOwotICAgIH0KLQotICAgIC8vIGRpc3BhdGNoIHRvIHRo
ZSBhY3R1YWwgdGFyZ2V0IG5vZGUKLSAgICBpdC50b0xhc3QoKTsKLSAgICBpZiAoIWV2dC0+cHJv
cGFnYXRpb25TdG9wcGVkKCkpIHsKLSAgICAgICAgZXZ0LT5zZXRFdmVudFBoYXNlKEV2ZW50OjpB
VF9UQVJHRVQpOwotICAgICAgICBldnQtPnNldEN1cnJlbnRUYXJnZXQoaXQuY3VycmVudCgpKTsK
LQotCWlmICghZXZ0LT5wcm9wYWdhdGlvblN0b3BwZWQoKSkKLSAgICAgICAgICAgIGl0LmN1cnJl
bnQoKS0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0LGZhbHNlKTsKLSAgICB9Ci0gICAgLS1pdDsKLQot
ICAgIC8vIG9rLCBub3cgYnViYmxlIHVwIGFnYWluIChvbmx5IG5vbi1jYXB0dXJpbmcgZXZlbnQg
aGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQpCi0gICAgLy8gIyMjIHJlY2FsY3VsYXRlIHRoZSBub2Rl
IGNoYWluIGhlcmU/IChlLmcuIGlmIHRhcmdldCBub2RlIG1vdmVkIGluIGRvY3VtZW50IGJ5IHBy
ZXZpb3VzIGV2ZW50IGhhbmRsZXJzKQotICAgIC8vIG5vLiB0aGUgRE9NIHNwZWNzIHNheXM6Ci0g
ICAgLy8gVGhlIGNoYWluIG9mIEV2ZW50VGFyZ2V0cyBmcm9tIHRoZSBldmVudCB0YXJnZXQgdG8g
dGhlIHRvcCBvZiB0aGUgdHJlZQotICAgIC8vIGlzIGRldGVybWluZWQgYmVmb3JlIHRoZSBpbml0
aWFsIGRpc3BhdGNoIG9mIHRoZSBldmVudC4KLSAgICAvLyBJZiBtb2RpZmljYXRpb25zIG9jY3Vy
IHRvIHRoZSB0cmVlIGR1cmluZyBldmVudCBwcm9jZXNzaW5nLAotICAgIC8vIGV2ZW50IGZsb3cg
d2lsbCBwcm9jZWVkIGJhc2VkIG9uIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSB0cmVlLgotICAg
IC8vCi0gICAgLy8gc2luY2UgdGhlIGluaXRpYWwgZGlzcGF0Y2ggaXMgYmVmb3JlIHRoZSBjYXB0
dXJpbmcgcGhhc2UsCi0gICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBu
b2RlIGNoYWluLgotICAgIC8vICh0b2JpYXMpCi0KLSAgICBpZiAoZXZ0LT5idWJibGVzKCkpIHsK
LSAgICAgICAgZXZ0LT5zZXRFdmVudFBoYXNlKEV2ZW50OjpCVUJCTElOR19QSEFTRSk7Ci0gICAg
ICAgIGZvciAoOyBpdC5jdXJyZW50KCkgJiYgIWV2dC0+cHJvcGFnYXRpb25TdG9wcGVkKCkgJiYg
IWV2dC0+Z2V0Q2FuY2VsQnViYmxlKCk7IC0taXQpIHsKLSAgICAgICAgICAgIGV2dC0+c2V0Q3Vy
cmVudFRhcmdldChpdC5jdXJyZW50KCkpOwotICAgICAgICAgICAgaXQuY3VycmVudCgpLT5oYW5k
bGVMb2NhbEV2ZW50cyhldnQsZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXZ0LT5z
ZXRDdXJyZW50VGFyZ2V0KDApOwotICAgIGV2dC0+c2V0RXZlbnRQaGFzZSgwKTsgLy8gSSBndWVz
cyB0aGlzIGlzIGNvcnJlY3QsIHRoZSBzcGVjIGRvZXMgbm90IHNlZW0gdG8gc2F5Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBhYm91dCB0aGUgZGVmYXVsdCBldmVudCBo
YW5kbGVyIHBoYXNlLgotCi0KLSAgICAvLyBOb3cgY2FsbCB0aGUgcG9zdCBkaXNwYXRjaC4KLSAg
ICBwb3N0RGlzcGF0Y2hFdmVudEhhbmRsZXIoZXZ0LCBkYXRhKTsKLSAgICAKLSAgICBpZiAoZXZ0
LT5idWJibGVzKCkpIHsKLQkvLyBub3cgd2UgY2FsbCBhbGwgZGVmYXVsdCBldmVudCBoYW5kbGVy
cyAodGhpcyBpcyBub3QgcGFydCBvZiBET00gLSBpdCBpcyBpbnRlcm5hbCB0byBraHRtbCkKLQot
CWl0LnRvTGFzdCgpOwotCWZvciAoOyBpdC5jdXJyZW50KCkgJiYgIWV2dC0+ZGVmYXVsdFByZXZl
bnRlZCgpICYmICFldnQtPmRlZmF1bHRIYW5kbGVkKCk7IC0taXQpCi0JICAgIGl0LmN1cnJlbnQo
KS0+ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotICAgIH0KLSAgICAKLSAgICAvLyBkZXJlZiBh
bGwgbm9kZXMgaW4gY2hhaW4KLSAgICBpdC50b0ZpcnN0KCk7Ci0gICAgZm9yICg7IGl0LmN1cnJl
bnQoKTsgKytpdCkKLSAgICAgICAgaXQuY3VycmVudCgpLT5kZXJlZigpOyAvLyB0aGlzIG1heSBk
ZWxldGUgdXMKLQotICAgIERvY3VtZW50SW1wbDo6dXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nKCk7
Ci0KLSAgICBib29sIGRlZmF1bHRQcmV2ZW50ZWQgPSBldnQtPmRlZmF1bHRQcmV2ZW50ZWQoKTsK
LQotICAgIGV2dC0+ZGVyZWYoKTsKLQotICAgIHJldHVybiAhZGVmYXVsdFByZXZlbnRlZDsgLy8g
IyMjIHdoYXQgaWYgZGVmYXVsdFByZXZlbnRlZCB3YXMgY2FsbGVkIGJlZm9yZSBkaXNwYXRjaEV2
ZW50PwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaEhUTUxFdmVudChjb25zdCBBdG9taWNT
dHJpbmcgJmV2ZW50VHlwZSwgYm9vbCBjYW5CdWJibGVBcmcsIGJvb2wgY2FuY2VsYWJsZUFyZykK
LXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaW50IGV4Y2Vw
dGlvbmNvZGUgPSAwOwotICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KG5ldyBFdmVudEltcGwoZXZl
bnRUeXBlLCBjYW5CdWJibGVBcmcsIGNhbmNlbGFibGVBcmcpLCBleGNlcHRpb25jb2RlLCB0cnVl
KTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0Y2hXaW5kb3dFdmVudChjb25zdCBBdG9taWNT
dHJpbmcgJmV2ZW50VHlwZSwgYm9vbCBjYW5CdWJibGVBcmcsIGJvb2wgY2FuY2VsYWJsZUFyZykK
LXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgaW50IGV4Y2Vw
dGlvbmNvZGUgPSAwOwotICAgIFJlZlB0cjxFdmVudEltcGw+IGV2dCA9IG5ldyBFdmVudEltcGwo
ZXZlbnRUeXBlLCBjYW5CdWJibGVBcmcsIGNhbmNlbGFibGVBcmcpOwotICAgIFJlZlB0cjxEb2N1
bWVudEltcGw+IGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgZXZ0LT5zZXRUYXJnZXQoZG9jLmdl
dCgpKTsKLSAgICBib29sIHIgPSBkaXNwYXRjaEdlbmVyaWNFdmVudChldnQuZ2V0KCksIGV4Y2Vw
dGlvbmNvZGUpOwotICAgIGlmICghZXZ0LT5kZWZhdWx0UHJldmVudGVkKCkgJiYgZG9jKQotIAlk
b2MtPmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0LmdldCgpKTsKLQotICAgIGlmIChldmVudFR5cGUg
PT0gbG9hZEV2ZW50ICYmICFldnQtPnByb3BhZ2F0aW9uU3RvcHBlZCgpICYmIGRvYykgewotICAg
ICAgICAvLyBGb3Igb25sb2FkIGV2ZW50cywgc2VuZCB0aGVtIHRvIHRoZSBlbmNsb3NpbmcgZnJh
bWUgb25seS4KLSAgICAgICAgLy8gVGhpcyBpcyBhIERPTSBleHRlbnNpb24gYW5kIGlzIGluZGVw
ZW5kZW50IG9mIGJ1YmJsaW5nL2NhcHR1cmluZyBydWxlcyBvZgotICAgICAgICAvLyB0aGUgRE9N
LiAgWW91IHNlbmQgdGhlIGV2ZW50IG9ubHkgdG8gdGhlIGVuY2xvc2luZyBmcmFtZS4gIEl0IGRv
ZXMgbm90Ci0gICAgICAgIC8vIGJ1YmJsZSB0aHJvdWdoIHRoZSBwYXJlbnQgZG9jdW1lbnQuCi0g
ICAgICAgIEVsZW1lbnRJbXBsKiBlbHQgPSBkb2MtPm93bmVyRWxlbWVudCgpOwotICAgICAgICBp
ZiAoZWx0ICYmIChlbHQtPmdldERvY3VtZW50KCktPmRvbWFpbigpLmlzTnVsbCgpIHx8Ci0gICAg
ICAgICAgICAgICAgICAgIGVsdC0+Z2V0RG9jdW1lbnQoKS0+ZG9tYWluKCkgPT0gZG9jLT5kb21h
aW4oKSkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFsc28gZG8gYSBzZWN1cml0eSBjaGVjaywgc2lu
Y2Ugd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyB0aGUgZW5jbG9zaW5nCi0gICAgICAgICAgICAvLyBp
ZnJhbWUgdG8gc2VlIGxvYWRzIG9mIGNoaWxkIGRvY3VtZW50cyBpbiBvdGhlciBkb21haW5zLgot
ICAgICAgICAgICAgZXZ0LT5zZXRDdXJyZW50VGFyZ2V0KGVsdCk7Ci0KLSAgICAgICAgICAgIC8v
IENhcHR1cmluZyBmaXJzdC4KLSAgICAgICAgICAgIGVsdC0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0
LmdldCgpLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gQnViYmxpbmcgc2Vjb25kLgotICAgICAg
ICAgICAgaWYgKCFldnQtPnByb3BhZ2F0aW9uU3RvcHBlZCgpKQotICAgICAgICAgICAgICAgIGVs
dC0+aGFuZGxlTG9jYWxFdmVudHMoZXZ0LmdldCgpLCBmYWxzZSk7Ci0gICAgICAgICAgICByID0g
IWV2dC0+ZGVmYXVsdFByZXZlbnRlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IHI7Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmRpc3BhdGNoTW91c2VFdmVudChRTW91c2VFdmVudCAq
X21vdXNlLCBjb25zdCBBdG9taWNTdHJpbmcgJm92ZXJyaWRlVHlwZSwgaW50IG92ZXJyaWRlRGV0
YWlsKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBpbnQg
ZGV0YWlsID0gb3ZlcnJpZGVEZXRhaWw7IC8vIGRlZmF1bHRzIHRvIDAKLSAgICBBdG9taWNTdHJp
bmcgZXZlbnRUeXBlOwotICAgIGlmICghb3ZlcnJpZGVUeXBlLmlzRW1wdHkoKSkgewotICAgICAg
ICBldmVudFR5cGUgPSBvdmVycmlkZVR5cGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNo
IChfbW91c2UtPnR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9u
UHJlc3M6Ci0gICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gbW91c2Vkb3duRXZlbnQ7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25S
ZWxlYXNlOgotICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IG1vdXNldXBFdmVudDsKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvbkRi
bENsaWNrOgotICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IGNsaWNrRXZlbnQ7Ci0gICAgICAg
ICAgICAgICAgZGV0YWlsID0gX21vdXNlLT5jbGlja0NvdW50KCk7Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFFFdmVudDo6TW91c2VNb3ZlOgotICAgICAgICAgICAg
ICAgIGV2ZW50VHlwZSA9IG1vdXNlbW92ZUV2ZW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIGludCBjbGllbnRYID0gMDsKLSAgICBpbnQgY2xpZW50WSA9IDA7Ci0gICAg
aWYgKEtIVE1MVmlldyAqdmlldyA9IGdldERvY3VtZW50KCktPnZpZXcoKSkKLSAgICAgICAgdmll
dy0+dmlld3BvcnRUb0NvbnRlbnRzKF9tb3VzZS0+eCgpLCBfbW91c2UtPnkoKSwgY2xpZW50WCwg
Y2xpZW50WSk7Ci0gICAgaW50IHNjcmVlblggPSBfbW91c2UtPmdsb2JhbFgoKTsKLSAgICBpbnQg
c2NyZWVuWSA9IF9tb3VzZS0+Z2xvYmFsWSgpOwotCi0gICAgaW50IGJ1dHRvbiA9IC0xOwotICAg
IHN3aXRjaCAoX21vdXNlLT5idXR0b24oKSkgewotICAgICAgICBjYXNlIFF0OjpMZWZ0QnV0dG9u
OgotICAgICAgICAgICAgYnV0dG9uID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFF0OjpNaWRCdXR0b246Ci0gICAgICAgICAgICBidXR0b24gPSAxOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgUXQ6OlJpZ2h0QnV0dG9uOgotICAgICAgICAgICAgYnV0dG9u
ID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgfQotCi0gICAgYm9vbCBjdHJsS2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0
OjpDb250cm9sQnV0dG9uKTsKLSAgICBib29sIGFsdEtleSA9IChfbW91c2UtPnN0YXRlKCkgJiBR
dDo6QWx0QnV0dG9uKTsKLSAgICBib29sIHNoaWZ0S2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0
OjpTaGlmdEJ1dHRvbik7Ci0gICAgYm9vbCBtZXRhS2V5ID0gKF9tb3VzZS0+c3RhdGUoKSAmIFF0
OjpNZXRhQnV0dG9uKTsKLSAgICAKLSAgICByZXR1cm4gZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50
VHlwZSwgYnV0dG9uLCBkZXRhaWwsCi0gICAgICAgIGNsaWVudFgsIGNsaWVudFksIHNjcmVlblgs
IHNjcmVlblksCi0gICAgICAgIGN0cmxLZXksIGFsdEtleSwgc2hpZnRLZXksIG1ldGFLZXkpOwot
fQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaFNpbXVsYXRlZE1vdXNlRXZlbnQoY29uc3QgQXRv
bWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlk
ZGVuKCkpOwotICAgIC8vIExpa2UgR2Vja28sIHdlIGp1c3QgcGFzcyAwIGZvciBldmVyeXRoaW5n
IHdoZW4gd2UgbWFrZSBhIGZha2UgbW91c2UgZXZlbnQuCi0gICAgLy8gSW50ZXJuZXQgRXhwbG9y
ZXIgaW5zdGVhZCBnaXZlcyB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiBhbmQgc3RhdGUuCi0g
ICAgcmV0dXJuIGRpc3BhdGNoTW91c2VFdmVudChldmVudFR5cGUsIDAsIDAsIDAsIDAsIDAsIDAs
IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6ZGlzcGF0
Y2hNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBpbnQgYnV0dG9uLCBp
bnQgZGV0YWlsLAotICAgIGludCBjbGllbnRYLCBpbnQgY2xpZW50WSwgaW50IHNjcmVlblgsIGlu
dCBzY3JlZW5ZLAotICAgIGJvb2wgY3RybEtleSwgYm9vbCBhbHRLZXksIGJvb2wgc2hpZnRLZXks
IGJvb2wgbWV0YUtleSkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7
Ci0gICAgaWYgKGRpc2FibGVkKCkpIC8vIERvbid0IGV2ZW4gc2VuZCBET00gZXZlbnRzIGZvciBk
aXNhYmxlZCBjb250cm9scy4uCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKGV2ZW50
VHlwZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsgLy8gU2hvdWxkbid0IGhhcHBl
bi4KLQotICAgIC8vIERpc3BhdGNoaW5nIHRoZSBmaXJzdCBldmVudCBjYW4gZWFzaWx5IHJlc3Vs
dCBpbiB0aGlzIG5vZGUgYmVpbmcgZGVzdHJveWVkLgotICAgIC8vIFNpbmNlIHdlIGRpc3BhdGNo
IHVwIHRvIHRocmVlIGV2ZW50cyBoZXJlLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSByZWZl
cmVuY2VkCi0gICAgLy8gc28gdGhlIHBvaW50ZXIgd2lsbCBiZSBnb29kIGZvciB0aGUgdHdvIHN1
YnNlcXVlbnQgb25lcy4KLSAgICBSZWZQdHI8Tm9kZUltcGw+IHByb3RlY3QodGhpcyk7Ci0KLSAg
ICBib29sIGNhbmNlbGFibGUgPSBldmVudFR5cGUgIT0gbW91c2Vtb3ZlRXZlbnQ7Ci0gICAgCi0g
ICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgYm9vbCBzd2FsbG93RXZlbnQgPSBmYWxz
ZTsKLQotICAgIEV2ZW50SW1wbCAqbWUgPSBuZXcgTW91c2VFdmVudEltcGwoZXZlbnRUeXBlLHRy
dWUsY2FuY2VsYWJsZSxnZXREb2N1bWVudCgpLT5kZWZhdWx0VmlldygpLAotICAgICAgICAgICAg
ICAgICAgIGRldGFpbCxzY3JlZW5YLHNjcmVlblksY2xpZW50WCxjbGllbnRZLGN0cmxLZXksYWx0
S2V5LHNoaWZ0S2V5LG1ldGFLZXksCi0gICAgICAgICAgICAgICAgICAgYnV0dG9uLDApOwotICAg
IG1lLT5yZWYoKTsKLSAgICBkaXNwYXRjaEV2ZW50KG1lLCBleGNlcHRpb25jb2RlLCB0cnVlKTsK
LSAgICBib29sIGRlZmF1bHRIYW5kbGVkID0gbWUtPmRlZmF1bHRIYW5kbGVkKCk7Ci0gICAgYm9v
bCBkZWZhdWx0UHJldmVudGVkID0gbWUtPmRlZmF1bHRQcmV2ZW50ZWQoKTsKLSAgICBpZiAoZGVm
YXVsdEhhbmRsZWQgfHwgZGVmYXVsdFByZXZlbnRlZCkKLSAgICAgICAgc3dhbGxvd0V2ZW50ID0g
dHJ1ZTsKLSAgICBtZS0+ZGVyZWYoKTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZTogSWYgaXQncyBh
IGRvdWJsZSBjbGljayBldmVudCwgd2UgYWxzbyBzZW5kIHRoZSBLSFRNTF9EQkxDTElDSyBldmVu
dC4gVGhpcyBpcyBub3QgcGFydAotICAgIC8vIG9mIHRoZSBET00gc3BlY3MsIGJ1dCBpcyB1c2Vk
IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9uZGJsY2xpY2s9IiIgYXR0cmlidXRlLiAgVGhp
cyBpcyB0cmVhdGVkCi0gICAgLy8gYXMgYSBzZXBhcmF0ZSBldmVudCBpbiBvdGhlciBET00tY29t
cGxpYW50IGJyb3dzZXJzIGxpa2UgRmlyZWZveCwgYW5kIHNvIHdlIGRvIHRoZSBzYW1lLgotICAg
IGlmIChldmVudFR5cGUgPT0gY2xpY2tFdmVudCAmJiBkZXRhaWwgPT0gMikgewotICAgICAgICBt
ZSA9IG5ldyBNb3VzZUV2ZW50SW1wbChraHRtbERibGNsaWNrRXZlbnQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRydWUsY2FuY2VsYWJsZSxnZXREb2N1bWVudCgpLT5kZWZhdWx0
VmlldygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwsc2NyZWVuWCxz
Y3JlZW5ZLGNsaWVudFgsY2xpZW50WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y3RybEtleSxhbHRLZXksc2hpZnRLZXksbWV0YUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYnV0dG9uLDApOwotICAgICAgICBtZS0+cmVmKCk7Ci0gICAgICAgIGlmIChkZWZh
dWx0SGFuZGxlZCkKLSAgICAgICAgICAgIG1lLT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAg
ICBkaXNwYXRjaEV2ZW50KG1lLGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci0gICAgICAgIGlmIChtZS0+
ZGVmYXVsdEhhbmRsZWQoKSB8fCBtZS0+ZGVmYXVsdFByZXZlbnRlZCgpKQotICAgICAgICAgICAg
c3dhbGxvd0V2ZW50ID0gdHJ1ZTsKLSAgICAgICAgbWUtPmRlcmVmKCk7Ci0gICAgfQotCi0gICAg
Ly8gQWxzbyBzZW5kIGEgRE9NQWN0aXZhdGUgZXZlbnQsIHdoaWNoIGNhdXNlcyB0aGluZ3MgbGlr
ZSBmb3JtIHN1Ym1pc3Npb25zIHRvIG9jY3VyLgotICAgIGlmIChldmVudFR5cGUgPT0gY2xpY2tF
dmVudCAmJiAhZGVmYXVsdFByZXZlbnRlZCkKLSAgICAgICAgZGlzcGF0Y2hVSUV2ZW50KERPTUFj
dGl2YXRlRXZlbnQsIGRldGFpbCk7Ci0KLSAgICByZXR1cm4gc3dhbGxvd0V2ZW50OwotfQotCi1i
b29sIE5vZGVJbXBsOjpkaXNwYXRjaFVJRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5
cGUsIGludCBkZXRhaWwpCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkp
OwotICAgIGFzc2VydCAoISggKGV2ZW50VHlwZSAhPSBET01Gb2N1c0luRXZlbnQgJiYKLSAgICAg
ICAgICAgICAgICBldmVudFR5cGUgIT0gRE9NRm9jdXNPdXRFdmVudCAmJgotICAgICAgICAgICAg
ICAgIGV2ZW50VHlwZSAhPSBET01BY3RpdmF0ZUV2ZW50KSkpOwotCi0gICAgaWYgKCFnZXREb2N1
bWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGNhbmNlbGFibGUgPSBm
YWxzZTsKLSAgICBpZiAoZXZlbnRUeXBlID09IERPTUFjdGl2YXRlRXZlbnQpCi0gICAgICAgIGNh
bmNlbGFibGUgPSB0cnVlOwotCi0gICAgaW50IGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgVUlF
dmVudEltcGwgKmV2dCA9IG5ldyBVSUV2ZW50SW1wbChldmVudFR5cGUsIHRydWUsIGNhbmNlbGFi
bGUsIGdldERvY3VtZW50KCktPmRlZmF1bHRWaWV3KCksIGRldGFpbCk7Ci0gICAgcmV0dXJuIGRp
c3BhdGNoRXZlbnQoZXZ0LGV4Y2VwdGlvbmNvZGUsdHJ1ZSk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6
OnJlZ2lzdGVyTm9kZUxpc3QoTm9kZUxpc3RJbXBsICpsaXN0KQotewotICAgIGlmICghbV9ub2Rl
TGlzdHMpIHsKLSAgICAgICAgbV9ub2RlTGlzdHMgPSBuZXcgUVB0ckRpY3Q8Tm9kZUxpc3RJbXBs
PjsKLSAgICB9Ci0KLSAgICBtX25vZGVMaXN0cy0+aW5zZXJ0KGxpc3QsIGxpc3QpOwotfQotCi12
b2lkIE5vZGVJbXBsOjp1bnJlZ2lzdGVyTm9kZUxpc3QoTm9kZUxpc3RJbXBsICpsaXN0KQotewot
ICAgIGlmICghbV9ub2RlTGlzdHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fbm9kZUxpc3Rz
LT5yZW1vdmUobGlzdCk7Ci19Ci0KLXZvaWQgTm9kZUltcGw6Om5vdGlmeUxvY2FsTm9kZUxpc3Rz
QXR0cmlidXRlQ2hhbmdlZCgpCi17Ci0gICAgaWYgKCFtX25vZGVMaXN0cykKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgUVB0ckRpY3RJdGVyYXRvcjxOb2RlTGlzdEltcGw+IGkoKm1fbm9kZUxpc3Rz
KTsKLQotICAgIHdoaWxlIChOb2RlTGlzdEltcGwgKmxpc3QgPSBpLmN1cnJlbnQoKSkgewotICAg
ICAgICBsaXN0LT5yb290Tm9kZUF0dHJpYnV0ZUNoYW5nZWQoKTsKLSAgICAgICAgKytpOwotICAg
IH0KLX0KLQotdm9pZCBOb2RlSW1wbDo6bm90aWZ5Tm9kZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgp
Ci17Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9IHRoaXM7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkp
IHsKLSAgICAgICAgbi0+bm90aWZ5TG9jYWxOb2RlTGlzdHNBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0g
ICAgfQotfQotCi12b2lkIE5vZGVJbXBsOjpub3RpZnlMb2NhbE5vZGVMaXN0c0NoaWxkcmVuQ2hh
bmdlZCgpCi17Ci0gICAgaWYgKCFtX25vZGVMaXN0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
UVB0ckRpY3RJdGVyYXRvcjxOb2RlTGlzdEltcGw+IGkoKm1fbm9kZUxpc3RzKTsKLQotICAgIHdo
aWxlIChOb2RlTGlzdEltcGwgKmxpc3QgPSBpLmN1cnJlbnQoKSkgewotICAgICAgICBsaXN0LT5y
b290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpOwotICAgICAgICArK2k7Ci0gICAgfQotfQotCi12b2lk
IE5vZGVJbXBsOjpub3RpZnlOb2RlTGlzdHNDaGlsZHJlbkNoYW5nZWQoKQotewotICAgIGZvciAo
Tm9kZUltcGwgKm4gPSB0aGlzOyBuOyBuID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIG4t
Pm5vdGlmeUxvY2FsTm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgfQotfQotCi1ib29s
IE5vZGVJbXBsOjpkaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KGJvb2wgc2VuZENoaWxkcmVu
Q2hhbmdlZCkKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0KLSAg
ICAvLyBGSVhNRTogUHVsbCB0aGlzIHdob2xlIGlmIGNsYXVzZSBvdXQgb2YgdGhpcyBmdW5jdGlv
bi4KLSAgICBpZiAoc2VuZENoaWxkcmVuQ2hhbmdlZCkgewotICAgICAgICBub3RpZnlOb2RlTGlz
dHNDaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAgICAgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgfSBl
bHNlCi0gICAgICAgIG5vdGlmeU5vZGVMaXN0c0F0dHJpYnV0ZUNoYW5nZWQoKTsgLy8gRklYTUU6
IENhbiBkbyBiZXR0ZXIgc29tZSBkYXkuIFJlYWxseSBvbmx5IGNhcmUgYWJvdXQgdGhlIG5hbWUg
YXR0cmlidXRlIGNoYW5naW5nLgotCi0gICAgaWYgKCFnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5l
clR5cGUoRG9jdW1lbnRJbXBsOjpET01TVUJUUkVFTU9ESUZJRURfTElTVEVORVIpKQotCXJldHVy
biBmYWxzZTsKLSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgcmV0dXJuIGRpc3BhdGNo
RXZlbnQobmV3IE11dGF0aW9uRXZlbnRJbXBsKERPTVN1YnRyZWVNb2RpZmllZEV2ZW50LAotCQkJ
IHRydWUsZmFsc2UsMCxET01TdHJpbmcoKSxET01TdHJpbmcoKSxET01TdHJpbmcoKSwwKSxleGNl
cHRpb25jb2RlLHRydWUpOwotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNwYXRjaEtleUV2ZW50KFFL
ZXlFdmVudCAqa2V5KQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsK
LSAgICBpbnQgZXhjZXB0aW9uY29kZSA9IDA7Ci0gICAgLy9rZERlYnVnKDYwMTApIDw8ICJET006
Ok5vZGVJbXBsOiBkaXNwYXRjaGluZyBrZXlib2FyZCBldmVudCIgPDwgZW5kbDsKLSAgICBLZXli
b2FyZEV2ZW50SW1wbCAqa2V5Ym9hcmRFdmVudEltcGwgPSBuZXcgS2V5Ym9hcmRFdmVudEltcGwo
a2V5LCBnZXREb2N1bWVudCgpLT5kZWZhdWx0VmlldygpKTsKLSAgICBrZXlib2FyZEV2ZW50SW1w
bC0+cmVmKCk7Ci0gICAgYm9vbCByID0gZGlzcGF0Y2hFdmVudChrZXlib2FyZEV2ZW50SW1wbCxl
eGNlcHRpb25jb2RlLHRydWUpOwotCi0gICAgLy8gd2Ugd2FudCB0byByZXR1cm4gZmFsc2UgaWYg
ZGVmYXVsdCBpcyBwcmV2ZW50ZWQgKGFscmVhZHkgdGFrZW4gY2FyZSBvZikKLSAgICAvLyBvciBp
ZiB0aGUgZWxlbWVudCBpcyBkZWZhdWx0LWhhbmRsZWQgYnkgdGhlIERPTS4gT3RoZXJ3aXNlIHdl
IGxldCBpdCBqdXN0Ci0gICAgLy8gbGV0IGl0IGdldCBoYW5kbGVkIGJ5IEFwcEtpdCAKLSAgICBp
ZiAoa2V5Ym9hcmRFdmVudEltcGwtPmRlZmF1bHRIYW5kbGVkKCkpCi0gICAgICByID0gZmFsc2U7
Ci0KLSAgICBrZXlib2FyZEV2ZW50SW1wbC0+ZGVyZWYoKTsKLSAgICByZXR1cm4gcjsKLQotfQot
Ci12b2lkIE5vZGVJbXBsOjpkaXNwYXRjaFdoZWVsRXZlbnQoUVdoZWVsRXZlbnQgKmUpCi17Ci0g
ICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIGlmIChlLT5kZWx0YSgp
ID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIERvY3VtZW50SW1wbCAqZG9jID0gZ2V0RG9j
dW1lbnQoKTsKLSAgICBpZiAoIWRvYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgS0hUTUxWaWV3
ICp2aWV3ID0gZ2V0RG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlmICghdmlldykKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaW50IHg7Ci0gICAgaW50IHk7Ci0gICAgdmlldy0+dmlld3BvcnRUb0Nv
bnRlbnRzKGUtPngoKSwgZS0+eSgpLCB4LCB5KTsKLQotICAgIGludCBzdGF0ZSA9IGUtPnN0YXRl
KCk7Ci0KLSAgICBXaGVlbEV2ZW50SW1wbCAqd2UgPSBuZXcgV2hlZWxFdmVudEltcGwoZS0+b3Jp
ZW50YXRpb24oKSA9PSBRdDo6SG9yaXpvbnRhbCwgZS0+ZGVsdGEoKSwKLSAgICAgICAgZ2V0RG9j
dW1lbnQoKS0+ZGVmYXVsdFZpZXcoKSwgZS0+Z2xvYmFsWCgpLCBlLT5nbG9iYWxZKCksIHgsIHks
Ci0gICAgICAgIHN0YXRlICYgUXQ6OkNvbnRyb2xCdXR0b24sIHN0YXRlICYgUXQ6OkFsdEJ1dHRv
biwgc3RhdGUgJiBRdDo6U2hpZnRCdXR0b24sIHN0YXRlICYgUXQ6Ok1ldGFCdXR0b24pOwotCi0g
ICAgaW50IGV4Y2VwdGlvbkNvZGUgPSAwOwotICAgIGlmICghZGlzcGF0Y2hFdmVudCh3ZSwgZXhj
ZXB0aW9uQ29kZSwgdHJ1ZSkpCi0gICAgICAgIGUtPmFjY2VwdCgpOwotfQotCi12b2lkIE5vZGVJ
bXBsOjpoYW5kbGVMb2NhbEV2ZW50cyhFdmVudEltcGwgKmV2dCwgYm9vbCB1c2VDYXB0dXJlKQot
ewotICAgIGlmICghbV9yZWdkTGlzdGVuZXJzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
ZGlzYWJsZWQoKSAmJiBldnQtPmlzTW91c2VFdmVudCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBRUHRyTGlzdDxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzQ29weSA9ICptX3Jl
Z2RMaXN0ZW5lcnM7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5l
cj4gaXQobGlzdGVuZXJzQ29weSk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAg
ICAgICAgaWYgKGl0LmN1cnJlbnQoKS0+ZXZlbnRUeXBlKCkgPT0gZXZ0LT50eXBlKCkgJiYgaXQu
Y3VycmVudCgpLT51c2VDYXB0dXJlKCkgPT0gdXNlQ2FwdHVyZSkKLSAgICAgICAgICAgIGl0LmN1
cnJlbnQoKS0+bGlzdGVuZXIoKS0+aGFuZGxlRXZlbnRJbXBsKGV2dCwgZmFsc2UpOwotfQotCi12
b2lkIE5vZGVJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50SW1wbCAqZXZ0KQotewotfQot
Ci11bnNpZ25lZCBOb2RlSW1wbDo6Y2hpbGROb2RlQ291bnQoKSBjb25zdAotewotICAgIHJldHVy
biAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6OmNoaWxkTm9kZSh1bnNpZ25lZCAvKmluZGV4
Ki8pCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6dHJhdmVyc2VO
ZXh0Tm9kZShjb25zdCBOb2RlSW1wbCAqc3RheVdpdGhpbikgY29uc3QKLXsKLSAgICBpZiAoZmly
c3RDaGlsZCgpKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCBmaXJzdENoaWxkKCkt
PmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwotCXJldHVybiBmaXJzdENoaWxkKCk7Ci0gICAgfQot
ICAgIGlmICh0aGlzID09IHN0YXlXaXRoaW4pCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChu
ZXh0U2libGluZygpKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCBuZXh0U2libGlu
ZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4pKTsKLQlyZXR1cm4gbmV4dFNpYmxpbmcoKTsKLSAg
ICB9Ci0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5u
ZXh0U2libGluZygpICYmICghc3RheVdpdGhpbiB8fCBuLT5wYXJlbnROb2RlKCkgIT0gc3RheVdp
dGhpbikpCi0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKG4pIHsKLSAgICAg
ICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8ICFuLT5uZXh0U2libGluZygpIHx8IG4tPm5leHRTaWJs
aW5nKCktPmlzQW5jZXN0b3Ioc3RheVdpdGhpbikpOwotICAgICAgICByZXR1cm4gbi0+bmV4dFNp
YmxpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6
dHJhdmVyc2VOZXh0U2libGluZyhjb25zdCBOb2RlSW1wbCAqc3RheVdpdGhpbikgY29uc3QKLXsK
LSAgICBpZiAodGhpcyA9PSBzdGF5V2l0aGluKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAo
bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgbmV4dFNpYmxp
bmcoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGluKSk7Ci0JcmV0dXJuIG5leHRTaWJsaW5nKCk7Ci0g
ICAgfQotICAgIGNvbnN0IE5vZGVJbXBsICpuID0gdGhpczsKLSAgICB3aGlsZSAobiAmJiAhbi0+
bmV4dFNpYmxpbmcoKSAmJiAoIXN0YXlXaXRoaW4gfHwgbi0+cGFyZW50Tm9kZSgpICE9IHN0YXlX
aXRoaW4pKQotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgIGlmIChuKSB7Ci0gICAg
ICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCAhbi0+bmV4dFNpYmxpbmcoKSB8fCBuLT5uZXh0U2li
bGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4pKTsKLSAgICAgICAgcmV0dXJuIG4tPm5leHRT
aWJsaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6
OnRyYXZlcnNlUHJldmlvdXNOb2RlKCkgY29uc3QKLXsKLSAgICBpZiAocHJldmlvdXNTaWJsaW5n
KCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm4gPSBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAg
d2hpbGUgKG4tPmxhc3RDaGlsZCgpKQotICAgICAgICAgICAgbiA9IG4tPmxhc3RDaGlsZCgpOwot
ICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50Tm9kZSgpKSB7Ci0g
ICAgICAgIHJldHVybiBwYXJlbnROb2RlKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBy
ZXR1cm4gMDsKLSAgICB9Ci19Ci0KLU5vZGVJbXBsICpOb2RlSW1wbDo6dHJhdmVyc2VQcmV2aW91
c05vZGVQb3N0T3JkZXIoY29uc3QgTm9kZUltcGwgKnN0YXlXaXRoaW4pIGNvbnN0Ci17Ci0gICAg
aWYgKGxhc3RDaGlsZCgpKSB7Ci0gICAgICAgIGFzc2VydCghc3RheVdpdGhpbiB8fCBsYXN0Q2hp
bGQoKS0+aXNBbmNlc3RvcihzdGF5V2l0aGluKSk7Ci0JcmV0dXJuIGxhc3RDaGlsZCgpOwotICAg
IH0KLSAgICBpZiAodGhpcyA9PSBzdGF5V2l0aGluKQotICAgICAgICByZXR1cm4gMDsKLSAgICBp
ZiAocHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgYXNzZXJ0KCFzdGF5V2l0aGluIHx8IHBy
ZXZpb3VzU2libGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4pKTsKLQlyZXR1cm4gcHJldmlv
dXNTaWJsaW5nKCk7Ci0gICAgfQotICAgIGNvbnN0IE5vZGVJbXBsICpuID0gdGhpczsKLSAgICB3
aGlsZSAobiAmJiAhbi0+cHJldmlvdXNTaWJsaW5nKCkgJiYgKCFzdGF5V2l0aGluIHx8IG4tPnBh
cmVudE5vZGUoKSAhPSBzdGF5V2l0aGluKSkKLSAgICAgICAgbiA9IG4tPnBhcmVudE5vZGUoKTsK
LSAgICBpZiAobikgewotICAgICAgICBhc3NlcnQoIXN0YXlXaXRoaW4gfHwgIW4tPnByZXZpb3Vz
U2libGluZygpIHx8IG4tPnByZXZpb3VzU2libGluZygpLT5pc0FuY2VzdG9yKHN0YXlXaXRoaW4p
KTsKLSAgICAgICAgcmV0dXJuIG4tPnByZXZpb3VzU2libGluZygpOwotICAgIH0KLSAgICByZXR1
cm4gMDsKLX0KLQotdm9pZCBOb2RlSW1wbDo6Y2hlY2tTZXRQcmVmaXgoY29uc3QgQXRvbWljU3Ry
aW5nICZfcHJlZml4LCBpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0gICAgLy8gUGVyZm9ybSBlcnJv
ciBjaGVja2luZyBhcyByZXF1aXJlZCBieSBzcGVjIGZvciBzZXR0aW5nIE5vZGUucHJlZml4LiBV
c2VkIGJ5Ci0gICAgLy8gRWxlbWVudEltcGw6OnNldFByZWZpeCgpIGFuZCBBdHRySW1wbDo6c2V0
UHJlZml4KCkKLQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgSU5WQUxJRF9D
SEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBwcmVmaXggY29udGFpbnMgYW4g
aWxsZWdhbCBjaGFyYWN0ZXIuCi0gICAgCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURf
RVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgIGlmIChpc1JlYWRPbmx5
KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9fTU9ESUZJQ0FU
SU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRklYTUU6
IEltcGxlbWVudCBOQU1FU1BBQ0VfRVJSOiAtIFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHByZWZp
eCBpcyBtYWxmb3JtZWQKLSAgICAvLyBXZSBoYXZlIHRvIGNvbW1lbnQgdGhpcyBvdXQsIHNpbmNl
IGl0J3MgdXNlZCBmb3IgYXR0cmlidXRlcyBhbmQgdGFnIG5hbWVzLCBhbmQgd2UndmUgb25seQot
ICAgIC8vIHN3aXRjaGVkIG9uZSBvdmVyLgotICAgIC8qCi0gICAgLy8gLSBpZiB0aGUgbmFtZXNw
YWNlVVJJIG9mIHRoaXMgbm9kZSBpcyBudWxsLAotICAgIC8vIC0gaWYgdGhlIHNwZWNpZmllZCBw
cmVmaXggaXMgInhtbCIgYW5kIHRoZSBuYW1lc3BhY2VVUkkgb2YgdGhpcyBub2RlIGlzIGRpZmZl
cmVudCBmcm9tCi0gICAgLy8gICAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNl
IiwKLSAgICAvLyAtIGlmIHRoaXMgbm9kZSBpcyBhbiBhdHRyaWJ1dGUgYW5kIHRoZSBzcGVjaWZp
ZWQgcHJlZml4IGlzICJ4bWxucyIgYW5kCi0gICAgLy8gICB0aGUgbmFtZXNwYWNlVVJJIG9mIHRo
aXMgbm9kZSBpcyBkaWZmZXJlbnQgZnJvbSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8i
LAotICAgIC8vIC0gb3IgaWYgdGhpcyBub2RlIGlzIGFuIGF0dHJpYnV0ZSBhbmQgdGhlIHF1YWxp
ZmllZE5hbWUgb2YgdGhpcyBub2RlIGlzICJ4bWxucyIgW05hbWVzcGFjZXNdLgotICAgIGlmICgo
bmFtZXNwYWNlUGFydChpZCgpKSA9PSBub05hbWVzcGFjZSAmJiBpZCgpID4gSURfTEFTVF9UQUcp
IHx8Ci0gICAgICAgIChfcHJlZml4ID09ICJ4bWwiICYmIERPTVN0cmluZyhnZXREb2N1bWVudCgp
LT5uYW1lc3BhY2VVUkkoaWQoKSkpICE9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1l
c3BhY2UiKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BB
Q0VfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfSovCi19Ci0KLXZvaWQgTm9kZUltcGw6OmNo
ZWNrQWRkQ2hpbGQoTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0g
ICAgLy8gUGVyZm9ybSBlcnJvciBjaGVja2luZyBhcyByZXF1aXJlZCBieSBzcGVjIGZvciBhZGRp
bmcgYSBuZXcgY2hpbGQuIFVzZWQgYnkKLSAgICAvLyBhcHBlbmRDaGlsZCgpLCByZXBsYWNlQ2hp
bGQoKSBhbmQgaW5zZXJ0QmVmb3JlKCkKLQotICAgIC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzog
dGhyb3cgTk9UX0ZPVU5EX0VSUiBpZiBuZXdDaGlsZCBpcyBudWxsCi0gICAgaWYgKCFuZXdDaGls
ZCkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfRk9VTkRfRVJS
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9X
RURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKGlzUmVhZE9u
bHkoKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT19NT0RJRklD
QVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHNo
b3VsZEFkb3B0Q2hpbGQgPSBmYWxzZTsKLQotICAgIC8vIFdST05HX0RPQ1VNRU5UX0VSUjogUmFp
c2VkIGlmIG5ld0NoaWxkIHdhcyBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhh
biB0aGUgb25lIHRoYXQKLSAgICAvLyBjcmVhdGVkIHRoaXMgbm9kZS4KLSAgICAvLyBXZSBhc3N1
bWUgdGhhdCBpZiBuZXdDaGlsZCBpcyBhIERvY3VtZW50RnJhZ21lbnQsIGFsbCBjaGlsZHJlbiBh
cmUgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGRvY3VtZW50Ci0gICAgLy8gYXMgdGhlIGZyYWdtZW50
IGl0c2VsZiAob3RoZXJ3aXNlIHRoZXkgY291bGQgbm90IGhhdmUgYmVlbiBhZGRlZCBhcyBjaGls
ZHJlbikKLSAgICBpZiAobmV3Q2hpbGQtPmdldERvY3VtZW50KCkgIT0gZ2V0RG9jdW1lbnQoKSkg
ewotCS8vIGJ1dCBpZiB0aGUgY2hpbGQgaXMgbm90IGluIGEgZG9jdW1lbnQgeWV0IHRoZW4gbG9v
c2VuIHRoZQotCS8vIHJlc3RyaWN0aW9uLCBzbyB0aGF0IGUuZy4gY3JlYXRpbmcgYW4gZWxlbWVu
dCB3aXRoIHRoZSBPcHRpb24oKQotCS8vIGNvbnN0cnVjdG9yIGFuZCB0aGVuIGFkZGluZyBpdCB0
byBhIGRpZmZlcmVudCBkb2N1bWVudCB3b3JrcywKLQkvLyBhcyBpdCBkb2VzIGluIE1vemlsbGEg
YW5kIE1hYyBJRS4KLQlpZiAoIW5ld0NoaWxkLT5pbkRvY3VtZW50KCkpIHsKLQkgICAgc2hvdWxk
QWRvcHRDaGlsZCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4
Y2VwdGlvbjo6V1JPTkdfRE9DVU1FTlRfRVJSOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQot
ICAgIC8vIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyBvZiBh
IHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdyBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiB0aGUKLSAg
ICAvLyBuZXdDaGlsZCBub2RlLCBvciBpZiB0aGUgbm9kZSB0byBhcHBlbmQgaXMgb25lIG9mIHRo
aXMgbm9kZSdzIGFuY2VzdG9ycy4KLQotICAgIC8vIGNoZWNrIGZvciBhbmNlc3Rvci9zYW1lIG5v
ZGUKLSAgICBpZiAobmV3Q2hpbGQgPT0gdGhpcyB8fCBpc0FuY2VzdG9yKG5ld0NoaWxkKSkgewot
ICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpISUVSQVJDSFlfUkVRVUVTVF9F
UlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG5ld0NoaWxkLT5ub2Rl
VHlwZSgpICE9IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKLSAgICAgICAgaWYgKCFj
aGlsZFR5cGVBbGxvd2VkKG5ld0NoaWxkLT5ub2RlVHlwZSgpKSkgewotICAgICAgICAgICAgZXhj
ZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3Ig
KE5vZGVJbXBsICpuID0gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJs
aW5nKCkpIHsKLSAgICAgICAgICAgIGlmICghY2hpbGRUeXBlQWxsb3dlZChuLT5ub2RlVHlwZSgp
KSkgewotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OkhJRVJB
UkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gY2hhbmdlIHRoZSBkb2N1bWVudCBwb2lu
dGVyIG9mIG5ld0NoaWxkIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIHRvIGJlIHRoZSBuZXcgZG9j
dW1lbnQKLSAgICBpZiAoc2hvdWxkQWRvcHRDaGlsZCkgewotICAgICAgICBmb3IgKE5vZGVJbXBs
KiBub2RlID0gbmV3Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKG5l
d0NoaWxkKSkgewotICAgICAgICAgICAgS0pTOjpTY3JpcHRJbnRlcnByZXRlcjo6dXBkYXRlRE9N
Tm9kZURvY3VtZW50KG5vZGUsIG5vZGUtPmdldERvY3VtZW50KCksIGdldERvY3VtZW50KCkpOwot
ICAgICAgICAgICAgbm9kZS0+c2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgIH0K
LSAgICB9Ci19Ci0KLWJvb2wgTm9kZUltcGw6OmlzQW5jZXN0b3IoY29uc3QgTm9kZUltcGwgKm90
aGVyKSBjb25zdAotewotICAgIC8vIFJldHVybiB0cnVlIGlmIG90aGVyIGlzIGFuIGFuY2VzdG9y
IG9mIHRoaXMsIG90aGVyd2lzZSBmYWxzZQotICAgIGlmICghb3RoZXIpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBmb3IgKGNvbnN0IE5vZGVJbXBsICpuID0gcGFyZW50Tm9kZSgpOyBuOyBu
ID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChuID09IG90aGVyKQotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBOb2Rl
SW1wbDo6Y2hpbGRBbGxvd2VkKCBOb2RlSW1wbCAqbmV3Q2hpbGQgKQotewotICAgIHJldHVybiBj
aGlsZFR5cGVBbGxvd2VkKG5ld0NoaWxkLT5ub2RlVHlwZSgpKTsKLX0KLQotTm9kZUltcGw6OlN0
eWxlQ2hhbmdlIE5vZGVJbXBsOjpkaWZmKCBraHRtbDo6UmVuZGVyU3R5bGUgKnMxLCBraHRtbDo6
UmVuZGVyU3R5bGUgKnMyICkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogVGhlIGJlaGF2aW9yIG9m
IHRoaXMgZnVuY3Rpb24gaXMganVzdCB0b3RhbGx5IHdyb25nLiAgSXQgZG9lc24ndCBoYW5kbGUK
LSAgICAvLyBleHBsaWNpdCBpbmhlcml0YW5jZSBvZiBub24taW5oZXJpdGVkIHByb3BlcnRpZXMg
YW5kIHNvIHlvdSBlbmQgdXAgbm90IHJlLXJlc29sdmluZwotICAgIC8vIHN0eWxlIGluIGNhc2Vz
IHdoZXJlIHlvdSBuZWVkIHRvLgotICAgIFN0eWxlQ2hhbmdlIGNoID0gTm9Jbmhlcml0OwotICAg
IEVEaXNwbGF5IGRpc3BsYXkxID0gczEgPyBzMS0+ZGlzcGxheSgpIDogTk9ORTsKLSAgICBib29s
IGZsMSA9IHMxID8gczEtPmhhc1BzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpGSVJTVF9MRVRURVIp
IDogZmFsc2U7Ci0gICAgRURpc3BsYXkgZGlzcGxheTIgPSBzMiA/IHMyLT5kaXNwbGF5KCkgOiBO
T05FOwotICAgIGJvb2wgZmwyID0gczIgPyBzMi0+aGFzUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6
OkZJUlNUX0xFVFRFUikgOiBmYWxzZTsKLSAgICBpZiAoZGlzcGxheTEgIT0gZGlzcGxheTIgfHwg
ZmwxICE9IGZsMikKLSAgICAgICAgY2ggPSBEZXRhY2g7Ci0gICAgZWxzZSBpZiAoICFzMSB8fCAh
czIgKQotCWNoID0gSW5oZXJpdDsKLSAgICBlbHNlIGlmICggKnMxID09ICpzMiApCi0gCWNoID0g
Tm9DaGFuZ2U7Ci0gICAgZWxzZSBpZiAoIHMxLT5pbmhlcml0ZWROb3RFcXVhbCggczIgKSApCi0J
Y2ggPSBJbmhlcml0OwotICAgIHJldHVybiBjaDsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQg
Tm9kZUltcGw6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgUVN0cmluZyBpbmQpIGNvbnN0Ci17
Ci0gICAgLy8gIyMjIGltcGxlbWVudCBkdW1wKCkgZm9yIGFsbCBhcHByb3ByaWF0ZSBzdWJjbGFz
c2VzCi0KLSAgICBpZiAobV9oYXNJZCkgeyAqc3RyZWFtIDw8ICIgaGFzSWQiOyB9Ci0gICAgaWYg
KG1faGFzQ2xhc3MpIHsgKnN0cmVhbSA8PCAiIGhhc0NsYXNzIjsgfQotICAgIGlmIChtX2hhc1N0
eWxlKSB7ICpzdHJlYW0gPDwgIiBoYXNTdHlsZSI7IH0KLSAgICBpZiAobV9zcGVjaWZpZWQpIHsg
KnN0cmVhbSA8PCAiIHNwZWNpZmllZCI7IH0KLSAgICBpZiAobV9mb2N1c2VkKSB7ICpzdHJlYW0g
PDwgIiBmb2N1c2VkIjsgfQotICAgIGlmIChtX2FjdGl2ZSkgeyAqc3RyZWFtIDw8ICIgYWN0aXZl
IjsgfQotICAgIGlmIChtX3N0eWxlRWxlbWVudCkgeyAqc3RyZWFtIDw8ICIgc3R5bGVFbGVtZW50
IjsgfQotICAgIGlmIChtX2ltcGxpY2l0KSB7ICpzdHJlYW0gPDwgIiBpbXBsaWNpdCI7IH0KLQot
ICAgICpzdHJlYW0gPDwgIiB0YWJJbmRleD0iIDw8IG1fdGFiSW5kZXg7Ci0gICAgaWYgKG1fcmVn
ZExpc3RlbmVycykKLQkqc3RyZWFtIDw8ICIgI3JlZ2RMaXN0ZW5lcnM9IiA8PCBtX3JlZ2RMaXN0
ZW5lcnMtPmNvdW50KCk7IC8vICMjIyBtb3JlIGRldGFpbAotICAgICpzdHJlYW0gPDwgZW5kbDsK
LQotICAgIE5vZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZShjaGlsZCkg
ewotCSpzdHJlYW0gPDwgaW5kIDw8IGNoaWxkLT5ub2RlTmFtZSgpLnFzdHJpbmcoKS5hc2NpaSgp
IDw8ICI6ICI7Ci0gICAgICAgIGNoaWxkLT5kdW1wKHN0cmVhbSxpbmQrIiAgIik7Ci0gICAgICAg
IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQg
Tm9kZUltcGw6OmF0dGFjaCgpCi17Ci0gICAgYXNzZXJ0KCFhdHRhY2hlZCgpKTsKLSAgICBhc3Nl
cnQoIW1fcmVuZGVyIHx8IChtX3JlbmRlci0+c3R5bGUoKSAmJiBtX3JlbmRlci0+cGFyZW50KCkp
KTsKLSAgICBnZXREb2N1bWVudCgpLT5pbmNET01UcmVlVmVyc2lvbigpOwotICAgIG1fYXR0YWNo
ZWQgPSB0cnVlOwotfQotCi12b2lkIE5vZGVJbXBsOjp3aWxsUmVtb3ZlKCkKLXsKLX0KLQotdm9p
ZCBOb2RlSW1wbDo6ZGV0YWNoKCkKLXsKLSAgICBtX2luRGV0YWNoID0gdHJ1ZTsKLS8vICAgIGFz
c2VydChtX2F0dGFjaGVkKTsKLQotICAgIGlmIChtX3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXIt
PmRlc3Ryb3koKTsKLSAgICBtX3JlbmRlciA9IDA7Ci0KLSAgICBEb2N1bWVudEltcGwgKmRvYyA9
IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvYykKLSAgICAgICAgZG9jLT5pbmNET01UcmVlVmVy
c2lvbigpOwotICAgIG1fYXR0YWNoZWQgPSBmYWxzZTsKLSAgICBtX2luRGV0YWNoID0gZmFsc2U7
Ci19Ci0KLWJvb2wgTm9kZUltcGw6Om1haW50YWluc1N0YXRlKCkKLXsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLVFTdHJpbmcgTm9kZUltcGw6OnN0YXRlKCkKLXsKLSAgICByZXR1cm4gUVN0cmlu
Zzo6bnVsbDsKLX0KLQotdm9pZCBOb2RlSW1wbDo6cmVzdG9yZVN0YXRlKFFTdHJpbmdMaXN0ICYv
KnN0YXRlcyovKQotewotfQotCi12b2lkIE5vZGVJbXBsOjppbnNlcnRlZEludG9Eb2N1bWVudCgp
Ci17Ci0gICAgaWYgKG1fcmVnZExpc3RlbmVycyAmJiAhbV9yZWdkTGlzdGVuZXJzLT5pc0VtcHR5
KCkgJiYgZ2V0RG9jdW1lbnQoKSkKLSAgICAgICAgZ2V0RG9jdW1lbnQoKS0+dW5yZWdpc3RlckRp
c2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnModGhpcyk7Ci0KLSAgICBzZXRJbkRvY3Vt
ZW50KHRydWUpOwotICAgIAotICAgIGluc2VydGVkSW50b1RyZWUoZmFsc2UpOwotfQotCi12b2lk
IE5vZGVJbXBsOjpyZW1vdmVkRnJvbURvY3VtZW50KCkKLXsKLSAgICBpZiAobV9yZWdkTGlzdGVu
ZXJzICYmICFtX3JlZ2RMaXN0ZW5lcnMtPmlzRW1wdHkoKSAmJiBnZXREb2N1bWVudCgpKQotICAg
ICAgICBnZXREb2N1bWVudCgpLT5yZWdpc3RlckRpc2Nvbm5lY3RlZE5vZGVXaXRoRXZlbnRMaXN0
ZW5lcnModGhpcyk7Ci0KLSAgICBzZXRJbkRvY3VtZW50KGZhbHNlKTsKLSAgICAKLSAgICByZW1v
dmVkRnJvbVRyZWUoZmFsc2UpOwotfQotCi12b2lkIE5vZGVJbXBsOjpjaGlsZHJlbkNoYW5nZWQo
KQotewotfQotCi1ib29sIE5vZGVJbXBsOjpkaXNhYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1ib29sIE5vZGVJbXBsOjppc1JlYWRPbmx5KCkKLXsKLSAgICAvLyBFbnRp
dHkgJiBFbnRpdHkgUmVmZXJlbmNlIG5vZGVzIGFuZCB0aGVpciBkZXNjZW5kYW50cyBhcmUgcmVh
ZC1vbmx5Ci0gICAgTm9kZUltcGwgKm4gPSB0aGlzOwotICAgIHdoaWxlIChuKSB7Ci0JaWYgKG4t
Pm5vZGVUeXBlKCkgPT0gTm9kZTo6RU5USVRZX05PREUgfHwKLQkgICAgbi0+bm9kZVR5cGUoKSA9
PSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREUpCi0JICAgIHJldHVybiB0cnVlOwotCW4gPSBu
LT5wYXJlbnROb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotTm9kZUltcGwg
Kk5vZGVJbXBsOjpwcmV2aW91c0VkaXRhYmxlKCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbm9k
ZSA9IHByZXZpb3VzTGVhZk5vZGUoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAo
bm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAg
ICAgICBub2RlID0gbm9kZS0+cHJldmlvdXNMZWFmTm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4g
MDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpuZXh0RWRpdGFibGUoKSBjb25zdAotewotICAg
IE5vZGVJbXBsICpub2RlID0gbmV4dExlYWZOb2RlKCk7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAg
ICAgICAgaWYgKG5vZGUtPmlzQ29udGVudEVkaXRhYmxlKCkpCi0gICAgICAgICAgICByZXR1cm4g
bm9kZTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHRMZWFmTm9kZSgpOwotICAgIH0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotUmVuZGVyT2JqZWN0ICogTm9kZUltcGw6OnByZXZpb3VzUmVuZGVyZXIo
KQotewotICAgIGZvciAoTm9kZUltcGwgKm4gPSBwcmV2aW91c1NpYmxpbmcoKTsgbjsgbiA9IG4t
PnByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgIGlmIChuLT5yZW5kZXJlcigpKQotICAgICAg
ICAgICAgcmV0dXJuIG4tPnJlbmRlcmVyKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1S
ZW5kZXJPYmplY3QgKiBOb2RlSW1wbDo6bmV4dFJlbmRlcmVyKCkKLXsKLSAgICAvLyBBdm9pZCBh
biBPKG5eMikgcHJvYmxlbSB3aXRoIHRoaXMgZnVuY3Rpb24gYnkgbm90IGNoZWNraW5nIGZvciBu
ZXh0UmVuZGVyZXIoKSB3aGVuIHRoZSBwYXJlbnQgZWxlbWVudCBoYXNuJ3QgZXZlbiAKLSAgICAv
LyBiZWVuIGF0dGFjaGVkIHlldC4KLSAgICBpZiAocGFyZW50KCkgJiYgIXBhcmVudCgpLT5hdHRh
Y2hlZCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvciAoTm9kZUltcGwgKm4gPSBuZXh0
U2libGluZygpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAobi0+cmVu
ZGVyZXIoKSkKLSAgICAgICAgICAgIHJldHVybiBuLT5yZW5kZXJlcigpOwotICAgIH0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotLy8gRklYTUU6IFRoaXMgY29kZSBpcyB1c2VkIGJ5IGVkaXRpbmcuICBT
ZWVtcyBsaWtlIGl0IGNvdWxkIG1vdmUgb3ZlciB0aGVyZSBhbmQgbm90IHBvbGx1dGUgTm9kZUlt
cGwuCi1Ob2RlSW1wbCAqTm9kZUltcGw6OnByZXZpb3VzTm9kZUNvbnNpZGVyaW5nQXRvbWljTm9k
ZXMoKSBjb25zdAotewotICAgIGlmIChwcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICBOb2Rl
SW1wbCAqbiA9IHByZXZpb3VzU2libGluZygpOwotICAgICAgICB3aGlsZSAoIWlzQXRvbWljTm9k
ZShuKSAmJiBuLT5sYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIG4gPSBuLT5sYXN0Q2hpbGQoKTsK
LSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudE5vZGUoKSkgewot
ICAgICAgICByZXR1cm4gcGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6Om5leHROb2RlQ29uc2lk
ZXJpbmdBdG9taWNOb2RlcygpIGNvbnN0Ci17Ci0gICAgaWYgKCFpc0F0b21pY05vZGUodGhpcykg
JiYgZmlyc3RDaGlsZCgpKQotCXJldHVybiBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKG5leHRTaWJs
aW5nKCkpCi0JcmV0dXJuIG5leHRTaWJsaW5nKCk7Ci0gICAgY29uc3QgTm9kZUltcGwgKm4gPSB0
aGlzOwotICAgIHdoaWxlIChuICYmICFuLT5uZXh0U2libGluZygpKQotICAgICAgICBuID0gbi0+
cGFyZW50Tm9kZSgpOwotICAgIGlmIChuKQotICAgICAgICByZXR1cm4gbi0+bmV4dFNpYmxpbmco
KTsKLSAgICByZXR1cm4gMDsKLX0KLQotTm9kZUltcGwgKk5vZGVJbXBsOjpwcmV2aW91c0xlYWZO
b2RlKCkgY29uc3QKLXsKLSAgICBOb2RlSW1wbCAqbm9kZSA9IHByZXZpb3VzTm9kZUNvbnNpZGVy
aW5nQXRvbWljTm9kZXMoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoaXNBdG9t
aWNOb2RlKG5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIG5vZGUgPSBu
b2RlLT5wcmV2aW91c05vZGVDb25zaWRlcmluZ0F0b21pY05vZGVzKCk7Ci0gICAgfQotICAgIHJl
dHVybiAwOwotfQotCi1Ob2RlSW1wbCAqTm9kZUltcGw6Om5leHRMZWFmTm9kZSgpIGNvbnN0Ci17
Ci0gICAgTm9kZUltcGwgKm5vZGUgPSBuZXh0Tm9kZUNvbnNpZGVyaW5nQXRvbWljTm9kZXMoKTsK
LSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoaXNBdG9taWNOb2RlKG5vZGUpKQotICAg
ICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0Tm9kZUNvbnNp
ZGVyaW5nQXRvbWljTm9kZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTm9k
ZUltcGw6OmNyZWF0ZVJlbmRlcmVySWZOZWVkZWQoKQotewotCi0gICAgaWYgKCFnZXREb2N1bWVu
dCgpLT5zaG91bGRDcmVhdGVSZW5kZXJlcnMoKSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAK
LSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotICAgIGFzc2VydCghbV9yZW5kZXIpOwotICAgIAot
ICAgIE5vZGVJbXBsICpwYXJlbnQgPSBwYXJlbnROb2RlKCk7ICAgIAotICAgIGFzc2VydChwYXJl
bnQpOwotICAgICAgICAKLSAgICBSZW5kZXJPYmplY3QgKnBhcmVudFJlbmRlcmVyID0gcGFyZW50
LT5yZW5kZXJlcigpOwotICAgIGlmIChwYXJlbnRSZW5kZXJlciAmJiBwYXJlbnRSZW5kZXJlci0+
Y2FuSGF2ZUNoaWxkcmVuKCkKLSNpZiBTVkdfU1VQUE9SVAotICAgICAgICAmJiBwYXJlbnQtPmNo
aWxkU2hvdWxkQ3JlYXRlUmVuZGVyZXIodGhpcykKLSNlbmRpZgotICAgICAgICApIHsKLSAgICAg
ICAgUmVuZGVyU3R5bGUgKnN0eWxlID0gc3R5bGVGb3JSZW5kZXJlcihwYXJlbnRSZW5kZXJlcik7
Ci0gICAgICAgIHN0eWxlLT5yZWYoKTsKLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgICAgIGJv
b2wgcmVzb2x2ZVN0eWxlID0gZmFsc2U7Ci0gICAgICAgIGlmIChnZXREb2N1bWVudCgpLT5iaW5k
aW5nTWFuYWdlcigpLT5sb2FkQmluZGluZ3ModGhpcywgc3R5bGUtPmJpbmRpbmdVUklzKCksIHRy
dWUsICZyZXNvbHZlU3R5bGUpICYmIAotICAgICAgICAgICAgcmVuZGVyZXJJc05lZWRlZChzdHls
ZSkpIHsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlU3R5bGUpIHsKLSAgICAgICAgICAgICAgICBz
dHlsZS0+ZGVyZWYoKTsKLSAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlRm9yUmVuZGVyZXIo
cGFyZW50UmVuZGVyZXIpOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKHJlbmRl
cmVySXNOZWVkZWQoc3R5bGUpKSB7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1fcmVuZGVyID0gY3Jl
YXRlUmVuZGVyZXIoZ2V0RG9jdW1lbnQoKS0+cmVuZGVyQXJlbmEoKSwgc3R5bGUpOwotICAgICAg
ICAgICAgaWYgKG1fcmVuZGVyKSB7Ci0gICAgICAgICAgICAgICAgbV9yZW5kZXItPnNldFN0eWxl
KHN0eWxlKTsKLSAgICAgICAgICAgICAgICBwYXJlbnRSZW5kZXJlci0+YWRkQ2hpbGQobV9yZW5k
ZXIsIG5leHRSZW5kZXJlcigpKTsKLSAgICAgICAgICAgIH0KLSNpZm5kZWYgS0hUTUxfTk9fWEJM
Ci0gICAgICAgIH0gLy8gYXZvaWQgY29uZnVzaW5nIHRoZSBjaGFuZ2UgbG9nIGNvZGUgcGFyc2Vy
IGJ5IGhhdmluZyB0d28gY2xvc2UgYnJhY2VzIHRvIG1hdGNoIHRoZSB0d28gb3BlbiBicmFjZXMg
YWJvdmUKLSNlbHNlCi0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBzdHlsZS0+ZGVyZWYoZ2V0
RG9jdW1lbnQoKS0+cmVuZGVyQXJlbmEoKSk7Ci0gICAgfQotfQotCi1SZW5kZXJTdHlsZSAqTm9k
ZUltcGw6OnN0eWxlRm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0ICpwYXJlbnQpCi17Ci0gICAgcmV0
dXJuIHBhcmVudC0+c3R5bGUoKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6cmVuZGVyZXJJc05lZWRl
ZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIChnZXREb2N1bWVudCgpLT5kb2N1
bWVudEVsZW1lbnQoKSA9PSB0aGlzKSB8fCAoc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FKTsKLX0K
LQotUmVuZGVyT2JqZWN0ICpOb2RlSW1wbDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFy
ZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1
cm4gMDsKLX0KLQotaW50IE5vZGVJbXBsOjptYXhPZmZzZXQoKSBjb25zdAotewotICAgIHJldHVy
biAxOwotfQotCi0vLyBGSVhNRTogU2hvdWxkbid0IHRoZXNlIGZ1bmN0aW9ucyBiZSBpbiB0aGUg
ZWRpdGluZyBjb2RlPyAgQ29kZSB0aGF0IGFza3MgcXVlc3Rpb25zIGFib3V0IEhUTUwgaW4gdGhl
IGNvcmUgRE9NIGNsYXNzCi0vLyBpcyBvYnZpb3VzbHkgbWlzcGxhY2VkLgotaW50IE5vZGVJbXBs
OjpjYXJldE1pbk9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgPyByZW5k
ZXJlcigpLT5jYXJldE1pbk9mZnNldCgpIDogMDsKLX0KLQotaW50IE5vZGVJbXBsOjpjYXJldE1h
eE9mZnNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5j
YXJldE1heE9mZnNldCgpIDogMTsKLX0KLQotdW5zaWduZWQgTm9kZUltcGw6OmNhcmV0TWF4UmVu
ZGVyZWRPZmZzZXQoKSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIo
KS0+Y2FyZXRNYXhSZW5kZXJlZE9mZnNldCgpIDogMTsKLX0KLQotaW50IE5vZGVJbXBsOjpwcmV2
aW91c09mZnNldCAoaW50IGN1cnJlbnQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCkg
PyByZW5kZXJlcigpLT5wcmV2aW91c09mZnNldChjdXJyZW50KSA6IGN1cnJlbnQgLSAxOwotfQot
Ci1pbnQgTm9kZUltcGw6Om5leHRPZmZzZXQgKGludCBjdXJyZW50KSBjb25zdAotewotICAgIHJl
dHVybiByZW5kZXJlcigpID8gcmVuZGVyZXIoKS0+bmV4dE9mZnNldChjdXJyZW50KSA6IGN1cnJl
bnQgKyAxOwotfQotCi1ib29sIE5vZGVJbXBsOjppc0Jsb2NrRmxvdygpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNCbG9ja0Zsb3coKTsKLX0KLQotYm9v
bCBOb2RlSW1wbDo6aXNCbG9ja0Zsb3dPckJsb2NrVGFibGUoKSBjb25zdAotewotICAgIHJldHVy
biByZW5kZXJlcigpICYmIChyZW5kZXJlcigpLT5pc0Jsb2NrRmxvdygpIHx8IHJlbmRlcmVyKCkt
PmlzVGFibGUoKSAmJiAhcmVuZGVyZXIoKS0+aXNJbmxpbmUoKSk7Ci19Ci0KLWJvb2wgTm9kZUlt
cGw6OmlzRWRpdGFibGVCbG9jaygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzQ29udGVudEVkaXRh
YmxlKCkgJiYgaXNCbG9ja0Zsb3coKTsKLX0KLQotRWxlbWVudEltcGwgKk5vZGVJbXBsOjplbmNs
b3NpbmdCbG9ja0Zsb3dPclRhYmxlRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4g
PSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMpOwotICAgIGlmIChpc0Jsb2NrRmxvd09yQmxv
Y2tUYWJsZSgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7
Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBuID0gbi0+cGFyZW50Tm9kZSgpOwotICAgICAg
ICBpZiAoIW4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKG4tPmlzQmxvY2tGbG93
T3JCbG9ja1RhYmxlKCkgfHwgbi0+aGFzVGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2RlSW1wbDo6ZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgp
IGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4gPSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMp
OwotICAgIGlmIChpc0Jsb2NrRmxvdygpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwgKj4obik7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBuID0gbi0+cGFyZW50
Tm9kZSgpOwotICAgICAgICBpZiAoIW4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYg
KG4tPmlzQmxvY2tGbG93KCkgfHwgbi0+aGFzVGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLSAgICB9Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2RlSW1wbDo6ZW5jbG9zaW5nSW5saW5lRWxlbWVudCgp
IGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4gPSBjb25zdF9jYXN0PE5vZGVJbXBsICo+KHRoaXMp
OwotICAgIE5vZGVJbXBsICpwOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgcCA9IG4tPnBh
cmVudE5vZGUoKTsKLSAgICAgICAgaWYgKCFwIHx8IHAtPmlzQmxvY2tGbG93KCkgfHwgcC0+aGFz
VGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50
SW1wbCAqPihuKTsKLSAgICAgICAgLy8gQWxzbyBzdG9wIGlmIGFueSBwcmV2aW91cyBzaWJsaW5n
IGlzIGEgYmxvY2sKLSAgICAgICAgZm9yIChOb2RlSW1wbCAqc2libGluZyA9IG4tPnByZXZpb3Vz
U2libGluZygpOyBzaWJsaW5nOyBzaWJsaW5nID0gc2libGluZy0+cHJldmlvdXNTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgIGlmIChzaWJsaW5nLT5pc0Jsb2NrRmxvdygpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihuKTsKLSAgICAgICAgfQotICAg
ICAgICBuID0gcDsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpOb2RlSW1wbDo6cm9vdEVkaXRhYmxlRWxlbWVudCgpIGNv
bnN0Ci17Ci0gICAgaWYgKCFpc0NvbnRlbnRFZGl0YWJsZSgpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIE5vZGVJbXBsICpuID0gY29uc3RfY2FzdDxOb2RlSW1wbCAqPih0aGlzKTsKLSAgICBp
ZiAobi0+aGFzVGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVs
ZW1lbnRJbXBsICo+KG4pOwotCi0gICAgTm9kZUltcGwgKnJlc3VsdCA9IG4tPmlzRWRpdGFibGVC
bG9jaygpID8gbiA6IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbiA9IG4tPnBhcmVudE5v
ZGUoKTsKLSAgICAgICAgaWYgKCFuIHx8ICFuLT5pc0NvbnRlbnRFZGl0YWJsZSgpKQotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGJvZHlUYWcpKSB7Ci0gICAg
ICAgICAgICByZXN1bHQgPSBuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKG4tPmlzQmxvY2tGbG93KCkpCi0gICAgICAgICAgICByZXN1bHQgPSBuOwotICAgIH0K
LSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4ocmVzdWx0KTsKLX0KLQotYm9v
bCBOb2RlSW1wbDo6aW5TYW1lUm9vdEVkaXRhYmxlRWxlbWVudChOb2RlSW1wbCAqbikKLXsKLSAg
ICByZXR1cm4gbiA/IHJvb3RFZGl0YWJsZUVsZW1lbnQoKSA9PSBuLT5yb290RWRpdGFibGVFbGVt
ZW50KCkgOiBmYWxzZTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aW5TYW1lQ29udGFpbmluZ0Jsb2Nr
Rmxvd0VsZW1lbnQoTm9kZUltcGwgKm4pCi17Ci0gICAgcmV0dXJuIG4gPyBlbmNsb3NpbmdCbG9j
a0Zsb3dFbGVtZW50KCkgPT0gbi0+ZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgpIDogZmFsc2U7
Ci19Ci0KLS8vIEZJWE1FOiBFbmQgb2Ygb2J2aW91c2x5IG1pc3BsYWNlZCBIVE1MIGVkaXRpbmcg
ZnVuY3Rpb25zLiAgVHJ5IHRvIG1vdmUgdGhlc2Ugb3V0IG9mIE5vZGVJbXBsLgotCi1SZWZQdHI8
Tm9kZUxpc3RJbXBsPiBOb2RlSW1wbDo6Z2V0RWxlbWVudHNCeVRhZ05hbWVOUyhjb25zdCBET01T
dHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2NhbE5hbWUpCi17Ci0gICAg
aWYgKG5hbWVzcGFjZVVSSS5pc051bGwoKSB8fCBsb2NhbE5hbWUuaXNOdWxsKCkpCi0gICAgICAg
IHJldHVybiBSZWZQdHI8Tm9kZUxpc3RJbXBsPigpOyAvLyBGSVhNRTogV2hvIGNhcmVzIGFib3V0
IHRoaXMgYWRkaXRpb25hbCBjaGVjaz8KLSAgICAKLSAgICBET01TdHJpbmcgbmFtZSA9IGxvY2Fs
TmFtZTsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAg
bmFtZSA9IGxvY2FsTmFtZS5sb3dlcigpOwotICAgIHJldHVybiBSZWZQdHI8Tm9kZUxpc3RJbXBs
PihuZXcgVGFnTm9kZUxpc3RJbXBsKHRoaXMsIEF0b21pY1N0cmluZyhuYW1lc3BhY2VVUkkpLCBB
dG9taWNTdHJpbmcobmFtZSkpKTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNTdXBwb3J0ZWQoY29u
c3QgRE9NU3RyaW5nICZmZWF0dXJlLCBjb25zdCBET01TdHJpbmcgJnZlcnNpb24pCi17Ci0gICAg
cmV0dXJuIERPTUltcGxlbWVudGF0aW9uSW1wbDo6aW5zdGFuY2UoKS0+aGFzRmVhdHVyZShmZWF0
dXJlLCB2ZXJzaW9uKTsKLX0KLQotRG9jdW1lbnRJbXBsICpOb2RlSW1wbDo6b3duZXJEb2N1bWVu
dCgpIGNvbnN0Ci17Ci0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBnZXREb2N1bWVudCgpOwotICAg
IHJldHVybiBkb2MgPT0gdGhpcyA/IDAgOiBkb2M7Ci19Ci0KLWJvb2wgTm9kZUltcGw6Omhhc0F0
dHJpYnV0ZXMoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotTmFtZWRBdHRyTWFw
SW1wbCAqTm9kZUltcGw6OmF0dHJpYnV0ZXMoKSBjb25zdAotewotICAgIHJldHVybiAwOwotfQot
Ci1ib29sIE5vZGVJbXBsOjppc0VxdWFsTm9kZShOb2RlSW1wbCAqb3RoZXIpIGNvbnN0Ci17Ci0g
ICAgaWYgKCFvdGhlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChub2Rl
VHlwZSgpICE9IG90aGVyLT5ub2RlVHlwZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
Ci0gICAgaWYgKG5vZGVOYW1lKCkgIT0gb3RoZXItPm5vZGVOYW1lKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBpZiAobG9jYWxOYW1lKCkgIT0gb3RoZXItPmxvY2FsTmFtZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG5hbWVzcGFjZVVSSSgpICE9
IG90aGVyLT5uYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAg
IGlmIChwcmVmaXgoKSAhPSBvdGhlci0+cHJlZml4KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAKLSAgICBpZiAobm9kZVZhbHVlKCkgIT0gb3RoZXItPm5vZGVWYWx1ZSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgTmFtZWRBdHRyTWFwSW1wbCAqYXR0cnMgPSBhdHRy
aWJ1dGVzKCk7Ci0gICAgTmFtZWRBdHRyTWFwSW1wbCAqb3RoZXJBdHRycyA9IG90aGVyLT5hdHRy
aWJ1dGVzKCk7Ci0gICAgCi0gICAgaWYgKCFhdHRycyAmJiBvdGhlckF0dHJzKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKGF0dHJzICYmICFhdHRycy0+bWFwc0VxdWl2YWxl
bnQob3RoZXJBdHRycykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBOb2RlSW1w
bCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgTm9kZUltcGwgKm90aGVyQ2hpbGQgPSBvdGhl
ci0+Zmlyc3RDaGlsZCgpOwotICAgIAotICAgIHdoaWxlIChjaGlsZCkgewotICAgICAgICBpZiAo
IWNoaWxkLT5pc0VxdWFsTm9kZShvdGhlckNoaWxkKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgCi0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAg
ICAgIG90aGVyQ2hpbGQgPSBvdGhlckNoaWxkLT5uZXh0U2libGluZygpOwotICAgIH0KLSAgICAK
LSAgICBpZiAob3RoZXJDaGlsZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIC8v
IEZJWE1FOiBGb3IgRG9jdW1lbnRUeXBlIG5vZGVzIHdlIHNob3VsZCBjaGVjayBlcXVhbGl0eSBv
bgotICAgIC8vIHRoZSBlbnRpdGllcyBhbmQgbm90YXRpb25zIE5hbWVkTm9kZU1hcHMgYXMgd2Vs
bC4KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBOb2RlSW1wbDo6aXNEZWZhdWx0
TmFtZXNwYWNlKGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJKSBjb25zdAotewotICAgIC8v
IEltcGxlbWVudGVkIGFjY29yZGluZyB0bwotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIw
MDQvUkVDLURPTS1MZXZlbC0zLUNvcmUtMjAwNDA0MDcvbmFtZXNwYWNlcy1hbGdvcml0aG1zLmh0
bWwjaXNEZWZhdWx0TmFtZXNwYWNlQWxnbwotICAgIAotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkg
ewotICAgICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERTogewotICAgICAgICAgICAgY29uc3Qg
RWxlbWVudEltcGwgKmVsZW0gPSBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPih0aGlz
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVsZW0tPnByZWZpeCgpLmlzTnVsbCgp
KQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLT5uYW1lc3BhY2VVUkkoKSA9PSBuYW1lc3Bh
Y2VVUkk7Ci0KLSAgICAgICAgICAgIGlmIChlbGVtLT5oYXNBdHRyaWJ1dGVzKCkpIHsKLSAgICAg
ICAgICAgICAgICBOYW1lZEF0dHJNYXBJbXBsICphdHRycyA9IGVsZW0tPmF0dHJpYnV0ZXMoKTsK
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgYXR0cnMtPmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRl
SW1wbCAqYXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHItPmxvY2FsTmFtZSgpID09ICJ4bWxucyIp
Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci0+dmFsdWUoKSA9PSBuYW1lc3Bh
Y2VVUkk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0g
ICAgICAgICAgICBpZiAoRWxlbWVudEltcGwgKmFuY2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50
KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLT5pc0RlZmF1bHROYW1lc3BhY2Uo
bmFtZXNwYWNlVVJJKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0g
ICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdCA8Y29uc3QgRG9jdW1lbnRJbXBsICo+KHRoaXMpLT5kb2N1bWVudEVsZW1lbnQoKS0+
aXNEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5U
SVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKLSAgICAgICAgY2Fz
ZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRf
RlJBR01FTlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBO
b2RlOjpBVFRSSUJVVEVfTk9ERTogewotICAgICAgICAgICAgY29uc3QgQXR0ckltcGwgKmF0dHIg
PSBzdGF0aWNfY2FzdDxjb25zdCBBdHRySW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVy
biBhdHRyLT5vd25lckVsZW1lbnQoKS0+aXNEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7
Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKEVsZW1lbnRJbXBsICphbmNlc3RvciA9IGdl
dEFuY2VzdG9yRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBhbmNlc3Rvci0+aXNE
ZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLURPTVN0cmluZyBOb2RlSW1wbDo6bG9va3VwUHJl
Zml4KGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJKSBjb25zdAotewotICAgIC8vIEltcGxl
bWVudGVkIGFjY29yZGluZyB0bwotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVD
LURPTS1MZXZlbC0zLUNvcmUtMjAwNDA0MDcvbmFtZXNwYWNlcy1hbGdvcml0aG1zLmh0bWwjbG9v
a3VwTmFtZXNwYWNlUHJlZml4QWxnbwotICAgIAotICAgIGlmIChuYW1lc3BhY2VVUkkuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgCi0gICAgc3dpdGNoIChub2Rl
VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgotICAgICAgICAgICAg
cmV0dXJuIGxvb2t1cE5hbWVzcGFjZVByZWZpeChuYW1lc3BhY2VVUkksIHN0YXRpY19jYXN0PGNv
bnN0IEVsZW1lbnRJbXBsICo+KHRoaXMpKTsKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9O
T0RFOgotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERvY3VtZW50SW1wbCAq
Pih0aGlzKS0+ZG9jdW1lbnRFbGVtZW50KCktPmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwot
ICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6Ok5PVEFU
SU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLSAg
ICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4g
RE9NU3RyaW5nKCk7Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6IHsKLSAgICAg
ICAgICAgIGNvbnN0IEF0dHJJbXBsICphdHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQXR0ckltcGwg
Kj4odGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhdHRyLT5vd25lckVsZW1l
bnQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci0+b3duZXJFbGVtZW50KCktPmxvb2t1
cFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4g
RE9NU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlm
IChFbGVtZW50SW1wbCAqYW5jZXN0b3IgPSBnZXRBbmNlc3RvckVsZW1lbnQoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gYW5jZXN0b3ItPmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgfQotfQotCi1E
T01TdHJpbmcgTm9kZUltcGw6Omxvb2t1cE5hbWVzcGFjZVVSSShjb25zdCBET01TdHJpbmcgJnBy
ZWZpeCkgY29uc3QKLXsKLSAgICAvLyBJbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8KLSAgICAvLyBo
dHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1Db3JlLTIwMDQwNDA3L25h
bWVzcGFjZXMtYWxnb3JpdGhtcy5odG1sI2xvb2t1cE5hbWVzcGFjZVVSSUFsZ28KLSAgICAKLSAg
ICBpZiAoIXByZWZpeC5pc051bGwoKSAmJiBwcmVmaXguaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gRE9NU3RyaW5nKCk7Ci0gICAgCi0gICAgc3dpdGNoIChub2RlVHlwZSgpKSB7Ci0gICAgICAg
IGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50SW1w
bCAqZWxlbSA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KHRoaXMpOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBpZiAoIWVsZW0tPm5hbWVzcGFjZVVSSSgpLmlzTnVsbCgpICYm
IGVsZW0tPnByZWZpeCgpID09IHByZWZpeCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS0+
bmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbGVtLT5oYXNB
dHRyaWJ1dGVzKCkpIHsKLSAgICAgICAgICAgICAgICBOYW1lZEF0dHJNYXBJbXBsICphdHRycyA9
IGVsZW0tPmF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0cnMtPmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAg
ICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAqYXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJdGVtKGkp
OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHItPnBy
ZWZpeCgpID09ICJ4bWxucyIgJiYgYXR0ci0+bG9jYWxOYW1lKCkgPT0gcHJlZml4KSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT52YWx1ZSgpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7
Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci0+bG9jYWxOYW1lKCkgPT0gInht
bG5zIiAmJiBwcmVmaXguaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgh
YXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGF0dHItPnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgaWYgKEVsZW1lbnRJbXBsICphbmNlc3RvciA9IGdldEFuY2VzdG9yRWxlbWVudCgpKQotICAg
ICAgICAgICAgICAgIHJldHVybiBhbmNlc3Rvci0+bG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7
Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAg
fQotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6Ci0gICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8Y29uc3QgRG9jdW1lbnRJbXBsICo+KHRoaXMpLT5kb2N1bWVudEVsZW1lbnQo
KS0+bG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZ
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Tk9UQVRJT05fTk9ERToKLSAgICAgICAgY2FzZSBO
b2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJB
R01FTlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBET01TdHJpbmcoKTsKLSAgICAgICAgY2Fz
ZSBOb2RlOjpBVFRSSUJVVEVfTk9ERTogewotICAgICAgICAgICAgY29uc3QgQXR0ckltcGwgKmF0
dHIgPSBzdGF0aWNfY2FzdDxjb25zdCBBdHRySW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHJl
dHVybiBhdHRyLT5vd25lckVsZW1lbnQoKS0+bG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0g
ICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAg
ICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoRWxlbWVudEltcGwgKmFu
Y2VzdG9yID0gZ2V0QW5jZXN0b3JFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFu
Y2VzdG9yLT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgcmV0dXJuIERPTVN0cmluZygpOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIE5vZGVJbXBs
Ojpsb29rdXBOYW1lc3BhY2VQcmVmaXgoY29uc3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBj
b25zdCBFbGVtZW50SW1wbCAqb3JpZ2luYWxFbGVtZW50KSBjb25zdAotewotICAgIGlmIChfbmFt
ZXNwYWNlVVJJLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci0gICAgICAg
ICAgICAKLSAgICBpZiAob3JpZ2luYWxFbGVtZW50LT5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4
KCkpID09IF9uYW1lc3BhY2VVUkkpCi0gICAgICAgIHJldHVybiBwcmVmaXgoKTsKLSAgICAKLSAg
ICBpZiAoaGFzQXR0cmlidXRlcygpKSB7Ci0gICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJz
ID0gYXR0cmlidXRlcygpOwotICAgICAgICAKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGF0dHJzLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVJbXBsICph
dHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IGlmIChhdHRyLT5wcmVmaXgoKSA9PSAieG1sbnMiICYmCi0gICAgICAgICAgICAgICAgYXR0ci0+
dmFsdWUoKSA9PSBfbmFtZXNwYWNlVVJJICYmCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxFbGVt
ZW50LT5sb29rdXBOYW1lc3BhY2VVUkkoYXR0ci0+bG9jYWxOYW1lKCkpID09IF9uYW1lc3BhY2VV
UkkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHItPmxvY2FsTmFtZSgpOwotICAgICAgICB9
Ci0gICAgfQotICAgIAotICAgIGlmIChFbGVtZW50SW1wbCAqYW5jZXN0b3IgPSBnZXRBbmNlc3Rv
ckVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGFuY2VzdG9yLT5sb29rdXBOYW1lc3BhY2VQcmVm
aXgoX25hbWVzcGFjZVVSSSwgb3JpZ2luYWxFbGVtZW50KTsKLSAgICAKLSAgICByZXR1cm4gRE9N
U3RyaW5nKCk7Ci19Ci0KLURPTVN0cmluZyBOb2RlSW1wbDo6dGV4dENvbnRlbnQoKSBjb25zdAot
ewotICAgIHN3aXRjaCAobm9kZVR5cGUoKSkgewotICAgICAgICBjYXNlIE5vZGU6OlRFWFRfTk9E
RToKLSAgICAgICAgY2FzZSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2Ug
Tm9kZTo6Q09NTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OlBST0NFU1NJTkdfSU5TVFJV
Q1RJT05fTk9ERToKLSAgICAgICAgICAgIHJldHVybiBub2RlVmFsdWUoKTsKLSAgICAgICAgCi0g
ICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkFUVFJJ
QlVURV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBjYXNl
IE5vZGU6OkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVO
VF9GUkFHTUVOVF9OT0RFOiB7Ci0gICAgICAgICAgICBET01TdHJpbmcgcyA9ICIiOwotICAgICAg
ICAKLSAgICAgICAgICAgIGZvciAoTm9kZUltcGwgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGls
ZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmIChj
aGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpDT01NRU5UX05PREUgfHwgCi0gICAgICAgICAgICAg
ICAgICAgIGNoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05f
Tk9ERSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICBzICs9IGNoaWxkLT50ZXh0Q29udGVudCgpOwotICAgICAgICAgICAgfQotICAg
ICAgICAKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAg
ICBjYXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRf
VFlQRV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRE9NU3RyaW5nKCk7ICAgICAgICAgICAgCi0gICAg
fQotfQotCi12b2lkIE5vZGVJbXBsOjpzZXRUZXh0Q29udGVudChjb25zdCBET01TdHJpbmcgJnRl
eHQsIGludCAmZXhjZXB0aW9uKQoteyAgICAgICAgICAgCi0gICAgc3dpdGNoIChub2RlVHlwZSgp
KSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6VEVYVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNE
QVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6Ci0gICAg
ICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAg
c2V0Tm9kZVZhbHVlKHRleHQsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRF
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgTm9k
ZTo6RU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZS
QUdNRU5UX05PREU6IHsKLSAgICAgICAgICAgIENvbnRhaW5lck5vZGVJbXBsICpjb250YWluZXIg
PSBzdGF0aWNfY2FzdDxDb250YWluZXJOb2RlSW1wbCAqPih0aGlzKTsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgY29udGFpbmVyLT5yZW1vdmVDaGlsZHJlbigpOwotICAgICAgICAgICAgCi0g
ICAgICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGFwcGVuZENo
aWxkKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKHRleHQpLCBleGNlcHRpb24pOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9O
T0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgY2Fz
ZSBOb2RlOjpOT1RBVElPTl9OT0RFOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8g
RG8gbm90aGluZwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1FbGVtZW50SW1wbCAq
Tm9kZUltcGw6OmdldEFuY2VzdG9yRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgLy8gSW4gdGhlb3J5
LCB0aGVyZSBjYW4gYmUgRW50aXR5UmVmZXJlbmNlIG5vZGVzIGJldHdlZW4gZWxlbWVudHMKLSAg
ICAvLyBidXQgdGhpcyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KLSAgICBmb3IgKE5vZGVJ
bXBsICpuID0gcGFyZW50Tm9kZSgpOyBuOyBuID0gbi0+cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAg
IGlmIChuLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RWxlbWVudEltcGwgKj4obik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotCi0jaWZu
ZGVmIE5ERUJVRwotCi1zdGF0aWMgdm9pZCBhcHBlbmRBdHRyaWJ1dGVEZXNjKGNvbnN0IE5vZGVJ
bXBsICpub2RlLCBET01TdHJpbmcgJnN0cmluZywgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwg
UVN0cmluZyBhdHRyRGVzYykKLXsKLSAgICBpZiAobm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7Ci0g
ICAgICAgIERPTVN0cmluZyBhdHRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxlbWVudEltcGwgKj4o
bm9kZSktPmdldEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgaWYgKCFhdHRyLmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgc3RyaW5nICs9IGF0dHJEZXNjOwotICAgICAgICAgICAgc3RyaW5nICs9
IGF0dHI7Ci0gICAgICAgIH0KLSAgICB9Ci19CisjaW5jbHVkZSAiQ29udGFpbmVyTm9kZUltcGwu
aCIKKyNpbmNsdWRlICJkb21fbm9kZS5oIgorI2luY2x1ZGUgImRvbV9leGNlcHRpb24uaCIKKyNp
bmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisjaW5j
bHVkZSAicmVuZGVyX3RoZW1lLmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50SW1wbC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgogCi12b2lkIE5vZGVJ
bXBsOjpzaG93Tm9kZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0Ci17Ci0gICAgaWYgKCFwcmVm
aXgpCi0gICAgICAgIHByZWZpeCA9ICIiOwotICAgIGlmIChpc1RleHROb2RlKCkpIHsKLSAgICAg
ICAgUVN0cmluZyB2YWx1ZSA9IG5vZGVWYWx1ZSgpLnFzdHJpbmcoKTsKLSAgICAgICAgdmFsdWUu
cmVwbGFjZSgnXFwnLCAiXFxcXCIpOwotICAgICAgICB2YWx1ZS5yZXBsYWNlKCdcbicsICJcXG4i
KTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVzXHQlcCBcIiVzXCJcbiIsIHByZWZpeCwg
bm9kZU5hbWUoKS5xc3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgdGhpcywgdmFsdWUudXRmOCgpLmRh
dGEoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRE9NU3RyaW5nIGF0dHJzID0gIiI7Ci0gICAg
ICAgIGFwcGVuZEF0dHJpYnV0ZURlc2ModGhpcywgYXR0cnMsIGNsYXNzQXR0ciwgIiBDTEFTUz0i
KTsKLSAgICAgICAgYXBwZW5kQXR0cmlidXRlRGVzYyh0aGlzLCBhdHRycywgc3R5bGVBdHRyLCAi
IFNUWUxFPSIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzJXNcdCVwJXNcbiIsIHByZWZp
eCwgbm9kZU5hbWUoKS5xc3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgdGhpcywgYXR0cnMucXN0cmlu
ZygpLmFzY2lpKCkpOwotICAgIH0KLX0KKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAKLXZvaWQg
Tm9kZUltcGw6OnNob3dUcmVlKCkgY29uc3QKLXsKLSAgICBzaG93VHJlZUFuZE1hcmsoKE5vZGVJ
bXBsICopdGhpcywgIioiLCBOVUxMLCBOVUxMKTsKLX0KLQotdm9pZCBOb2RlSW1wbDo6c2hvd1Ry
ZWVBbmRNYXJrKE5vZGVJbXBsICogbWFya2VkTm9kZTEsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJl
bDEsIE5vZGVJbXBsICogbWFya2VkTm9kZTIsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJlbDIpIGNv
bnN0Ci17Ci0gICAgTm9kZUltcGwgKnJvb3ROb2RlOwotICAgIE5vZGVJbXBsICpub2RlID0gKE5v
ZGVJbXBsICopdGhpczsKLSAgICB3aGlsZSAobm9kZS0+cGFyZW50Tm9kZSgpICYmICFub2RlLT5o
YXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOwot
ICAgIHJvb3ROb2RlID0gbm9kZTsKLQkKLSAgICBmb3IgKG5vZGUgPSByb290Tm9kZTsgbm9kZTsg
bm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICBOb2RlSW1wbCAqdG1w
Tm9kZTsKLQkJCi0gICAgICAgIGlmIChub2RlID09IG1hcmtlZE5vZGUxKQotICAgICAgICAgICAg
ZnByaW50ZihzdGRlcnIsICIlcyIsIG1hcmtlZExhYmVsMSk7Ci0gICAgICAgIGlmIChub2RlID09
IG1hcmtlZE5vZGUyKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1hcmtlZExh
YmVsMik7Ci0JCQkKLSAgICAgICAgZm9yICh0bXBOb2RlID0gbm9kZTsgdG1wTm9kZSAmJiB0bXBO
b2RlICE9IHJvb3ROb2RlOyB0bXBOb2RlID0gdG1wTm9kZS0+cGFyZW50Tm9kZSgpKQotICAgICAg
ICAgICAgZnByaW50ZihzdGRlcnIsICJcdCIpOwotICAgICAgICBub2RlLT5zaG93Tm9kZSgwKTsK
LSAgICB9Ci19CisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgInFkYXRldGltZS5oIgog
Ci12b2lkIE5vZGVJbXBsOjpmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVk
IGxlbmd0aCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgcmVzdWx0OwotICAgIERPTVN0cmluZyBz
OwotICAgIAotICAgIHMgPSBub2RlTmFtZSgpOwotICAgIGlmIChzLmxlbmd0aCgpID09IDApCi0g
ICAgICAgIHJlc3VsdCArPSAiPG5vbmU+IjsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCArPSBz
OwotICAgICAgICAgIAotICAgIHN0cm5jcHkoYnVmZmVyLCByZXN1bHQucXN0cmluZygpLmxhdGlu
MSgpLCBsZW5ndGggLSAxKTsKLX0KK3VzaW5nIG5hbWVzcGFjZSBraHRtbDsKIAotI2VuZGlmCitu
YW1lc3BhY2UgRE9NIHsKIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1c2luZyBuYW1lc3BhY2UgRXZl
bnROYW1lczsKIAogQ29udGFpbmVyTm9kZUltcGw6OkNvbnRhaW5lck5vZGVJbXBsKERvY3VtZW50
SW1wbCAqZG9jKQogICAgIDogTm9kZUltcGwoZG9jKQpAQCAtMjAyMyw4ICs1Miw2IEBAIENvbnRh
aW5lck5vZGVJbXBsOjpDb250YWluZXJOb2RlSW1wbChEb2MKIAogdm9pZCBDb250YWluZXJOb2Rl
SW1wbDo6cmVtb3ZlQWxsQ2hpbGRyZW4oKQogewotICAgIC8va2REZWJ1ZyggNjAyMCApIDw8ICJD
b250YWluZXJOb2RlSW1wbCBkZXN0cnVjdG9yIiA8PCBlbmRsOwotCiAgICAgLy8gQXZvaWQgZGVl
cCByZWN1cnNpb24gd2hlbiBkZXN0cm95aW5nIHRoZSBub2RlIHRyZWUuCiAgICAgc3RhdGljIGJv
b2wgYWxyZWFkeUluc2lkZURlc3RydWN0b3I7IAogICAgIGJvb2wgdG9wTGV2ZWwgPSAhYWxyZWFk
eUluc2lkZURlc3RydWN0b3I7CkBAIC0yNDYwLDcgKzQ4Nyw2IEBAIGJvb2wgQ29udGFpbmVyTm9k
ZUltcGw6OmNoZWNrU2FtZURvY3VtZW4KICAgICAvLyBGSVhNRTogRG9oISBUaGlzIG5leHQgbGlu
ZSBpc24ndCBnZXR0aW5nIG5ld0NoaWxkLCBzbyBpdCdzIG5ldmVyIGdvaW5nIHRvIHdvcmshCiAg
ICAgRG9jdW1lbnRJbXBsICpvd25lckRvY05ldyA9IGdldERvY3VtZW50KCk7CiAgICAgaWYob3du
ZXJEb2NUaGlzICE9IG93bmVyRG9jTmV3KSB7Ci0gICAgICAgIGtkRGVidWcoNjAxMCk8PCAibm90
IHNhbWUgZG9jdW1lbnQsIG5ld0NoaWxkID0gIiA8PCBuZXdDaGlsZCA8PCAiZG9jdW1lbnQgPSAi
IDw8IGdldERvY3VtZW50KCkgPDwgZW5kbDsKICAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4
Y2VwdGlvbjo6V1JPTkdfRE9DVU1FTlRfRVJSOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9
CkBAIC0yNjczLDcgKzY5OSw3IEBAIGJvb2wgQ29udGFpbmVyTm9kZUltcGw6OmdldExvd2VyUmln
aHRDb3IKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotUVJlY3QgQ29udGFpbmVyTm9kZUltcGw6Omdl
dFJlY3QoKSBjb25zdAorSW50UmVjdCBDb250YWluZXJOb2RlSW1wbDo6Z2V0UmVjdCgpIGNvbnN0
CiB7CiAgICAgaW50IHhQb3MgPSAwLCB5UG9zID0gMCwgeEVuZCA9IDAsIHlFbmQgPSAwOwogICAg
IGJvb2wgZm91bmRVcHBlckxlZnQgPSBnZXRVcHBlckxlZnRDb3JuZXIoeFBvcyx5UG9zKTsKQEAg
LTI2OTcsNyArNzIzLDcgQEAgUVJlY3QgQ29udGFpbmVyTm9kZUltcGw6OmdldFJlY3QoKSBjb25z
dAogICAgIGlmICh5RW5kIDwgeVBvcykKICAgICAgICAgeUVuZCA9IHlQb3M7CiAgICAgICAgIAot
ICAgIHJldHVybiBRUmVjdCh4UG9zLCB5UG9zLCB4RW5kIC0geFBvcywgeUVuZCAtIHlQb3MpOwor
ICAgIHJldHVybiBJbnRSZWN0KHhQb3MsIHlQb3MsIHhFbmQgLSB4UG9zLCB5RW5kIC0geVBvcyk7
CiB9CiAKIHZvaWQgQ29udGFpbmVyTm9kZUltcGw6OnNldEZvY3VzKGJvb2wgcmVjZWl2ZWQpCkBA
IC0yODQwLDIyNiArODY2LDQgQEAgdm9pZCBDb250YWluZXJOb2RlSW1wbDo6ZGlzcGF0Y2hDaGls
ZFJlbQogCX0KICAgICB9CiB9Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLU5vZGVMaXN0
SW1wbDo6Tm9kZUxpc3RJbXBsKE5vZGVJbXBsICpfcm9vdE5vZGUpCi0gICAgOiByb290Tm9kZShf
cm9vdE5vZGUpLAotICAgICAgaXNMZW5ndGhDYWNoZVZhbGlkKGZhbHNlKSwKLSAgICAgIGlzSXRl
bUNhY2hlVmFsaWQoZmFsc2UpCi17Ci0gICAgcm9vdE5vZGUtPnJlZigpOwotICAgIHJvb3ROb2Rl
LT5yZWdpc3Rlck5vZGVMaXN0KHRoaXMpOwotfSAgICAKLQotTm9kZUxpc3RJbXBsOjp+Tm9kZUxp
c3RJbXBsKCkKLXsKLSAgICByb290Tm9kZS0+dW5yZWdpc3Rlck5vZGVMaXN0KHRoaXMpOwotICAg
IHJvb3ROb2RlLT5kZXJlZigpOwotfQotCi11bnNpZ25lZCBOb2RlTGlzdEltcGw6OnJlY3Vyc2l2
ZUxlbmd0aCggTm9kZUltcGwgKnN0YXJ0ICkgY29uc3QKLXsKLSAgICBpZiAoIXN0YXJ0KQotCXN0
YXJ0ID0gcm9vdE5vZGU7Ci0KLSAgICBpZiAoaXNMZW5ndGhDYWNoZVZhbGlkICYmIHN0YXJ0ID09
IHJvb3ROb2RlKSB7Ci0gICAgICAgIHJldHVybiBjYWNoZWRMZW5ndGg7Ci0gICAgfQotCi0gICAg
dW5zaWduZWQgbGVuID0gMDsKLQotICAgIGZvcihOb2RlSW1wbCAqbiA9IHN0YXJ0LT5maXJzdENo
aWxkKCk7IG4gIT0gMDsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCBuLT5u
b2RlVHlwZSgpID09IE5vZGU6OkVMRU1FTlRfTk9ERSApIHsKLSAgICAgICAgICAgIGlmIChub2Rl
TWF0Y2hlcyhuKSkKLSAgICAgICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgIGxlbis9IHJl
Y3Vyc2l2ZUxlbmd0aChuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdGFydCA9PSBy
b290Tm9kZSkgewotICAgICAgICBjYWNoZWRMZW5ndGggPSBsZW47Ci0gICAgICAgIGlzTGVuZ3Ro
Q2FjaGVWYWxpZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotTm9kZUlt
cGwgKk5vZGVMaXN0SW1wbDo6cmVjdXJzaXZlSXRlbSAoIHVuc2lnbmVkIG9mZnNldCwgTm9kZUlt
cGwgKnN0YXJ0KSBjb25zdAotewotICAgIGludCByZW1haW5pbmdPZmZzZXQgPSBvZmZzZXQ7Ci0g
ICAgaWYgKCFzdGFydCkgewotICAgICAgICBzdGFydCA9IHJvb3ROb2RlLT5maXJzdENoaWxkKCk7
Ci0gICAgICAgIGlmIChpc0l0ZW1DYWNoZVZhbGlkKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0
ID09IGxhc3RJdGVtT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RJdGVtOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPiBsYXN0SXRlbU9mZnNldCkgewotICAgICAg
ICAgICAgICAgIHN0YXJ0ID0gbGFzdEl0ZW07Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nT2Zm
c2V0IC09IGxhc3RJdGVtT2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgTm9kZUltcGwgKm4gPSBzdGFydDsKLQotICAgIHdoaWxlIChuKSB7Ci0gICAgICAgIGlm
ICggbi0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUgKSB7Ci0gICAgICAgICAgICBp
ZiAobm9kZU1hdGNoZXMobikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlbWFpbmluZ09mZnNl
dCkgewotICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IG47Ci0gICAgICAgICAgICAgICAg
ICAgIGxhc3RJdGVtT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBpc0l0ZW1D
YWNoZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbWFpbmluZ09mZnNldC0tOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUocm9vdE5v
ZGUpOwotICAgIH0KLQotICAgIHJldHVybiAwOyAvLyBubyBtYXRjaGluZyBub2RlIGluIHRoaXMg
c3VidHJlZQotfQotCi1Ob2RlSW1wbCAqTm9kZUxpc3RJbXBsOjppdGVtQnlJZCAoY29uc3QgRE9N
U3RyaW5nJiBlbGVtZW50SWQpIGNvbnN0Ci17Ci0gICAgaWYgKHJvb3ROb2RlLT5pc0RvY3VtZW50
Tm9kZSgpIHx8IHJvb3ROb2RlLT5pbkRvY3VtZW50KCkpIHsKLSAgICAgICAgTm9kZUltcGwgKm5v
ZGUgPSByb290Tm9kZS0+Z2V0RG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsK
LQotICAgICAgICBpZiAobm9kZSA9PSBOVUxMIHx8ICFub2RlTWF0Y2hlcyhub2RlKSkKLSAgICAg
ICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGZvciAoTm9kZUltcGwgKnAgPSBub2RlLT5wYXJl
bnROb2RlKCk7IHA7IHAgPSBwLT5wYXJlbnROb2RlKCkpIHsKLSAgICAgICAgICAgIGlmIChwID09
IHJvb3ROb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbCA9IGxlbmd0aCgpOwotCi0g
ICAgZm9yICggdW5zaWduZWQgaSA9IDA7IGkgPCBsOyBpKysgKSB7Ci0gICAgICAgIE5vZGVJbXBs
ICpub2RlID0gaXRlbShpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICggc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwgKj4obm9kZSktPmdldElEQXR0cmlidXRlKCkgPT0gZWxlbWVudElkICkgewotICAg
ICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsK
LX0KLQotCi12b2lkIE5vZGVMaXN0SW1wbDo6cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKQotewot
ICAgIGlzTGVuZ3RoQ2FjaGVWYWxpZCA9IGZhbHNlOwotICAgIGlzSXRlbUNhY2hlVmFsaWQgPSBm
YWxzZTsgICAgIAotICAgIGxhc3RJdGVtID0gMDsKLX0KLQotQ2hpbGROb2RlTGlzdEltcGw6OkNo
aWxkTm9kZUxpc3RJbXBsKCBOb2RlSW1wbCAqbiApCi0gICAgOiBOb2RlTGlzdEltcGwobikKLXsK
LX0KLQotdW5zaWduZWQgQ2hpbGROb2RlTGlzdEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAg
aWYgKGlzTGVuZ3RoQ2FjaGVWYWxpZCkKLSAgICAgICAgcmV0dXJuIGNhY2hlZExlbmd0aDsKLQot
ICAgIHVuc2lnbmVkIGxlbiA9IDA7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yKG4gPSByb290
Tm9kZS0+Zmlyc3RDaGlsZCgpOyBuICE9IDA7IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAg
ICBsZW4rKzsKLQotICAgIGNhY2hlZExlbmd0aCA9IGxlbjsKLSAgICBpc0xlbmd0aENhY2hlVmFs
aWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotTm9kZUltcGwgKkNoaWxkTm9kZUxp
c3RJbXBsOjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdAotewotICAgIHVuc2lnbmVkIGlu
dCBwb3MgPSAwOwotICAgIE5vZGVJbXBsICpuID0gcm9vdE5vZGUtPmZpcnN0Q2hpbGQoKTsKLQot
ICAgIGlmIChpc0l0ZW1DYWNoZVZhbGlkKSB7Ci0gICAgICAgIGlmIChpbmRleCA9PSBsYXN0SXRl
bU9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIGxhc3RJdGVtOwotICAgICAgICB9IGVsc2Ug
aWYgKGluZGV4ID4gbGFzdEl0ZW1PZmZzZXQpIHsKLSAgICAgICAgICAgIG4gPSBsYXN0SXRlbTsK
LSAgICAgICAgICAgIHBvcyA9IGxhc3RJdGVtT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgd2hpbGUgKG4gJiYgcG9zIDwgaW5kZXgpIHsKLSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5n
KCk7Ci0gICAgICAgIHBvcysrOwotICAgIH0KLQotICAgIGlmIChuKSB7Ci0gICAgICAgIGxhc3RJ
dGVtID0gbjsKLSAgICAgICAgbGFzdEl0ZW1PZmZzZXQgPSBwb3M7Ci0gICAgICAgIGlzSXRlbUNh
Y2hlVmFsaWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICByZXR1cm4g
MDsKLX0KLQotYm9vbCBDaGlsZE5vZGVMaXN0SW1wbDo6bm9kZU1hdGNoZXMoTm9kZUltcGwgKnRl
c3ROb2RlKSBjb25zdAotewotICAgIHJldHVybiB0ZXN0Tm9kZS0+cGFyZW50Tm9kZSgpID09IHJv
b3ROb2RlOwotfQotCi1UYWdOb2RlTGlzdEltcGw6OlRhZ05vZGVMaXN0SW1wbChOb2RlSW1wbCAq
biwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IEF0b21pY1N0cmluZyYg
bG9jYWxOYW1lKQotICAgIDogTm9kZUxpc3RJbXBsKG4pLCAKLSAgICAgIG1fbmFtZXNwYWNlVVJJ
KG5hbWVzcGFjZVVSSSksIAotICAgICAgbV9sb2NhbE5hbWUobG9jYWxOYW1lKQotewotfQotCi11
bnNpZ25lZCBUYWdOb2RlTGlzdEltcGw6Omxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJl
Y3Vyc2l2ZUxlbmd0aCgpOwotfQotCi1Ob2RlSW1wbCAqVGFnTm9kZUxpc3RJbXBsOjppdGVtKHVu
c2lnbmVkIGluZGV4KSBjb25zdAotewotICAgIHJldHVybiByZWN1cnNpdmVJdGVtKGluZGV4KTsK
LX0KLQotYm9vbCBUYWdOb2RlTGlzdEltcGw6Om5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9k
ZSkgY29uc3QKLXsKLSAgICBpZiAoIXRlc3ROb2RlLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmIChtX25hbWVzcGFjZVVSSSAhPSBzdGFyQXRvbSAmJiBt
X25hbWVzcGFjZVVSSSAhPSB0ZXN0Tm9kZS0+bmFtZXNwYWNlVVJJKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICByZXR1cm4gbV9sb2NhbE5hbWUgPT0gc3RhckF0b20gfHwgbV9s
b2NhbE5hbWUgPT0gdGVzdE5vZGUtPmxvY2FsTmFtZSgpOwotfQotCi1OYW1lTm9kZUxpc3RJbXBs
OjpOYW1lTm9kZUxpc3RJbXBsKE5vZGVJbXBsICpuLCBjb25zdCBET01TdHJpbmcgJnQgKQotICA6
IE5vZGVMaXN0SW1wbChuKSwgbm9kZU5hbWUodCkKLXsKLX0KLQotdW5zaWduZWQgTmFtZU5vZGVM
aXN0SW1wbDo6bGVuZ3RoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVjdXJzaXZlTGVuZ3RoKCk7
Ci19Ci0KLU5vZGVJbXBsICpOYW1lTm9kZUxpc3RJbXBsOjppdGVtICggdW5zaWduZWQgaW5kZXgg
KSBjb25zdAotewotICAgIHJldHVybiByZWN1cnNpdmVJdGVtKCBpbmRleCApOwotfQotCi1ib29s
IE5hbWVOb2RlTGlzdEltcGw6Om5vZGVNYXRjaGVzKE5vZGVJbXBsICp0ZXN0Tm9kZSkgY29uc3QK
LXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4odGVzdE5vZGUpLT5nZXRB
dHRyaWJ1dGUobmFtZUF0dHIpID09IG5vZGVOYW1lOwotfQotCiB9CkluZGV4OiBraHRtbC94bWwv
ZG9tMl9ldmVudHNpbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL2RvbTJfZXZlbnRzaW1w
bC5oCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL3htbC9kb20yX2V2ZW50c2ltcGwuaAkod29y
a2luZyBjb3B5KQpAQCAtMjYsNyArMjYsNyBAQAogI2RlZmluZSBET01fRVZFTlRTSU1QTF9ICiAK
ICNpbmNsdWRlICJkb20vZG9tX25vZGUuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgi
CisjaW5jbHVkZSAiTm9kZUltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX2F0b21pY3N0cmluZy5o
IgogI2luY2x1ZGUgInhtbC9kb20yX3ZpZXdzaW1wbC5oIgogI2luY2x1ZGUgIm1pc2Mvc2hhcmVk
LmgiCkluZGV4OiBraHRtbC94bWwvQ2hpbGROb2RlTGlzdEltcGwuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC94bWwvQ2hpbGROb2RlTGlzdEltcGwuaAkocmV2aXNpb24gMTIwNjMpCisrKyBraHRtbC94
bWwvQ2hpbGROb2RlTGlzdEltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMjIsNTg5ICsyMiwxOCBA
QAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZuZGVmIF9ET01f
Tm9kZUltcGxfaF8KLSNkZWZpbmUgX0RPTV9Ob2RlSW1wbF9oXworI2lmbmRlZiBET01fQ2hpbGRO
b2RlTGlzdEltcGxfaAorI2RlZmluZSBET01fQ2hpbGROb2RlTGlzdEltcGxfaAogCi0jaW5jbHVk
ZSAiZG9tL2RvbV9zdHJpbmcuaCIKLSNpbmNsdWRlICJkb20vZG9tX25vZGUuaCIKLSNpbmNsdWRl
ICJtaXNjL2hlbHBlci5oIgotI2luY2x1ZGUgIm1pc2Mvc2hhcmVkLmgiCi0jaW5jbHVkZSAiZG9t
X2F0b21pY3N0cmluZy5oIgotI2luY2x1ZGUgIkRvY1B0ci5oIgotCi1jbGFzcyBRUGFpbnRlcjsK
LXRlbXBsYXRlIDxjbGFzcyB0eXBlPiBjbGFzcyBRUHRyTGlzdDsKLXRlbXBsYXRlIDxjbGFzcyB0
eXBlPiBjbGFzcyBRUHRyRGljdDsKLWNsYXNzIEtIVE1MVmlldzsKLWNsYXNzIFJlbmRlckFyZW5h
OwotY2xhc3MgUVJlY3Q7Ci1jbGFzcyBRTW91c2VFdmVudDsKLWNsYXNzIFFLZXlFdmVudDsKLWNs
YXNzIFFUZXh0U3RyZWFtOwotY2xhc3MgUVN0cmluZ0xpc3Q7Ci1jbGFzcyBRV2hlZWxFdmVudDsK
LQotbmFtZXNwYWNlIGtodG1sIHsKLSAgICBjbGFzcyBSZW5kZXJPYmplY3Q7Ci0gICAgY2xhc3Mg
UmVuZGVyU3R5bGU7Ci19OworI2luY2x1ZGUgIk5vZGVMaXN0SW1wbC5oIgogCiBuYW1lc3BhY2Ug
RE9NIHsKIAotY2xhc3MgQXRvbWljU3RyaW5nOwotY2xhc3MgRG9jdW1lbnRJbXBsOwotY2xhc3Mg
RWxlbWVudEltcGw7Ci1jbGFzcyBFdmVudEltcGw7Ci1jbGFzcyBFdmVudExpc3RlbmVyOwotY2xh
c3MgTm9kZUxpc3RJbXBsOwotY2xhc3MgTmFtZWRBdHRyTWFwSW1wbDsKLWNsYXNzIFF1YWxpZmll
ZE5hbWU7Ci1jbGFzcyBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcjsKLQotLy8gdGhpcyBjbGFzcyBp
bXBsZW1lbnRzIG5vZGVzLCB3aGljaCBjYW4gaGF2ZSBhIHBhcmVudCBidXQgbm8gY2hpbGRyZW46
Ci1jbGFzcyBOb2RlSW1wbCA6IHB1YmxpYyBraHRtbDo6VHJlZVNoYXJlZDxOb2RlSW1wbD4KLXsK
LSAgICBmcmllbmQgY2xhc3MgRG9jdW1lbnRJbXBsOwotcHVibGljOgotICAgIE5vZGVJbXBsKERv
Y3VtZW50SW1wbCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5Ob2RlSW1wbCgpOwotCi0gICAgLy8gRE9N
IG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBOb2RlCi0gICAgdmlydHVhbCBib29sIGhhc1RhZ05h
bWUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
LSAgICB2aXJ0dWFsIERPTVN0cmluZyBub2RlTmFtZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFs
IERPTVN0cmluZyBub2RlVmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Tm9kZVZh
bHVlKCBjb25zdCBET01TdHJpbmcgJl9ub2RlVmFsdWUsIGludCAmZXhjZXB0aW9uY29kZSApOwot
ICAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgbm9kZVR5cGUoKSBjb25zdCA9IDA7Ci0gICAgTm9k
ZUltcGwgKnBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBwYXJlbnQoKTsgfQotICAgIE5vZGVJ
bXBsICpwcmV2aW91c1NpYmxpbmcoKSBjb25zdCB7IHJldHVybiBtX3ByZXZpb3VzOyB9Ci0gICAg
Tm9kZUltcGwgKm5leHRTaWJsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9uZXh0OyB9Ci0gICAgdmly
dHVhbCBSZWZQdHI8Tm9kZUxpc3RJbXBsPiBjaGlsZE5vZGVzKCk7Ci0gICAgdmlydHVhbCBOb2Rl
SW1wbCAqZmlyc3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmxhc3RDaGls
ZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBoYXNBdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gICAg
dmlydHVhbCBOYW1lZEF0dHJNYXBJbXBsICphdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBEb2N1bWVudEltcGwgKm93bmVyRG9jdW1lbnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJ
bXBsICppbnNlcnRCZWZvcmUgKCBOb2RlSW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpyZWZDaGls
ZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVwbGFjZUNo
aWxkICggTm9kZUltcGwgKm5ld0NoaWxkLCBOb2RlSW1wbCAqb2xkQ2hpbGQsIGludCAmZXhjZXB0
aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKnJlbW92ZUNoaWxkICggTm9kZUltcGwg
Km9sZENoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICph
cHBlbmRDaGlsZCAoIE5vZGVJbXBsICpuZXdDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0g
ICAgdmlydHVhbCB2b2lkIHJlbW92ZShpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIHZpcnR1YWwg
Ym9vbCBoYXNDaGlsZE5vZGVzICggICkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xv
bmVOb2RlICggYm9vbCBkZWVwICkgPSAwOwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5n
JiBsb2NhbE5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFt
ZXNwYWNlVVJJKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZp
eCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5n
ICZfcHJlZml4LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIHZvaWQgbm9ybWFsaXplICgpOwot
ICAgIHN0YXRpYyBib29sIGlzU3VwcG9ydGVkKGNvbnN0IERPTVN0cmluZyAmZmVhdHVyZSwgY29u
c3QgRE9NU3RyaW5nICZ2ZXJzaW9uKTsKLQotICAgIGJvb2wgaXNTYW1lTm9kZShOb2RlSW1wbCAq
b3RoZXIpIGNvbnN0IHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH0KLSAgICBib29sIGlzRXF1YWxO
b2RlKE5vZGVJbXBsICpvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc0RlZmF1bHROYW1lc3BhY2Uo
Y29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0OwotICAgIERPTVN0cmluZyBsb29r
dXBQcmVmaXgoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkkpIGNvbnN0OwotICAgIERPTVN0
cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoY29uc3QgRE9NU3RyaW5nICZwcmVmaXgpIGNvbnN0Owot
ICAgIAotICAgIERPTVN0cmluZyB0ZXh0Q29udGVudCgpIGNvbnN0OwotICAgIHZvaWQgc2V0VGV4
dENvbnRlbnQoY29uc3QgRE9NU3RyaW5nICZ0ZXh0LCBpbnQgJmV4Y2VwdGlvbik7Ci0gICAgCi0g
ICAgTm9kZUltcGwgKmxhc3REZXNjZW5kYW50KCkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRo
b2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlzRWxlbWVudE5vZGUoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0hUTUxFbGVtZW50KCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSNpZiBTVkdfU1VQUE9SVAotICAgIHZpcnR1YWwgYm9v
bCBpc1NWR0VsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotI2VuZGlmCi0gICAgdmly
dHVhbCBib29sIGlzU3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAg
dmlydHVhbCBib29sIGlzQXR0cmlidXRlTm9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0g
ICAgdmlydHVhbCBib29sIGlzVGV4dE5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAg
IHZpcnR1YWwgYm9vbCBpc0NvbW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNEb2N1bWVudE5vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
ICAgIGJvb2wgaXNCbG9ja0Zsb3coKSBjb25zdDsKLSAgICBib29sIGlzQmxvY2tGbG93T3JCbG9j
a1RhYmxlKCkgY29uc3Q7Ci0gICAgCi0gICAgLy8gVXNlZCBieSA8Zm9ybT4gZWxlbWVudHMgdG8g
aW5kaWNhdGUgYSBtYWxmb3JtZWQgc3RhdGUgb2Ygc29tZSBraW5kLCB0eXBpY2FsbHkKLSAgICAv
LyB1c2VkIHRvIGtlZXAgZnJvbSBhcHBseWluZyB0aGUgYm90dG9tIG1hcmdpbiBvZiB0aGUgZm9y
bS4KLSAgICB2aXJ0dWFsIGJvb2wgaXNNYWxmb3JtZWQoKSB7IHJldHVybiBmYWxzZTsgfQotICAg
IHZpcnR1YWwgdm9pZCBzZXRNYWxmb3JtZWQoYm9vbCBtYWxmb3JtZWQpIHt9OwotICAgIAotICAg
IC8vIGhlbHBlciBmdW5jdGlvbnMgbm90IGJlaW5nIHBhcnQgb2YgdGhlIERPTQotICAgIC8vIEF0
dGVudGlvbjogdGhleSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGRpZCB0aGUgY29uc2lzdGVuY3kg
Y2hlY2tpbmchCi0gICAgdm9pZCBzZXRQcmV2aW91c1NpYmxpbmcoTm9kZUltcGwgKnByZXZpb3Vz
KSB7IG1fcHJldmlvdXMgPSBwcmV2aW91czsgfQotICAgIHZvaWQgc2V0TmV4dFNpYmxpbmcoTm9k
ZUltcGwgKm5leHQpIHsgbV9uZXh0ID0gbmV4dDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEZp
cnN0Q2hpbGQoTm9kZUltcGwgKmNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0TGFzdENoaWxk
KE5vZGVJbXBsICpjaGlsZCk7Ci0KLSAgICBOb2RlSW1wbCAqcHJldmlvdXNOb2RlQ29uc2lkZXJp
bmdBdG9taWNOb2RlcygpIGNvbnN0OwotICAgIE5vZGVJbXBsICpuZXh0Tm9kZUNvbnNpZGVyaW5n
QXRvbWljTm9kZXMoKSBjb25zdDsKLSAgICAKLSAgICBFbGVtZW50SW1wbCAqZ2V0QW5jZXN0b3JF
bGVtZW50KCkgY29uc3Q7Ci0gICAgRE9NU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVByZWZpeChjb25z
dCBET01TdHJpbmcgJl9uYW1lc3BhY2VVUkksIGNvbnN0IEVsZW1lbnRJbXBsICpvcmlnaW5hbEVs
ZW1lbnQpIGNvbnN0OwotICAgIAotICAgIC8qKiAoTm90IHBhcnQgb2YgdGhlIG9mZmljaWFsIERP
TSkKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGxlYWYgbm9kZS4KLSAgICAgKgotICAgICAqIFVz
aW5nIHRoaXMgZnVuY3Rpb24gZGVsaXZlcnMgbGVhZiBub2RlcyBhcyBpZiB0aGUgd2hvbGUgRE9N
IHRyZWUKLSAgICAgKiB3ZXJlIGEgbGluZWFyIGNoYWluIG9mIGl0cyBsZWFmIG5vZGVzLgotICAg
ICAqIEByZXR1cm4gbmV4dCBsZWFmIG5vZGUgb3IgMCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4KLSAg
ICAgKi8KLSAgICBOb2RlSW1wbCAqbmV4dExlYWZOb2RlKCkgY29uc3Q7Ci0KLSAgICAvKiogKE5v
dCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBET00pCi0gICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMg
bGVhZiBub2RlLgotICAgICAqCi0gICAgICogVXNpbmcgdGhpcyBmdW5jdGlvbiBkZWxpdmVycyBs
ZWFmIG5vZGVzIGFzIGlmIHRoZSB3aG9sZSBET00gdHJlZQotICAgICAqIHdlcmUgYSBsaW5lYXIg
Y2hhaW4gb2YgaXRzIGxlYWYgbm9kZXMuCi0gICAgICogQHJldHVybiBwcmV2aW91cyBsZWFmIG5v
ZGUgb3IgMCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4KLSAgICAgKi8KLSAgICBOb2RlSW1wbCAqcHJl
dmlvdXNMZWFmTm9kZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc0VkaXRhYmxlQmxvY2soKSBjb25z
dDsKLSAgICBFbGVtZW50SW1wbCAqZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudCgpIGNvbnN0Owot
ICAgIEVsZW1lbnRJbXBsICplbmNsb3NpbmdCbG9ja0Zsb3dPclRhYmxlRWxlbWVudCgpIGNvbnN0
OwotICAgIEVsZW1lbnRJbXBsICplbmNsb3NpbmdJbmxpbmVFbGVtZW50KCkgY29uc3Q7Ci0gICAg
RWxlbWVudEltcGwgKnJvb3RFZGl0YWJsZUVsZW1lbnQoKSBjb25zdDsKLSAgICAKLSAgICBib29s
IGluU2FtZVJvb3RFZGl0YWJsZUVsZW1lbnQoTm9kZUltcGwgKik7Ci0gICAgYm9vbCBpblNhbWVD
b250YWluaW5nQmxvY2tGbG93RWxlbWVudChOb2RlSW1wbCAqKTsKLSAgICAKLSAgICAvLyB1c2Vk
IGJ5IHRoZSBwYXJzZXIuIENoZWNrcyBhZ2FpbnN0IHRoZSBEVEQsIHVubGlrZSBET00gb3BlcmF0
aW9ucyBsaWtlCi0gICAgLy8gYXBwZW5kQ2hpbGQoKSwgYW5kIHJldHVybnMgdGhlIG5ldyBjb250
YWluZXIgbm9kZSBmb3IgZnV0dXJlIGluc2VydGlvbnMgYXMgeW91IHBhcnNlLgotICAgIHZpcnR1
YWwgTm9kZUltcGwgKmFkZENoaWxkKE5vZGVJbXBsICpuZXdDaGlsZCk7Ci0gICAgCi0gICAgLy8g
Y2FsbGVkIGJ5IHRoZSBwYXJzZXIgd2hlbiB0aGlzIGVsZW1lbnQncyBjbG9zZSB0YWcgaXMgcmVh
Y2hlZCwKLSAgICAvLyBzaWduYWxsaW5nIHRoYXQgYWxsIGNoaWxkIHRhZ3MgaGF2ZSBiZWVuIHBh
cnNlZCBhbmQgYWRkZWQuCi0gICAgLy8gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgPGFwcGxldD4g
YW5kIDxvYmplY3Q+IGVsZW1lbnRzLCB3aGljaCBjYW4ndCBsYXkgdGhlbXNlbHZlcyBvdXQKLSAg
ICAvLyB1bnRpbCB0aGV5IGtub3cgYWxsIG9mIHRoZWlyIG5lc3RlZCA8cGFyYW0+cy4gWzM2MDMx
OTEsIDQwNDA4NDhdCi0gICAgdmlydHVhbCB2b2lkIGNsb3NlUmVuZGVyZXIoKSB7fQotCi0gICAg
ZW51bSBNb3VzZUV2ZW50VHlwZSB7Ci0gICAgICAgIE1vdXNlUHJlc3MsCi0gICAgICAgIE1vdXNl
UmVsZWFzZSwKLSAgICAgICAgTW91c2VDbGljaywKLSAgICAgICAgTW91c2VEYmxDbGljaywKLSAg
ICAgICAgTW91c2VNb3ZlCi0gICAgfTsKLQotICAgIHN0cnVjdCBNb3VzZUV2ZW50Ci0gICAgewot
ICAgICAgICBNb3VzZUV2ZW50KCBpbnQgX2J1dHRvbiwgTW91c2VFdmVudFR5cGUgX3R5cGUsCi0g
ICAgICAgICAgICAgICAgICAgIGNvbnN0IERPTVN0cmluZyAmX3VybCA9IERPTVN0cmluZygpLCBj
b25zdCBET01TdHJpbmcmIF90YXJnZXQgPSBET01TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAg
ICAgTm9kZUltcGwgKl9pbm5lck5vZGUgPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAg
ICAgIGJ1dHRvbiA9IF9idXR0b247IHR5cGUgPSBfdHlwZTsKLSAgICAgICAgICAgICAgICB1cmwg
PSBfdXJsOyB0YXJnZXQgPSBfdGFyZ2V0OwotICAgICAgICAgICAgICAgIGlubmVyTm9kZSA9IF9p
bm5lck5vZGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJ1dHRvbjsKLSAgICAgICAg
TW91c2VFdmVudFR5cGUgdHlwZTsKLSAgICAgICAgRE9NU3RyaW5nIHVybDsgLy8gdXJsIHVuZGVy
IG1vdXNlIG9yIGVtcHR5Ci0gICAgICAgIERPTVN0cmluZyB0YXJnZXQ7Ci0gICAgICAgIFJlZlB0
cjxOb2RlSW1wbD4gaW5uZXJOb2RlOwotICAgIH07Ci0KLSAgICAvLyBmb3IgTElOSyBhbmQgU1RZ
TEUKLSAgICB2aXJ0dWFsIHZvaWQgc2hlZXRMb2FkZWQoKSB7fQotCi0gICAgYm9vbCBoYXNJRCgp
IGNvbnN0ICAgICAgeyByZXR1cm4gbV9oYXNJZDsgfQotICAgIGJvb2wgaGFzQ2xhc3MoKSBjb25z
dCAgIHsgcmV0dXJuIG1faGFzQ2xhc3M7IH0KLSAgICBib29sIGhhc1N0eWxlKCkgY29uc3QgICB7
IHJldHVybiBtX2hhc1N0eWxlOyB9Ci0gICAgYm9vbCBhY3RpdmUoKSBjb25zdCAgICAgeyByZXR1
cm4gbV9hY3RpdmU7IH0KLSAgICBib29sIGluQWN0aXZlQ2hhaW4oKSBjb25zdCB7IHJldHVybiBt
X2luQWN0aXZlQ2hhaW47IH0KLSAgICBib29sIGhvdmVyZWQoKSBjb25zdCB7IHJldHVybiBtX2hv
dmVyZWQ7IH0KLSAgICBib29sIGZvY3VzZWQoKSBjb25zdCB7IHJldHVybiBtX2ZvY3VzZWQ7IH0K
LSAgICBib29sIGF0dGFjaGVkKCkgY29uc3QgICB7IHJldHVybiBtX2F0dGFjaGVkOyB9Ci0gICAg
Ym9vbCBjaGFuZ2VkKCkgY29uc3QgICAgeyByZXR1cm4gbV9jaGFuZ2VkOyB9Ci0gICAgYm9vbCBo
YXNDaGFuZ2VkQ2hpbGQoKSBjb25zdCB7IHJldHVybiBtX2hhc0NoYW5nZWRDaGlsZDsgfQotICAg
IGJvb2wgaXNMaW5rKCkgY29uc3QgeyByZXR1cm4gbV9pc0xpbms7IH0KLSAgICAvLyBpbkRvY3Vt
ZW50IHNob3VsZCBhbHNvIG1ha2Ugc3VyZSBhIGRvY3VtZW50IGV4aXN0cyBpbiBjYXNlIHRoZSBk
b2N1bWVudCBoYXMgYmVlbiBkZXN0cm95ZWQgYmVmb3JlIHRoZSBub2RlIGlzIHJlbW92ZWQgZnJv
bSB0aGUgZG9jdW1lbnQuCi0gICAgYm9vbCBpbkRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gZG9j
dW1lbnQuZ2V0KCkgJiYgbV9pbkRvY3VtZW50OyB9Ci0gICAgYm9vbCBzdHlsZUVsZW1lbnQoKSBj
b25zdCB7IHJldHVybiBtX3N0eWxlRWxlbWVudDsgfQotICAgIGJvb2wgaW1wbGljaXROb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9pbXBsaWNpdDsgfQotICAgIHZvaWQgc2V0SGFzSUQoYm9vbCBiPXRy
dWUpIHsgbV9oYXNJZCA9IGI7IH0KLSAgICB2b2lkIHNldEhhc0NsYXNzKGJvb2wgYj10cnVlKSB7
IG1faGFzQ2xhc3MgPSBiOyB9Ci0gICAgdm9pZCBzZXRIYXNTdHlsZShib29sIGI9dHJ1ZSkgeyBt
X2hhc1N0eWxlID0gYjsgfQotICAgIHZvaWQgc2V0SGFzQ2hhbmdlZENoaWxkKCBib29sIGIgPSB0
cnVlICkgeyBtX2hhc0NoYW5nZWRDaGlsZCA9IGI7IH0KLSAgICB2b2lkIHNldEluRG9jdW1lbnQo
Ym9vbCBiPXRydWUpIHsgbV9pbkRvY3VtZW50ID0gYjsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRG
b2N1cyhib29sIGI9dHJ1ZSkgeyBtX2ZvY3VzZWQgPSBiOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNl
dEFjdGl2ZShib29sIGI9dHJ1ZSwgYm9vbCBwYXVzZT1mYWxzZSkgeyBtX2FjdGl2ZSA9IGI7IH0K
LSAgICB2b2lkIHNldEluQWN0aXZlQ2hhaW4oYm9vbCBiPXRydWUpIHsgbV9pbkFjdGl2ZUNoYWlu
ID0gYjsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRIb3ZlcmVkKGJvb2wgYj10cnVlKSB7IG1faG92
ZXJlZCA9IGI7IH0KLSAgICB2b2lkIHNldENoYW5nZWQoYm9vbCBiPXRydWUpOwotCi0gICAgdW5z
aWduZWQgc2hvcnQgdGFiSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3RhYkluZGV4OyB9Ci0gICAg
dm9pZCBzZXRUYWJJbmRleCh1bnNpZ25lZCBzaG9ydCBfdGFiSW5kZXgpIHsgbV90YWJJbmRleCA9
IF90YWJJbmRleDsgfQotCi0gICAgLyoqCi0gICAgICAgICogd2hldGhlciB0aGlzIG5vZGUgY2Fu
IHJlY2VpdmUgdGhlIGtleWJvYXJkIGZvY3VzLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBp
c0ZvY3VzYWJsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxl
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzTW91c2VGb2N1c2FibGUoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGJvb2wgaXNDb250cm9sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0gLy8gRXZl
bnR1YWxseSB0aGUgbm90aW9uIG9mIHdoYXQgaXMgYSBjb250cm9sIHdpbGwgYmUgZXh0ZW5zaWJs
ZS4KLSAgICB2aXJ0dWFsIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQot
ICAgIHZpcnR1YWwgYm9vbCBpc0NoZWNrZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAg
IHZpcnR1YWwgYm9vbCBpc0luZGV0ZXJtaW5hdGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQot
Ci0gICAgdmlydHVhbCBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBRUmVjdCBnZXRSZWN0KCkgY29uc3Q7Ci0KLSAgICBlbnVtIFN0eWxlQ2hhbmdlIHsgTm9DaGFu
Z2UsIE5vSW5oZXJpdCwgSW5oZXJpdCwgRGV0YWNoLCBGb3JjZSB9OwotICAgIHZpcnR1YWwgdm9p
ZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgPSBOb0NoYW5nZSApIHt9Ci0gICAgU3R5bGVDaGFu
Z2UgZGlmZigga2h0bWw6OlJlbmRlclN0eWxlICpzMSwga2h0bWw6OlJlbmRlclN0eWxlICpzMiAp
IGNvbnN0OwotCi0gICAgdW5zaWduZWQgbm9kZUluZGV4KCkgY29uc3Q7Ci0gICAgLy8gUmV0dXJu
cyB0aGUgZG9jdW1lbnQgdGhhdCB0aGlzIG5vZGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBUaGlzIGlz
IGd1YXJhbnRlZWQgdG8gYWx3YXlzIGJlIG5vbi1udWxsLCBhcyBvcHBvc2VkIHRvCi0gICAgLy8g
RE9NJ3Mgb3duZXJEb2N1bWVudCgpIHdoaWNoIGlzIG51bGwgZm9yIERvY3VtZW50IG5vZGVzIChh
bmQgc29tZXRpbWVzIERvY3VtZW50VHlwZSBub2RlcykuCi0gICAgRG9jdW1lbnRJbXBsKiBnZXRE
b2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGRvY3VtZW50LmdldCgpOyB9Ci0KLSAgICB2b2lkIHNl
dERvY3VtZW50KERvY3VtZW50SW1wbCAqZG9jKTsKLQotICAgIHZvaWQgYWRkRXZlbnRMaXN0ZW5l
cihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIs
IGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VD
YXB0dXJlKTsKLSAgICB2b2lkIHJlbW92ZUhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0
cmluZyAmZXZlbnRUeXBlKTsKLSAgICB2b2lkIHNldEhUTUxFdmVudExpc3RlbmVyKGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lcik7Ci0gICAgRXZl
bnRMaXN0ZW5lciAqZ2V0SFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVu
dFR5cGUpOwotICAgIHZvaWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLQotICAgIGJvb2wg
ZGlzcGF0Y2hFdmVudChFdmVudEltcGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlLCBib29sIHRl
bXBFdmVudCA9IGZhbHNlKTsKLSAgICBib29sIGRpc3BhdGNoR2VuZXJpY0V2ZW50KCBFdmVudElt
cGwgKmV2dCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGRpc3BhdGNoSFRNTEV2ZW50
KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBib29sIGNhbkJ1YmJsZUFyZywgYm9vbCBj
YW5jZWxhYmxlQXJnKTsKLSAgICBib29sIGRpc3BhdGNoV2luZG93RXZlbnQoY29uc3QgQXRvbWlj
U3RyaW5nICZldmVudFR5cGUsIGJvb2wgY2FuQnViYmxlQXJnLCBib29sIGNhbmNlbGFibGVBcmcp
OwotICAgIGJvb2wgZGlzcGF0Y2hNb3VzZUV2ZW50KFFNb3VzZUV2ZW50ICplLCBjb25zdCBBdG9t
aWNTdHJpbmcgJm92ZXJyaWRlVHlwZSwgaW50IG92ZXJyaWRlRGV0YWlsID0gMCk7Ci0gICAgYm9v
bCBkaXNwYXRjaFNpbXVsYXRlZE1vdXNlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5
cGUpOwotICAgIGJvb2wgZGlzcGF0Y2hNb3VzZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyAmZXZl
bnRUeXBlLCBpbnQgYnV0dG9uLCBpbnQgZGV0YWlsLAotICAgICAgICBpbnQgY2xpZW50WCwgaW50
IGNsaWVudFksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwKLSAgICAgICAgYm9vbCBjdHJsS2V5
LCBib29sIGFsdEtleSwgYm9vbCBzaGlmdEtleSwgYm9vbCBtZXRhS2V5KTsKLSAgICBib29sIGRp
c3BhdGNoVUlFdmVudChjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgaW50IGRldGFpbCA9
IDApOwotICAgIGJvb2wgZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudChib29sIGNoaWxkcmVu
Q2hhbmdlZCA9IHRydWUpOwotICAgIGJvb2wgZGlzcGF0Y2hLZXlFdmVudChRS2V5RXZlbnQgKmtl
eSk7Ci0gICAgdm9pZCBkaXNwYXRjaFdoZWVsRXZlbnQoUVdoZWVsRXZlbnQgKik7Ci0KLSAgICB2
b2lkIGhhbmRsZUxvY2FsRXZlbnRzKEV2ZW50SW1wbCAqZXZ0LCBib29sIHVzZUNhcHR1cmUpOwot
Ci0gICAgLy8gSGFuZGxlcnMgdG8gZG8vdW5kbyBhY3Rpb25zIG9uIHRoZSB0YXJnZXQgbm9kZSBi
ZWZvcmUgYW4gZXZlbnQgaXMgZGlzcGF0Y2hlZCB0byBpdCBhbmQgYWZ0ZXIgdGhlIGV2ZW50Ci0g
ICAgLy8gaGFzIGJlZW4gZGlzcGF0Y2hlZC4gIFRoZSBkYXRhIHBvaW50ZXIgaXMgaGFuZGVkIGJh
Y2sgYnkgdGhlIHByZURpc3BhdGNoIGFuZCBwYXNzZWQgdG8gcG9zdERpc3BhdGNoLgotICAgIHZp
cnR1YWwgdm9pZCogcHJlRGlzcGF0Y2hFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpIHsgcmV0
dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERpc3BhdGNoRXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0LCB2b2lkKiBkYXRhKSB7fQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSB0aGUg
ZGVmYXVsdCBhY3Rpb24gZm9yIGFuIGV2ZW50IGUuZy4gc3VibWl0dGluZyBhIGZvcm0KLSAgICAg
Ki8KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7
Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGZvciBkaXNhYmxlZCBmb3JtIGVsZW1lbnRzOyBpZiB0
cnVlLCBwcmV2ZW50cyBtb3VzZSBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkCi0gICAgICog
dG8gZXZlbnQgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgRE9NQWN0aXZhdGUgZXZlbnRzIGZyb20g
YmVpbmcgc2VudCBhdCBhbGwuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGRpc2FibGVkKCkg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgpOwotICAgIHZpcnR1YWwgYm9v
bCBjaGlsZFR5cGVBbGxvd2VkKCB1bnNpZ25lZCBzaG9ydCAvKnR5cGUqLyApIHsgcmV0dXJuIGZh
bHNlOyB9Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBjaGlsZE5vZGVDb3VudCgpIGNvbnN0OwotICAg
IHZpcnR1YWwgTm9kZUltcGwgKmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCk7Ci0KLSAgICAvKioK
LSAgICAgKiBEb2VzIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZSB0byBmaW5kIHRo
ZSBub2RlIG5leHQgbm9kZSBhZnRlciB0aGlzIG9uZS4gVGhpcyB1c2VzIHRoZSBzYW1lIG9yZGVy
IHRoYXQKLSAgICAgKiB0aGUgdGFncyBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICAq
Ci0gICAgICogQHBhcmFtIHN0YXlXaXRoaW4gSWYgbm90IG51bGwsIHRoZSB0cmF2ZXJzYWwgd2ls
bCBzdG9wIG9uY2UgdGhlIHNwZWNpZmllZCBub2RlIGlzIHJlYWNoZWQuIFRoaXMgY2FuIGJlIHVz
ZWQgdG8KLSAgICAgKiByZXN0cmljdCB0cmF2ZXJzYWwgdG8gYSBwYXJ0aWN1bGFyIHN1Yi10cmVl
LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV4dCBub2RlLCBpbiBkb2N1bWVudCBvcmRl
cgotICAgICAqCi0gICAgICogc2VlIEByZWYgdHJhdmVyc2VQcmV2aW91c05vZGUoKQotICAgICAq
LwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZU5leHROb2RlKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0
aGluID0gMCkgY29uc3Q7Ci0gICAgCi0gICAgLyogTGlrZSB0cmF2ZXJzZU5leHROb2RlLCBidXQg
c2tpcHMgY2hpbGRyZW4gYW5kIHN0YXJ0cyB3aXRoIHRoZSBuZXh0IHNpYmxpbmcuICovCi0gICAg
Tm9kZUltcGwgKnRyYXZlcnNlTmV4dFNpYmxpbmcoY29uc3QgTm9kZUltcGwgKnN0YXlXaXRoaW4g
PSAwKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIERvZXMgYSByZXZlcnNlIHByZS1vcmRlciB0
cmF2ZXJzYWwgdG8gZmluZCB0aGUgbm9kZSB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgY3VycmVudCBv
bmUgaW4gZG9jdW1lbnQgb3JkZXIKLSAgICAgKgotICAgICAqIHNlZSBAcmVmIHRyYXZlcnNlTmV4
dE5vZGUoKQotICAgICAqLwotICAgIE5vZGVJbXBsICp0cmF2ZXJzZVByZXZpb3VzTm9kZSgpIGNv
bnN0OwotCi0gICAgLyogTGlrZSB0cmF2ZXJzZVByZXZpb3VzTm9kZSwgYnV0IHZpc2l0cyBub2Rl
cyBiZWZvcmUgdGhlaXIgY2hpbGRyZW4uICovCi0gICAgTm9kZUltcGwgKnRyYXZlcnNlUHJldmlv
dXNOb2RlUG9zdE9yZGVyKGNvbnN0IE5vZGVJbXBsICpzdGF5V2l0aGluID0gMCkgY29uc3Q7Ci0K
LSAgICBOb2RlSW1wbCAqcHJldmlvdXNFZGl0YWJsZSgpIGNvbnN0OwotICAgIE5vZGVJbXBsICpu
ZXh0RWRpdGFibGUoKSBjb25zdDsKLSAgICAvL2Jvb2wgaXNFZGl0YWJsZSgpIGNvbnN0OwotCi0g
ICAga2h0bWw6OlJlbmRlck9iamVjdCAqcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX3JlbmRl
cjsgfQotICAgIGtodG1sOjpSZW5kZXJPYmplY3QgKm5leHRSZW5kZXJlcigpOwotICAgIGtodG1s
OjpSZW5kZXJPYmplY3QgKnByZXZpb3VzUmVuZGVyZXIoKTsKLSAgICB2b2lkIHNldFJlbmRlcmVy
KGtodG1sOjpSZW5kZXJPYmplY3QqIHJlbmRlcmVyKSB7IG1fcmVuZGVyID0gcmVuZGVyZXI7IH0K
LSAgICAKLSAgICB2b2lkIGNoZWNrU2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZp
eCwgaW50ICZleGNlcHRpb25jb2RlKTsKLSAgICBib29sIGlzQW5jZXN0b3IoY29uc3QgTm9kZUlt
cGwgKikgY29uc3Q7Ci0KLQkvLyBUaGVzZSB0d28gbWV0aG9kcyBhcmUgbXV0dWFsbHkgZXhjbHVz
aXZlLiAgVGhlIGZvcm1lciBpcyB1c2VkIHRvIGRvIHN0cmljdCBlcnJvci1jaGVja2luZwotCS8v
IHdoZW4gYWRkaW5nIGNoaWxkcmVuIHZpYSB0aGUgcHVibGljIERPTSBBUEkgKGUuZy4sIGFwcGVu
ZENoaWxkKCkpLiAgVGhlIGxhdHRlciBpcyBjYWxsZWQgb25seSB3aGVuIHBhcnNpbmcsIAotCS8v
IHRvIHNhbml0eS1jaGVjayBhZ2FpbnN0IHRoZSBEVEQgZm9yIGVycm9yIHJlY292ZXJ5LgotCXZv
aWQgY2hlY2tBZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSk7
ICAgIC8vIEVycm9yLWNoZWNraW5nIHdoZW4gYWRkaW5nIHZpYSB0aGUgRE9NIEFQSQotCXZpcnR1
YWwgYm9vbCBjaGlsZEFsbG93ZWQoTm9kZUltcGwgKm5ld0NoaWxkKTsJCQkJICAgLy8gRXJyb3It
Y2hlY2tpbmcgZHVyaW5nIHBhcnNpbmcgdGhhdCBjaGVja3MgdGhlIERURAotCQotICAgIHZpcnR1
YWwgaW50IG1heE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGNhcmV0TWluT2Zmc2V0
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgY2FyZXRNYXhPZmZzZXQoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIHVuc2lnbmVkIGNhcmV0TWF4UmVuZGVyZWRPZmZzZXQoKSBjb25zdDsKLQotICAgIHZp
cnR1YWwgaW50IHByZXZpb3VzT2Zmc2V0IChpbnQgY3VycmVudCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBpbnQgbmV4dE9mZnNldCAoaW50IGN1cnJlbnQpIGNvbnN0OwotICAgIAotI2lmbmRlZiBOREVC
VUcKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBRU3RyaW5nIGlu
ZCA9ICIiKSBjb25zdDsKLSNlbmRpZgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAg
ICAvLyBJbnRlZ3JhdGlvbiB3aXRoIHJlbmRlcmluZyB0cmVlCi0KLSAgICAvKioKLSAgICAgKiBB
dHRhY2hlcyB0aGlzIG5vZGUgdG8gdGhlIHJlbmRlcmluZyB0cmVlLiBUaGlzIGNhbGN1bGF0ZXMg
dGhlIHN0eWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIG5vZGUgYW5kIGNyZWF0ZXMgYW4KLSAgICAg
KiBhcHByb3ByaWF0ZSBSZW5kZXJPYmplY3Qgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRo
ZSB0cmVlIChleGNlcHQgd2hlbiB0aGUgc3R5bGUgaGFzIGRpc3BsYXk6IG5vbmUpLiBUaGlzCi0g
ICAgICogbWFrZXMgdGhlIG5vZGUgdmlzaWJsZSBpbiB0aGUgS0hUTUxWaWV3LgotICAgICAqLwot
ICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLQotICAgIC8qKgotICAgICAqIERldGFjaGVzIHRo
ZSBub2RlIGZyb20gdGhlIHJlbmRlcmluZyB0cmVlLCBtYWtpbmcgaXQgaW52aXNpYmxlIGluIHRo
ZSByZW5kZXJlZCB2aWV3LiBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZQotICAgICAqIHRoZSBub2Rl
J3MgcmVuZGVyaW5nIG9iamVjdCBmcm9tIHRoZSByZW5kZXJpbmcgdHJlZSBhbmQgZGVsZXRlIGl0
LgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgIHZpcnR1YWwgdm9p
ZCB3aWxsUmVtb3ZlKCk7Ci0gICAgdm9pZCBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCk7Ci0gICAg
dmlydHVhbCBraHRtbDo6UmVuZGVyU3R5bGUgKnN0eWxlRm9yUmVuZGVyZXIoa2h0bWw6OlJlbmRl
ck9iamVjdCAqcGFyZW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRlZChraHRt
bDo6UmVuZGVyU3R5bGUgKik7Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICB2aXJ0dWFsIGJvb2wgY2hp
bGRTaG91bGRDcmVhdGVSZW5kZXJlcihET006Ok5vZGVJbXBsICopIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLSNlbmRpZgotICAgIHZpcnR1YWwga2h0bWw6OlJlbmRlck9iamVjdCAqY3JlYXRlUmVu
ZGVyZXIoUmVuZGVyQXJlbmEgKiwga2h0bWw6OlJlbmRlclN0eWxlICopOwotCi0gICAgLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRob2RzIGZvciBtYWludGFpbmluZyB0aGUgc3Rh
dGUgb2YgdGhlIGVsZW1lbnQgYmV0d2VlbiBoaXN0b3J5IG5hdmlnYXRpb24KLQotICAgIC8qKgot
ICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHR5cGUgb2Ygbm9kZSBtYWludGFp
bnMgaXQncyBzdGF0ZS4gSWYgc28sIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZSB3aWxsIGJlIHN0b3Jl
ZCB3aGVuCi0gICAgICogdGhlIHVzZXIgZ29lcyB0byBhIGRpZmZlcmVudCBwYWdlIHVzaW5nIHRo
ZSBzdGF0ZSgpIG1ldGhvZCwgYW5kIHJlc3RvcmVkIHVzaW5nIHRoZSByZXN0b3JlU3RhdGUoKSBt
ZXRob2QgaWYgdGhlCi0gICAgICogdXNlciByZXR1cm5zIChlLmcuIHVzaW5nIHRoZSBiYWNrIGJ1
dHRvbikuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB1c2VyLWNoYW5nZWFibGUgZWxlbWVu
dHMgc3VjaCBhcyBmb3JtCi0gICAgICogY29udHJvbHMgbWFpbnRhaW4gdGhlaXIgY29udGVudHMg
d2hlbiB0aGUgdXNlciByZXR1cm5zIHRvIGEgcHJldmlvdXMgcGFnZSBpbiB0aGUgaGlzdG9yeS4K
LSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgbWFpbnRhaW5zU3RhdGUoKTsKLQotICAgIC8qKgot
ICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoaXMgbm9kZSByZXByZXNlbnRlZCBhcyBhIHN0
cmluZy4gVGhpcyBzdHJpbmcgd2lsbCBiZSBwYXNzZWQgdG8gcmVzdG9yZVN0YXRlKCkgaWYgdGhl
IHVzZXIKLSAgICAgKiByZXR1cm5zIHRvIHRoZSBwYWdlLgotICAgICAqCi0gICAgICogQHJldHVy
biBTdGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSByZXByZXNlbnRlZCBhcyBhIHN0cmlu
ZwotICAgICAqLwotICAgIHZpcnR1YWwgUVN0cmluZyBzdGF0ZSgpOwotCi0gICAgLyoqCi0gICAg
ICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGVsZW1lbnQgYmFzZWQgb24gc3RyaW5ncyBwcmV2aW91
c2x5IHJldHVybmVkIGJ5IHN0YXRlKCkuIFRoaXMgaXMgdXNlZCB0byBpbml0aWFsaXplIGZvcm0K
LSAgICAgKiBjb250cm9scyB3aXRoIHRoZWlyIG9sZCB2YWx1ZXMgd2hlbiB0aGUgdXNlciByZXR1
cm5zIHRvIHRoZSBwYWdlIGluIHRoZWlyIGhpc3RvcnkuICBUaGUgcmVjZWl2ZXIKLSAgICAgKiBz
aG91bGQgcmVtb3ZlIHRoZSBzdHJpbmcgZnJvbSB0aGUgbGlzdCB0aGF0IGl0IHVzZXMgZm9yIGl0
cyByZXN0b3JlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXRlcyBUaGUgc3RyaW5ncyBwcmV2
aW91c2x5IHJldHVybmVkIGJ5IG5vZGVzJyBzdGF0ZSBtZXRob2RzLgotICAgICAqLwotICAgIHZp
cnR1YWwgdm9pZCByZXN0b3JlU3RhdGUoUVN0cmluZ0xpc3QgJnN0YXRlTGlzdCk7Ci0KLSAgICAv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5vdGlmaWNhdGlvbiBvZiBkb2N1bWVudCBz
dHVjdHVyZSBjaGFuZ2VzCi0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0
IGl0IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIGRvY3VtZW50LiBUaGlzIGlzIGNhbGxlZCBk
dXJpbmcgZG9jdW1lbnQgcGFyc2luZywgYW5kIGFsc28KLSAgICAgKiB3aGVuIGEgbm9kZSBpcyBh
ZGRlZCB0aHJvdWdoIHRoZSBET00gbWV0aG9kcyBpbnNlcnRCZWZvcmUoKSwgYXBwZW5kQ2hpbGQo
KSBvciByZXBsYWNlQ2hpbGQoKS4gTm90ZSB0aGF0IHRoaXMgb25seQotICAgICAqIGhhcHBlbnMg
d2hlbiB0aGUgbm9kZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsIGkuZS4gb25s
eSB3aGVuIHRoZSBkb2N1bWVudCBpcyBhY3R1YWxseSBhbiBhbmNlc3RvciBvZgotICAgICAqIHRo
ZSBub2RlLiBUaGUgY2FsbCBoYXBwZW5zIF9hZnRlcl8gdGhlIG5vZGUgaGFzIGJlZW4gYWRkZWQg
dG8gdGhlIHRyZWUuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIERPTU5v
ZGVJbnNlcnRlZEludG9Eb2N1bWVudCBET00gZXZlbnQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRo
ZSBvdmVyaGVhZCBvZiBldmVudAotICAgICAqIGRpc3BhdGNoaW5nLgotICAgICAqLwotICAgIHZp
cnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgLyoqCi0gICAgICogTm90
aWZpZXMgdGhlIG5vZGUgdGhhdCBpdCBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgZG9jdW1lbnQg
dHJlZSwgaS5lLiB3aGVuIHRoZSBkb2N1bWVudCBpcyBubyBsb25nZXIgYW4gYW5jZXN0b3IKLSAg
ICAgKiBub2RlLgotICAgICAqCi0gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBET01Ob2Rl
UmVtb3ZlZEZyb21Eb2N1bWVudCBET00gZXZlbnQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoZSBv
dmVyaGVhZCBvZiBldmVudAotICAgICAqIGRpc3BhdGNoaW5nLCBhbmQgaXMgY2FsbGVkIF9hZnRl
cl8gdGhlIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgotICAgICAqLwotICAgIHZpcnR1
YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0KLSAgICAvLyBUaGVzZSBmdW5jdGlvbnMg
YXJlIGNhbGxlZCB3aGVuZXZlciB5b3UgYXJlIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQgZnJv
bSBhIHRyZWUuICBUaGF0IHRyZWUgbWF5IGJlIHRoZSBtYWluCi0gICAgLy8gZG9jdW1lbnQgdHJl
ZSwgb3IgaXQgY291bGQgYmUgYW5vdGhlciBkaXNjb25uZWN0ZWQgdHJlZS4gIE92ZXJyaWRlIHRo
ZXNlIGZ1bmN0aW9ucyB0byBkbyBhbnkgd29yayB0aGF0IGRlcGVuZHMKLSAgICAvLyBvbiBjb25u
ZWN0ZWRuZXNzIHRvIHNvbWUgYW5jZXN0b3IgKGUuZy4sIGFuIGFuY2VzdG9yIDxmb3JtPiBmb3Ig
ZXhhbXBsZSkuCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKSB7
fTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21UcmVlKGJvb2wgZGVlcCkge307Ci0KLSAg
ICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgbm9kZSB0aGF0IGl0J3MgbGlzdCBvZiBjaGlsZHJl
biBoYXZlIGNoYW5nZWQgKGVpdGhlciBieSBhZGRpbmcgb3IgcmVtb3ZpbmcgY2hpbGQgbm9kZXMp
LCBvciBhIGNoaWxkCi0gICAgICogbm9kZSB0aGF0IGlzIG9mIHRoZSB0eXBlIENEQVRBX1NFQ1RJ
T05fTk9ERSwgVEVYVF9OT0RFIG9yIENPTU1FTlRfTk9ERSBoYXMgY2hhbmdlZCBpdHMgdmFsdWUu
Ci0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotCi0gICAgdmly
dHVhbCBET01TdHJpbmcgdG9TdHJpbmcoKSBjb25zdCA9IDA7Ci0gICAgCi0jaWZuZGVmIE5ERUJV
RwotICAgIHZpcnR1YWwgdm9pZCBmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2ln
bmVkIGxlbmd0aCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNob3dOb2RlKGNvbnN0IGNoYXIgKnByZWZp
eD0iIikgY29uc3Q7Ci0gICAgdm9pZCBzaG93VHJlZSgpIGNvbnN0OwotICAgIHZvaWQgc2hvd1Ry
ZWVBbmRNYXJrKE5vZGVJbXBsICogbWFya2VkTm9kZTEsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJl
bDEsIE5vZGVJbXBsICogbWFya2VkTm9kZTIsIGNvbnN0IGNoYXIgKiBtYXJrZWRMYWJlbDIpIGNv
bnN0OwotCQotI2VuZGlmCi0KLSAgICB2b2lkIHJlZ2lzdGVyTm9kZUxpc3QoTm9kZUxpc3RJbXBs
ICpsaXN0KTsKLSAgICB2b2lkIHVucmVnaXN0ZXJOb2RlTGlzdChOb2RlTGlzdEltcGwgKmxpc3Qp
OwotICAgIHZvaWQgbm90aWZ5Tm9kZUxpc3RzQ2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgdm9pZCBu
b3RpZnlMb2NhbE5vZGVMaXN0c0NoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZvaWQgbm90aWZ5Tm9k
ZUxpc3RzQXR0cmlidXRlQ2hhbmdlZCgpOwotICAgIHZvaWQgbm90aWZ5TG9jYWxOb2RlTGlzdHNB
dHRyaWJ1dGVDaGFuZ2VkKCk7Ci0gICAgCi0gICAgUmVmUHRyPE5vZGVMaXN0SW1wbD4gZ2V0RWxl
bWVudHNCeVRhZ05hbWUoY29uc3QgRE9NU3RyaW5nICZuYW1lKSB7IHJldHVybiBnZXRFbGVtZW50
c0J5VGFnTmFtZU5TKCIqIiwgbmFtZSk7IH0KLSAgICBSZWZQdHI8Tm9kZUxpc3RJbXBsPiBnZXRF
bGVtZW50c0J5VGFnTmFtZU5TKGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBE
T01TdHJpbmcgJmxvY2FsTmFtZSk7Ci0KLXByaXZhdGU6IC8vIG1lbWJlcnMKLSAgICBEb2NQdHI8
RG9jdW1lbnRJbXBsPiBkb2N1bWVudDsKLSAgICBOb2RlSW1wbCAqbV9wcmV2aW91czsKLSAgICBO
b2RlSW1wbCAqbV9uZXh0OwotcHJvdGVjdGVkOgotICAgIGtodG1sOjpSZW5kZXJPYmplY3QgKm1f
cmVuZGVyOwotICAgIFFQdHJMaXN0PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiAqbV9yZWdkTGlz
dGVuZXJzOwotICAgIFFQdHJEaWN0PE5vZGVMaXN0SW1wbD4gKm1fbm9kZUxpc3RzOwotCi0gICAg
dW5zaWduZWQgc2hvcnQgbV90YWJJbmRleCA6IDE1OwotICAgIGJvb2wgbV9oYXNUYWJJbmRleCAg
OiAxOwotCi0gICAgYm9vbCBtX2hhc0lkIDogMTsKLSAgICBib29sIG1faGFzQ2xhc3MgOiAxOwot
ICAgIGJvb2wgbV9oYXNTdHlsZSA6IDE7Ci0gICAgYm9vbCBtX2F0dGFjaGVkIDogMTsKLSAgICBi
b29sIG1fY2hhbmdlZCA6IDE7Ci0gICAgYm9vbCBtX2hhc0NoYW5nZWRDaGlsZCA6IDE7Ci0gICAg
Ym9vbCBtX2luRG9jdW1lbnQgOiAxOwotCi0gICAgYm9vbCBtX2lzTGluayA6IDE7Ci0gICAgYm9v
bCBtX3NwZWNpZmllZCA6IDE7IC8vIHVzZWQgaW4gQXR0ckltcGwuIEFjY2Vzc29yIGZ1bmN0aW9u
cyB0aGVyZQotICAgIGJvb2wgbV9mb2N1c2VkIDogMTsKLSAgICBib29sIG1fYWN0aXZlIDogMTsK
LSAgICBib29sIG1faG92ZXJlZCA6IDE7Ci0gICAgYm9vbCBtX2luQWN0aXZlQ2hhaW4gOiAxOwot
ICAgIGJvb2wgbV9zdHlsZUVsZW1lbnQgOiAxOyAvLyBjb250YWlucyBzdHlsZXNoZWV0IHRleHQK
LSAgICBib29sIG1faW1wbGljaXQgOiAxOyAvLyBpbXBsaWNpdGVseSBnZW5lcmF0ZWQgYnkgdGhl
IHBhcnNlcgotCi0gICAgYm9vbCBtX2luRGV0YWNoIDogMTsKLX07Ci0KLWNsYXNzIENvbnRhaW5l
ck5vZGVJbXBsIDogcHVibGljIE5vZGVJbXBsCi17Ci1wdWJsaWM6Ci0gICAgQ29udGFpbmVyTm9k
ZUltcGwoRG9jdW1lbnRJbXBsICpkb2MpOwotICAgIHZpcnR1YWwgfkNvbnRhaW5lck5vZGVJbXBs
KCk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2Vz
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqZmlyc3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwg
Tm9kZUltcGwgKmxhc3RDaGlsZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmluc2Vy
dEJlZm9yZSAoIE5vZGVJbXBsICpuZXdDaGlsZCwgTm9kZUltcGwgKnJlZkNoaWxkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpyZXBsYWNlQ2hpbGQgKCBOb2Rl
SW1wbCAqbmV3Q2hpbGQsIE5vZGVJbXBsICpvbGRDaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqcmVtb3ZlQ2hpbGQgKCBOb2RlSW1wbCAqb2xkQ2hpbGQs
IGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmFwcGVuZENoaWxk
ICggTm9kZUltcGwgKm5ld0NoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFs
IGJvb2wgaGFzQ2hpbGROb2RlcyAoICApIGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAo
bm90IHBhcnQgb2YgRE9NKQotICAgIHZvaWQgd2lsbFJlbW92ZSgpOwotICAgIGludCB3aWxsUmVt
b3ZlQ2hpbGQoTm9kZUltcGwgKmNoaWxkKTsKLSAgICB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKCk7
Ci0gICAgdm9pZCByZW1vdmVDaGlsZHJlbigpOwotICAgIHZvaWQgY2xvbmVDaGlsZE5vZGVzKE5v
ZGVJbXBsICpjbG9uZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rmlyc3RDaGlsZChOb2RlSW1w
bCAqY2hpbGQpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRMYXN0Q2hpbGQoTm9kZUltcGwgKmNoaWxk
KTsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICphZGRDaGlsZChOb2RlSW1wbCAqbmV3Q2hpbGQpOwot
ICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0K
LSAgICB2aXJ0dWFsIFFSZWN0IGdldFJlY3QoKSBjb25zdDsKLSAgICBib29sIGdldFVwcGVyTGVm
dENvcm5lcihpbnQgJnhQb3MsIGludCAmeVBvcykgY29uc3Q7Ci0gICAgYm9vbCBnZXRMb3dlclJp
Z2h0Q29ybmVyKGludCAmeFBvcywgaW50ICZ5UG9zKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9p
ZCBzZXRGb2N1cyhib29sPXRydWUpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBh
Y3RpdmUgPSB0cnVlLCBib29sIHBhdXNlID0gZmFsc2UpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRI
b3ZlcmVkKGJvb2w9dHJ1ZSk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBjaGlsZE5vZGVDb3VudCgp
IGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmNoaWxkTm9kZSh1bnNpZ25lZCBpbmRleCk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFs
IHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZElu
dG9UcmVlKGJvb2wgZGVlcCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tVHJlZShib29s
IGRlZXApOwotCi0vL3Byb3RlY3RlZDoKLSAgICBOb2RlSW1wbCAqX2ZpcnN0OwotICAgIE5vZGVJ
bXBsICpfbGFzdDsKLQotICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGluc2VydGluZyBjaGls
ZHJlbjoKLQotICAgIC8vICMjIyB0aGlzIHNob3VsZCB2YW5pc2guIGRvIGl0IGluIGRvbS8gIQot
ICAgIC8vIGNoZWNrIGZvciBzYW1lIHNvdXJjZSBkb2N1bWVudDoKLSAgICBib29sIGNoZWNrU2Ft
ZURvY3VtZW50KCBOb2RlSW1wbCAqbmV3Y2hpbGQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAg
IC8vIGNoZWNrIGZvciBiZWluZyBjaGlsZDoKLSAgICBib29sIGNoZWNrSXNDaGlsZCggTm9kZUlt
cGwgKm9sZGNoaWxkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICAvLyAjIyMKLQotICAgIC8v
IGZpbmQgb3V0IGlmIGEgbm9kZSBpcyBhbGxvd2VkIHRvIGJlIG91ciBjaGlsZAotICAgIHZvaWQg
ZGlzcGF0Y2hDaGlsZEluc2VydGVkRXZlbnRzKCBOb2RlSW1wbCAqY2hpbGQsIGludCAmZXhjZXB0
aW9uY29kZSApOwotICAgIHZvaWQgZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoIE5vZGVJbXBs
ICpjaGlsZCwgaW50ICZleGNlcHRpb25jb2RlICk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotY2xhc3MgTm9kZTsKLWNsYXNzIE5vZGVJbXBsOwotCi1jbGFzcyBOb2RlTGlzdEltcGwgOiBw
dWJsaWMga2h0bWw6OlNoYXJlZDxOb2RlTGlzdEltcGw+Ci17Ci1wdWJsaWM6Ci0gICAgTm9kZUxp
c3RJbXBsKCBOb2RlSW1wbCAqX3Jvb3ROb2RlICk7Ci0gICAgdmlydHVhbCB+Tm9kZUxpc3RJbXBs
KCk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIE5vZGVMaXN0Ci0gICAg
dmlydHVhbCB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBOb2RlSW1w
bCAqaXRlbSAoIHVuc2lnbmVkIGluZGV4ICkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgTm9kZUlt
cGwgKml0ZW1CeUlkICggY29uc3QgRE9NU3RyaW5nICYgZWxlbWVudElkICkgY29uc3Q7Ci0KLSAg
ICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0KLSAgICB2aXJ0dWFsIHZvaWQg
cm9vdE5vZGVDaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcm9vdE5vZGVBdHRy
aWJ1dGVDaGFuZ2VkKCkge30KLQotcHJvdGVjdGVkOgotICAgIC8vIGhlbHBlciBmdW5jdGlvbnMg
Zm9yIHNlYXJjaGluZyBhbGwgRWxlbWVudEltcGxzIGluIGEgdHJlZQotICAgIHVuc2lnbmVkIHJl
Y3Vyc2l2ZUxlbmd0aChOb2RlSW1wbCAqc3RhcnQgPSAwKSBjb25zdDsKLSAgICBOb2RlSW1wbCAq
cmVjdXJzaXZlSXRlbSAoIHVuc2lnbmVkIG9mZnNldCwgTm9kZUltcGwgKnN0YXJ0ID0gMCApIGNv
bnN0OwotICAgIHZpcnR1YWwgYm9vbCBub2RlTWF0Y2hlcyggTm9kZUltcGwgKnRlc3ROb2RlICkg
Y29uc3QgPSAwOwotCi0gICAgTm9kZUltcGwgKnJvb3ROb2RlOwotICAgIG11dGFibGUgaW50IGNh
Y2hlZExlbmd0aDsKLSAgICBtdXRhYmxlIE5vZGVJbXBsICpsYXN0SXRlbTsKLSAgICBtdXRhYmxl
IHVuc2lnbmVkIGxhc3RJdGVtT2Zmc2V0OwotICAgIG11dGFibGUgYm9vbCBpc0xlbmd0aENhY2hl
VmFsaWQgOiAxOwotICAgIG11dGFibGUgYm9vbCBpc0l0ZW1DYWNoZVZhbGlkIDogMTsKLX07Ci0K
IGNsYXNzIENoaWxkTm9kZUxpc3RJbXBsIDogcHVibGljIE5vZGVMaXN0SW1wbAogewogcHVibGlj
OgogICAgIENoaWxkTm9kZUxpc3RJbXBsKCBOb2RlSW1wbCAqbik7CiAKLSAgICAvLyBET00gbWV0
aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0KICAgICB2aXJ0dWFsIHVuc2ln
bmVkIGxlbmd0aCgpIGNvbnN0OwogICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25l
ZCBpbmRleCApIGNvbnN0OwogCkBAIC02MTIsNTcgKzQxLDUgQEAgcHJvdGVjdGVkOgogICAgIHZp
cnR1YWwgYm9vbCBub2RlTWF0Y2hlcyggTm9kZUltcGwgKnRlc3ROb2RlICkgY29uc3Q7CiB9Owog
Ci0vKioKLSAqIE5vZGVMaXN0IHdoaWNoIGxpc3RzIGFsbCBOb2RlcyBpbiBhIEVsZW1lbnQgd2l0
aCBhIGdpdmVuICJuYW1lPSIgdGFnCi0gKi8KLWNsYXNzIE5hbWVOb2RlTGlzdEltcGwgOiBwdWJs
aWMgTm9kZUxpc3RJbXBsCi17Ci1wdWJsaWM6Ci0gICAgTmFtZU5vZGVMaXN0SW1wbCggTm9kZUlt
cGwgKmRvYywgY29uc3QgRE9NU3RyaW5nICZ0ICk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVy
cmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0KLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGxlbmd0
aCgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25lZCBpbmRleCAp
IGNvbnN0OwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIHZp
cnR1YWwgdm9pZCByb290Tm9kZUNoaWxkcmVuQ2hhbmdlZCgpIHt9OwotICAgIHZpcnR1YWwgdm9p
ZCByb290Tm9kZUF0dHJpYnV0ZUNoYW5nZWQoKSB7IE5vZGVMaXN0SW1wbDo6cm9vdE5vZGVDaGls
ZHJlbkNoYW5nZWQoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIG5vZGVNYXRj
aGVzKCBOb2RlSW1wbCAqdGVzdE5vZGUgKSBjb25zdDsKLQotICAgIERPTVN0cmluZyBub2RlTmFt
ZTsKLX07Ci0KLQotLy8gR2VuZXJpYyBOYW1lZE5vZGVNYXAgaW50ZXJmYWNlCi0vLyBPdGhlciBj
bGFzc2VzIGltcGxlbWVudCB0aGlzIGZvciBtb3JlIHNwZWNpZmljIHNpdHVhdGlvbnMgZS5nLiBh
dHRyaWJ1dGVzCi0vLyBvZiBhbiBlbGVtZW50Ci1jbGFzcyBOYW1lZE5vZGVNYXBJbXBsIDogcHVi
bGljIGtodG1sOjpTaGFyZWQ8TmFtZWROb2RlTWFwSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBOYW1l
ZE5vZGVNYXBJbXBsKCkge30KLSAgICB2aXJ0dWFsIH5OYW1lZE5vZGVNYXBJbXBsKCkge30KLQot
ICAgIE5vZGVJbXBsICpnZXROYW1lZEl0ZW0oY29uc3QgRE9NU3RyaW5nICZuYW1lKSBjb25zdCB7
IHJldHVybiBnZXROYW1lZEl0ZW1OUyhET01TdHJpbmcoKSwgbmFtZSk7IH0KLSAgICBSZWZQdHI8
Tm9kZUltcGw+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhj
ZXB0aW9uKSB7IHJldHVybiByZW1vdmVOYW1lZEl0ZW1OUyhET01TdHJpbmcoKSwgbmFtZSwgZXhj
ZXB0aW9uKTsgfQotCi0gICAgdmlydHVhbCBOb2RlSW1wbCAqZ2V0TmFtZWRJdGVtTlMoY29uc3Qg
RE9NU3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmbG9jYWxOYW1lKSBjb25z
dCA9IDA7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBzZXROYW1lZEl0ZW1OUyhOb2RlSW1wbCAqYXJn
LCBpbnQgJmV4Y2VwdGlvbikgeyByZXR1cm4gc2V0TmFtZWRJdGVtKGFyZywgZXhjZXB0aW9uKTsg
fQotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJbXBsPiByZW1vdmVOYW1lZEl0ZW1OUyhjb25zdCBE
T01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZsb2NhbE5hbWUsIGludCAm
ZXhjZXB0aW9uKSA9IDA7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIE5h
bWVkTm9kZU1hcAotICAgIHZpcnR1YWwgTm9kZUltcGwgKmdldE5hbWVkSXRlbShjb25zdCBRdWFs
aWZpZWROYW1lJiBhdHRyTmFtZSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgUmVmUHRyPE5vZGVJ
bXBsPiByZW1vdmVOYW1lZEl0ZW0gKGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBpbnQg
JmV4Y2VwdGlvbmNvZGUpID0gMDsKLSAgICB2aXJ0dWFsIFJlZlB0cjxOb2RlSW1wbD4gc2V0TmFt
ZWRJdGVtIChOb2RlSW1wbCogYXJnLCBpbnQgJmV4Y2VwdGlvbmNvZGUpID0gMDsKLQotICAgIHZp
cnR1YWwgTm9kZUltcGwgKml0ZW0gKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0ID0gMDsKLSAgICB2
aXJ0dWFsIHVuc2lnbmVkIGxlbmd0aCggICkgY29uc3QgPSAwOwotCi0gICAgLy8gT3RoZXIgbWV0
aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIHZpcnR1YWwgYm9vbCBpc1JlYWRPbmx5KCkgeyBy
ZXR1cm4gZmFsc2U7IH0KLX07Ci0KIH07IC8vbmFtZXNwYWNlCiAjZW5kaWYKSW5kZXg6IGtodG1s
L3htbC9kb21feG1saW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9kb21feG1saW1wbC5o
CShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL3htbC9kb21feG1saW1wbC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0yMyw4ICsyMyw4IEBACiAjaWZuZGVmIF9ET01fWG1sSW1wbF9oXwogI2RlZmluZSBf
RE9NX1htbEltcGxfaF8KIAorI2luY2x1ZGUgIkNvbnRhaW5lck5vZGVJbXBsLmgiCiAjaW5jbHVk
ZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgog
I2luY2x1ZGUgIm1pc2MvbG9hZGVyX2NsaWVudC5oIgogCiBuYW1lc3BhY2Uga2h0bWwgewpJbmRl
eDoga2h0bWwveG1sL0RvY3VtZW50RnJhZ21lbnRJbXBsLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
eG1sL0RvY3VtZW50RnJhZ21lbnRJbXBsLmgJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwveG1s
L0RvY3VtZW50RnJhZ21lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTI1LDcgKzI1LDcgQEAK
ICNpZm5kZWYgRE9NX0RvY3VtZW50RnJhZ21lbnRJbXBsX2gKICNkZWZpbmUgRE9NX0RvY3VtZW50
RnJhZ21lbnRJbXBsX2gKIAotI2luY2x1ZGUgImRvbV9ub2RlaW1wbC5oIgorI2luY2x1ZGUgIkNv
bnRhaW5lck5vZGVJbXBsLmgiCiAKIG5hbWVzcGFjZSBET00gewogCkluZGV4OiBraHRtbC94bWwv
eG1sX3Rva2VuaXplci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL3htbF90b2tlbml6ZXIu
Y3BwCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL3htbC94bWxfdG9rZW5pemVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgInhtbC9kb21fZWxlbWVudGlt
cGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV94
bWxpbXBsLmgiCisjaW5jbHVkZSAiZG9tX25vZGUuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfaGVh
ZGltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfdGFibGVpbXBsLmgiCiAjaW5jbHVkZSAiaHRt
bG5hbWVzLmgiCkluZGV4OiBraHRtbC9lZGl0aW5nL3Zpc2libGVfdGV4dC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2h0bWwvZWRpdGluZy92aXNpYmxlX3RleHQuY3BwCShyZXZpc2lvbiAxMjA4NikKKysr
IGtodG1sL2VkaXRpbmcvdmlzaWJsZV90ZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNyAr
MjksNiBAQAogCiAjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCiAjaW5jbHVkZSAiSW5saW5lVGV4dEJv
eC5oIgotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3Bv
c2l0aW9uLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfcmFuZ2VpbXBsLmgiCiAjaW5jbHVkZSAiRG9j
dW1lbnRJbXBsLmgiCkluZGV4OiBraHRtbC9lZGl0aW5nL2luc2VydF9ub2RlX2JlZm9yZV9jb21t
YW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL2luc2VydF9ub2RlX2JlZm9yZV9j
b21tYW5kLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRtbC9lZGl0aW5nL2luc2VydF9ub2Rl
X2JlZm9yZV9jb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsNiBAQAogI2lu
Y2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImluc2VydF9ub2RlX2JlZm9yZV9jb21tYW5kLmgi
CiAKLSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAKICNpbmNsdWRlIDxreG1sY29yZS9B
c3NlcnRpb25zLmg+CiAKSW5kZXg6IGtodG1sL2VkaXRpbmcvcmVtb3ZlX25vZGVfcHJlc2Vydmlu
Z19jaGlsZHJlbl9jb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL3JlbW92
ZV9ub2RlX3ByZXNlcnZpbmdfY2hpbGRyZW5fY29tbWFuZC5jcHAJKHJldmlzaW9uIDEyMDg2KQor
Kysga2h0bWwvZWRpdGluZy9yZW1vdmVfbm9kZV9wcmVzZXJ2aW5nX2NoaWxkcmVuX2NvbW1hbmQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgi
CiAjaW5jbHVkZSAicmVtb3ZlX25vZGVfcHJlc2VydmluZ19jaGlsZHJlbl9jb21tYW5kLmgiCiAK
LSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAKICNpbmNsdWRlIDxreG1sY29yZS9Bc3Nl
cnRpb25zLmg+CiAKSW5kZXg6IGtodG1sL2VkaXRpbmcvdmlzaWJsZV9wb3NpdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy92aXNpYmxlX3Bvc2l0aW9uLmNwcAkocmV2aXNpb24g
MTIwODYpCisrKyBraHRtbC9lZGl0aW5nL3Zpc2libGVfcG9zaXRpb24uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgogI2luY2x1
ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb20yX3JhbmdlaW1wbC5oIgotI2lu
Y2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgi
CiAKICNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CkluZGV4OiBraHRtbC9lZGl0aW5n
L3JlbW92ZV9ub2RlX2F0dHJpYnV0ZV9jb21tYW5kLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvZWRp
dGluZy9yZW1vdmVfbm9kZV9hdHRyaWJ1dGVfY29tbWFuZC5oCShyZXZpc2lvbiAxMjA4NikKKysr
IGtodG1sL2VkaXRpbmcvcmVtb3ZlX25vZGVfYXR0cmlidXRlX2NvbW1hbmQuaAkod29ya2luZyBj
b3B5KQpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAiZWRpdF9jb21tYW5kLmgiCiAKLSNp
bmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAiZG9tX3FuYW1lLmgiCiAKIG5h
bWVzcGFjZSBraHRtbCB7CkluZGV4OiBraHRtbC9lZGl0aW5nL3JlbW92ZV9ub2RlX2NvbW1hbmQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvcmVtb3ZlX25vZGVfY29tbWFuZC5jcHAJ
KHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvZWRpdGluZy9yZW1vdmVfbm9kZV9jb21tYW5kLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgInJlbW92ZV9ub2RlX2NvbW1hbmQuaCIKIAotI2luY2x1ZGUgInhtbC9kb21fbm9k
ZWltcGwuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KIApJbmRleDoga2h0
bWwvZWRpdGluZy9odG1sZWRpdGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy9o
dG1sZWRpdGluZy5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvZWRpdGluZy9odG1sZWRp
dGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlICJjc3Nw
cm9wZXJ0aWVzLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiZG9tX2Vs
ZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAiZG9tX3Bv
c2l0aW9uLmgiCiAjaW5jbHVkZSAiZG9tX3N0cmluZ2ltcGwuaCIKICNpbmNsdWRlICJkb21fdGV4
dGltcGwuaCIKSW5kZXg6IGtodG1sL2VkaXRpbmcvU2VsZWN0aW9uQ29udHJvbGxlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy9TZWxlY3Rpb25Db250cm9sbGVyLmNwcAkocmV2aXNp
b24gMTIwODYpCisrKyBraHRtbC9lZGl0aW5nL1NlbGVjdGlvbkNvbnRyb2xsZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgog
I2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fZWxlbWVudGltcGwu
aCIKLSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV90ZXh0
aW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb20yX3JhbmdlaW1wbC5oIgogCkluZGV4OiBraHRtbC9l
ZGl0aW5nL2FwcGVuZF9ub2RlX2NvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRp
bmcvYXBwZW5kX25vZGVfY29tbWFuZC5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvZWRp
dGluZy9hcHBlbmRfbm9kZV9jb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYs
NiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImFwcGVuZF9ub2RlX2NvbW1hbmQu
aCIKIAotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3Jl
L0Fzc2VydGlvbnMuaD4KIApJbmRleDoga2h0bWwvZWRpdGluZy9odG1sZWRpdGluZy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvaHRtbGVkaXRpbmcuaAkocmV2aXNpb24gMTIwODYpCisr
KyBraHRtbC9lZGl0aW5nL2h0bWxlZGl0aW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTM0LDcgKzM0
LDYgQEAKICNpbmNsdWRlICJyZXBsYWNlX3NlbGVjdGlvbl9jb21tYW5kLmgiCiAjaW5jbHVkZSAi
dHlwaW5nX2NvbW1hbmQuaCIKIAotI2luY2x1ZGUgImRvbV9ub2RlaW1wbC5oIgogI2luY2x1ZGUg
ImVkaXRpbmcvZWRpdF9hY3Rpb25zLmgiCiAjaW5jbHVkZSAicW1hcC5oIgogI2luY2x1ZGUgInFw
dHJsaXN0LmgiCkluZGV4OiBraHRtbC9lZGl0aW5nL3NldF9ub2RlX2F0dHJpYnV0ZV9jb21tYW5k
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy9zZXRfbm9kZV9hdHRyaWJ1dGVfY29tbWFu
ZC5oCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL2VkaXRpbmcvc2V0X25vZGVfYXR0cmlidXRl
X2NvbW1hbmQuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAi
ZWRpdF9jb21tYW5kLmgiCiAKLSNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVk
ZSAiZG9tX3FuYW1lLmgiCiAKIG5hbWVzcGFjZSBraHRtbCB7CkluZGV4OiBraHRtbC9raHRtbF9l
dmVudHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2todG1sX2V2ZW50cy5jcHAJKHJldmlzaW9u
IDEyMDg2KQorKysga2h0bWwva2h0bWxfZXZlbnRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjAs
NyArMjAsNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImtodG1sX2V2ZW50cy5o
IgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfb2JqZWN0LmgiCi0jaW5jbHVkZSAieG1sL2Rv
bV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fcG9zaXRpb24uaCIKIAogdXNpbmcgbmFt
ZXNwYWNlIERPTTsKSW5kZXg6IGtodG1sL2h0bWwvaHRtbF9oZWFkaW1wbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2h0bWwvaHRtbC9odG1sX2hlYWRpbXBsLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBr
aHRtbC9odG1sL2h0bWxfaGVhZGltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3
IEBACiAjaW5jbHVkZSAiaHRtbC9odG1sX2RvY3VtZW50aW1wbC5oIgogI2luY2x1ZGUgInhtbC9k
b21fdGV4dGltcGwuaCIKICNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgImRv
bV9ub2RlLmgiCiAKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgImtqc19wcm94eS5oIgpJ
bmRleDoga2h0bWwvaHRtbC9odG1scGFyc2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9odG1s
L2h0bWxwYXJzZXIuY3BwCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL2h0bWwvaHRtbHBhcnNl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlICJIVE1MSXNJ
bmRleEVsZW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiaHRtbGZhY3RvcnkuaCIKICNpbmNsdWRlICJ4
bWwvZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgogI2luY2x1
ZGUgIkRvY3VtZW50RnJhZ21lbnRJbXBsLmgiCiAjaW5jbHVkZSA8a3htbGNvcmUvSGFzaFNldC5o
PgogI2luY2x1ZGUgImh0bWwvaHRtbHRva2VuaXplci5oIgpJbmRleDoga2h0bWwvaHRtbC9IVE1M
T3B0aW9uRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTE9wdGlv
bkVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRtbC9odG1sL0hUTUxPcHRp
b25FbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNs
dWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJkb21fdGV4dGltcGwuaCIKICNpbmNsdWRl
ICJkb21fZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZG9tX25vZGUuaCIKIAogdXNpbmcgbmFtZXNw
YWNlIGtodG1sOwogCkluZGV4OiBraHRtbC9lY21hL2tqc190cmF2ZXJzYWwuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIGtodG1sL2VjbWEva2pzX3RyYXZlcnNhbC5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysg
a2h0bWwvZWNtYS9ranNfdHJhdmVyc2FsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsMTYgKzIz
LDEyIEBACiAKICNpbmNsdWRlICJranNfcHJveHkuaCIKICNpbmNsdWRlICJEb2N1bWVudEltcGwu
aCIKLSNpbmNsdWRlIDx4bWwvZG9tX25vZGVpbXBsLmg+CiAjaW5jbHVkZSAiZG9tMl90cmF2ZXJz
YWxpbXBsLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlIDxrZGVidWcuaD4KICNpbmNs
dWRlIDxranMvcHJvdGVjdC5oPgogCi11c2luZyBET006Ok5vZGVGaWx0ZXJJbXBsOwotdXNpbmcg
RE9NOjpOb2RlSW1wbDsKLXVzaW5nIERPTTo6Tm9kZUl0ZXJhdG9ySW1wbDsKLXVzaW5nIERPTTo6
VHJlZVdhbGtlckltcGw7Cit1c2luZyBuYW1lc3BhY2UgRE9NOwogCiBuYW1lc3BhY2UgS0pTIHsK
IApJbmRleDoga2h0bWwvZWNtYS9ranNfaHRtbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvZWNt
YS9ranNfaHRtbC5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvZWNtYS9ranNfaHRtbC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJ4bWwvZG9tX2F0
b21pY3N0cmluZy5oIgogI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKIAorI2luY2x1
ZGUgIk5hbWVOb2RlTGlzdEltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCiAj
aW5jbHVkZSAieG1sL0V2ZW50TmFtZXMuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfYmFzZWltcGwu
aCIKSW5kZXg6IGtodG1sL2VjbWEva2pzX2V2ZW50cy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
ZWNtYS9ranNfZXZlbnRzLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRtbC9lY21hL2tqc19l
dmVudHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAia2pz
X3dpbmRvdy5oIgogI2luY2x1ZGUgImtqc192aWV3cy5oIgogI2luY2x1ZGUgImtqc19wcm94eS5o
IgotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJEb2N1bWVudEltcGwu
aCIKICNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJf
dmlld3NpbXBsLmgiCkluZGV4OiBraHRtbC9lY21hL2tqc19iaW5kaW5nLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBraHRtbC9lY21hL2tqc19iaW5kaW5nLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRt
bC9lY21hL2tqc19iaW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzUsNyArMzUsNiBAQAog
I2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiZG9tL2RvbTJfZXZlbnRz
LmgiCiAjaW5jbHVkZSAiZG9tL2RvbTJfcmFuZ2UuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX25vZGVp
bXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgogI2luY2x1ZGUgInhtbC9F
dmVudE5hbWVzLmgiCiAjaW5jbHVkZSAiZG9tL2Nzc19zdHlsZXNoZWV0LmgiCkluZGV4OiBraHRt
bC9lY21hL2tqc19kb20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VjbWEva2pzX2RvbS5jcHAJ
KHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvZWNtYS9ranNfZG9tLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKICNp
bmNsdWRlICJ4bWwvZG9tMl92aWV3c2ltcGwuaCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVy
X2NhbnZhcy5oIgotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJEb2N1
bWVudFR5cGVJbXBsLmgiCiAjaW5jbHVkZSAiRE9NSW1wbGVtZW50YXRpb25JbXBsLmgiCiAjaW5j
bHVkZSAiRG9jdW1lbnRGcmFnbWVudEltcGwuaCIKSW5kZXg6IGtodG1sL2VjbWEva2pzX2RvbS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtodG1sL2VjbWEva2pzX2RvbS5oCShyZXZpc2lvbiAxMjA4NikKKysr
IGtodG1sL2VjbWEva2pzX2RvbS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsyMiw2IEBACiAj
ZGVmaW5lIEtKU19ET01fSAogCiAjaW5jbHVkZSAia2pzX2JpbmRpbmcuaCIKLSNpbmNsdWRlICJk
b21fbm9kZWltcGwuaCIKIAogI2luY2x1ZGUgPHF2YWx1ZWxpc3QuaD4KICNpbmNsdWRlICJtaXNj
L3NoYXJlZC5oIgpAQCAtMzksNiArMzgsNyBAQCBuYW1lc3BhY2UgRE9NIHsKICAgICBjbGFzcyBO
b3RhdGlvbkltcGw7CiAgICAgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDsKICAgICBj
bGFzcyBUZXh0SW1wbDsKKyAgICBjbGFzcyBOb2RlTGlzdEltcGw7CiB9CiAKIG5hbWVzcGFjZSBL
SlMgewpJbmRleDoga2h0bWwveHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGtodG1sL3hzbC94c2x0X3Byb2Nlc3NvcmltcGwuaAkocmV2aXNpb24gMTIwODYpCisrKyBraHRt
bC94c2wveHNsdF9wcm9jZXNzb3JpbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDgg
QEAKIAogI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hNYXAuaD4KIAorY2xhc3MgS0hUTUxWaWV3Owor
CiBuYW1lc3BhY2UgRE9NIHsKIAogY2xhc3MgTm9kZUltcGw7CkluZGV4OiBraHRtbC94c2wveHNs
X3N0eWxlc2hlZXRpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94c2wveHNsX3N0eWxlc2hl
ZXRpbXBsLmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRtbC94c2wveHNsX3N0eWxlc2hlZXRp
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImRvbS9k
b21fc3RyaW5nLmgiCiAjaW5jbHVkZSAiZG9tL2RvbV9leGNlcHRpb24uaCIKIAotI2luY2x1ZGUg
InhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgi
CiAjaW5jbHVkZSAibWlzYy9sb2FkZXIuaCIKICNpbmNsdWRlICJDYWNoZWRYU0xTdHlsZVNoZWV0
LmgiCkluZGV4OiBraHRtbC9jc3MvY3NzX3ZhbHVlaW1wbC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0
bWwvY3NzL2Nzc192YWx1ZWltcGwuY3BwCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1sL2Nzcy9j
c3NfdmFsdWVpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1
ZGUgInhtbC9kb21fc3RyaW5naW1wbC5oIgogI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2lu
Y2x1ZGUgImh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgorI2luY2x1ZGUgIm1pc2MvaGVscGVyLmgi
CiAKICNpbmNsdWRlICJDYWNoZS5oIgogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCkluZGV4OiBr
aHRtbC9jc3MvY3NzX3ZhbHVlaW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2Nzcy9jc3NfdmFs
dWVpbXBsLmgJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvY3NzL2Nzc192YWx1ZWltcGwuaAko
d29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBjbGFzcyBDb3VudGVySW1wbDsKIGNsYXNz
IERhc2hib2FyZFJlZ2lvbkltcGw7CiBjbGFzcyBSZWN0SW1wbDsKIGNsYXNzIFBhaXJJbXBsOwor
Y2xhc3MgTm9kZUltcGw7CiAKIGV4dGVybiBjb25zdCBpbnQgaW5oZXJpdGFibGVQcm9wZXJ0aWVz
W107CiBleHRlcm4gY29uc3QgdW5zaWduZWQgbnVtSW5oZXJpdGFibGVQcm9wZXJ0aWVzOwpJbmRl
eDoga2h0bWwvY3NzL2Nzc19zdHlsZXNoZWV0aW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
Y3NzL2Nzc19zdHlsZXNoZWV0aW1wbC5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvY3Nz
L2Nzc19zdHlsZXNoZWV0aW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcgKzM1LDYgQEAK
ICNpbmNsdWRlICJjc3MvY3NzcGFyc2VyLmgiCiAjaW5jbHVkZSAiY3NzL2Nzc19zdHlsZXNoZWV0
aW1wbC5oIgogCi0jaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgImh0bWwv
aHRtbF9kb2N1bWVudGltcGwuaCIKICNpbmNsdWRlICJtaXNjL2xvYWRlci5oIgogCkluZGV4OiBr
aHRtbC9jc3MvY3NzX2Jhc2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9jc3MvY3NzX2Jhc2UuaAko
cmV2aXNpb24gMTIwODYpCisrKyBraHRtbC9jc3MvY3NzX2Jhc2UuaAkod29ya2luZyBjb3B5KQpA
QCAtMjUsNyArMjUsNiBAQAogI2RlZmluZSBDU1NfQkFTRV9ICiAKICNpbmNsdWRlICJkb20vZG9t
X3N0cmluZy5oIgotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJkb21f
cW5hbWUuaCIKICNpbmNsdWRlICJtaXNjL3NoYXJlZC5oIgogI2luY2x1ZGUgPHFkYXRldGltZS5o
PgpJbmRleDoga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9saW5lLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC9yZW5kZXJpbmcvcmVuZGVyX2xpbmUuY3BwCShyZXZpc2lvbiAxMjA4NikKKysrIGtodG1s
L3JlbmRlcmluZy9yZW5kZXJfbGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDcgKzI5LDYg
QEAKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2Zsb3cuaCIKICNpbmNsdWRlICJJbmxpbmVU
ZXh0Qm94LmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl90YWJsZS5oIgotI2luY2x1ZGUg
InhtbC9kb21fbm9kZWltcGwuaCIKICNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRl
ICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgInJlbmRlcl9pbmxpbmUuaCIKSW5kZXg6IGtodG1s
L3JlbmRlcmluZy9yZW5kZXJfYm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcv
cmVuZGVyX2JveC5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvcmVuZGVyaW5nL3JlbmRl
cl9ib3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAicmVu
ZGVyX2FyZW5hLmgiCiAjaW5jbHVkZSAicmVuZGVyX3RoZW1lLmgiCiAKLSNpbmNsdWRlICJ4bWwv
ZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiaHRt
bC9odG1sX2VsZW1lbnRpbXBsLmgiCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKSW5kZXg6IGto
dG1sL3JlbmRlcmluZy9yZW5kZXJfZmxvdy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVuZGVy
aW5nL3JlbmRlcl9mbG93LmNwcAkocmV2aXNpb24gMTIwODYpCisrKyBraHRtbC9yZW5kZXJpbmcv
cmVuZGVyX2Zsb3cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVk
ZSAiSW5saW5lVGV4dEJveC5oIgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfdGFibGUuaCIK
ICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2NhbnZhcy5oIgotI2luY2x1ZGUgInhtbC9kb21f
bm9kZWltcGwuaCIKICNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJyZW5kZXJf
aW5saW5lLmgiCiAjaW5jbHVkZSAicmVuZGVyX2Jsb2NrLmgiCkluZGV4OiBraHRtbC9yZW5kZXJp
bmcvcmVuZGVyX29iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9yZW5kZXJf
b2JqZWN0LmgJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9vYmpl
Y3QuaAkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgIkZsb2F0UmVj
dC5oIgogI2luY2x1ZGUgPHFwdHJkaWN0Lmg+CiAKLSNpbmNsdWRlICJkb21fbm9kZWltcGwuaCIK
KyNpbmNsdWRlICJOb2RlSW1wbC5oIgogI2luY2x1ZGUgImVkaXRpbmcvdGV4dF9hZmZpbml0eS5o
IgogI2luY2x1ZGUgIm1pc2Mva2h0bWxsYXlvdXQuaCIKICNpbmNsdWRlICJtaXNjL2xvYWRlcl9j
bGllbnQuaCIKSW5kZXg6IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfZnJhbWVzLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9mcmFtZXMuaAkocmV2aXNpb24gMTIwODYpCisr
KyBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2ZyYW1lcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw3
ICsyNSw2IEBACiAKICNpbmNsdWRlICJyZW5kZXJfY29udGFpbmVyLmgiCiAjaW5jbHVkZSAicmVu
ZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5oIgotI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIK
ICNpbmNsdWRlICJodG1sL2h0bWxfYmFzZWltcGwuaCIKIGNsYXNzIEtIVE1MVmlldzsKIApJbmRl
eDoga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9ibG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
cmVuZGVyaW5nL3JlbmRlcl9ibG9jay5jcHAJKHJldmlzaW9uIDEyMDg2KQorKysga2h0bWwvcmVu
ZGVyaW5nL3JlbmRlcl9ibG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDYgQEAK
ICNpbmNsdWRlICJSZW5kZXJUZXh0RnJhZ21lbnQuaCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVu
ZGVyX3RhYmxlLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9jYW52YXMuaCIKLSNpbmNs
dWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5j
bHVkZSAieG1sL2RvbV9wb3NpdGlvbi5oIgogI2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgpJbmRl
eDogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTIwODYpCisrKyBXZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE2NCw3ICsxNjQs
NiBAQAogCQk5M0YxOTkxOTA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tMl90cmF2ZXJzYWxpbXBsLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDMwNjAy
REU0NDc2MDE4NjM1Q0EgLyogZG9tMl90cmF2ZXJzYWxpbXBsLmggKi87IH07CiAJCTkzRjE5OTFB
MDgyNDVFNTkwMDFFOUFCQyAvKiBkb20yX3ZpZXdzaW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QzMDgwMkRFNDQ3NjAxODYzNUNBIC8qIGRv
bTJfdmlld3NpbXBsLmggKi87IH07CiAJCTkzRjE5OTFDMDgyNDVFNTkwMDFFOUFCQyAvKiBkb21f
ZWxlbWVudGltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEY1MjNEMkY4MDJERTQ0NzYwMTg2MzVDQSAvKiBkb21fZWxlbWVudGltcGwuaCAqLzsgfTsK
LQkJOTNGMTk5MUQwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9ub2RlaW1wbC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyRkEwMkRFNDQ3NjAxODYz
NUNBIC8qIGRvbV9ub2RlaW1wbC5oICovOyB9OwogCQk5M0YxOTkxRTA4MjQ1RTU5MDAxRTlBQkMg
LyogZG9tX3N0cmluZ2ltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEY1MjNEMkZDMDJERTQ0NzYwMTg2MzVDQSAvKiBkb21fc3RyaW5naW1wbC5oICov
OyB9OwogCQk5M0YxOTkxRjA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX3RleHRpbXBsLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGRTAyREU0NDc2
MDE4NjM1Q0EgLyogZG9tX3RleHRpbXBsLmggKi87IH07CiAJCTkzRjE5OTIwMDgyNDVFNTkwMDFF
OUFCQyAvKiBkb21feG1saW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gRjUyM0QzMDAwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV94bWxpbXBsLmggKi87
IH07CkBAIC00NjUsNyArNDY0LDYgQEAKIAkJOTNGMTlBQUYwODI0NUU1OTAwMUU5QUJDIC8qIHJl
bmRlcl9zdHlsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGNTIzRDJDMjAyREU0NDM4MDE4NjM1Q0EgLyogcmVuZGVyX3N0eWxlLmNwcCAqLzsgfTsK
IAkJOTNGMTlBQjAwODI0NUU1OTAwMUU5QUJDIC8qIHJlbmRlcl90YWJsZS5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJDNDAyREU0NDM4MDE4
NjM1Q0EgLyogcmVuZGVyX3RhYmxlLmNwcCAqLzsgfTsKIAkJOTNGMTlBQjMwODI0NUU1OTAwMUU5
QUJDIC8qIGRvbV9lbGVtZW50aW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGNzAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRp
bXBsLmNwcCAqLzsgfTsKLQkJOTNGMTlBQjQwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9ub2RlaW1w
bC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIz
RDJGOTAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX25vZGVpbXBsLmNwcCAqLzsgfTsKIAkJOTNGMTlB
QjUwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9zdHJpbmdpbXBsLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMkZCMDJERTQ0NzYwMTg2MzVDQSAv
KiBkb21fc3RyaW5naW1wbC5jcHAgKi87IH07CiAJCTkzRjE5QUI2MDgyNDVFNTkwMDFFOUFCQyAv
KiBkb21fdGV4dGltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRjUyM0QyRkQwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV90ZXh0aW1wbC5jcHAgKi87
IH07CiAJCTkzRjE5QUI3MDgyNDVFNTkwMDFFOUFCQyAvKiBkb21feG1saW1wbC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGRjAyREU0NDc2
MDE4NjM1Q0EgLyogZG9tX3htbGltcGwuY3BwICovOyB9OwpAQCAtNjc1LDYgKzY3MywyOCBAQAog
CQlBODE4NUY0NjA5NzY1NzY2MDA1ODI2RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBsLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjM2MDk3
NjU3NjUwMDU4MjZEOSAvKiBET01JbXBsZW1lbnRhdGlvbkltcGwuY3BwICovOyB9OwogCQlBODE4
NUY0NzA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRGcmFnbWVudEltcGwuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODVGMzcwOTc2NTc2NTAw
NTgyNkQ5IC8qIERvY3VtZW50RnJhZ21lbnRJbXBsLmNwcCAqLzsgfTsKIAkJQTgxODVGNDgwOTc2
NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODVGMzgwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50
SW1wbC5oICovOyB9OworCQlBODE4NzIxQjA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUxpc3RJbXBs
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIx
MDA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUxpc3RJbXBsLmggKi87IH07CisJCUE4MTg3MjFDMDk3
N0QzQzAwMDU4MjZEOSAvKiBDb250YWluZXJOb2RlSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTEwOTc3RDNDMDAwNTgyNkQ5IC8qIENv
bnRhaW5lck5vZGVJbXBsLmggKi87IH07CisJCUE4MTg3MjFEMDk3N0QzQzAwMDU4MjZEOSAvKiBO
b2RlSW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBBODE4NzIxMjA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUltcGwuY3BwICovOyB9OworCQlBODE4
NzIxRTA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0SW1wbC5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTMwOTc3RDNDMDAwNTgyNkQ5
IC8qIE5hbWVOb2RlTGlzdEltcGwuaCAqLzsgfTsKKwkJQTgxODcyMUYwOTc3RDNDMDAwNTgyNkQ5
IC8qIENvbnRhaW5lck5vZGVJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEE4MTg3MjE0MDk3N0QzQzAwMDU4MjZEOSAvKiBDb250YWluZXJOb2Rl
SW1wbC5jcHAgKi87IH07CisJCUE4MTg3MjIwMDk3N0QzQzAwMDU4MjZEOSAvKiBDaGlsZE5vZGVM
aXN0SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTgxODcyMTUwOTc3RDNDMDAwNTgyNkQ5IC8qIENoaWxkTm9kZUxpc3RJbXBsLmggKi87IH07CisJ
CUE4MTg3MjIxMDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlTGlzdEltcGwuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTYwOTc3RDNDMDAwNTgy
NkQ5IC8qIE5vZGVMaXN0SW1wbC5jcHAgKi87IH07CisJCUE4MTg3MjIyMDk3N0QzQzAwMDU4MjZE
OSAvKiBOb2RlSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQTgxODcyMTcwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVJbXBsLmggKi87IH07CisJCUE4
MTg3MjIzMDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1lZE5vZGVNYXBJbXBsLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxODA5NzdEM0MwMDA1ODI2
RDkgLyogTmFtZWROb2RlTWFwSW1wbC5oICovOyB9OworCQlBODE4NzIyNDA5NzdEM0MwMDA1ODI2
RDkgLyogTmFtZU5vZGVMaXN0SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxOTA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0
SW1wbC5jcHAgKi87IH07CisJCUE4MTg3MjI1MDk3N0QzQzAwMDU4MjZEOSAvKiBDaGlsZE5vZGVM
aXN0SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBBODE4NzIxQTA5NzdEM0MwMDA1ODI2RDkgLyogQ2hpbGROb2RlTGlzdEltcGwuY3BwICovOyB9
OworCQlBODE4NzIyNjA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUxpc3RJbXBsLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxMDA5NzdEM0MwMDA1
ODI2RDkgLyogTm9kZUxpc3RJbXBsLmggKi87IH07CisJCUE4MTg3MjI3MDk3N0QzQzAwMDU4MjZE
OSAvKiBDb250YWluZXJOb2RlSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQTgxODcyMTEwOTc3RDNDMDAwNTgyNkQ5IC8qIENvbnRhaW5lck5vZGVJ
bXBsLmggKi87IH07CisJCUE4MTg3MjI4MDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlSW1wbC5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxMjA5
NzdEM0MwMDA1ODI2RDkgLyogTm9kZUltcGwuY3BwICovOyB9OworCQlBODE4NzIyOTA5NzdEM0Mw
MDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTMwOTc3RDNDMDAwNTgyNkQ5IC8qIE5hbWVOb2Rl
TGlzdEltcGwuaCAqLzsgfTsKKwkJQTgxODcyMkEwOTc3RDNDMDAwNTgyNkQ5IC8qIENvbnRhaW5l
ck5vZGVJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEE4MTg3MjE0MDk3N0QzQzAwMDU4MjZEOSAvKiBDb250YWluZXJOb2RlSW1wbC5jcHAgKi87
IH07CisJCUE4MTg3MjJCMDk3N0QzQzAwMDU4MjZEOSAvKiBDaGlsZE5vZGVMaXN0SW1wbC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTUwOTc3
RDNDMDAwNTgyNkQ5IC8qIENoaWxkTm9kZUxpc3RJbXBsLmggKi87IH07CisJCUE4MTg3MjJDMDk3
N0QzQzAwMDU4MjZEOSAvKiBOb2RlTGlzdEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTYwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVM
aXN0SW1wbC5jcHAgKi87IH07CisJCUE4MTg3MjJEMDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlSW1w
bC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcy
MTcwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVJbXBsLmggKi87IH07CisJCUE4MTg3MjJFMDk3N0Qz
QzAwMDU4MjZEOSAvKiBOYW1lZE5vZGVNYXBJbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxODA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZWRO
b2RlTWFwSW1wbC5oICovOyB9OworCQlBODE4NzIyRjA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZU5v
ZGVMaXN0SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBODE4NzIxOTA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0SW1wbC5jcHAgKi87
IH07CisJCUE4MTg3MjMwMDk3N0QzQzAwMDU4MjZEOSAvKiBDaGlsZE5vZGVMaXN0SW1wbC5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxQTA5
NzdEM0MwMDA1ODI2RDkgLyogQ2hpbGROb2RlTGlzdEltcGwuY3BwICovOyB9OwogCQlBODJCOENB
QzA5NzEyQzJDMDAyN0UzREUgLyogUmVuZGVyVGV4dEZyYWdtZW50LmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODJCOENBNjA5NzEyQzJDMDAyN0UzREUg
LyogUmVuZGVyVGV4dEZyYWdtZW50LmggKi87IH07CiAJCUE4MkI4Q0FEMDk3MTJDMkMwMDI3RTNE
RSAvKiBSZW5kZXJUZXh0RnJhZ21lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQTgyQjhDQTcwOTcxMkMyQzAwMjdFM0RFIC8qIFJlbmRlclRleHRG
cmFnbWVudC5jcHAgKi87IH07CiAJCUE4MkI4Q0FFMDk3MTJDMkMwMDI3RTNERSAvKiBSZW5kZXJU
ZXh0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODJC
OENBODA5NzEyQzJDMDAyN0UzREUgLyogUmVuZGVyVGV4dC5oICovOyB9OwpAQCAtNzYyLDcgKzc4
Miw2IEBACiAJCUE4OEFEMTY0MDk1MjQ4MEEwMDFERDE5NiAvKiBkb20yX3RyYXZlcnNhbGltcGwu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMzA2
MDJERTQ0NzYwMTg2MzVDQSAvKiBkb20yX3RyYXZlcnNhbGltcGwuaCAqLzsgfTsKIAkJQTg4QUQx
NjUwOTUyNDgwQTAwMUREMTk2IC8qIGRvbTJfdmlld3NpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDMwODAyREU0NDc2MDE4NjM1Q0EgLyog
ZG9tMl92aWV3c2ltcGwuaCAqLzsgfTsKIAkJQTg4QUQxNjcwOTUyNDgwQTAwMUREMTk2IC8qIGRv
bV9lbGVtZW50aW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRjUyM0QyRjgwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVtZW50aW1wbC5oICovOyB9
OwotCQlBODhBRDE2ODA5NTI0ODBBMDAxREQxOTYgLyogZG9tX25vZGVpbXBsLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGQTAyREU0NDc2MDE4
NjM1Q0EgLyogZG9tX25vZGVpbXBsLmggKi87IH07CiAJCUE4OEFEMTY5MDk1MjQ4MEEwMDFERDE5
NiAvKiBkb21fc3RyaW5naW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gRjUyM0QyRkMwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9zdHJpbmdpbXBsLmgg
Ki87IH07CiAJCUE4OEFEMTZBMDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fdGV4dGltcGwuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMkZFMDJERTQ0
NzYwMTg2MzVDQSAvKiBkb21fdGV4dGltcGwuaCAqLzsgfTsKIAkJQTg4QUQxNkIwOTUyNDgwQTAw
MUREMTk2IC8qIGRvbV94bWxpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGNTIzRDMwMDAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX3htbGltcGwuaCAq
LzsgfTsKQEAgLTExMDUsNyArMTEyNCw2IEBACiAJCUE4OEFEMkYxMDk1MjQ4MEEwMDFERDE5NiAv
KiByZW5kZXJfc3R5bGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRjUyM0QyQzIwMkRFNDQzODAxODYzNUNBIC8qIHJlbmRlcl9zdHlsZS5jcHAgKi87
IH07CiAJCUE4OEFEMkYyMDk1MjQ4MEEwMDFERDE5NiAvKiByZW5kZXJfdGFibGUuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyQzQwMkRFNDQz
ODAxODYzNUNBIC8qIHJlbmRlcl90YWJsZS5jcHAgKi87IH07CiAJCUE4OEFEMkY1MDk1MjQ4MEEw
MDFERDE5NiAvKiBkb21fZWxlbWVudGltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyRjcwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVt
ZW50aW1wbC5jcHAgKi87IH07Ci0JCUE4OEFEMkY2MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fbm9k
ZWltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
RjUyM0QyRjkwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9ub2RlaW1wbC5jcHAgKi87IH07CiAJCUE4
OEFEMkY3MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fc3RyaW5naW1wbC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGQjAyREU0NDc2MDE4NjM1
Q0EgLyogZG9tX3N0cmluZ2ltcGwuY3BwICovOyB9OwogCQlBODhBRDJGODA5NTI0ODBBMDAxREQx
OTYgLyogZG9tX3RleHRpbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEY1MjNEMkZEMDJERTQ0NzYwMTg2MzVDQSAvKiBkb21fdGV4dGltcGwuY3Bw
ICovOyB9OwogCQlBODhBRDJGOTA5NTI0ODBBMDAxREQxOTYgLyogZG9tX3htbGltcGwuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyRkYwMkRF
NDQ3NjAxODYzNUNBIC8qIGRvbV94bWxpbXBsLmNwcCAqLzsgfTsKQEAgLTIwNjYsNiArMjA4NCwx
NyBAQAogCQlBODE4NUYzNjA5NzY1NzY1MDA1ODI2RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBs
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBET01JbXBsZW1lbnRh
dGlvbkltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBODE4NUYzNzA5NzY1
NzY1MDA1ODI2RDkgLyogRG9jdW1lbnRGcmFnbWVudEltcGwuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERvY3VtZW50RnJhZ21lbnRJbXBsLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTgxODVGMzgwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50
SW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRG9jdW1lbnRJbXBsLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTg3MjEwMDk3N0QzQzAwMDU4MjZEOSAv
KiBOb2RlTGlzdEltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5vZGVM
aXN0SW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODE4NzIxMTA5NzdEM0Mw
MDA1ODI2RDkgLyogQ29udGFpbmVyTm9kZUltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IENvbnRhaW5lck5vZGVJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4MTg3MjEyMDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlSW1wbC5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTm9kZUltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlBODE4NzIxMzA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0SW1w
bC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTmFtZU5vZGVMaXN0SW1wbC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODE4NzIxNDA5NzdEM0MwMDA1ODI2RDkg
LyogQ29udGFpbmVyTm9kZUltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IENvbnRhaW5lck5vZGVJbXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJQTgxODcyMTUwOTc3RDNDMDAwNTgyNkQ5IC8qIENoaWxkTm9kZUxpc3RJbXBsLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDaGlsZE5vZGVMaXN0SW1wbC5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQlBODE4NzIxNjA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUxp
c3RJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBOb2RlTGlz
dEltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODE4NzIxNzA5NzdEM0Mw
MDA1ODI2RDkgLyogTm9kZUltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IE5vZGVJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTg3MjE4MDk3N0Qz
QzAwMDU4MjZEOSAvKiBOYW1lZE5vZGVNYXBJbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBOYW1lZE5vZGVNYXBJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4MTg3MjE5MDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1lTm9kZUxpc3RJbXBsLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBOYW1lTm9kZUxpc3RJbXBsLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxODcyMUEwOTc3RDNDMDAwNTgyNkQ5IC8q
IENoaWxkTm9kZUxpc3RJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBDaGlsZE5vZGVMaXN0SW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUE4MjMzNkIxMDk0QzIzQkUwMDg1QTI5NiAvKiBEYXRhUmVmLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRGF0YVJlZi5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJQTgyQjhDQTYwOTcx
MkMyQzAwMjdFM0RFIC8qIFJlbmRlclRleHRGcmFnbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gUmVuZGVyVGV4dEZyYWdtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCUE4MkI4Q0E3MDk3MTJDMkMwMDI3RTNERSAvKiBSZW5kZXJUZXh0RnJhZ21lbnQu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlclRleHRGcmFn
bWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNjYwLDggKzI2ODksNiBA
QAogCQlGNTIzRDJDNTAyREU0NDM4MDE4NjM1Q0EgLyogcmVuZGVyX3RhYmxlLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHJlbmRlcl90YWJsZS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsK
IAkJRjUyM0QyRjcwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVtZW50aW1wbC5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBkb21fZWxl
bWVudGltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNU
YWJzID0gMDsgfTsKIAkJRjUyM0QyRjgwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVtZW50aW1w
bC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRl
bnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBk
b21fZWxlbWVudGltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1
c2VzVGFicyA9IDA7IH07Ci0JCUY1MjNEMkY5MDJERTQ0NzYwMTg2MzVDQSAvKiBkb21fbm9kZWlt
cGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBp
bmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gZG9tX25vZGVpbXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGgg
PSA4OyB1c2VzVGFicyA9IDA7IH07Ci0JCUY1MjNEMkZBMDJERTQ0NzYwMTg2MzVDQSAvKiBkb21f
bm9kZWltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gZG9tX25vZGVpbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0g
ODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDJGQjAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX3N0
cmluZ2ltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gZG9tX3N0cmluZ2ltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0
YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRjUyM0QyRkMwMkRFNDQ3NjAxODYzNUNB
IC8qIGRvbV9zdHJpbmdpbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IGRvbV9zdHJpbmdpbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDJGRDAyREU0NDc2MDE4NjM1
Q0EgLyogZG9tX3RleHRpbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGRvbV90ZXh0aW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpAQCAtNDEwNyw4ICs0MTM0LDYg
QEAKIAkJCQlCQzNCMzY0NzA1QzlENUUyMDBFNDI5MDIgLyogZG9tX2F0b21pY3N0cmluZ2xpc3Qu
aCAqLywKIAkJCQlGNTIzRDJGNzAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmNw
cCAqLywKIAkJCQlGNTIzRDJGODAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmgg
Ki8sCi0JCQkJRjUyM0QyRjkwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9ub2RlaW1wbC5jcHAgKi8s
Ci0JCQkJRjUyM0QyRkEwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9ub2RlaW1wbC5oICovLAogCQkJ
CUJFOTFGQzhCMDYxMzM2NjYwMDVFMzc5MCAvKiBkb21fcG9zaXRpb24uaCAqLywKIAkJCQlCRTkx
RkM4QzA2MTMzNjY2MDA1RTM3OTAgLyogZG9tX3Bvc2l0aW9uLmNwcCAqLywKIAkJCQlGNTIzRDJG
QjAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX3N0cmluZ2ltcGwuY3BwICovLApAQCAtNDEzNSw2ICs0
MTYwLDE3IEBACiAJCQkJQTgxODVGMzgwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50SW1wbC5o
ICovLAogCQkJCUE4MTg1RjM3MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudEZyYWdtZW50SW1w
bC5jcHAgKi8sCiAJCQkJQTgxODVGMzUwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50RnJhZ21l
bnRJbXBsLmggKi8sCisJCQkJQTgxODcyMTYwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVMaXN0SW1w
bC5jcHAgKi8sCisJCQkJQTgxODcyMTAwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVMaXN0SW1wbC5o
ICovLAorCQkJCUE4MTg3MjE0MDk3N0QzQzAwMDU4MjZEOSAvKiBDb250YWluZXJOb2RlSW1wbC5j
cHAgKi8sCisJCQkJQTgxODcyMTEwOTc3RDNDMDAwNTgyNkQ5IC8qIENvbnRhaW5lck5vZGVJbXBs
LmggKi8sCisJCQkJQTgxODcyMTcwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVJbXBsLmggKi8sCisJ
CQkJQTgxODcyMTIwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVJbXBsLmNwcCAqLywKKwkJCQlBODE4
NzIxMzA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0SW1wbC5oICovLAorCQkJCUE4MTg3
MjFBMDk3N0QzQzAwMDU4MjZEOSAvKiBDaGlsZE5vZGVMaXN0SW1wbC5jcHAgKi8sCisJCQkJQTgx
ODcyMTUwOTc3RDNDMDAwNTgyNkQ5IC8qIENoaWxkTm9kZUxpc3RJbXBsLmggKi8sCisJCQkJQTgx
ODcyMTkwOTc3RDNDMDAwNTgyNkQ5IC8qIE5hbWVOb2RlTGlzdEltcGwuY3BwICovLAorCQkJCUE4
MTg3MjE4MDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1lZE5vZGVNYXBJbXBsLmggKi8sCiAJCQkpOwog
CQkJcGF0aCA9IHhtbDsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC00NDkyLDcgKzQ1
MjgsNiBAQAogCQkJCTkzRjE5OTE5MDgyNDVFNTkwMDFFOUFCQyAvKiBkb20yX3RyYXZlcnNhbGlt
cGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OTFBMDgyNDVFNTkwMDFFOUFCQyAvKiBkb20y
X3ZpZXdzaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5MUMwODI0NUU1OTAwMUU5QUJD
IC8qIGRvbV9lbGVtZW50aW1wbC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJOTNGMTk5MUQwODI0NUU1
OTAwMUU5QUJDIC8qIGRvbV9ub2RlaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5MUUw
ODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9zdHJpbmdpbXBsLmggaW4gSGVhZGVycyAqLywKIAkJCQk5
M0YxOTkxRjA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX3RleHRpbXBsLmggaW4gSGVhZGVycyAqLywK
IAkJCQk5M0YxOTkyMDA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX3htbGltcGwuaCBpbiBIZWFkZXJz
ICovLApAQCAtNDkyNyw2ICs0OTYyLDEyIEBACiAJCQkJQTgxODVGM0IwOTc2NTc2NjAwNTgyNkQ5
IC8qIERPTUltcGxlbWVudGF0aW9uSW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTgxODVGM0Qw
OTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50RnJhZ21lbnRJbXBsLmggaW4gSGVhZGVycyAqLywK
IAkJCQlBODE4NUY0MDA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRJbXBsLmggaW4gSGVhZGVy
cyAqLywKKwkJCQlBODE4NzIxQjA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUxpc3RJbXBsLmggaW4g
SGVhZGVycyAqLywKKwkJCQlBODE4NzIxQzA5NzdEM0MwMDA1ODI2RDkgLyogQ29udGFpbmVyTm9k
ZUltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg3MjFFMDk3N0QzQzAwMDU4MjZEOSAvKiBO
YW1lTm9kZUxpc3RJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODE4NzIyMDA5NzdEM0MwMDA1
ODI2RDkgLyogQ2hpbGROb2RlTGlzdEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg3MjIy
MDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlSW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgxODcy
MjMwOTc3RDNDMDAwNTgyNkQ5IC8qIE5hbWVkTm9kZU1hcEltcGwuaCBpbiBIZWFkZXJzICovLAog
CQkJCTY1NEVDNjExMDk3Nzc4RjUwMERBQjUyQyAvKiBXZWJDb3JlRnJhbWVCcmlkZ2UuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDRjFBNUYxMDk3ODM5NjAwMDYxQTEyMyAvKiBJbnRTaXplLmggaW4g
SGVhZGVycyAqLywKIAkJCQlCQzczRTI1RTA5Nzg2ODI3MDBFREZGOEEgLyogRmxvYXRTaXplLmgg
aW4gSGVhZGVycyAqLywKQEAgLTUwMTcsNyArNTA1OCw2IEBACiAJCQkJQTg4QUQxNjQwOTUyNDgw
QTAwMUREMTk2IC8qIGRvbTJfdHJhdmVyc2FsaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTg4
QUQxNjUwOTUyNDgwQTAwMUREMTk2IC8qIGRvbTJfdmlld3NpbXBsLmggaW4gSGVhZGVycyAqLywK
IAkJCQlBODhBRDE2NzA5NTI0ODBBMDAxREQxOTYgLyogZG9tX2VsZW1lbnRpbXBsLmggaW4gSGVh
ZGVycyAqLywKLQkJCQlBODhBRDE2ODA5NTI0ODBBMDAxREQxOTYgLyogZG9tX25vZGVpbXBsLmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBODhBRDE2OTA5NTI0ODBBMDAxREQxOTYgLyogZG9tX3N0cmlu
Z2ltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4OEFEMTZBMDk1MjQ4MEEwMDFERDE5NiAvKiBk
b21fdGV4dGltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4OEFEMTZCMDk1MjQ4MEEwMDFERDE5
NiAvKiBkb21feG1saW1wbC5oIGluIEhlYWRlcnMgKi8sCkBAIC01MjY2LDYgKzUzMDYsMTIgQEAK
IAkJCQlBODE4NUY0MzA5NzY1NzY2MDA1ODI2RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBsLmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBODE4NUY0NTA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRG
cmFnbWVudEltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4MTg1RjQ4MDk3NjU3NjYwMDU4MjZE
OSAvKiBEb2N1bWVudEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg3MjI2MDk3N0QzQzAw
MDU4MjZEOSAvKiBOb2RlTGlzdEltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg3MjI3MDk3
N0QzQzAwMDU4MjZEOSAvKiBDb250YWluZXJOb2RlSW1wbC5oIGluIEhlYWRlcnMgKi8sCisJCQkJ
QTgxODcyMjkwOTc3RDNDMDAwNTgyNkQ5IC8qIE5hbWVOb2RlTGlzdEltcGwuaCBpbiBIZWFkZXJz
ICovLAorCQkJCUE4MTg3MjJCMDk3N0QzQzAwMDU4MjZEOSAvKiBDaGlsZE5vZGVMaXN0SW1wbC5o
IGluIEhlYWRlcnMgKi8sCisJCQkJQTgxODcyMkQwOTc3RDNDMDAwNTgyNkQ5IC8qIE5vZGVJbXBs
LmggaW4gSGVhZGVycyAqLywKKwkJCQlBODE4NzIyRTA5NzdEM0MwMDA1ODI2RDkgLyogTmFtZWRO
b2RlTWFwSW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNGMUE1RjMwOTc4Mzk2MDAwNjFBMTIz
IC8qIEludFNpemUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDNzNFMjYwMDk3ODY4MjcwMEVERkY4
QSAvKiBGbG9hdFNpemUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDNzNFMzAzMDk3OEFGOUMwMEVE
RkY4QSAvKiBJbnRQb2ludEFycmF5LmggaW4gSGVhZGVycyAqLywKQEAgLTY0NzIsNyArNjUxOCw2
IEBACiAJCQkJOTNGMTlBQUYwODI0NUU1OTAwMUU5QUJDIC8qIHJlbmRlcl9zdHlsZS5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQk5M0YxOUFCMDA4MjQ1RTU5MDAxRTlBQkMgLyogcmVuZGVyX3RhYmxl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzRjE5QUIzMDgyNDVFNTkwMDFFOUFCQyAvKiBkb21f
ZWxlbWVudGltcGwuY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJOTNGMTlBQjQwODI0NUU1OTAwMUU5
QUJDIC8qIGRvbV9ub2RlaW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YxOUFCNTA4MjQ1
RTU5MDAxRTlBQkMgLyogZG9tX3N0cmluZ2ltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNG
MTlBQjYwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV90ZXh0aW1wbC5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk5M0YxOUFCNzA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX3htbGltcGwuY3BwIGluIFNvdXJj
ZXMgKi8sCkBAIC02Nzk4LDYgKzY4NDMsMTEgQEAKIAkJCQlBODE4NUYzQzA5NzY1NzY2MDA1ODI2
RDkgLyogRG9jdW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTg1RjNFMDk3NjU3
NjYwMDU4MjZEOSAvKiBET01JbXBsZW1lbnRhdGlvbkltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQTgxODVGM0YwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50RnJhZ21lbnRJbXBsLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCUE4MTg3MjFEMDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlSW1wbC5j
cHAgaW4gU291cmNlcyAqLywKKwkJCQlBODE4NzIxRjA5NzdEM0MwMDA1ODI2RDkgLyogQ29udGFp
bmVyTm9kZUltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgxODcyMjEwOTc3RDNDMDAwNTgy
NkQ5IC8qIE5vZGVMaXN0SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODE4NzIyNDA5NzdE
M0MwMDA1ODI2RDkgLyogTmFtZU5vZGVMaXN0SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlB
ODE4NzIyNTA5NzdEM0MwMDA1ODI2RDkgLyogQ2hpbGROb2RlTGlzdEltcGwuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJNjU0RUM2MTIwOTc3NzhGNTAwREFCNTJDIC8qIFdlYkNvcmVGcmFtZUJyaWRn
ZS5tbSBpbiBTb3VyY2VzICovLAogCQkJCUJDRjFBNjFDMDk3ODNCREQwMDYxQTEyMyAvKiBJbnRT
aXplLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDNzNFMjEzMDk3ODU0NjMwMEVERkY4QSAvKiBJ
bnRTaXplLm1tIGluIFNvdXJjZXMgKi8sCkBAIC02OTM1LDcgKzY5ODUsNiBAQAogCQkJCUE4OEFE
MkYxMDk1MjQ4MEEwMDFERDE5NiAvKiByZW5kZXJfc3R5bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQTg4QUQyRjIwOTUyNDgwQTAwMUREMTk2IC8qIHJlbmRlcl90YWJsZS5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlBODhBRDJGNTA5NTI0ODBBMDAxREQxOTYgLyogZG9tX2VsZW1lbnRpbXBsLmNw
cCBpbiBTb3VyY2VzICovLAotCQkJCUE4OEFEMkY2MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fbm9k
ZWltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTg4QUQyRjcwOTUyNDgwQTAwMUREMTk2IC8q
IGRvbV9zdHJpbmdpbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4OEFEMkY4MDk1MjQ4MEEw
MDFERDE5NiAvKiBkb21fdGV4dGltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTg4QUQyRjkw
OTUyNDgwQTAwMUREMTk2IC8qIGRvbV94bWxpbXBsLmNwcCBpbiBTb3VyY2VzICovLApAQCAtNzA4
OCw2ICs3MTM3LDExIEBACiAJCQkJQTgxODVGNDQwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50
SW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODE4NUY0NjA5NzY1NzY2MDA1ODI2RDkgLyog
RE9NSW1wbGVtZW50YXRpb25JbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTg1RjQ3MDk3
NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudEZyYWdtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQlBODE4NzIyODA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUltcGwuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJQTgxODcyMkEwOTc3RDNDMDAwNTgyNkQ5IC8qIENvbnRhaW5lck5vZGVJbXBsLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTg3MjJDMDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlTGlz
dEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgxODcyMkYwOTc3RDNDMDAwNTgyNkQ5IC8q
IE5hbWVOb2RlTGlzdEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgxODcyMzAwOTc3RDND
MDAwNTgyNkQ5IC8qIENoaWxkTm9kZUxpc3RJbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJD
RjFBNUYyMDk3ODM5NjAwMDYxQTEyMyAvKiBJbnRTaXplLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CUJDNzNFMjE0MDk3ODU0NjMwMEVERkY4QSAvKiBJbnRTaXplLm1tIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQkM3M0UyNUYwOTc4NjgyNzAwRURGRjhBIC8qIEZsb2F0U2l6ZS5jcHAgaW4gU291cmNlcyAq
LywKSW5kZXg6IGtjYW52YXMvUmVuZGVyRm9yZWlnbk9iamVjdC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJbmRl
eDoga2NhbnZhcy9SZW5kZXJGb3JlaWduT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJbmRleDogQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIENoYW5nZUxvZwkocmV2aXNpb24gMTIwODYpCisrKyBDaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw5NiBAQAorMjAwNi0wMS0xNCAgRXJpYyBTZWlk
ZWwgIDxlc2VpZGVsQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBicmVhayBjbGFzc2VzIGluIGRvbV9ub2RlaW1wbC4qIGludG8gc2Vw
YXJhdGUgZmlsZXMgKG9uZSBwZXIgY2xhc3MpCisgICAgICAgIGh0dHA6Ly9idWd6aWxsYS5vcGVu
ZGFyd2luLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0MworCisgICAgICAgICogRm9yd2FyZGluZ0hl
YWRlcnMva2RvbS9jb3JlL05vZGVJbXBsLmg6IFJlbW92ZWQuCisgICAgICAgICogV2ViQ29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGJyaWRnZS9tYWMvTWFjRnJhbWUu
aDoKKyAgICAgICAgKiBicmlkZ2UvbWFjL1dlYkNvcmVGcmFtZUJyaWRnZS5tbToKKyAgICAgICAg
KiBrY2FudmFzL1JlbmRlckZvcmVpZ25PYmplY3QuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBrY2Fu
dmFzL1JlbmRlckZvcmVpZ25PYmplY3QuaDogQWRkZWQuCisgICAgICAgICoga2h0bWwvY3NzL2Nz
c19iYXNlLmg6CisgICAgICAgICoga2h0bWwvY3NzL2Nzc19zdHlsZXNoZWV0aW1wbC5jcHA6Cisg
ICAgICAgICoga2h0bWwvY3NzL2Nzc192YWx1ZWltcGwuY3BwOgorICAgICAgICAqIGtodG1sL2Nz
cy9jc3NfdmFsdWVpbXBsLmg6CisgICAgICAgICoga2h0bWwvZWNtYS9ranNfYmluZGluZy5jcHA6
CisgICAgICAgICoga2h0bWwvZWNtYS9ranNfZG9tLmNwcDoKKyAgICAgICAgKiBraHRtbC9lY21h
L2tqc19kb20uaDoKKyAgICAgICAgKiBraHRtbC9lY21hL2tqc19ldmVudHMuY3BwOgorICAgICAg
ICAqIGtodG1sL2VjbWEva2pzX2h0bWwuY3BwOgorICAgICAgICAqIGtodG1sL2VjbWEva2pzX3Ry
YXZlcnNhbC5jcHA6CisgICAgICAgICoga2h0bWwvZWRpdGluZy9TZWxlY3Rpb25Db250cm9sbGVy
LmNwcDoKKyAgICAgICAgKiBraHRtbC9lZGl0aW5nL2FwcGVuZF9ub2RlX2NvbW1hbmQuY3BwOgor
ICAgICAgICAqIGtodG1sL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwOgorICAgICAgICAqIGtodG1s
L2VkaXRpbmcvaHRtbGVkaXRpbmcuaDoKKyAgICAgICAgKiBraHRtbC9lZGl0aW5nL2luc2VydF9u
b2RlX2JlZm9yZV9jb21tYW5kLmNwcDoKKyAgICAgICAgKiBraHRtbC9lZGl0aW5nL3JlbW92ZV9u
b2RlX2F0dHJpYnV0ZV9jb21tYW5kLmg6CisgICAgICAgICoga2h0bWwvZWRpdGluZy9yZW1vdmVf
bm9kZV9jb21tYW5kLmNwcDoKKyAgICAgICAgKiBraHRtbC9lZGl0aW5nL3JlbW92ZV9ub2RlX3By
ZXNlcnZpbmdfY2hpbGRyZW5fY29tbWFuZC5jcHA6CisgICAgICAgICoga2h0bWwvZWRpdGluZy9z
ZXRfbm9kZV9hdHRyaWJ1dGVfY29tbWFuZC5oOgorICAgICAgICAqIGtodG1sL2VkaXRpbmcvdmlz
aWJsZV9wb3NpdGlvbi5jcHA6CisgICAgICAgICoga2h0bWwvZWRpdGluZy92aXNpYmxlX3RleHQu
Y3BwOgorICAgICAgICAqIGtodG1sL2h0bWwvSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmNwcDoKKyAg
ICAgICAgKiBraHRtbC9odG1sL2h0bWxfaGVhZGltcGwuY3BwOgorICAgICAgICAqIGtodG1sL2h0
bWwvaHRtbHBhcnNlci5jcHA6CisgICAgICAgICoga2h0bWwva2h0bWxfZXZlbnRzLmNwcDoKKyAg
ICAgICAgKiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcDoKKyAgICAgICAgKiBraHRt
bC9yZW5kZXJpbmcvcmVuZGVyX2JveC5jcHA6CisgICAgICAgICoga2h0bWwvcmVuZGVyaW5nL3Jl
bmRlcl9mbG93LmNwcDoKKyAgICAgICAgKiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2ZyYW1lcy5o
OgorICAgICAgICAqIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfbGluZS5jcHA6CisgICAgICAgICog
a2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuaDoKKyAgICAgICAgKiBraHRtbC94bWwvQ2hp
bGROb2RlTGlzdEltcGwuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBraHRtbC94bWwvQ2hpbGROb2Rl
TGlzdEltcGwuaDogQWRkZWQuCisgICAgICAgICoga2h0bWwveG1sL0NvbnRhaW5lck5vZGVJbXBs
LmNwcDogQWRkZWQuCisgICAgICAgIChET006OkNvbnRhaW5lck5vZGVJbXBsOjpyZW1vdmVBbGxD
aGlsZHJlbik6CisgICAgICAgIChET006OkNvbnRhaW5lck5vZGVJbXBsOjpjaGVja1NhbWVEb2N1
bWVudCk6CisgICAgICAgIChET006OkNvbnRhaW5lck5vZGVJbXBsOjpnZXRSZWN0KToKKyAgICAg
ICAgKERPTTo6Q29udGFpbmVyTm9kZUltcGw6OmRpc3BhdGNoQ2hpbGRSZW1vdmFsRXZlbnRzKToK
KyAgICAgICAgKiBraHRtbC94bWwvQ29udGFpbmVyTm9kZUltcGwuaDogQWRkZWQuCisgICAgICAg
ICoga2h0bWwveG1sL0RvY3VtZW50RnJhZ21lbnRJbXBsLmNwcDoKKyAgICAgICAgKiBraHRtbC94
bWwvRG9jdW1lbnRGcmFnbWVudEltcGwuaDoKKyAgICAgICAgKiBraHRtbC94bWwvRG9jdW1lbnRJ
bXBsLmNwcDoKKyAgICAgICAgKiBraHRtbC94bWwvRG9jdW1lbnRJbXBsLmg6CisgICAgICAgIChE
T006OkRvY3VtZW50SW1wbDo6c2V0VGV4dENvbG9yKToKKyAgICAgICAgKiBraHRtbC94bWwvRG9j
dW1lbnRUeXBlSW1wbC5jcHA6CisgICAgICAgICoga2h0bWwveG1sL0RvY3VtZW50VHlwZUltcGwu
aDoKKyAgICAgICAgKiBraHRtbC94bWwvTmFtZU5vZGVMaXN0SW1wbC5jcHA6IEFkZGVkLgorICAg
ICAgICAqIGtodG1sL3htbC9OYW1lTm9kZUxpc3RJbXBsLmg6IEFkZGVkLgorICAgICAgICAqIGto
dG1sL3htbC9OYW1lZE5vZGVNYXBJbXBsLmg6IEFkZGVkLgorICAgICAgICAoRE9NOjpOYW1lZE5v
ZGVNYXBJbXBsOjpOYW1lZE5vZGVNYXBJbXBsKToKKyAgICAgICAgKERPTTo6TmFtZWROb2RlTWFw
SW1wbDo6fk5hbWVkTm9kZU1hcEltcGwpOgorICAgICAgICAqIGtodG1sL3htbC9Ob2RlSW1wbC5j
cHA6IEFkZGVkLgorICAgICAgICAoRE9NOjpUYWdOb2RlTGlzdEltcGw6OlRhZ05vZGVMaXN0SW1w
bCk6CisgICAgICAgIChET006OlRhZ05vZGVMaXN0SW1wbDo6bGVuZ3RoKToKKyAgICAgICAgKERP
TTo6VGFnTm9kZUxpc3RJbXBsOjppdGVtKToKKyAgICAgICAgKERPTTo6VGFnTm9kZUxpc3RJbXBs
Ojpub2RlTWF0Y2hlcyk6CisgICAgICAgIChET006Ok5vZGVJbXBsOjpnZXRSZWN0KToKKyAgICAg
ICAgKiBraHRtbC94bWwvTm9kZUltcGwuaDogQWRkZWQuCisgICAgICAgICoga2h0bWwveG1sL05v
ZGVMaXN0SW1wbC5jcHA6IEFkZGVkLgorICAgICAgICAqIGtodG1sL3htbC9Ob2RlTGlzdEltcGwu
aDogQWRkZWQuCisgICAgICAgICoga2h0bWwveG1sL2RvbTJfZXZlbnRzaW1wbC5oOgorICAgICAg
ICAqIGtodG1sL3htbC9kb21fZWxlbWVudGltcGwuaDoKKyAgICAgICAgKiBraHRtbC94bWwvZG9t
X25vZGVpbXBsLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBraHRtbC94bWwvZG9tX25vZGVpbXBs
Lmg6IFJlbW92ZWQuCisgICAgICAgICoga2h0bWwveG1sL2RvbV9wb3NpdGlvbi5jcHA6CisgICAg
ICAgICoga2h0bWwveG1sL2RvbV90ZXh0aW1wbC5oOgorICAgICAgICAqIGtodG1sL3htbC9kb21f
eG1saW1wbC5jcHA6CisgICAgICAgICoga2h0bWwveG1sL2RvbV94bWxpbXBsLmg6CisgICAgICAg
ICoga2h0bWwveG1sL3htbF90b2tlbml6ZXIuY3BwOgorICAgICAgICAqIGtodG1sL3hzbC94c2xf
c3R5bGVzaGVldGltcGwuY3BwOgorICAgICAgICAqIGtodG1sL3hzbC94c2x0X3Byb2Nlc3Nvcmlt
cGwuaDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnRJbXBsLmNw
cDogQWRkZWQuCisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0ZvcmVpZ25PYmplY3RFbGVtZW50SW1w
bC5oOiBBZGRlZC4KKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHVVJJUmVmZXJlbmNlSW1wbC5jcHA6
CisgICAgICAgICoga3dxL0RPTS5tbToKKyAgICAgICAgKiBrd3EvRE9NSFRNTC5tbToKKyAgICAg
ICAgKiBrd3EvRE9NVXRpbGl0eS5tbToKKyAgICAgICAgKiBrd3EvS1dRQ2xpcGJvYXJkLmg6Cisg
ICAgICAgICogcGFnZS9GcmFtZVZpZXcuY3BwOgorCiAyMDA2LTAxLTE0ICBEYXZpZCBIeWF0dCAg
PGh5YXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBDb252ZXJ0IFFNZW1BcnJheSB0byBBcnJheS4g
IFFCeXRlQXJyYXkgYmVjb21lcyBCeXRlQXJyYXkuCkluZGV4OiBicmlkZ2UvbWFjL01hY0ZyYW1l
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gYnJpZGdlL21hYy9NYWNGcmFtZS5oCShyZXZpc2lvbiAxMjA4NikK
KysrIGJyaWRnZS9tYWMvTWFjRnJhbWUuaAkod29ya2luZyBjb3B5KQpAQCAtMjksOCArMjksNyBA
QAogI2luY2x1ZGUgIkZyYW1lLmgiCiAKICNpbmNsdWRlICJ0ZXh0X2FmZmluaXR5LmgiCi0KLSNp
bmNsdWRlICJkb21fbm9kZWltcGwuaCIKKyNpbmNsdWRlICJOb2RlSW1wbC5oIgogCiAjaW5jbHVk
ZSAiV2ViQ29yZUtleWJvYXJkQWNjZXNzLmgiCiAKSW5kZXg6IGJyaWRnZS9tYWMvV2ViQ29yZUZy
YW1lQnJpZGdlLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdl
Lm1tCShyZXZpc2lvbiAxMjA4NikKKysrIGJyaWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdlLm1t
CSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3ICszMyw3IEBACiAjaW1wb3J0ICJkb20yX3ZpZXdzaW1w
bC5oIgogI2ltcG9ydCAiRG9jdW1lbnRUeXBlSW1wbC5oIgogI2ltcG9ydCAiZG9tX25vZGUuaCIK
LSNpbXBvcnQgImRvbV9ub2RlaW1wbC5oIgorI2ltcG9ydCAiTm9kZUltcGwuaCIKICNpbXBvcnQg
ImRvbV9wb3NpdGlvbi5oIgogI2ltcG9ydCAiaHRtbF9kb2N1bWVudGltcGwuaCIKICNpbXBvcnQg
IkhUTUxJbnB1dEVsZW1lbnRJbXBsLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHVVJJUmVmZXJlbmNl
SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR1VSSVJlZmVyZW5jZUltcGwuY3Bw
CShyZXZpc2lvbiAxMjA4NikKKysrIGtzdmcyL3N2Zy9TVkdVUklSZWZlcmVuY2VJbXBsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjEsNyArMjEsNyBAQAogKi8KIAogI2luY2x1ZGUgImNvbmZpZy5o
IgotI2luY2x1ZGUgPGtkb20vY29yZS9Ob2RlSW1wbC5oPgorI2luY2x1ZGUgIk5vZGVJbXBsLmgi
CiAjaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHJJbXBsLmg+CiAKICNpbmNsdWRlICJTVkdOYW1lcy5o
IgpJbmRleDoga3N2ZzIvc3ZnL1NWR0ZvcmVpZ25PYmplY3RFbGVtZW50SW1wbC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KSW5kZXg6IGtzdmcyL3N2Zy9TVkdGb3JlaWduT2JqZWN0RWxlbWVudEltcGwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KSW5kZXg6IEZvcndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9Ob2RlSW1wbC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEZvcndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9Ob2RlSW1wbC5oCShyZXZpc2lv
biAxMjA4NikKKysrIEZvcndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9Ob2RlSW1wbC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlICJkb21fbm9kZWltcGwuaCIKSW5kZXg6
IGt3cS9ET01VdGlsaXR5Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGt3cS9ET01VdGlsaXR5Lm1tCShyZXZp
c2lvbiAxMjA4NikKKysrIGt3cS9ET01VdGlsaXR5Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw3
ICsyNSw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbXBvcnQgImtqc19kb20uaCIKLSNp
bXBvcnQgImRvbV9ub2RlaW1wbC5oIgorI2ltcG9ydCAiTm9kZUltcGwuaCIKIAogI2ltcG9ydCAi
RE9NLmgiCiAjaW1wb3J0ICJET01JbnRlcm5hbC5oIgpJbmRleDoga3dxL0RPTUhUTUwubW0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga3dxL0RPTUhUTUwubW0JKHJldmlzaW9uIDEyMDg2KQorKysga3dxL0RPTUhU
TUwubW0JKHdvcmtpbmcgY29weSkKQEAgLTUxLDcgKzUxLDggQEAKICNpbXBvcnQgImh0bWxfb2Jq
ZWN0aW1wbC5oIgogI2ltcG9ydCAiaHRtbF90YWJsZWltcGwuaCIKICNpbXBvcnQgImRvbV9lbGVt
ZW50aW1wbC5oIgotI2ltcG9ydCAiZG9tX25vZGVpbXBsLmgiCisjaW1wb3J0ICJDb250YWluZXJO
b2RlSW1wbC5oIgorI2ltcG9ydCAiTmFtZU5vZGVMaXN0SW1wbC5oIgogI2ltcG9ydCAibWFya3Vw
LmgiCiAKICNpbXBvcnQgIkRPTUV4dGVuc2lvbnMuaCIKSW5kZXg6IGt3cS9ET00ubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0ga3dxL0RPTS5tbQkocmV2aXNpb24gMTIwODYpCisrKyBrd3EvRE9NLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Myw3ICs0Myw3IEBACiAjaW1wb3J0ICJkb21fZWxlbWVudGltcGwuaCIK
ICNpbXBvcnQgImRvbV9leGNlcHRpb24uaCIKICNpbXBvcnQgImRvbV9ub2RlLmgiCi0jaW1wb3J0
ICJkb21fbm9kZWltcGwuaCIKKyNpbXBvcnQgIkNvbnRhaW5lck5vZGVJbXBsLmgiCiAjaW1wb3J0
ICJkb21fc3RyaW5nLmgiCiAjaW1wb3J0ICJkb21fc3RyaW5naW1wbC5oIgogI2ltcG9ydCAiZG9t
X3RleHRpbXBsLmgiCkluZGV4OiBrd3EvS1dRQ2xpcGJvYXJkLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3dx
L0tXUUNsaXBib2FyZC5oCShyZXZpc2lvbiAxMjA4NikKKysrIGt3cS9LV1FDbGlwYm9hcmQuaAko
d29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSAiS1dRUGl4bWFwLmgi
CiAjaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgorI2luY2x1ZGUgIkludFBvaW50Lmgi
CiAKICNpZmRlZiBfX09CSkNfXwogQGNsYXNzIE5TSW1hZ2U7CkBAIC00Miw2ICs0Myw3IEBAIGNs
YXNzIE5TUGFzdGVib2FyZDsKIHR5cGVkZWYgdW5zaWduZWQgTlNEcmFnT3BlcmF0aW9uOwogCiBj
bGFzcyBNYWNGcmFtZTsKK2NsYXNzIFFTdHJpbmdMaXN0OwogCiBjbGFzcyBLV1FDbGlwYm9hcmQg
OiBwdWJsaWMgRE9NOjpDbGlwYm9hcmRJbXBsCiB7CkluZGV4OiBwYWdlL0ZyYW1lVmlldy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gcGFnZS9GcmFtZVZpZXcuY3BwCShyZXZpc2lvbiAxMjA4NikKKysrIHBh
Z2UvRnJhbWVWaWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1
ZGUgInJlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuaCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVu
ZGVyX2xpbmUuaCIKICNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCi0jaW5jbHVkZSAieG1sL2RvbV9u
b2RlaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKICNpbmNsdWRlICJ4
bWwvRXZlbnROYW1lcy5oIgogI2luY2x1ZGUgImNzcy9jc3NzdHlsZXNlbGVjdG9yLmgiCg==
</data>
<flag name="review"
          id="1273"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>