<?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>20437</bug_id>
          
          <creation_ts>2008-08-18 16:40:29 -0700</creation_ts>
          <short_desc>Clean XMLTokenizer by separating the Qt and Libxml2 implementation</short_desc>
          <delta_ts>2009-11-21 01:27:00 -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>XML</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Holger Freyther">zecke</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>lars.knoll</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>88774</commentid>
    <comment_count>0</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-08-18 16:40:29 -0700</bug_when>
    <thetext>The current XMLTokenizer.cpp is hard to read as two separate implementations are in one file. Separating the Qt and libxml2 implementation should make it more readable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88775</commentid>
    <comment_count>1</comment_count>
      <attachid>22867</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-08-18 17:04:56 -0700</bug_when>
    <thetext>Created attachment 22867
Start separating XMLTokenizer

Keep common code in XMLTokenizer.cpp, move Qt code to XMLTokenizerQt.cpp and the rest to XMLTokenizerLibxml2.cpp.
Comments appreciated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88790</commentid>
    <comment_count>2</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-08-18 19:10:42 -0700</bug_when>
    <thetext>It might be a good idea to create the two new .cpp files by doing an &quot;svn cp&quot; of XMLTokenizer.cpp then removing the unneeded bits.  That would help make it obvious what has happened in the SVN history. </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88885</commentid>
    <comment_count>3</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-08-19 20:52:35 -0700</bug_when>
    <thetext>Should also change USE_QXMLSTREAM to the USE(QXMLSTREAM) style that we use for these sorts of things elsewhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88894</commentid>
    <comment_count>4</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-08-19 22:24:44 -0700</bug_when>
    <thetext>Oh, and the new file will need to be added to the Mac, Windows and Wx project files too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>88895</commentid>
    <comment_count>5</comment_count>
      <attachid>22867</attachid>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-08-19 22:25:37 -0700</bug_when>
    <thetext>Comment on attachment 22867
Start separating XMLTokenizer

r=me, if you address the comments I made above, and add a ChangeLog entry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91701</commentid>
    <comment_count>6</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-18 17:18:54 -0700</bug_when>
    <thetext>I think I addressed all the points and landed this patch. The size of the patch is a bit worrying but it looked good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>165591</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2009-11-21 01:27:00 -0800</bug_when>
    <thetext>*** Bug 14791 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>22867</attachid>
            <date>2008-08-18 17:04:56 -0700</date>
            <delta_ts>2008-08-19 22:25:37 -0700</delta_ts>
            <desc>Start separating XMLTokenizer</desc>
            <filename>0003-XMLTokenizer-Move-the-libXML-and-Qt-implementation.patch</filename>
            <type>text/plain</type>
            <size>136011</size>
            <attacher name="Holger Freyther">zecke</attacher>
            
              <data encoding="base64">RnJvbSBmM2FjZDIwZjVkMTdlMTM0MjNiMjMwNzcwMzliNjJhYzc5NjA1YjdlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2Vs
ZmlzaC5vcmc+CkRhdGU6IFRodSwgMTQgQXVnIDIwMDggMTY6Mzk6MzkgKzAyMDAKU3ViamVjdDog
W1BBVENIXSBbWE1MVG9rZW5pemVyXSBNb3ZlIHRoZSBsaWJYTUwgYW5kIFF0IGltcGxlbWVudGF0
aW9ucyB0byB0d28gc2VwYXJhdGUgZmlsZXMKICAgICBUcnkgdG8gZ2V0IFhNTFRva2VuaXplci5j
cHAgZnJlZSBvZiAjaWZkZWYgYmxvY2tzIGFuZCBtb3ZlIHRoZSBsaWJ4bWwyCiAgICAgYW5kIFF0
WG1sU3RyZWFtUmVhZGVyIGltcGxlbWVudGF0aW9ucyB0byB0d28gc2VwYXJhdGUgZmlsZXMgdHJ5
aW5nIHRvCiAgICAgbWF4aW1pemUgdGhlIGNvZGUgc2hhcmluZyBpbmJldHdlZW4gdGhlbS4KCi0t
LQogSmF2YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmggICAgICAgfCAgICA4ICsKIFdlYkNvcmUv
R05VbWFrZWZpbGUuYW0gICAgICAgICAgICAgIHwgICAgMSArCiBXZWJDb3JlL1dlYkNvcmUucHJv
ICAgICAgICAgICAgICAgICB8ICAgIDEgKwogV2ViQ29yZS9kb20vWE1MVG9rZW5pemVyLmNwcCAg
ICAgICAgfCAxODU0ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBXZWJDb3Jl
L2RvbS9YTUxUb2tlbml6ZXIuaCAgICAgICAgICB8ICAgNTYgKy0KIFdlYkNvcmUvZG9tL1hNTFRv
a2VuaXplckxpYnhtbDIuY3BwIHwgMTM1NCArKysrKysrKysrKysrKysrKysrKysrKysrCiBXZWJD
b3JlL2RvbS9YTUxUb2tlbml6ZXJRdC5jcHAgICAgICB8ICA3NjEgKysrKysrKysrKysrKysKIDcg
ZmlsZXMgY2hhbmdlZCwgMjE4MSBpbnNlcnRpb25zKCspLCAxODU0IGRlbGV0aW9ucygtKQogY3Jl
YXRlIG1vZGUgMTAwNjQ0IFdlYkNvcmUvZG9tL1hNTFRva2VuaXplckxpYnhtbDIuY3BwCiBjcmVh
dGUgbW9kZSAxMDA2NDQgV2ViQ29yZS9kb20vWE1MVG9rZW5pemVyUXQuY3BwCgpkaWZmIC0tZ2l0
IGEvSmF2YVNjcmlwdENvcmUvd3RmL1BsYXRmb3JtLmggYi9KYXZhU2NyaXB0Q29yZS93dGYvUGxh
dGZvcm0uaAppbmRleCAzY2U0MTE0Li4xYWE0ZDQyIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS93dGYvUGxhdGZvcm0uaAorKysgYi9KYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaApAQCAt
MzI3LDQgKzMyNywxMiBAQAogI2RlZmluZSBFTkFCTEVfU0FNUExJTkdfVE9PTCAwCiAjZW5kaWYK
IAorLyogVXNlIHRoZSBRdFhtbFN0cmVhbVJlYWRlciBpbXBsZW1lbnRhdGlvbiBmb3IgWE1MVG9r
ZW5pemVyICovCisjaWYgUExBVEZPUk0oUVQpCisjaWYgIUVOQUJMRShYU0xUKQorI2RlZmluZSBV
U0VfUVhNTFNUUkVBTQorI2VuZGlmCisjZW5kaWYKKworCiAjZW5kaWYgLyogV1RGX1BsYXRmb3Jt
X2ggKi8KZGlmZiAtLWdpdCBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtCmluZGV4IDVhMDAxNzYuLjkyZThiNTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05V
bWFrZWZpbGUuYW0KKysrIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMTAwMCw2ICsxMDAw
LDcgQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2RvbS9XaGVlbEV2ZW50LmNwcCBc
CiAJV2ViQ29yZS9kb20vV2hlZWxFdmVudC5oIFwKIAlXZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXIu
Y3BwIFwKKwlXZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXJMaWJ4bWwyLmNwcCBcCiAJV2ViQ29yZS9k
b20vWE1MVG9rZW5pemVyLmggXAogCVdlYkNvcmUvZWRpdGluZy9BcHBlbmROb2RlQ29tbWFuZC5j
cHAgXAogCVdlYkNvcmUvZWRpdGluZy9BcHBlbmROb2RlQ29tbWFuZC5oIFwKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dlYkNvcmUucHJvCmluZGV4IDVjOTZmOTAu
LjAzZjE0MmYgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5wcm8KKysrIGIvV2ViQ29yZS9X
ZWJDb3JlLnBybwpAQCAtNTUyLDYgKzU1Miw3IEBAIFNPVVJDRVMgKz0gXAogICAgIGRvbS9XZWJL
aXRUcmFuc2l0aW9uRXZlbnQuY3BwIFwKICAgICBkb20vV2hlZWxFdmVudC5jcHAgXAogICAgIGRv
bS9YTUxUb2tlbml6ZXIuY3BwIFwKKyAgICBkb20vWE1MVG9rZW5pemVyUXQuY3BwIFwKICAgICBl
ZGl0aW5nL0FwcGVuZE5vZGVDb21tYW5kLmNwcCBcCiAgICAgZWRpdGluZy9BcHBseVN0eWxlQ29t
bWFuZC5jcHAgXAogICAgIGVkaXRpbmcvQnJlYWtCbG9ja3F1b3RlQ29tbWFuZC5jcHAgXApkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9kb20vWE1MVG9rZW5pemVyLmNwcCBiL1dlYkNvcmUvZG9tL1hNTFRv
a2VuaXplci5jcHAKaW5kZXggNWE0NzYyMC4uZTViZjdkNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9k
b20vWE1MVG9rZW5pemVyLmNwcAorKysgYi9XZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXIuY3BwCkBA
IC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3Yg
KGFwQHdlYmtpdC5vcmcpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2FtdWVsIFdlaW5pZyAoc2Ft
QHdlYmtpdC5vcmcpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVHJvbGx0ZWNoIEFTQQorICogQ29w
eXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCiAgKgogICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKQEAgLTM3LDM5ICszOCwyMCBAQAogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCiAjaW5j
bHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAiSFRNTExpbmtFbGVtZW50LmgiCi0jaW5jbHVk
ZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFNjcmlwdEVsZW1lbnQuaCIKICNpbmNsdWRl
ICJIVE1MU3R5bGVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTFRva2VuaXplci5oIgogI2luY2x1
ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTY3JpcHRFbGVtZW50LmgiCiAjaW5j
bHVkZSAiUHJvY2Vzc2luZ0luc3RydWN0aW9uLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VFcnJvci5o
IgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0
LmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgogI2luY2x1ZGUgIlRleHRSZXNvdXJj
ZURlY29kZXIuaCIKLSNpZm5kZWYgVVNFX1FYTUxTVFJFQU0KLSNpbmNsdWRlIDxsaWJ4bWwvcGFy
c2VyLmg+Ci0jaW5jbHVkZSA8bGlieG1sL3BhcnNlckludGVybmFscy5oPgotI2Vsc2UKLSNpbmNs
dWRlIDxRRGVidWc+Ci0jZW5kaWYKICNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KICNpbmNsdWRl
IDx3dGYvU3RyaW5nRXh0cmFzLmg+CiAjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgogI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KIAotI2lmIEVOQUJMRShYU0xUKQotI2luY2x1ZGUgPGxpYnhzbHQv
eHNsdC5oPgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIlNWR05hbWVzLmgi
Ci0jaW5jbHVkZSAiU1ZHU2NyaXB0RWxlbWVudC5oIgotI2luY2x1ZGUgIlNWR1N0eWxlRWxlbWVu
dC5oIgotI2VuZGlmCi0KIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKQEAgLTc4LDYyNCArNjAsNiBAQCB1c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKIAogY29u
c3QgaW50IG1heEVycm9ycyA9IDI1OwogCi0jaWZuZGVmIFVTRV9RWE1MU1RSRUFNCi1jbGFzcyBQ
ZW5kaW5nQ2FsbGJhY2tzIHsKLXB1YmxpYzoKLSAgICBQZW5kaW5nQ2FsbGJhY2tzKCkKLSAgICB7
Ci0gICAgICAgIG1fY2FsbGJhY2tzLnNldEF1dG9EZWxldGUodHJ1ZSk7Ci0gICAgfQotICAgIAot
ICAgIHZvaWQgYXBwZW5kU3RhcnRFbGVtZW50TlNDYWxsYmFjayhjb25zdCB4bWxDaGFyKiB4bWxM
b2NhbE5hbWUsIGNvbnN0IHhtbENoYXIqIHhtbFByZWZpeCwgY29uc3QgeG1sQ2hhciogeG1sVVJJ
LCBpbnQgbmJfbmFtZXNwYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgeG1sQ2hhcioqIG5hbWVzcGFjZXMsIGludCBuYl9hdHRyaWJ1dGVzLCBpbnQgbmJf
ZGVmYXVsdGVkLCBjb25zdCB4bWxDaGFyKiogYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIFBl
bmRpbmdTdGFydEVsZW1lbnROU0NhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nU3RhcnRF
bGVtZW50TlNDYWxsYmFjazsKLSAgICAgICAgCi0gICAgICAgIGNhbGxiYWNrLT54bWxMb2NhbE5h
bWUgPSB4bWxTdHJkdXAoeG1sTG9jYWxOYW1lKTsKLSAgICAgICAgY2FsbGJhY2stPnhtbFByZWZp
eCA9IHhtbFN0cmR1cCh4bWxQcmVmaXgpOwotICAgICAgICBjYWxsYmFjay0+eG1sVVJJID0geG1s
U3RyZHVwKHhtbFVSSSk7Ci0gICAgICAgIGNhbGxiYWNrLT5uYl9uYW1lc3BhY2VzID0gbmJfbmFt
ZXNwYWNlczsKLSAgICAgICAgY2FsbGJhY2stPm5hbWVzcGFjZXMgPSByZWludGVycHJldF9jYXN0
PHhtbENoYXIqKj4oeG1sTWFsbG9jKHNpemVvZih4bWxDaGFyKikgKiBuYl9uYW1lc3BhY2VzICog
MikpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iX25hbWVzcGFjZXMgKiAyIDsgaSsr
KQotICAgICAgICAgICAgY2FsbGJhY2stPm5hbWVzcGFjZXNbaV0gPSB4bWxTdHJkdXAobmFtZXNw
YWNlc1tpXSk7Ci0gICAgICAgIGNhbGxiYWNrLT5uYl9hdHRyaWJ1dGVzID0gbmJfYXR0cmlidXRl
czsKLSAgICAgICAgY2FsbGJhY2stPm5iX2RlZmF1bHRlZCA9IG5iX2RlZmF1bHRlZDsKLSAgICAg
ICAgY2FsbGJhY2stPmF0dHJpYnV0ZXMgPSAgcmVpbnRlcnByZXRfY2FzdDx4bWxDaGFyKio+KHht
bE1hbGxvYyhzaXplb2YoeG1sQ2hhciopICogbmJfYXR0cmlidXRlcyAqIDUpKTsKLSAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBuYl9hdHRyaWJ1dGVzOyBpKyspIHsKLSAgICAgICAgICAgIC8v
IEVhY2ggYXR0cmlidXRlIGhhcyA1IGVsZW1lbnRzIGluIHRoZSBhcnJheToKLSAgICAgICAgICAg
IC8vIG5hbWUsIHByZWZpeCwgdXJpLCB2YWx1ZSBhbmQgYW4gZW5kIHBvaW50ZXIuCi0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAg
ICAgICAgIGNhbGxiYWNrLT5hdHRyaWJ1dGVzW2kgKiA1ICsgal0gPSB4bWxTdHJkdXAoYXR0cmli
dXRlc1tpICogNSArIGpdKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGxlbiA9IGF0
dHJpYnV0ZXNbaSAqIDUgKyA0XSAtIGF0dHJpYnV0ZXNbaSAqIDUgKyAzXTsKLQotICAgICAgICAg
ICAgY2FsbGJhY2stPmF0dHJpYnV0ZXNbaSAqIDUgKyAzXSA9IHhtbFN0cm5kdXAoYXR0cmlidXRl
c1tpICogNSArIDNdLCBsZW4pOwotICAgICAgICAgICAgY2FsbGJhY2stPmF0dHJpYnV0ZXNbaSAq
IDUgKyA0XSA9IGNhbGxiYWNrLT5hdHRyaWJ1dGVzW2kgKiA1ICsgM10gKyBsZW47Ci0gICAgICAg
IH0KLSAgICAgICAgCi0gICAgICAgIG1fY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjayk7Ci0gICAg
fQotCi0gICAgdm9pZCBhcHBlbmRFbmRFbGVtZW50TlNDYWxsYmFjaygpCi0gICAgewotICAgICAg
ICBQZW5kaW5nRW5kRWxlbWVudE5TQ2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBlbmRpbmdFbmRF
bGVtZW50TlNDYWxsYmFjazsKLSAgICAgICAgCi0gICAgICAgIG1fY2FsbGJhY2tzLmFwcGVuZChj
YWxsYmFjayk7Ci0gICAgfQotICAgIAotICAgIHZvaWQgYXBwZW5kQ2hhcmFjdGVyc0NhbGxiYWNr
KGNvbnN0IHhtbENoYXIqIHMsIGludCBsZW4pCi0gICAgewotICAgICAgICBQZW5kaW5nQ2hhcmFj
dGVyc0NhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nQ2hhcmFjdGVyc0NhbGxiYWNrOwot
ICAgICAgICAKLSAgICAgICAgY2FsbGJhY2stPnMgPSB4bWxTdHJuZHVwKHMsIGxlbik7Ci0gICAg
ICAgIGNhbGxiYWNrLT5sZW4gPSBsZW47Ci0gICAgICAgIAotICAgICAgICBtX2NhbGxiYWNrcy5h
cHBlbmQoY2FsbGJhY2spOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHZvaWQgYXBwZW5kUHJv
Y2Vzc2luZ0luc3RydWN0aW9uQ2FsbGJhY2soY29uc3QgeG1sQ2hhciogdGFyZ2V0LCBjb25zdCB4
bWxDaGFyKiBkYXRhKQotICAgIHsKLSAgICAgICAgUGVuZGluZ1Byb2Nlc3NpbmdJbnN0cnVjdGlv
bkNhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nUHJvY2Vzc2luZ0luc3RydWN0aW9uQ2Fs
bGJhY2s7Ci0gICAgICAgIAotICAgICAgICBjYWxsYmFjay0+dGFyZ2V0ID0geG1sU3RyZHVwKHRh
cmdldCk7Ci0gICAgICAgIGNhbGxiYWNrLT5kYXRhID0geG1sU3RyZHVwKGRhdGEpOwotICAgICAg
ICAKLSAgICAgICAgbV9jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKTsKLSAgICB9Ci0gICAgCi0g
ICAgdm9pZCBhcHBlbmRDREFUQUJsb2NrQ2FsbGJhY2soY29uc3QgeG1sQ2hhciogcywgaW50IGxl
bikKLSAgICB7Ci0gICAgICAgIFBlbmRpbmdDREFUQUJsb2NrQ2FsbGJhY2sqIGNhbGxiYWNrID0g
bmV3IFBlbmRpbmdDREFUQUJsb2NrQ2FsbGJhY2s7Ci0gICAgICAgIAotICAgICAgICBjYWxsYmFj
ay0+cyA9IHhtbFN0cm5kdXAocywgbGVuKTsKLSAgICAgICAgY2FsbGJhY2stPmxlbiA9IGxlbjsK
LSAgICAgICAgCi0gICAgICAgIG1fY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjayk7ICAgICAgICAK
LSAgICB9Ci0KLSAgICB2b2lkIGFwcGVuZENvbW1lbnRDYWxsYmFjayhjb25zdCB4bWxDaGFyKiBz
KQotICAgIHsKLSAgICAgICAgUGVuZGluZ0NvbW1lbnRDYWxsYmFjayogY2FsbGJhY2sgPSBuZXcg
UGVuZGluZ0NvbW1lbnRDYWxsYmFjazsKLSAgICAgICAgCi0gICAgICAgIGNhbGxiYWNrLT5zID0g
eG1sU3RyZHVwKHMpOwotICAgICAgICAKLSAgICAgICAgbV9jYWxsYmFja3MuYXBwZW5kKGNhbGxi
YWNrKTsgICAgICAgIAotICAgIH0KLQotICAgIHZvaWQgYXBwZW5kSW50ZXJuYWxTdWJzZXRDYWxs
YmFjayhjb25zdCB4bWxDaGFyKiBuYW1lLCBjb25zdCB4bWxDaGFyKiBleHRlcm5hbElELCBjb25z
dCB4bWxDaGFyKiBzeXN0ZW1JRCkKLSAgICB7Ci0gICAgICAgIFBlbmRpbmdJbnRlcm5hbFN1YnNl
dENhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nSW50ZXJuYWxTdWJzZXRDYWxsYmFjazsK
LSAgICAgICAgCi0gICAgICAgIGNhbGxiYWNrLT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwotICAg
ICAgICBjYWxsYmFjay0+ZXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChleHRlcm5hbElEKTsKLSAgICAg
ICAgY2FsbGJhY2stPnN5c3RlbUlEID0geG1sU3RyZHVwKHN5c3RlbUlEKTsKLSAgICAgICAgCi0g
ICAgICAgIG1fY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjayk7ICAgICAgICAKLSAgICB9Ci0gICAg
Ci0gICAgdm9pZCBhcHBlbmRFcnJvckNhbGxiYWNrKFhNTFRva2VuaXplcjo6RXJyb3JUeXBlIHR5
cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVy
KQotICAgIHsKLSAgICAgICAgUGVuZGluZ0Vycm9yQ2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBl
bmRpbmdFcnJvckNhbGxiYWNrOwotICAgICAgICAKLSAgICAgICAgY2FsbGJhY2stPm1lc3NhZ2Ug
PSBzdHJkdXAobWVzc2FnZSk7Ci0gICAgICAgIGNhbGxiYWNrLT50eXBlID0gdHlwZTsKLSAgICAg
ICAgY2FsbGJhY2stPmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICAgICBjYWxsYmFjay0+
Y29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICAgICAgICAKLSAgICAgICAgbV9jYWxsYmFj
a3MuYXBwZW5kKGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNhbGxBbmRSZW1vdmVGaXJz
dENhbGxiYWNrKFhNTFRva2VuaXplciogdG9rZW5pemVyKQotICAgIHsKLSAgICAgICAgUGVuZGlu
Z0NhbGxiYWNrKiBjYiA9IG1fY2FsbGJhY2tzLmdldEZpcnN0KCk7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgY2ItPmNhbGwodG9rZW5pemVyKTsKLSAgICAgICAgbV9jYWxsYmFja3MucmVtb3ZlRmly
c3QoKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9j
YWxsYmFja3MuaXNFbXB0eSgpOyB9Ci0gICAgCi1wcml2YXRlOiAgICAKLSAgICBzdHJ1Y3QgUGVu
ZGluZ0NhbGxiYWNrIHsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB+UGVuZGlu
Z0NhbGxiYWNrKCkgeyB9IAotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTFRva2VuaXpl
ciogdG9rZW5pemVyKSA9IDA7Ci0gICAgfTsgIAotICAgIAotICAgIHN0cnVjdCBQZW5kaW5nU3Rh
cnRFbGVtZW50TlNDYWxsYmFjayA6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgeyAgICAgICAgCi0g
ICAgICAgIHZpcnR1YWwgflBlbmRpbmdTdGFydEVsZW1lbnROU0NhbGxiYWNrKCkgewotICAgICAg
ICAgICAgeG1sRnJlZSh4bWxMb2NhbE5hbWUpOwotICAgICAgICAgICAgeG1sRnJlZSh4bWxQcmVm
aXgpOwotICAgICAgICAgICAgeG1sRnJlZSh4bWxVUkkpOwotICAgICAgICAgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBuYl9uYW1lc3BhY2VzICogMjsgaSsrKQotICAgICAgICAgICAgICAgIHhtbEZy
ZWUobmFtZXNwYWNlc1tpXSk7Ci0gICAgICAgICAgICB4bWxGcmVlKG5hbWVzcGFjZXMpOwotICAg
ICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9hdHRyaWJ1dGVzOyBpKyspCi0gICAgICAg
ICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIAotICAgICAgICAgICAgICAgICAg
ICB4bWxGcmVlKGF0dHJpYnV0ZXNbaSAqIDUgKyBqXSk7Ci0gICAgICAgICAgICB4bWxGcmVlKGF0
dHJpYnV0ZXMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgY2Fs
bChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikgewotICAgICAgICAgICAgdG9rZW5pemVyLT5zdGFy
dEVsZW1lbnROcyh4bWxMb2NhbE5hbWUsIHhtbFByZWZpeCwgeG1sVVJJLCAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfbmFtZXNwYWNlcywgKGNvbnN0IHhtbENoYXIq
KiluYW1lc3BhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9h
dHRyaWJ1dGVzLCBuYl9kZWZhdWx0ZWQsIChjb25zdCB4bWxDaGFyKiopKGF0dHJpYnV0ZXMpKTsK
LSAgICAgICAgfQotCi0gICAgICAgIHhtbENoYXIqIHhtbExvY2FsTmFtZTsKLSAgICAgICAgeG1s
Q2hhciogeG1sUHJlZml4OwotICAgICAgICB4bWxDaGFyKiB4bWxVUkk7Ci0gICAgICAgIGludCBu
Yl9uYW1lc3BhY2VzOwotICAgICAgICB4bWxDaGFyKiogbmFtZXNwYWNlczsKLSAgICAgICAgaW50
IG5iX2F0dHJpYnV0ZXM7Ci0gICAgICAgIGludCBuYl9kZWZhdWx0ZWQ7Ci0gICAgICAgIHhtbENo
YXIqKiBhdHRyaWJ1dGVzOwotICAgIH07Ci0gICAgCi0gICAgc3RydWN0IFBlbmRpbmdFbmRFbGVt
ZW50TlNDYWxsYmFjayA6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgewotICAgICAgICB2aXJ0dWFs
IHZvaWQgY2FsbChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikgCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIHRva2VuaXplci0+ZW5kRWxlbWVudE5zKCk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIAot
ICAgIHN0cnVjdCBQZW5kaW5nQ2hhcmFjdGVyc0NhbGxiYWNrIDogcHVibGljIFBlbmRpbmdDYWxs
YmFjayB7Ci0gICAgICAgIHZpcnR1YWwgflBlbmRpbmdDaGFyYWN0ZXJzQ2FsbGJhY2soKSAKLSAg
ICAgICAgewotICAgICAgICAgICAgeG1sRnJlZShzKTsKLSAgICAgICAgfQotICAgIAotICAgICAg
ICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikgCi0gICAgICAgIHsK
LSAgICAgICAgICAgIHRva2VuaXplci0+Y2hhcmFjdGVycyhzLCBsZW4pOwotICAgICAgICB9Ci0g
ICAgICAgIAotICAgICAgICB4bWxDaGFyKiBzOwotICAgICAgICBpbnQgbGVuOwotICAgIH07Ci0K
LSAgICBzdHJ1Y3QgUGVuZGluZ1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkNhbGxiYWNrIDogcHVibGlj
IFBlbmRpbmdDYWxsYmFjayB7Ci0gICAgICAgIHZpcnR1YWwgflBlbmRpbmdQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb25DYWxsYmFjaygpIAotICAgICAgICB7Ci0gICAgICAgICAgICB4bWxGcmVlKHRhcmdl
dCk7Ci0gICAgICAgICAgICB4bWxGcmVlKGRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAg
ICAgICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikgCi0gICAgICAg
IHsKLSAgICAgICAgICAgIHRva2VuaXplci0+cHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwg
ZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHhtbENoYXIqIHRhcmdldDsKLSAg
ICAgICAgeG1sQ2hhciogZGF0YTsKLSAgICB9OwotICAgIAotICAgIHN0cnVjdCBQZW5kaW5nQ0RB
VEFCbG9ja0NhbGxiYWNrIDogcHVibGljIFBlbmRpbmdDYWxsYmFjayB7Ci0gICAgICAgIHZpcnR1
YWwgflBlbmRpbmdDREFUQUJsb2NrQ2FsbGJhY2soKSAKLSAgICAgICAgewotICAgICAgICAgICAg
eG1sRnJlZShzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIGNh
bGwoWE1MVG9rZW5pemVyKiB0b2tlbml6ZXIpIAotICAgICAgICB7Ci0gICAgICAgICAgICB0b2tl
bml6ZXItPmNkYXRhQmxvY2socywgbGVuKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAg
eG1sQ2hhciogczsKLSAgICAgICAgaW50IGxlbjsKLSAgICB9OwotCi0gICAgc3RydWN0IFBlbmRp
bmdDb21tZW50Q2FsbGJhY2sgOiBwdWJsaWMgUGVuZGluZ0NhbGxiYWNrIHsKLSAgICAgICAgdmly
dHVhbCB+UGVuZGluZ0NvbW1lbnRDYWxsYmFjaygpIAotICAgICAgICB7Ci0gICAgICAgICAgICB4
bWxGcmVlKHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgY2Fs
bChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRva2Vu
aXplci0+Y29tbWVudChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhtbENoYXIqIHM7Ci0gICAg
fTsKLSAgICAKLSAgICBzdHJ1Y3QgUGVuZGluZ0ludGVybmFsU3Vic2V0Q2FsbGJhY2sgOiBwdWJs
aWMgUGVuZGluZ0NhbGxiYWNrIHsKLSAgICAgICAgdmlydHVhbCB+UGVuZGluZ0ludGVybmFsU3Vi
c2V0Q2FsbGJhY2soKSAKLSAgICAgICAgewotICAgICAgICAgICAgeG1sRnJlZShuYW1lKTsKLSAg
ICAgICAgICAgIHhtbEZyZWUoZXh0ZXJuYWxJRCk7Ci0gICAgICAgICAgICB4bWxGcmVlKHN5c3Rl
bUlEKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdmlydHVhbCB2b2lkIGNhbGwoWE1M
VG9rZW5pemVyKiB0b2tlbml6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRva2VuaXplci0+
aW50ZXJuYWxTdWJzZXQobmFtZSwgZXh0ZXJuYWxJRCwgc3lzdGVtSUQpOwotICAgICAgICB9Ci0g
ICAgICAgIAotICAgICAgICB4bWxDaGFyKiBuYW1lOwotICAgICAgICB4bWxDaGFyKiBleHRlcm5h
bElEOwotICAgICAgICB4bWxDaGFyKiBzeXN0ZW1JRDsgICAgICAgIAotICAgIH07Ci0gICAgCi0g
ICAgc3RydWN0IFBlbmRpbmdFcnJvckNhbGxiYWNrOiBwdWJsaWMgUGVuZGluZ0NhbGxiYWNrIHsK
LSAgICAgICAgdmlydHVhbCB+UGVuZGluZ0Vycm9yQ2FsbGJhY2soKSAKLSAgICAgICAgewotICAg
ICAgICAgICAgZnJlZSAobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZp
cnR1YWwgdm9pZCBjYWxsKFhNTFRva2VuaXplciogdG9rZW5pemVyKSAKLSAgICAgICAgewotICAg
ICAgICAgICAgdG9rZW5pemVyLT5oYW5kbGVFcnJvcih0eXBlLCBtZXNzYWdlLCBsaW5lTnVtYmVy
LCBjb2x1bW5OdW1iZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBYTUxUb2tlbml6
ZXI6OkVycm9yVHlwZSB0eXBlOwotICAgICAgICBjaGFyKiBtZXNzYWdlOwotICAgICAgICBpbnQg
bGluZU51bWJlcjsKLSAgICAgICAgaW50IGNvbHVtbk51bWJlcjsKLSAgICB9OwotICAgIAotcHVi
bGljOgotICAgIERlcHJlY2F0ZWRQdHJMaXN0PFBlbmRpbmdDYWxsYmFjaz4gbV9jYWxsYmFja3M7
Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGludCBn
bG9iYWxEZXNjcmlwdG9yID0gMDsKLXN0YXRpYyBEb2NMb2FkZXIqIGdsb2JhbERvY0xvYWRlciA9
IDA7Ci1zdGF0aWMgVGhyZWFkSWRlbnRpZmllciBsaWJ4bWxMb2FkZXJUaHJlYWQgPSAwOwotCi1z
dGF0aWMgaW50IG1hdGNoRnVuYyhjb25zdCBjaGFyKiB1cmkpCi17Ci0gICAgLy8gT25seSBtYXRj
aCBsb2FkcyBpbml0aWF0ZWQgZHVlIHRvIHVzZXMgb2YgbGlieG1sMiBmcm9tIHdpdGhpbiBYTUxU
b2tlbml6ZXIgdG8gYXZvaWQKLSAgICAvLyBpbnRlcmZlcmluZyB3aXRoIGNsaWVudCBhcHBsaWNh
dGlvbnMgdGhhdCBhbHNvIHVzZSBsaWJ4bWwyLiAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTczNTMKLSAgICByZXR1cm4gZ2xvYmFsRG9jTG9hZGVyICYmIGN1cnJlbnRU
aHJlYWQoKSA9PSBsaWJ4bWxMb2FkZXJUaHJlYWQ7Ci19Ci0KLWNsYXNzIE9mZnNldEJ1ZmZlciB7
Ci1wdWJsaWM6Ci0gICAgT2Zmc2V0QnVmZmVyKGNvbnN0IFZlY3RvcjxjaGFyPiYgYikgOiBtX2J1
ZmZlcihiKSwgbV9jdXJyZW50T2Zmc2V0KDApIHsgfQotICAgIAotICAgIGludCByZWFkT3V0Qnl0
ZXMoY2hhciogb3V0cHV0QnVmZmVyLCB1bnNpZ25lZCBhc2tlZFRvUmVhZCkgewotICAgICAgICB1
bnNpZ25lZCBieXRlc0xlZnQgPSBtX2J1ZmZlci5zaXplKCkgLSBtX2N1cnJlbnRPZmZzZXQ7Ci0g
ICAgICAgIHVuc2lnbmVkIGxlblRvQ29weSA9IG1pbihhc2tlZFRvUmVhZCwgYnl0ZXNMZWZ0KTsK
LSAgICAgICAgaWYgKGxlblRvQ29weSkgewotICAgICAgICAgICAgbWVtY3B5KG91dHB1dEJ1ZmZl
ciwgbV9idWZmZXIuZGF0YSgpICsgbV9jdXJyZW50T2Zmc2V0LCBsZW5Ub0NvcHkpOwotICAgICAg
ICAgICAgbV9jdXJyZW50T2Zmc2V0ICs9IGxlblRvQ29weTsKLSAgICAgICAgfQotICAgICAgICBy
ZXR1cm4gbGVuVG9Db3B5OwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBWZWN0b3I8Y2hhcj4gbV9i
dWZmZXI7Ci0gICAgdW5zaWduZWQgbV9jdXJyZW50T2Zmc2V0OwotfTsKLQotc3RhdGljIGJvb2wg
c2hvdWxkQWxsb3dFeHRlcm5hbExvYWQoY29uc3QgS1VSTCYgdXJsKQotewotICAgIFN0cmluZyB1
cmxTdHJpbmcgPSB1cmwuc3RyaW5nKCk7Ci0KLSAgICAvLyBPbiBub24tV2luZG93cyBwbGF0Zm9y
bXMgbGlieG1sIGFza3MgZm9yIHRoaXMgVVJMLCB0aGUKLSAgICAvLyAiWE1MX1hNTF9ERUZBVUxU
X0NBVEFMT0ciLCBvbiBpbml0aWFsaXphdGlvbi4KLSAgICBpZiAodXJsU3RyaW5nID09ICJmaWxl
Oi8vL2V0Yy94bWwvY2F0YWxvZyIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9u
IFdpbmRvd3MsIGxpYnhtbCBjb21wdXRlcyBhIFVSTCByZWxhdGl2ZSB0byB3aGVyZSBpdHMgRExM
IHJlc2lkZXMuCi0gICAgaWYgKHVybFN0cmluZy5zdGFydHNXaXRoKCJmaWxlOi8vLyIsIGZhbHNl
KSAmJiB1cmxTdHJpbmcuZW5kc1dpdGgoIi9ldGMvY2F0YWxvZyIsIGZhbHNlKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhlIG1vc3QgY29tbW9uIERURC4gIFRoZXJlIGlzbid0
IG11Y2ggcG9pbnQgaW4gaGFtbWVyaW5nIHd3dy53M2Mub3JnCi0gICAgLy8gYnkgcmVxdWVzdGlu
ZyB0aGlzIFVSTCBmb3IgZXZlcnkgWEhUTUwgZG9jdW1lbnQuCi0gICAgaWYgKHVybFN0cmluZy5z
dGFydHNXaXRoKCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbCIsIGZhbHNlKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgLy8gU2ltaWxhcmx5LCB0aGVyZSBpc24ndCBtdWNoIHBvaW50
IGluIHJlcXVlc3RpbmcgdGhlIFNWRyBEVEQuCi0gICAgaWYgKHVybFN0cmluZy5zdGFydHNXaXRo
KCJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkciLCBmYWxzZSkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIC8vIFRoZSBsaWJ4bWwgZG9lc24ndCBnaXZlIHVzIGEgbG90IG9mIGNv
bnRleHQgZm9yIGRlY2lkaW5nIHdoZXRoZXIgdG8KLSAgICAvLyBhbGxvdyB0aGlzIHJlcXVlc3Qu
ICBJbiB0aGUgd29yc3QgY2FzZSwgdGhpcyBsb2FkIGNvdWxkIGJlIGZvciBhbgotICAgIC8vIGV4
dGVybmFsIGVudGl0eSBhbmQgdGhlIHJlc3VsdGluZyBkb2N1bWVudCBjb3VsZCBzaW1wbHkgcmVh
ZCB0aGUKLSAgICAvLyByZXRyaWV2ZWQgY29udGVudC4gIElmIHdlIGhhZCBtb3JlIGNvbnRleHQs
IHdlIGNvdWxkIHBvdGVudGlhbGx5IGFsbG93Ci0gICAgLy8gdGhlIHBhcnNlciB0byBsb2FkIGEg
RFRELiAgQXMgdGhpbmdzIHN0YW5kLCB3ZSB0YWtlIHRoZSBjb25zZXJ2YXRpdmUKLSAgICAvLyBy
b3V0ZSBhbmQgYWxsb3cgc2FtZS1vcmlnaW4gcmVxdWVzdHMgb25seS4KLSAgICBpZiAoIWdsb2Jh
bERvY0xvYWRlci0+ZG9jKCktPnNlY3VyaXR5T3JpZ2luKCktPmNhblJlcXVlc3QodXJsKSkgewot
ICAgICAgICBnbG9iYWxEb2NMb2FkZXItPnByaW50QWNjZXNzRGVuaWVkTWVzc2FnZSh1cmwpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0
YXRpYyB2b2lkKiBvcGVuRnVuYyhjb25zdCBjaGFyKiB1cmkpCi17Ci0gICAgQVNTRVJUKGdsb2Jh
bERvY0xvYWRlcik7Ci0gICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBsaWJ4bWxMb2FkZXJU
aHJlYWQpOwotCi0gICAgS1VSTCB1cmwodXJpKTsKLQotICAgIGlmICghc2hvdWxkQWxsb3dFeHRl
cm5hbExvYWQodXJsKSkKLSAgICAgICAgcmV0dXJuICZnbG9iYWxEZXNjcmlwdG9yOwotCi0gICAg
UmVzb3VyY2VFcnJvciBlcnJvcjsKLSAgICBSZXNvdXJjZVJlc3BvbnNlIHJlc3BvbnNlOwotICAg
IFZlY3RvcjxjaGFyPiBkYXRhOwotICAgIAotICAgIERvY0xvYWRlciogZG9jTG9hZGVyID0gZ2xv
YmFsRG9jTG9hZGVyOwotICAgIGdsb2JhbERvY0xvYWRlciA9IDA7Ci0gICAgLy8gRklYTUU6IFdl
IHNob3VsZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBnbG9iYWwgZXJyb3IgaGFuZGxlciBhcyB3ZWxs
LgotCi0gICAgaWYgKGRvY0xvYWRlci0+ZnJhbWUoKSkgCi0gICAgICAgIGRvY0xvYWRlci0+ZnJh
bWUoKS0+bG9hZGVyKCktPmxvYWRSZXNvdXJjZVN5bmNocm9ub3VzbHkodXJsLCBlcnJvciwgcmVz
cG9uc2UsIGRhdGEpOwotCi0gICAgZ2xvYmFsRG9jTG9hZGVyID0gZG9jTG9hZGVyOwotCi0gICAg
cmV0dXJuIG5ldyBPZmZzZXRCdWZmZXIoZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZEZ1bmMo
dm9pZCogY29udGV4dCwgY2hhciogYnVmZmVyLCBpbnQgbGVuKQotewotICAgIC8vIERvIDAtYnl0
ZSByZWFkcyBpbiBjYXNlIG9mIGEgbnVsbCBkZXNjcmlwdG9yCi0gICAgaWYgKGNvbnRleHQgPT0g
Jmdsb2JhbERlc2NyaXB0b3IpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgICAKLSAgICBPZmZz
ZXRCdWZmZXIqIGRhdGEgPSBzdGF0aWNfY2FzdDxPZmZzZXRCdWZmZXIqPihjb250ZXh0KTsKLSAg
ICByZXR1cm4gZGF0YS0+cmVhZE91dEJ5dGVzKGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIGlu
dCB3cml0ZUZ1bmModm9pZCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuKQot
ewotICAgIC8vIEFsd2F5cyBqdXN0IGRvIDAtYnl0ZSB3cml0ZXMKLSAgICByZXR1cm4gMDsKLX0K
LQotc3RhdGljIGludCBjbG9zZUZ1bmModm9pZCogY29udGV4dCkKLXsKLSAgICBpZiAoY29udGV4
dCAhPSAmZ2xvYmFsRGVzY3JpcHRvcikgewotICAgICAgICBPZmZzZXRCdWZmZXIqIGRhdGEgPSBz
dGF0aWNfY2FzdDxPZmZzZXRCdWZmZXIqPihjb250ZXh0KTsKLSAgICAgICAgZGVsZXRlIGRhdGE7
Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBlcnJvckZ1bmModm9pZCos
IGNvbnN0IGNoYXIqLCAuLi4pCi17Ci0gICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2UgdG8g
ZGlzcGxheSBlcnJvciBtZXNzYWdlcyBzb21ld2hlcmUuCi19Ci0KLXZvaWQgc2V0TG9hZGVyRm9y
TGliWE1MQ2FsbGJhY2tzKERvY0xvYWRlciogZG9jTG9hZGVyKQotewotICAgIGdsb2JhbERvY0xv
YWRlciA9IGRvY0xvYWRlcjsKLX0KLQotc3RhdGljIGJvb2wgZGlkSW5pdCA9IGZhbHNlOwotCi1z
dGF0aWMgeG1sUGFyc2VyQ3R4dFB0ciBjcmVhdGVTdHJpbmdQYXJzZXIoeG1sU0FYSGFuZGxlclB0
ciBoYW5kbGVycywgdm9pZCogdXNlckRhdGEpCi17Ci0gICAgaWYgKCFkaWRJbml0KSB7Ci0gICAg
ICAgIHhtbEluaXRQYXJzZXIoKTsKLSAgICAgICAgeG1sUmVnaXN0ZXJJbnB1dENhbGxiYWNrcyht
YXRjaEZ1bmMsIG9wZW5GdW5jLCByZWFkRnVuYywgY2xvc2VGdW5jKTsKLSAgICAgICAgeG1sUmVn
aXN0ZXJPdXRwdXRDYWxsYmFja3MobWF0Y2hGdW5jLCBvcGVuRnVuYywgd3JpdGVGdW5jLCBjbG9z
ZUZ1bmMpOwotICAgICAgICBsaWJ4bWxMb2FkZXJUaHJlYWQgPSBjdXJyZW50VGhyZWFkKCk7Ci0g
ICAgICAgIGRpZEluaXQgPSB0cnVlOwotICAgIH0KLQotICAgIHhtbFBhcnNlckN0eHRQdHIgcGFy
c2VyID0geG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQoaGFuZGxlcnMsIDAsIDAsIDAsIDApOwotICAg
IHBhcnNlci0+X3ByaXZhdGUgPSB1c2VyRGF0YTsKLSAgICBwYXJzZXItPnJlcGxhY2VFbnRpdGll
cyA9IHRydWU7Ci0gICAgY29uc3QgVUNoYXIgQk9NID0gMHhGRUZGOwotICAgIGNvbnN0IHVuc2ln
bmVkIGNoYXIgQk9NSGlnaEJ5dGUgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBj
aGFyKj4oJkJPTSk7Ci0gICAgeG1sU3dpdGNoRW5jb2RpbmcocGFyc2VyLCBCT01IaWdoQnl0ZSA9
PSAweEZGID8gWE1MX0NIQVJfRU5DT0RJTkdfVVRGMTZMRSA6IFhNTF9DSEFSX0VOQ09ESU5HX1VU
RjE2QkUpOwotCi0gICAgcmV0dXJuIHBhcnNlcjsKLX0KLQotCi0vLyBDaHVuayBzaG91bGQgYmUg
ZW5jb2RlZCBpbiBVVEYtOAotc3RhdGljIHhtbFBhcnNlckN0eHRQdHIgY3JlYXRlTWVtb3J5UGFy
c2VyKHhtbFNBWEhhbmRsZXJQdHIgaGFuZGxlcnMsIHZvaWQqIHVzZXJEYXRhLCBjb25zdCBjaGFy
KiBjaHVuaykKLXsKLSAgICBpZiAoIWRpZEluaXQpIHsKLSAgICAgICAgeG1sSW5pdFBhcnNlcigp
OwotICAgICAgICB4bWxSZWdpc3RlcklucHV0Q2FsbGJhY2tzKG1hdGNoRnVuYywgb3BlbkZ1bmMs
IHJlYWRGdW5jLCBjbG9zZUZ1bmMpOwotICAgICAgICB4bWxSZWdpc3Rlck91dHB1dENhbGxiYWNr
cyhtYXRjaEZ1bmMsIG9wZW5GdW5jLCB3cml0ZUZ1bmMsIGNsb3NlRnVuYyk7Ci0gICAgICAgIGxp
YnhtbExvYWRlclRocmVhZCA9IGN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgZGlkSW5pdCA9IHRy
dWU7Ci0gICAgfQotCi0gICAgeG1sUGFyc2VyQ3R4dFB0ciBwYXJzZXIgPSB4bWxDcmVhdGVNZW1v
cnlQYXJzZXJDdHh0KGNodW5rLCB4bWxTdHJsZW4oKGNvbnN0IHhtbENoYXIqKWNodW5rKSk7Ci0K
LSAgICBpZiAoIXBhcnNlcikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDb3B5IHRoZSBz
YXggaGFuZGxlcgotICAgIG1lbWNweShwYXJzZXItPnNheCwgaGFuZGxlcnMsIHNpemVvZih4bWxT
QVhIYW5kbGVyKSk7Ci0KLSAgICAvLyBTZXQgcGFyc2VyIG9wdGlvbnMuCi0gICAgLy8gWE1MX1BB
UlNFX05PRElDVDogZGVmYXVsdCBkaWN0aW9uYXJ5IG9wdGlvbi4KLSAgICAvLyBYTUxfUEFSU0Vf
Tk9FTlQ6IGZvcmNlIGVudGl0aWVzIHN1YnN0aXR1dGlvbnMuCi0gICAgeG1sQ3R4dFVzZU9wdGlv
bnMocGFyc2VyLCBYTUxfUEFSU0VfTk9ESUNUIHwgWE1MX1BBUlNFX05PRU5UKTsKLQotICAgIC8v
IEludGVybmFsIGluaXRpYWxpemF0aW9uCi0gICAgcGFyc2VyLT5zYXgyID0gMTsKLSAgICBwYXJz
ZXItPmluc3RhdGUgPSBYTUxfUEFSU0VSX0NPTlRFTlQ7IC8vIFdlIGFyZSBwYXJzaW5nIGEgQ09O
VEVOVAotICAgIHBhcnNlci0+ZGVwdGggPSAwOwotICAgIHBhcnNlci0+c3RyX3htbCA9IHhtbERp
Y3RMb29rdXAocGFyc2VyLT5kaWN0LCBCQURfQ0FTVCAieG1sIiwgMyk7Ci0gICAgcGFyc2VyLT5z
dHJfeG1sbnMgPSB4bWxEaWN0TG9va3VwKHBhcnNlci0+ZGljdCwgQkFEX0NBU1QgInhtbG5zIiwg
NSk7Ci0gICAgcGFyc2VyLT5zdHJfeG1sX25zID0geG1sRGljdExvb2t1cChwYXJzZXItPmRpY3Qs
IFhNTF9YTUxfTkFNRVNQQUNFLCAzNik7Ci0gICAgcGFyc2VyLT5fcHJpdmF0ZSA9IHVzZXJEYXRh
OwotCi0gICAgcmV0dXJuIHBhcnNlcjsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfUVhN
TFNUUkVBTSkgJiYgUVRfVkVSU0lPTiA+PSAweDA0MDQwMAotY2xhc3MgRW50aXR5UmVzb2x2ZXIg
OiBwdWJsaWMgUVhtbFN0cmVhbUVudGl0eVJlc29sdmVyCi17Ci0gICAgdmlydHVhbCBRU3RyaW5n
IHJlc29sdmVVbmRlY2xhcmVkRW50aXR5KGNvbnN0IFFTdHJpbmcgJm5hbWUpOwotfTsKLQotUVN0
cmluZyBFbnRpdHlSZXNvbHZlcjo6cmVzb2x2ZVVuZGVjbGFyZWRFbnRpdHkoY29uc3QgUVN0cmlu
ZyAmbmFtZSkKLXsKLSAgICBVQ2hhciBjID0gZGVjb2RlTmFtZWRFbnRpdHkobmFtZS50b1V0Zjgo
KS5jb25zdERhdGEoKSk7Ci0gICAgcmV0dXJuIFFTdHJpbmcoYyk7Ci19Ci0jZW5kaWYKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lIGJvb2wgaXNTY3JpcHRF
bGVtZW50KEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgcmV0dXJuIGVsZW1lbnQtPmhhc1RhZ05h
bWUoSFRNTE5hbWVzOjpzY3JpcHRUYWcpCi0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgfHwgZWxl
bWVudC0+aGFzVGFnTmFtZShTVkdOYW1lczo6c2NyaXB0VGFnKQotI2VuZGlmCi0gICAgICAgIDsK
LX0KLQotaW5saW5lIFNjcmlwdEVsZW1lbnQqIGNhc3RUb1NjcmlwdEVsZW1lbnQoRWxlbWVudCog
ZWxlbWVudCkKLXsKLSAgICBBU1NFUlQoaXNTY3JpcHRFbGVtZW50KGVsZW1lbnQpKTsKLQotICAg
IGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6c2NyaXB0VGFnKSkKLSAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PEhUTUxTY3JpcHRFbGVtZW50Kj4oZWxlbWVudCk7Ci0KLSNpZiBF
TkFCTEUoU1ZHKQotICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzY3JpcHRU
YWcpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U1ZHU2NyaXB0RWxlbWVudCo+KGVsZW1l
bnQpOwotI2VuZGlmCi0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsK
LX0KLQotWE1MVG9rZW5pemVyOjpYTUxUb2tlbml6ZXIoRG9jdW1lbnQqIF9kb2MsIEZyYW1lVmll
dyogX3ZpZXcpCi0gICAgOiBtX2RvYyhfZG9jKQotICAgICwgbV92aWV3KF92aWV3KQotI2lmZGVm
IFVTRV9RWE1MU1RSRUFNCi0gICAgLCBtX3dyb3RlVGV4dChmYWxzZSkKLSNlbHNlCi0gICAgLCBt
X2NvbnRleHQoMCkKLSNlbmRpZgotICAgICwgbV9jdXJyZW50Tm9kZShfZG9jKQotICAgICwgbV9j
dXJyZW50Tm9kZUlzUmVmZXJlbmNlZChmYWxzZSkKLSAgICAsIG1fc2F3RXJyb3IoZmFsc2UpCi0g
ICAgLCBtX3Nhd1hTTFRyYW5zZm9ybShmYWxzZSkKLSAgICAsIG1fc2F3Rmlyc3RFbGVtZW50KGZh
bHNlKQotICAgICwgbV9pc1hIVE1MRG9jdW1lbnQoZmFsc2UpCi0gICAgLCBtX3BhcnNlclBhdXNl
ZChmYWxzZSkKLSAgICAsIG1fcmVxdWVzdGluZ1NjcmlwdChmYWxzZSkKLSAgICAsIG1fZmluaXNo
Q2FsbGVkKGZhbHNlKQotICAgICwgbV9lcnJvckNvdW50KDApCi0gICAgLCBtX2xhc3RFcnJvckxp
bmUoMCkKLSAgICAsIG1fbGFzdEVycm9yQ29sdW1uKDApCi0gICAgLCBtX3BlbmRpbmdTY3JpcHQo
MCkKLSAgICAsIG1fc2NyaXB0U3RhcnRMaW5lKDApCi0gICAgLCBtX3BhcnNpbmdGcmFnbWVudChm
YWxzZSkKLSNpZm5kZWYgVVNFX1FYTUxTVFJFQU0KLSAgICAsIG1fcGVuZGluZ0NhbGxiYWNrcyhu
ZXcgUGVuZGluZ0NhbGxiYWNrcykKLSNlbmRpZgotewotI2lmIGRlZmluZWQoVVNFX1FYTUxTVFJF
QU0pICYmIFFUX1ZFUlNJT04gPj0gMHgwNDA0MDAKLSAgICBtX3N0cmVhbS5zZXRFbnRpdHlSZXNv
bHZlcihuZXcgRW50aXR5UmVzb2x2ZXIpOwotI2VuZGlmCi19Ci0KLVhNTFRva2VuaXplcjo6WE1M
VG9rZW5pemVyKERvY3VtZW50RnJhZ21lbnQqIGZyYWdtZW50LCBFbGVtZW50KiBwYXJlbnRFbGVt
ZW50KQotICAgIDogbV9kb2MoZnJhZ21lbnQtPmRvY3VtZW50KCkpCi0gICAgLCBtX3ZpZXcoMCkK
LSNpZmRlZiBVU0VfUVhNTFNUUkVBTQotICAgICwgbV93cm90ZVRleHQoZmFsc2UpCi0jZWxzZQot
ICAgICwgbV9jb250ZXh0KDApCi0jZW5kaWYKLSAgICAsIG1fY3VycmVudE5vZGUoZnJhZ21lbnQp
Ci0gICAgLCBtX2N1cnJlbnROb2RlSXNSZWZlcmVuY2VkKGZyYWdtZW50KQotICAgICwgbV9zYXdF
cnJvcihmYWxzZSkKLSAgICAsIG1fc2F3WFNMVHJhbnNmb3JtKGZhbHNlKQotICAgICwgbV9zYXdG
aXJzdEVsZW1lbnQoZmFsc2UpCi0gICAgLCBtX2lzWEhUTUxEb2N1bWVudChmYWxzZSkKLSAgICAs
IG1fcGFyc2VyUGF1c2VkKGZhbHNlKQotICAgICwgbV9yZXF1ZXN0aW5nU2NyaXB0KGZhbHNlKQot
ICAgICwgbV9maW5pc2hDYWxsZWQoZmFsc2UpCi0gICAgLCBtX2Vycm9yQ291bnQoMCkKLSAgICAs
IG1fbGFzdEVycm9yTGluZSgwKQotICAgICwgbV9sYXN0RXJyb3JDb2x1bW4oMCkKLSAgICAsIG1f
cGVuZGluZ1NjcmlwdCgwKQotICAgICwgbV9zY3JpcHRTdGFydExpbmUoMCkKLSAgICAsIG1fcGFy
c2luZ0ZyYWdtZW50KHRydWUpCi0jaWZuZGVmIFVTRV9RWE1MU1RSRUFNCi0gICAgLCBtX3BlbmRp
bmdDYWxsYmFja3MobmV3IFBlbmRpbmdDYWxsYmFja3MpCi0jZW5kaWYKLXsKLSAgICBpZiAoZnJh
Z21lbnQpCi0gICAgICAgIGZyYWdtZW50LT5yZWYoKTsKLSAgICBpZiAobV9kb2MpCi0gICAgICAg
IG1fZG9jLT5yZWYoKTsKLSAgICAgICAgICAKLSAgICAvLyBBZGQgbmFtZXNwYWNlcyBiYXNlZCBv
biB0aGUgcGFyZW50IG5vZGUKLSAgICBWZWN0b3I8RWxlbWVudCo+IGVsZW1TdGFjazsKLSAgICB3
aGlsZSAocGFyZW50RWxlbWVudCkgewotICAgICAgICBlbGVtU3RhY2suYXBwZW5kKHBhcmVudEVs
ZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgTm9kZSogbiA9IHBhcmVudEVsZW1lbnQtPnBhcmVu
dE5vZGUoKTsKLSAgICAgICAgaWYgKCFuIHx8ICFuLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgcGFyZW50RWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQq
PihuKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGVsZW1TdGFjay5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLSAgICAKLSNpZiAhUExBVEZPUk0oUVQpIHx8IFFUX1ZFUlNJT04gPCAweDA0MDQw
MAotICAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IGVsZW1TdGFjay5sYXN0KCk7ICFlbGVtU3Rh
Y2suaXNFbXB0eSgpOyBlbGVtU3RhY2sucmVtb3ZlTGFzdCgpKSB7Ci0gICAgICAgIGlmIChOYW1l
ZEF0dHJNYXAqIGF0dHJzID0gZWxlbWVudC0+YXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0cnMtPmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAg
ICAgICAgICBBdHRyaWJ1dGUqIGF0dHIgPSBhdHRycy0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAg
ICAgICAgICAgICBpZiAoYXR0ci0+bG9jYWxOYW1lKCkgPT0gInhtbG5zIikKLSAgICAgICAgICAg
ICAgICAgICAgbV9kZWZhdWx0TmFtZXNwYWNlVVJJID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAg
ICAgICAgICBlbHNlIGlmIChhdHRyLT5wcmVmaXgoKSA9PSAieG1sbnMiKQotICAgICAgICAgICAg
ICAgICAgICBtX3ByZWZpeFRvTmFtZXNwYWNlTWFwLnNldChhdHRyLT5sb2NhbE5hbWUoKSwgYXR0
ci0+dmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAg
IFFYbWxTdHJlYW1OYW1lc3BhY2VEZWNsYXJhdGlvbnMgbmFtZXNwYWNlczsKLSAgICBmb3IgKEVs
ZW1lbnQqIGVsZW1lbnQgPSBlbGVtU3RhY2subGFzdCgpOyAhZWxlbVN0YWNrLmlzRW1wdHkoKTsg
ZWxlbVN0YWNrLnJlbW92ZUxhc3QoKSkgewotICAgICAgICBpZiAoTmFtZWRBdHRyTWFwKiBhdHRy
cyA9IGVsZW1lbnQtPmF0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGF0dHJzLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmli
dXRlKiBhdHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYg
KGF0dHItPmxvY2FsTmFtZSgpID09ICJ4bWxucyIpCi0gICAgICAgICAgICAgICAgICAgIG1fZGVm
YXVsdE5hbWVzcGFjZVVSSSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBp
ZiAoYXR0ci0+cHJlZml4KCkgPT0gInhtbG5zIikKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNw
YWNlcy5hcHBlbmQoUVhtbFN0cmVhbU5hbWVzcGFjZURlY2xhcmF0aW9uKGF0dHItPmxvY2FsTmFt
ZSgpLCBhdHRyLT52YWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgbV9zdHJlYW0uYWRkRXh0cmFOYW1lc3BhY2VEZWNsYXJhdGlvbnMobmFtZXNwYWNlcyk7Ci0g
ICAgbV9zdHJlYW0uc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKTsKLSNlbmRp
ZgotCi0gICAgLy8gSWYgdGhlIHBhcmVudCBlbGVtZW50IGlzIG5vdCBpbiBkb2N1bWVudCB0cmVl
LCB0aGVyZSBtYXkgYmUgbm8geG1sbnMgYXR0cmlidXRlOyBqdXN0IGRlZmF1bHQgdG8gdGhlIHBh
cmVudCdzIG5hbWVzcGFjZS4KLSAgICBpZiAobV9kZWZhdWx0TmFtZXNwYWNlVVJJLmlzTnVsbCgp
ICYmICFwYXJlbnRFbGVtZW50LT5pbkRvY3VtZW50KCkpCi0gICAgICAgIG1fZGVmYXVsdE5hbWVz
cGFjZVVSSSA9IHBhcmVudEVsZW1lbnQtPm5hbWVzcGFjZVVSSSgpOwotfQotCi1YTUxUb2tlbml6
ZXI6On5YTUxUb2tlbml6ZXIoKQotewotICAgIHNldEN1cnJlbnROb2RlKDApOwotICAgIGlmICht
X3BhcnNpbmdGcmFnbWVudCAmJiBtX2RvYykKLSAgICAgICAgbV9kb2MtPmRlcmVmKCk7Ci0gICAg
aWYgKG1fcGVuZGluZ1NjcmlwdCkKLSAgICAgICAgbV9wZW5kaW5nU2NyaXB0LT5yZW1vdmVDbGll
bnQodGhpcyk7Ci0jaWYgZGVmaW5lZChVU0VfUVhNTFNUUkVBTSkgJiYgUVRfVkVSU0lPTiA+PSAw
eDA0MDQwMAotICAgIGRlbGV0ZSBtX3N0cmVhbS5lbnRpdHlSZXNvbHZlcigpOwotI2VuZGlmCi0j
aWZuZGVmIFVTRV9RWE1MU1RSRUFNCi0gICAgaWYgKG1fY29udGV4dCkKLSAgICAgICAgeG1sRnJl
ZVBhcnNlckN0eHQobV9jb250ZXh0KTsKLSNlbmRpZgotfQotCiB2b2lkIFhNTFRva2VuaXplcjo6
c2V0Q3VycmVudE5vZGUoTm9kZSogbikKIHsKICAgICBib29sIG5vZGVOZWVkc1JlZmVyZW5jZSA9
IG4gJiYgbiAhPSBtX2RvYzsKQEAgLTcyMiw2MSArODYsMTEgQEAgYm9vbCBYTUxUb2tlbml6ZXI6
OndyaXRlKGNvbnN0IFNlZ21lbnRlZFN0cmluZyYgcywgYm9vbCAvKmFwcGVuZERhdGEqLykKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKLSNpZm5kZWYgVVNFX1FYTUxTVFJFQU0K
LSAgICBpZiAoIW1fY29udGV4dCkKLSAgICAgICAgaW5pdGlhbGl6ZVBhcnNlckNvbnRleHQoKTsK
LSAgICAKLSAgICAvLyBsaWJYTUwgdGhyb3dzIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gc3dpdGNo
IHRoZSBlbmNvZGluZyBmb3IgYW4gZW1wdHkgc3RyaW5nLgotICAgIGlmIChwYXJzZVN0cmluZy5s
ZW5ndGgoKSkgewotICAgICAgICAvLyBIYWNrIGFyb3VuZCBsaWJ4bWwyJ3MgbGFjayBvZiBlbmNv
ZGluZyBvdmVyaWRlIHN1cHBvcnQgYnkgbWFudWFsbHkKLSAgICAgICAgLy8gcmVzZXR0aW5nIHRo
ZSBlbmNvZGluZyB0byBVVEYtMTYgYmVmb3JlIGV2ZXJ5IGNodW5rLiAgT3RoZXJ3aXNlIGxpYnht
bAotICAgICAgICAvLyB3aWxsIGRldGVjdCA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSI8
ZW5jb2RpbmcgbmFtZT4iPz4gYmxvY2tzIAotICAgICAgICAvLyBhbmQgc3dpdGNoIGVuY29kaW5n
cywgY2F1c2luZyB0aGUgcGFyc2UgdG8gZmFpbC4KLSAgICAgICAgY29uc3QgVUNoYXIgQk9NID0g
MHhGRUZGOwotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEJPTUhpZ2hCeXRlID0gKnJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZCT00pOwotICAgICAgICB4bWxTd2l0
Y2hFbmNvZGluZyhtX2NvbnRleHQsIEJPTUhpZ2hCeXRlID09IDB4RkYgPyBYTUxfQ0hBUl9FTkNP
RElOR19VVEYxNkxFIDogWE1MX0NIQVJfRU5DT0RJTkdfVVRGMTZCRSk7Ci0KLSAgICAgICAgeG1s
UGFyc2VDaHVuayhtX2NvbnRleHQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBhcnNl
U3RyaW5nLmNoYXJhY3RlcnMoKSksIHNpemVvZihVQ2hhcikgKiBwYXJzZVN0cmluZy5sZW5ndGgo
KSwgMCk7Ci0gICAgfQotI2Vsc2UKLSAgICBtX3dyb3RlVGV4dCA9IHRydWU7Ci0gICAgUVN0cmlu
ZyBkYXRhKHBhcnNlU3RyaW5nKTsKLSAgICBpZiAoIWRhdGEuaXNFbXB0eSgpKSB7Ci0jaWYgUVRf
VkVSU0lPTiA8IDB4MDQwNDAwCi0gICAgICAgIGlmICghbV9zYXdGaXJzdEVsZW1lbnQpIHsKLSAg
ICAgICAgICAgIGludCBpZHggPSBkYXRhLmluZGV4T2YoUUxhdGluMVN0cmluZygiPD94bWwiKSk7
Ci0gICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0
ID0gaWR4ICsgNTsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gZGF0YS5pbmRleE9mKFFMYXRp
bjFTdHJpbmcoIj8+IiksIHN0YXJ0KTsKLSAgICAgICAgICAgICAgICBRU3RyaW5nIGNvbnRlbnQg
PSBkYXRhLm1pZChzdGFydCwgZW5kLXN0YXJ0KTsKLSAgICAgICAgICAgICAgICBib29sIG9rID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBhdHRycyA9IHBh
cnNlQXR0cmlidXRlcyhjb250ZW50LCBvayk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNp
b24gPSBhdHRycy5nZXQoInZlcnNpb24iKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2Rp
bmcgPSBhdHRycy5nZXQoImVuY29kaW5nIik7Ci0gICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX3BhcnNpbmdGcmFnbWVudCkgewotICAg
ICAgICAgICAgICAgICAgICBpZiAoIXZlcnNpb24uaXNFbXB0eSgpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgbV9kb2MtPnNldFhNTFZlcnNpb24odmVyc2lvbiwgZWMpOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoIWVuY29kaW5nLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1fZG9jLT5zZXRYTUxFbmNvZGluZyhlbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgbV9zdHJlYW0uYWRkRGF0YShk
YXRhKTsKLSAgICAgICAgcGFyc2UoKTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICBpZiAobV9k
b2MtPmRlY29kZXIoKSAmJiBtX2RvYy0+ZGVjb2RlcigpLT5zYXdFcnJvcigpKSB7Ci0gICAgICAg
IC8vIElmIHRoZSBkZWNvZGVyIHNhdyBhbiBlcnJvciwgcmVwb3J0IGl0IGFzIGZhdGFsIChzdG9w
cyBwYXJzaW5nKQotICAgICAgICBoYW5kbGVFcnJvcihmYXRhbCwgIkVuY29kaW5nIGVycm9yIiwg
bGluZU51bWJlcigpLCBjb2x1bW5OdW1iZXIoKSk7Ci0gICAgfQotCisgICAgZG9Xcml0ZShzLnRv
U3RyaW5nKCkpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgZXZlbnR1YWxs
eU1hcmtBc1BhcnNlckNyZWF0ZWQoRWxlbWVudCogZWxlbWVudCkKK3ZvaWQgWE1MVG9rZW5pemVy
OjpldmVudHVhbGx5TWFya0FzUGFyc2VyQ3JlYXRlZChFbGVtZW50KiBlbGVtZW50KQogewogICAg
IGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6c2NyaXB0VGFnKSkKICAgICAgICAg
c3RhdGljX2Nhc3Q8SFRNTFNjcmlwdEVsZW1lbnQqPihlbGVtZW50KS0+c2V0Q3JlYXRlZEJ5UGFy
c2VyKHRydWUpOwpAQCAtNzk0LDUwNSArMTA4LDYgQEAgc3RhdGljIHZvaWQgZXZlbnR1YWxseU1h
cmtBc1BhcnNlckNyZWF0ZWQoRWxlbWVudCogZWxlbWVudCkKICAgICAgICAgc3RhdGljX2Nhc3Q8
SFRNTExpbmtFbGVtZW50Kj4oZWxlbWVudCktPnNldENyZWF0ZWRCeVBhcnNlcih0cnVlKTsKIH0K
IAotI2lmbmRlZiBVU0VfUVhNTFNUUkVBTQotc3RhdGljIGlubGluZSBTdHJpbmcgdG9TdHJpbmco
Y29uc3QgeG1sQ2hhciogc3RyLCB1bnNpZ25lZCBsZW4pCi17Ci0gICAgcmV0dXJuIFVURjhFbmNv
ZGluZygpLmRlY29kZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzdHIpLCBsZW4pOwot
fQotCi1zdGF0aWMgaW5saW5lIFN0cmluZyB0b1N0cmluZyhjb25zdCB4bWxDaGFyKiBzdHIpCi17
Ci0gICAgaWYgKCFzdHIpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLSAgICAKLSAgICByZXR1
cm4gVVRGOEVuY29kaW5nKCkuZGVjb2RlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHN0
ciksIHN0cmxlbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzdHIpKSk7Ci19Ci0KLXN0
cnVjdCBfeG1sU0FYMk5hbWVzcGFjZSB7Ci0gICAgY29uc3QgeG1sQ2hhciogcHJlZml4OwotICAg
IGNvbnN0IHhtbENoYXIqIHVyaTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfeG1sU0FYMk5hbWVzcGFj
ZSB4bWxTQVgyTmFtZXNwYWNlOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlRWxlbWVudE5h
bWVzcGFjZXMoRWxlbWVudCogbmV3RWxlbWVudCwgY29uc3QgeG1sQ2hhcioqIGxpYnhtbE5hbWVz
cGFjZXMsIGludCBuYl9uYW1lc3BhY2VzLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICB4bWxT
QVgyTmFtZXNwYWNlKiBuYW1lc3BhY2VzID0gcmVpbnRlcnByZXRfY2FzdDx4bWxTQVgyTmFtZXNw
YWNlKj4obGlieG1sTmFtZXNwYWNlcyk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG5iX25hbWVz
cGFjZXM7IGkrKykgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlUU5hbWUgPSAieG1sbnMiOwot
ICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gdG9TdHJpbmcobmFtZXNwYWNlc1tpXS51cmkp
OwotICAgICAgICBpZiAobmFtZXNwYWNlc1tpXS5wcmVmaXgpCi0gICAgICAgICAgICBuYW1lc3Bh
Y2VRTmFtZSA9ICJ4bWxuczoiICsgdG9TdHJpbmcobmFtZXNwYWNlc1tpXS5wcmVmaXgpOwotICAg
ICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC94
bWxucy8iLCBuYW1lc3BhY2VRTmFtZSwgbmFtZXNwYWNlVVJJLCBlYyk7Ci0gICAgICAgIGlmIChl
YykgLy8gZXhjZXB0aW9uIHNldHRpbmcgYXR0cmlidXRlcwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgIH0KLX0KLQotc3RydWN0IF94bWxTQVgyQXR0cmlidXRlcyB7Ci0gICAgY29uc3QgeG1sQ2hh
ciogbG9jYWxuYW1lOwotICAgIGNvbnN0IHhtbENoYXIqIHByZWZpeDsKLSAgICBjb25zdCB4bWxD
aGFyKiB1cmk7Ci0gICAgY29uc3QgeG1sQ2hhciogdmFsdWU7Ci0gICAgY29uc3QgeG1sQ2hhciog
ZW5kOwotfTsKLXR5cGVkZWYgc3RydWN0IF94bWxTQVgyQXR0cmlidXRlcyB4bWxTQVgyQXR0cmli
dXRlczsKLQotc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZUVsZW1lbnRBdHRyaWJ1dGVzKEVsZW1l
bnQqIG5ld0VsZW1lbnQsIGNvbnN0IHhtbENoYXIqKiBsaWJ4bWxBdHRyaWJ1dGVzLCBpbnQgbmJf
YXR0cmlidXRlcywgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgeG1sU0FYMkF0dHJpYnV0ZXMq
IGF0dHJpYnV0ZXMgPSByZWludGVycHJldF9jYXN0PHhtbFNBWDJBdHRyaWJ1dGVzKj4obGlieG1s
QXR0cmlidXRlcyk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG5iX2F0dHJpYnV0ZXM7IGkrKykg
ewotICAgICAgICBTdHJpbmcgYXR0ckxvY2FsTmFtZSA9IHRvU3RyaW5nKGF0dHJpYnV0ZXNbaV0u
bG9jYWxuYW1lKTsKLSAgICAgICAgaW50IHZhbHVlTGVuZ3RoID0gKGludCkgKGF0dHJpYnV0ZXNb
aV0uZW5kIC0gYXR0cmlidXRlc1tpXS52YWx1ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyVmFsdWUg
PSB0b1N0cmluZyhhdHRyaWJ1dGVzW2ldLnZhbHVlLCB2YWx1ZUxlbmd0aCk7Ci0gICAgICAgIFN0
cmluZyBhdHRyUHJlZml4ID0gdG9TdHJpbmcoYXR0cmlidXRlc1tpXS5wcmVmaXgpOwotICAgICAg
ICBTdHJpbmcgYXR0clVSSSA9IGF0dHJQcmVmaXguaXNFbXB0eSgpID8gU3RyaW5nKCkgOiB0b1N0
cmluZyhhdHRyaWJ1dGVzW2ldLnVyaSk7Ci0gICAgICAgIFN0cmluZyBhdHRyUU5hbWUgPSBhdHRy
UHJlZml4LmlzRW1wdHkoKSA/IGF0dHJMb2NhbE5hbWUgOiBhdHRyUHJlZml4ICsgIjoiICsgYXR0
ckxvY2FsTmFtZTsKLSAgICAgICAgCi0gICAgICAgIG5ld0VsZW1lbnQtPnNldEF0dHJpYnV0ZU5T
KGF0dHJVUkksIGF0dHJRTmFtZSwgYXR0clZhbHVlLCBlYyk7Ci0gICAgICAgIGlmIChlYykgLy8g
ZXhjZXB0aW9uIHNldHRpbmcgYXR0cmlidXRlcwotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0K
LX0KLQotdm9pZCBYTUxUb2tlbml6ZXI6OnN0YXJ0RWxlbWVudE5zKGNvbnN0IHhtbENoYXIqIHht
bExvY2FsTmFtZSwgY29uc3QgeG1sQ2hhciogeG1sUHJlZml4LCBjb25zdCB4bWxDaGFyKiB4bWxV
UkksIGludCBuYl9uYW1lc3BhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IHhtbENoYXIqKiBsaWJ4bWxOYW1lc3BhY2VzLCBpbnQgbmJfYXR0cmlidXRlcywgaW50
IG5iX2RlZmF1bHRlZCwgY29uc3QgeG1sQ2hhcioqIGxpYnhtbEF0dHJpYnV0ZXMpCi17Ci0gICAg
aWYgKG1fcGFyc2VyU3RvcHBlZCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX3Bh
cnNlclBhdXNlZCkgewotICAgICAgICBtX3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZFN0YXJ0RWxl
bWVudE5TQ2FsbGJhY2soeG1sTG9jYWxOYW1lLCB4bWxQcmVmaXgsIHhtbFVSSSwgbmJfbmFtZXNw
YWNlcywgbGlieG1sTmFtZXNwYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2F0dHJpYnV0ZXMsIG5iX2RlZmF1bHRlZCwgbGli
eG1sQXR0cmlidXRlcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgbV9zYXdG
aXJzdEVsZW1lbnQgPSB0cnVlOwotCi0gICAgZXhpdFRleHQoKTsKLQotICAgIFN0cmluZyBsb2Nh
bE5hbWUgPSB0b1N0cmluZyh4bWxMb2NhbE5hbWUpOwotICAgIFN0cmluZyB1cmkgPSB0b1N0cmlu
Zyh4bWxVUkkpOwotICAgIFN0cmluZyBwcmVmaXggPSB0b1N0cmluZyh4bWxQcmVmaXgpOwotCi0g
ICAgaWYgKG1fcGFyc2luZ0ZyYWdtZW50ICYmIHVyaS5pc051bGwoKSkgewotICAgICAgICBpZiAo
IXByZWZpeC5pc051bGwoKSkKLSAgICAgICAgICAgIHVyaSA9IG1fcHJlZml4VG9OYW1lc3BhY2VN
YXAuZ2V0KHByZWZpeCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHVyaSA9IG1fZGVmYXVs
dE5hbWVzcGFjZVVSSTsKLSAgICB9Ci0KLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBR
dWFsaWZpZWROYW1lIHFOYW1lKHByZWZpeCwgbG9jYWxOYW1lLCB1cmkpOwotICAgIFJlZlB0cjxF
bGVtZW50PiBuZXdFbGVtZW50ID0gbV9kb2MtPmNyZWF0ZUVsZW1lbnQocU5hbWUsIHRydWUsIGVj
KTsKLSAgICBpZiAoIW5ld0VsZW1lbnQpIHsKLSAgICAgICAgc3RvcFBhcnNpbmcoKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBoYW5kbGVFbGVtZW50TmFtZXNwYWNlcyhuZXdF
bGVtZW50LmdldCgpLCBsaWJ4bWxOYW1lc3BhY2VzLCBuYl9uYW1lc3BhY2VzLCBlYyk7Ci0gICAg
aWYgKGVjKSB7Ci0gICAgICAgIHN0b3BQYXJzaW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBTY3JpcHRDb250cm9sbGVyKiBqc1Byb3h5ID0gbV9kb2MtPmZyYW1lKCkgPyBtX2Rv
Yy0+ZnJhbWUoKS0+c2NyaXB0KCkgOiAwOwotICAgIGlmIChqc1Byb3h5ICYmIG1fZG9jLT5mcmFt
ZSgpLT5zY3JpcHQoKS0+aXNFbmFibGVkKCkpCi0gICAgICAgIGpzUHJveHktPnNldEV2ZW50SGFu
ZGxlckxpbmVubyhsaW5lTnVtYmVyKCkpOwotCi0gICAgaGFuZGxlRWxlbWVudEF0dHJpYnV0ZXMo
bmV3RWxlbWVudC5nZXQoKSwgbGlieG1sQXR0cmlidXRlcywgbmJfYXR0cmlidXRlcywgZWMpOwot
ICAgIGlmIChlYykgewotICAgICAgICBzdG9wUGFyc2luZygpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgaWYgKGpzUHJveHkpCi0gICAgICAgIGpzUHJveHktPnNldEV2ZW50SGFuZGxl
ckxpbmVubygwKTsKLQotICAgIG5ld0VsZW1lbnQtPmJlZ2luUGFyc2luZ0NoaWxkcmVuKCk7Ci0g
ICAgZXZlbnR1YWxseU1hcmtBc1BhcnNlckNyZWF0ZWQobmV3RWxlbWVudC5nZXQoKSk7Ci0KLSAg
ICBpZiAoaXNTY3JpcHRFbGVtZW50KG5ld0VsZW1lbnQuZ2V0KCkpKQotICAgICAgICBtX3Njcmlw
dFN0YXJ0TGluZSA9IGxpbmVOdW1iZXIoKTsKLQotICAgIGlmICghbV9jdXJyZW50Tm9kZS0+YWRk
Q2hpbGQobmV3RWxlbWVudC5nZXQoKSkpIHsKLSAgICAgICAgc3RvcFBhcnNpbmcoKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNldEN1cnJlbnROb2RlKG5ld0VsZW1lbnQuZ2V0KCkp
OwotICAgIGlmIChtX3ZpZXcgJiYgIW5ld0VsZW1lbnQtPmF0dGFjaGVkKCkpCi0gICAgICAgIG5l
d0VsZW1lbnQtPmF0dGFjaCgpOwotfQotCi12b2lkIFhNTFRva2VuaXplcjo6ZW5kRWxlbWVudE5z
KCkKLXsKLSAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBp
ZiAobV9wYXJzZXJQYXVzZWQpIHsKLSAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5hcHBlbmRF
bmRFbGVtZW50TlNDYWxsYmFjaygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAg
IGV4aXRUZXh0KCk7Ci0KLSAgICBOb2RlKiBuID0gbV9jdXJyZW50Tm9kZTsKLSAgICBSZWZQdHI8
Tm9kZT4gcGFyZW50ID0gbi0+cGFyZW50Tm9kZSgpOwotICAgIG4tPmZpbmlzaFBhcnNpbmdDaGls
ZHJlbigpOwotICAgIAotICAgIC8vIGRvbid0IGxvYWQgZXh0ZXJuYWwgc2NyaXB0cyBmb3Igc3Rh
bmRhbG9uZSBkb2N1bWVudHMgKGZvciBub3cpCi0gICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSAm
JiBtX3ZpZXcgJiYgaXNTY3JpcHRFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKSkpIHsK
LSAgICAgICAgQVNTRVJUKCFtX3BlbmRpbmdTY3JpcHQpOwotICAgICAgICBtX3JlcXVlc3RpbmdT
Y3JpcHQgPSB0cnVlOwotCi0gICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxF
bGVtZW50Kj4obik7IAotICAgICAgICBTY3JpcHRFbGVtZW50KiBzY3JpcHRFbGVtZW50ID0gY2Fz
dFRvU2NyaXB0RWxlbWVudChlbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgc2NyaXB0SHJlZiA9
IHNjcmlwdEVsZW1lbnQtPnNvdXJjZUF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgIGlmICghc2Ny
aXB0SHJlZi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBzcmMgYXR0cmli
dXRlIAotICAgICAgICAgICAgU3RyaW5nIHNjcmlwdENoYXJzZXQgPSBzY3JpcHRFbGVtZW50LT5j
aGFyc2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICgobV9wZW5kaW5nU2NyaXB0
ID0gbV9kb2MtPmRvY0xvYWRlcigpLT5yZXF1ZXN0U2NyaXB0KHNjcmlwdEhyZWYsIHNjcmlwdENo
YXJzZXQpKSkgewotICAgICAgICAgICAgICAgIG1fc2NyaXB0RWxlbWVudCA9IGVsZW1lbnQ7Ci0g
ICAgICAgICAgICAgICAgbV9wZW5kaW5nU2NyaXB0LT5hZGRDbGllbnQodGhpcyk7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBtX3BlbmRpbmdTY3JpcHQgd2lsbCBiZSAwIGlmIHNjcmlwdCB3YXMgYWxy
ZWFkeSBsb2FkZWQgYW5kIHJlZigpIGV4ZWN1dGVkIGl0Ci0gICAgICAgICAgICAgICAgaWYgKG1f
cGVuZGluZ1NjcmlwdCkKLSAgICAgICAgICAgICAgICAgICAgcGF1c2VQYXJzaW5nKCk7Ci0gICAg
ICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgbV9zY3JpcHRFbGVtZW50ID0gMDsKLQot
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHNjcmlwdENvZGUgPSBzY3JpcHRF
bGVtZW50LT5zY3JpcHRDb250ZW50KCk7Ci0gICAgICAgICAgICBtX3ZpZXctPmZyYW1lKCktPmxv
YWRlcigpLT5leGVjdXRlU2NyaXB0KG1fZG9jLT51cmwoKS5zdHJpbmcoKSwgbV9zY3JpcHRTdGFy
dExpbmUsIHNjcmlwdENvZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9yZXF1ZXN0aW5nU2Ny
aXB0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgc2V0Q3VycmVudE5vZGUocGFyZW50LmdldCgpKTsK
LX0KLQotdm9pZCBYTUxUb2tlbml6ZXI6OmNoYXJhY3RlcnMoY29uc3QgeG1sQ2hhciogcywgaW50
IGxlbikKLXsKLSAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgaWYgKG1fcGFyc2VyUGF1c2VkKSB7Ci0gICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+
YXBwZW5kQ2hhcmFjdGVyc0NhbGxiYWNrKHMsIGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgCi0gICAgaWYgKG1fY3VycmVudE5vZGUtPmlzVGV4dE5vZGUoKSB8fCBlbnRlclRleHQo
KSkKLSAgICAgICAgbV9idWZmZXJlZFRleHQuYXBwZW5kKHMsIGxlbik7Ci19Ci0KLXZvaWQgWE1M
VG9rZW5pemVyOjplcnJvcihFcnJvclR5cGUgdHlwZSwgY29uc3QgY2hhciogbWVzc2FnZSwgdmFf
bGlzdCBhcmdzKQotewotICAgIGlmIChtX3BhcnNlclN0b3BwZWQpCi0gICAgICAgIHJldHVybjsK
LQotI2lmIFBMQVRGT1JNKFdJTl9PUykKLSAgICBjaGFyIG1bMTAyNF07Ci0gICAgdnNucHJpbnRm
KG0sIHNpemVvZihtKSAtIDEsIG1lc3NhZ2UsIGFyZ3MpOwotI2Vsc2UKLSAgICBjaGFyKiBtOwot
ICAgIHZhc3ByaW50ZigmbSwgbWVzc2FnZSwgYXJncyk7Ci0jZW5kaWYKLSAgICAKLSAgICBpZiAo
bV9wYXJzZXJQYXVzZWQpCi0gICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+YXBwZW5kRXJyb3JD
YWxsYmFjayh0eXBlLCBtLCBsaW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKLSAgICBlbHNl
Ci0gICAgICAgIGhhbmRsZUVycm9yKHR5cGUsIG0sIGxpbmVOdW1iZXIoKSwgY29sdW1uTnVtYmVy
KCkpOwotCi0jaWYgIVBMQVRGT1JNKFdJTl9PUykKLSAgICBmcmVlKG0pOwotI2VuZGlmCi19Ci0K
LXZvaWQgWE1MVG9rZW5pemVyOjpwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY29uc3QgeG1sQ2hhciog
dGFyZ2V0LCBjb25zdCB4bWxDaGFyKiBkYXRhKQotewotICAgIGlmIChtX3BhcnNlclN0b3BwZWQp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3BhcnNlclBhdXNlZCkgewotICAgICAgICBt
X3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkNhbGxiYWNrKHRh
cmdldCwgZGF0YSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgZXhpdFRleHQo
KTsKLQotICAgIC8vICMjIyBoYW5kbGUgZXhjZXB0aW9ucwotICAgIGludCBleGNlcHRpb24gPSAw
OwotICAgIFJlZlB0cjxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IHBpID0gbV9kb2MtPmNyZWF0ZVBy
b2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgdG9TdHJpbmcodGFyZ2V0KSwgdG9TdHJpbmco
ZGF0YSksIGV4Y2VwdGlvbik7Ci0gICAgaWYgKGV4Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgcGktPnNldENyZWF0ZWRCeVBhcnNlcih0cnVlKTsKLSAgICAKLSAgICBpZiAoIW1fY3Vy
cmVudE5vZGUtPmFkZENoaWxkKHBpLmdldCgpKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICht
X3ZpZXcgJiYgIXBpLT5hdHRhY2hlZCgpKQotICAgICAgICBwaS0+YXR0YWNoKCk7Ci0KLSAgICBw
aS0+ZmluaXNoUGFyc2luZ0NoaWxkcmVuKCk7Ci0KLSNpZiBFTkFCTEUoWFNMVCkKLSAgICBtX3Nh
d1hTTFRyYW5zZm9ybSA9ICFtX3Nhd0ZpcnN0RWxlbWVudCAmJiBwaS0+aXNYU0woKTsKLSAgICBp
ZiAobV9zYXdYU0xUcmFuc2Zvcm0gJiYgIW1fZG9jLT50cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgp
KQotICAgICAgICBzdG9wUGFyc2luZygpOwotI2VuZGlmCi19Ci0KLXZvaWQgWE1MVG9rZW5pemVy
OjpjZGF0YUJsb2NrKGNvbnN0IHhtbENoYXIqIHMsIGludCBsZW4pCi17Ci0gICAgaWYgKG1fcGFy
c2VyU3RvcHBlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fcGFyc2VyUGF1c2VkKSB7
Ci0gICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+YXBwZW5kQ0RBVEFCbG9ja0NhbGxiYWNrKHMs
IGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgZXhpdFRleHQoKTsKLQot
ICAgIFJlZlB0cjxOb2RlPiBuZXdOb2RlID0gbmV3IENEQVRBU2VjdGlvbihtX2RvYywgdG9TdHJp
bmcocywgbGVuKSk7Ci0gICAgaWYgKCFtX2N1cnJlbnROb2RlLT5hZGRDaGlsZChuZXdOb2RlLmdl
dCgpKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChtX3ZpZXcgJiYgIW5ld05vZGUtPmF0dGFj
aGVkKCkpCi0gICAgICAgIG5ld05vZGUtPmF0dGFjaCgpOwotfQotCi12b2lkIFhNTFRva2VuaXpl
cjo6Y29tbWVudChjb25zdCB4bWxDaGFyKiBzKQotewotICAgIGlmIChtX3BhcnNlclN0b3BwZWQp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3BhcnNlclBhdXNlZCkgewotICAgICAgICBt
X3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZENvbW1lbnRDYWxsYmFjayhzKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICAKLSAgICBleGl0VGV4dCgpOwotCi0gICAgUmVmUHRyPE5vZGU+IG5l
d05vZGUgPSBuZXcgQ29tbWVudChtX2RvYywgdG9TdHJpbmcocykpOwotICAgIG1fY3VycmVudE5v
ZGUtPmFkZENoaWxkKG5ld05vZGUuZ2V0KCkpOwotICAgIGlmIChtX3ZpZXcgJiYgIW5ld05vZGUt
PmF0dGFjaGVkKCkpCi0gICAgICAgIG5ld05vZGUtPmF0dGFjaCgpOwotfQotCi12b2lkIFhNTFRv
a2VuaXplcjo6c3RhcnREb2N1bWVudChjb25zdCB4bWxDaGFyKiB2ZXJzaW9uLCBjb25zdCB4bWxD
aGFyKiBlbmNvZGluZywgaW50IHN0YW5kYWxvbmUpCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7Ci0KLSAgICBpZiAodmVyc2lvbikKLSAgICAgICAgbV9kb2MtPnNldFhNTFZlcnNpb24odG9T
dHJpbmcodmVyc2lvbiksIGVjKTsKLSAgICBtX2RvYy0+c2V0WE1MU3RhbmRhbG9uZShzdGFuZGFs
b25lID09IDEsIGVjKTsgLy8gcG9zc2libGUgdmFsdWVzIGFyZSAwLCAxLCBhbmQgLTEKLSAgICBp
ZiAoZW5jb2RpbmcpCi0gICAgICAgIG1fZG9jLT5zZXRYTUxFbmNvZGluZyh0b1N0cmluZyhlbmNv
ZGluZykpOwotfQotCi12b2lkIFhNTFRva2VuaXplcjo6ZW5kRG9jdW1lbnQoKQotewotICAgIGV4
aXRUZXh0KCk7Ci19Ci0KLXZvaWQgWE1MVG9rZW5pemVyOjppbnRlcm5hbFN1YnNldChjb25zdCB4
bWxDaGFyKiBuYW1lLCBjb25zdCB4bWxDaGFyKiBleHRlcm5hbElELCBjb25zdCB4bWxDaGFyKiBz
eXN0ZW1JRCkKLXsKLSAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKLSAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5h
cHBlbmRJbnRlcm5hbFN1YnNldENhbGxiYWNrKG5hbWUsIGV4dGVybmFsSUQsIHN5c3RlbUlEKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAobV9kb2MpCi0gICAgICAgIG1f
ZG9jLT5hZGRDaGlsZChEb2N1bWVudFR5cGU6OmNyZWF0ZShtX2RvYywgdG9TdHJpbmcobmFtZSks
IHRvU3RyaW5nKGV4dGVybmFsSUQpLCB0b1N0cmluZyhzeXN0ZW1JRCkpKTsKLX0KLQotc3RhdGlj
IGlubGluZSBYTUxUb2tlbml6ZXIqIGdldFRva2VuaXplcih2b2lkKiBjbG9zdXJlKQotewotICAg
IHhtbFBhcnNlckN0eHRQdHIgY3R4dCA9IHN0YXRpY19jYXN0PHhtbFBhcnNlckN0eHRQdHI+KGNs
b3N1cmUpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxYTUxUb2tlbml6ZXIqPihjdHh0LT5fcHJp
dmF0ZSk7Ci19Ci0KLS8vIFRoaXMgaXMgYSBoYWNrIGFyb3VuZCBodHRwOi8vYnVnemlsbGEuZ25v
bWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTkyMTkKLS8vIE90aGVyd2lzZSBsaWJ4bWwgc2VlbXMg
dG8gY2FsbCBhbGwgdGhlIFNBWCBjYWxsYmFja3MgdHdpY2UgZm9yIGFueSByZXBsYWNlZCBlbnRp
dHkuCi1zdGF0aWMgaW5saW5lIGJvb2wgaGFja0Fyb3VuZExpYlhNTEVudGl0eUJ1Zyh2b2lkKiBj
bG9zdXJlKQotewotI2lmIExJQlhNTF9WRVJTSU9OID49IDIwNjI3Ci0gICAgLy8gVGhpcyBidWcg
aGFzIGJlZW4gZml4ZWQgaW4gbGlieG1sIDIuNi4yNy4KLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxz
ZQotICAgIHJldHVybiBzdGF0aWNfY2FzdDx4bWxQYXJzZXJDdHh0UHRyPihjbG9zdXJlKS0+bm9k
ZTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBzdGFydEVsZW1lbnROc0hhbmRsZXIodm9pZCog
Y2xvc3VyZSwgY29uc3QgeG1sQ2hhciogbG9jYWxuYW1lLCBjb25zdCB4bWxDaGFyKiBwcmVmaXgs
IGNvbnN0IHhtbENoYXIqIHVyaSwgaW50IG5iX25hbWVzcGFjZXMsIGNvbnN0IHhtbENoYXIqKiBu
YW1lc3BhY2VzLCBpbnQgbmJfYXR0cmlidXRlcywgaW50IG5iX2RlZmF1bHRlZCwgY29uc3QgeG1s
Q2hhcioqIGxpYnhtbEF0dHJpYnV0ZXMpCi17Ci0gICAgaWYgKGhhY2tBcm91bmRMaWJYTUxFbnRp
dHlCdWcoY2xvc3VyZSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGdldFRva2VuaXplcihjbG9z
dXJlKS0+c3RhcnRFbGVtZW50TnMobG9jYWxuYW1lLCBwcmVmaXgsIHVyaSwgbmJfbmFtZXNwYWNl
cywgbmFtZXNwYWNlcywgbmJfYXR0cmlidXRlcywgbmJfZGVmYXVsdGVkLCBsaWJ4bWxBdHRyaWJ1
dGVzKTsKLX0KLQotc3RhdGljIHZvaWQgZW5kRWxlbWVudE5zSGFuZGxlcih2b2lkKiBjbG9zdXJl
LCBjb25zdCB4bWxDaGFyKiBsb2NhbG5hbWUsIGNvbnN0IHhtbENoYXIqIHByZWZpeCwgY29uc3Qg
eG1sQ2hhciogdXJpKQotewotICAgIGlmIChoYWNrQXJvdW5kTGliWE1MRW50aXR5QnVnKGNsb3N1
cmUpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5l
bmRFbGVtZW50TnMoKTsKLX0KLQotc3RhdGljIHZvaWQgY2hhcmFjdGVyc0hhbmRsZXIodm9pZCog
Y2xvc3VyZSwgY29uc3QgeG1sQ2hhciogcywgaW50IGxlbikKLXsKLSAgICBpZiAoaGFja0Fyb3Vu
ZExpYlhNTEVudGl0eUJ1ZyhjbG9zdXJlKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGdl
dFRva2VuaXplcihjbG9zdXJlKS0+Y2hhcmFjdGVycyhzLCBsZW4pOwotfQotCi1zdGF0aWMgdm9p
ZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHhtbENo
YXIqIHRhcmdldCwgY29uc3QgeG1sQ2hhciogZGF0YSkKLXsKLSAgICBpZiAoaGFja0Fyb3VuZExp
YlhNTEVudGl0eUJ1ZyhjbG9zdXJlKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGdldFRv
a2VuaXplcihjbG9zdXJlKS0+cHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci19
Ci0KLXN0YXRpYyB2b2lkIGNkYXRhQmxvY2tIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHht
bENoYXIqIHMsIGludCBsZW4pCi17Ci0gICAgaWYgKGhhY2tBcm91bmRMaWJYTUxFbnRpdHlCdWco
Y2xvc3VyZSkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBnZXRUb2tlbml6ZXIoY2xvc3Vy
ZSktPmNkYXRhQmxvY2socywgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgY29tbWVudEhhbmRsZXIo
dm9pZCogY2xvc3VyZSwgY29uc3QgeG1sQ2hhciogY29tbWVudCkKLXsKLSAgICBpZiAoaGFja0Fy
b3VuZExpYlhNTEVudGl0eUJ1ZyhjbG9zdXJlKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAg
IGdldFRva2VuaXplcihjbG9zdXJlKS0+Y29tbWVudChjb21tZW50KTsKLX0KLQotV1RGX0FUVFJJ
QlVURV9QUklOVEYoMiwgMykKLXN0YXRpYyB2b2lkIHdhcm5pbmdIYW5kbGVyKHZvaWQqIGNsb3N1
cmUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAg
dmFfc3RhcnQoYXJncywgbWVzc2FnZSk7Ci0gICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5lcnJv
cihYTUxUb2tlbml6ZXI6Ondhcm5pbmcsIG1lc3NhZ2UsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdz
KTsKLX0KLQotV1RGX0FUVFJJQlVURV9QUklOVEYoMiwgMykKLXN0YXRpYyB2b2lkIGZhdGFsRXJy
b3JIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikKLXsKLSAg
ICB2YV9saXN0IGFyZ3M7Ci0gICAgdmFfc3RhcnQoYXJncywgbWVzc2FnZSk7Ci0gICAgZ2V0VG9r
ZW5pemVyKGNsb3N1cmUpLT5lcnJvcihYTUxUb2tlbml6ZXI6OmZhdGFsLCBtZXNzYWdlLCBhcmdz
KTsKLSAgICB2YV9lbmQoYXJncyk7Ci19Ci0KLVdURl9BVFRSSUJVVEVfUFJJTlRGKDIsIDMpCi1z
dGF0aWMgdm9pZCBub3JtYWxFcnJvckhhbmRsZXIodm9pZCogY2xvc3VyZSwgY29uc3QgY2hhciog
bWVzc2FnZSwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBt
ZXNzYWdlKTsKLSAgICBnZXRUb2tlbml6ZXIoY2xvc3VyZSktPmVycm9yKFhNTFRva2VuaXplcjo6
bm9uRmF0YWwsIG1lc3NhZ2UsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLX0KLQotLy8gVXNp
bmcgYSBnbG9iYWwgdmFyaWFibGUgZW50aXR5IGFuZCBtYXJraW5nIGl0IFhNTF9JTlRFUk5BTF9Q
UkVERUZJTkVEX0VOVElUWSBpcwotLy8gYSBoYWNrIHRvIGF2b2lkIG1hbGxvYy9mcmVlLiBVc2lu
ZyBhIGdsb2JhbCB2YXJpYWJsZSBsaWtlIHRoaXMgY291bGQgY2F1c2UgdHJvdWJsZQotLy8gaWYg
bGlieG1sIGltcGxlbWVudGF0aW9uIGRldGFpbHMgd2VyZSB0byBjaGFuZ2UKLXN0YXRpYyB4bWxD
aGFyIHNoYXJlZFhIVE1MRW50aXR5UmVzdWx0WzVdID0gezAsMCwwLDAsMH07Ci1zdGF0aWMgeG1s
RW50aXR5IHNoYXJlZFhIVE1MRW50aXR5ID0gewotICAgIDAsIFhNTF9FTlRJVFlfREVDTCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgCi0gICAgc2hhcmVkWEhUTUxFbnRpdHlSZXN1bHQsIHNoYXJlZFhI
VE1MRW50aXR5UmVzdWx0LCAwLAotICAgIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWSwg
MCwgMCwgMCwgMCwgMCwKLSNpZiBMSUJYTUxfVkVSU0lPTiA+PSAyMDYyNwotICAgIC8vIHhtbEVu
dGl0eSBnYWluZWQgYW4gZXh0cmEgbWVtYmVyIGluIDIuNi4yNy4KLSAgICAxCi0jZW5kaWYKLX07
Ci0KLXN0YXRpYyB4bWxFbnRpdHlQdHIgZ2V0WEhUTUxFbnRpdHkoY29uc3QgeG1sQ2hhciogbmFt
ZSkKLXsKLSAgICBVQ2hhciBjID0gZGVjb2RlTmFtZWRFbnRpdHkocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4obmFtZSkpOwotICAgIGlmICghYykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICBDU3RyaW5nIHZhbHVlID0gU3RyaW5nKCZjLCAxKS51dGY4KCk7Ci0gICAgQVNTRVJUKHZhbHVl
Lmxlbmd0aCgpIDwgNSk7Ci0gICAgc2hhcmVkWEhUTUxFbnRpdHkubGVuZ3RoID0gdmFsdWUubGVu
Z3RoKCk7Ci0gICAgc2hhcmVkWEhUTUxFbnRpdHkubmFtZSA9IG5hbWU7Ci0gICAgbWVtY3B5KHNo
YXJlZFhIVE1MRW50aXR5UmVzdWx0LCB2YWx1ZS5kYXRhKCksIHNoYXJlZFhIVE1MRW50aXR5Lmxl
bmd0aCArIDEpOwotCi0gICAgcmV0dXJuICZzaGFyZWRYSFRNTEVudGl0eTsKLX0KLQotc3RhdGlj
IHhtbEVudGl0eVB0ciBnZXRFbnRpdHlIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHhtbENo
YXIqIG5hbWUpCi17Ci0gICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0ID0gc3RhdGljX2Nhc3Q8eG1s
UGFyc2VyQ3R4dFB0cj4oY2xvc3VyZSk7Ci0gICAgeG1sRW50aXR5UHRyIGVudCA9IHhtbEdldFBy
ZWRlZmluZWRFbnRpdHkobmFtZSk7Ci0gICAgaWYgKGVudCkgewotICAgICAgICBlbnQtPmV0eXBl
ID0gWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZOwotICAgICAgICByZXR1cm4gZW50Owot
ICAgIH0KLQotICAgIGVudCA9IHhtbEdldERvY0VudGl0eShjdHh0LT5teURvYywgbmFtZSk7Ci0g
ICAgaWYgKCFlbnQgJiYgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5pc1hIVE1MRG9jdW1lbnQoKSkg
ewotICAgICAgICBlbnQgPSBnZXRYSFRNTEVudGl0eShuYW1lKTsKLSAgICAgICAgaWYgKGVudCkK
LSAgICAgICAgICAgIGVudC0+ZXR5cGUgPSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk7Ci0g
ICAgfQotICAgIAotICAgIHJldHVybiBlbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0RG9jdW1l
bnRIYW5kbGVyKHZvaWQqIGNsb3N1cmUpCi17Ci0gICAgeG1sUGFyc2VyQ3R4dCogY3R4dCA9IHN0
YXRpY19jYXN0PHhtbFBhcnNlckN0eHQqPihjbG9zdXJlKTsKLSAgICBnZXRUb2tlbml6ZXIoY2xv
c3VyZSktPnN0YXJ0RG9jdW1lbnQoY3R4dC0+dmVyc2lvbiwgY3R4dC0+ZW5jb2RpbmcsIGN0eHQt
PnN0YW5kYWxvbmUpOwotICAgIHhtbFNBWDJTdGFydERvY3VtZW50KGNsb3N1cmUpOwotfQotCi1z
dGF0aWMgdm9pZCBlbmREb2N1bWVudEhhbmRsZXIodm9pZCogY2xvc3VyZSkKLXsKLSAgICBnZXRU
b2tlbml6ZXIoY2xvc3VyZSktPmVuZERvY3VtZW50KCk7Ci0gICAgeG1sU0FYMkVuZERvY3VtZW50
KGNsb3N1cmUpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlcm5hbFN1YnNldEhhbmRsZXIodm9pZCog
Y2xvc3VyZSwgY29uc3QgeG1sQ2hhciogbmFtZSwgY29uc3QgeG1sQ2hhciogZXh0ZXJuYWxJRCwg
Y29uc3QgeG1sQ2hhciogc3lzdGVtSUQpCi17Ci0gICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5p
bnRlcm5hbFN1YnNldChuYW1lLCBleHRlcm5hbElELCBzeXN0ZW1JRCk7Ci0gICAgeG1sU0FYMklu
dGVybmFsU3Vic2V0KGNsb3N1cmUsIG5hbWUsIGV4dGVybmFsSUQsIHN5c3RlbUlEKTsKLX0KLQot
c3RhdGljIHZvaWQgZXh0ZXJuYWxTdWJzZXRIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHht
bENoYXIqIG5hbWUsIGNvbnN0IHhtbENoYXIqIGV4dGVybmFsSWQsIGNvbnN0IHhtbENoYXIqIHN5
c3RlbUlkKQotewotICAgIFN0cmluZyBleHRJZCA9IHRvU3RyaW5nKGV4dGVybmFsSWQpOwotICAg
IGlmICgoZXh0SWQgPT0gIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIikK
LSAgICAgICAgfHwgKGV4dElkID09ICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIikKLSAgICAg
ICAgfHwgKGV4dElkID09ICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIpCi0gICAg
ICAgIHx8IChleHRJZCA9PSAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIpCi0g
ICAgICAgIHx8IChleHRJZCA9PSAiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIpCi0g
ICAgICAgIHx8IChleHRJZCA9PSAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xIHBsdXMgTWF0aE1MIDIu
MC8vRU4iKQotICAgICAgICB8fCAoZXh0SWQgPT0gIi0vL1czQy8vRFREIFhIVE1MIDEuMSBwbHVz
IE1hdGhNTCAyLjAgcGx1cyBTVkcgMS4xLy9FTiIpCi0gICAgICAgIHx8IChleHRJZCA9PSAiLS8v
V0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIpKQotICAgICAgICBnZXRUb2tlbml6
ZXIoY2xvc3VyZSktPnNldElzWEhUTUxEb2N1bWVudCh0cnVlKTsgLy8gY29udHJvbHMgaWYgd2Ug
cmVwbGFjZSBlbnRpdGllcyBvciBub3QuCi19Ci0KLXN0YXRpYyB2b2lkIGlnbm9yYWJsZVdoaXRl
c3BhY2VIYW5kbGVyKHZvaWQqIGN0eCwgY29uc3QgeG1sQ2hhciogY2gsIGludCBsZW4pCi17Ci0g
ICAgLy8gbm90aGluZyB0byBkbywgYnV0IHdlIG5lZWQgdGhpcyB0byB3b3JrIGFyb3VuZCBhIGNy
YXNoZXIKLSAgICAvLyBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0x
NzIyNTUKLSAgICAvLyBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Nzky
Ci19Ci0jZW5kaWYKIAogdm9pZCBYTUxUb2tlbml6ZXI6OmhhbmRsZUVycm9yKEVycm9yVHlwZSB0
eXBlLCBjb25zdCBjaGFyKiBtLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKIHsK
QEAgLTEzMzAsNiArMTQ1LDE0IEBAIGJvb2wgWE1MVG9rZW5pemVyOjplbnRlclRleHQoKQogICAg
IHJldHVybiB0cnVlOwogfQogCisjaWZuZGVmIFVTRV9RWE1MU1RSRUFNCitzdGF0aWMgaW5saW5l
IFN0cmluZyB0b1N0cmluZyhjb25zdCB4bWxDaGFyKiBzdHIsIHVuc2lnbmVkIGxlbikKK3sKKyAg
ICByZXR1cm4gVVRGOEVuY29kaW5nKCkuZGVjb2RlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hh
cio+KHN0ciksIGxlbik7Cit9CisjZW5kaWYKKworCiB2b2lkIFhNTFRva2VuaXplcjo6ZXhpdFRl
eHQoKQogewogICAgIGlmIChtX3BhcnNlclN0b3BwZWQpCkBAIC0xMzU0LDcyICsxNzcsOSBAQCB2
b2lkIFhNTFRva2VuaXplcjo6ZXhpdFRleHQoKQogICAgICAgICBzZXRDdXJyZW50Tm9kZShwYXIp
OwogfQogCi12b2lkIFhNTFRva2VuaXplcjo6aW5pdGlhbGl6ZVBhcnNlckNvbnRleHQoY29uc3Qg
Y2hhciogY2h1bmspCi17Ci0jaWZuZGVmIFVTRV9RWE1MU1RSRUFNCi0gICAgeG1sU0FYSGFuZGxl
ciBzYXg7Ci0gICAgbWVtc2V0KCZzYXgsIDAsIHNpemVvZihzYXgpKTsKLQotICAgIHNheC5lcnJv
ciA9IG5vcm1hbEVycm9ySGFuZGxlcjsKLSAgICBzYXguZmF0YWxFcnJvciA9IGZhdGFsRXJyb3JI
YW5kbGVyOwotICAgIHNheC5jaGFyYWN0ZXJzID0gY2hhcmFjdGVyc0hhbmRsZXI7Ci0gICAgc2F4
LnByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI7Ci0g
ICAgc2F4LmNkYXRhQmxvY2sgPSBjZGF0YUJsb2NrSGFuZGxlcjsKLSAgICBzYXguY29tbWVudCA9
IGNvbW1lbnRIYW5kbGVyOwotICAgIHNheC53YXJuaW5nID0gd2FybmluZ0hhbmRsZXI7Ci0gICAg
c2F4LnN0YXJ0RWxlbWVudE5zID0gc3RhcnRFbGVtZW50TnNIYW5kbGVyOwotICAgIHNheC5lbmRF
bGVtZW50TnMgPSBlbmRFbGVtZW50TnNIYW5kbGVyOwotICAgIHNheC5nZXRFbnRpdHkgPSBnZXRF
bnRpdHlIYW5kbGVyOwotICAgIHNheC5zdGFydERvY3VtZW50ID0gc3RhcnREb2N1bWVudEhhbmRs
ZXI7Ci0gICAgc2F4LmVuZERvY3VtZW50ID0gZW5kRG9jdW1lbnRIYW5kbGVyOwotICAgIHNheC5p
bnRlcm5hbFN1YnNldCA9IGludGVybmFsU3Vic2V0SGFuZGxlcjsKLSAgICBzYXguZXh0ZXJuYWxT
dWJzZXQgPSBleHRlcm5hbFN1YnNldEhhbmRsZXI7Ci0gICAgc2F4Lmlnbm9yYWJsZVdoaXRlc3Bh
Y2UgPSBpZ25vcmFibGVXaGl0ZXNwYWNlSGFuZGxlcjsKLSAgICBzYXguZW50aXR5RGVjbCA9IHht
bFNBWDJFbnRpdHlEZWNsOwotICAgIHNheC5pbml0aWFsaXplZCA9IFhNTF9TQVgyX01BR0lDOwot
I2VuZGlmCi0gICAgbV9wYXJzZXJTdG9wcGVkID0gZmFsc2U7Ci0gICAgbV9zYXdFcnJvciA9IGZh
bHNlOwotICAgIG1fc2F3WFNMVHJhbnNmb3JtID0gZmFsc2U7Ci0gICAgbV9zYXdGaXJzdEVsZW1l
bnQgPSBmYWxzZTsKLQotI2lmbmRlZiBVU0VfUVhNTFNUUkVBTQotICAgIGlmIChtX3BhcnNpbmdG
cmFnbWVudCkKLSAgICAgICAgbV9jb250ZXh0ID0gY3JlYXRlTWVtb3J5UGFyc2VyKCZzYXgsIHRo
aXMsIGNodW5rKTsKLSAgICBlbHNlCi0gICAgICAgIG1fY29udGV4dCA9IGNyZWF0ZVN0cmluZ1Bh
cnNlcigmc2F4LCB0aGlzKTsKLSNlbmRpZgotfQotCiB2b2lkIFhNTFRva2VuaXplcjo6ZW5kKCkK
IHsKLSNpZiBFTkFCTEUoWFNMVCkKLSAgICBpZiAobV9zYXdYU0xUcmFuc2Zvcm0pIHsKLSAgICAg
ICAgbV9kb2MtPnNldFRyYW5zZm9ybVNvdXJjZSh4bWxEb2NQdHJGb3JTdHJpbmcobV9kb2MtPmRv
Y0xvYWRlcigpLCBtX29yaWdpbmFsU291cmNlRm9yVHJhbnNmb3JtLCBtX2RvYy0+dXJsKCkuc3Ry
aW5nKCkpKTsKLSAgICAgICAgCi0gICAgICAgIG1fZG9jLT5zZXRQYXJzaW5nKGZhbHNlKTsgLy8g
TWFrZSB0aGUgZG9jIHRoaW5rIGl0J3MgZG9uZSwgc28gaXQgd2lsbCBhcHBseSB4c2wgc2hlZXRz
LgotICAgICAgICBtX2RvYy0+dXBkYXRlU3R5bGVTZWxlY3RvcigpOwotICAgICAgICBtX2RvYy0+
c2V0UGFyc2luZyh0cnVlKTsKLSAgICAgICAgbV9wYXJzZXJTdG9wcGVkID0gdHJ1ZTsKLSAgICB9
Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUVhNTFNUUkVBTQotICAgIGlmIChtX2NvbnRleHQpIHsK
LSAgICAgICAgLy8gVGVsbCBsaWJ4bWwgd2UncmUgZG9uZS4KLSAgICAgICAgeG1sUGFyc2VDaHVu
ayhtX2NvbnRleHQsIDAsIDAsIDEpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1fY29udGV4dC0+
bXlEb2MpCi0gICAgICAgICAgICB4bWxGcmVlRG9jKG1fY29udGV4dC0+bXlEb2MpOwotICAgICAg
ICB4bWxGcmVlUGFyc2VyQ3R4dChtX2NvbnRleHQpOwotICAgICAgICBtX2NvbnRleHQgPSAwOwot
ICAgIH0KLSNlbHNlCi0gICAgaWYgKG1fc3RyZWFtLmVycm9yKCkgPT0gUVhtbFN0cmVhbVJlYWRl
cjo6UHJlbWF0dXJlRW5kT2ZEb2N1bWVudEVycm9yIHx8IChtX3dyb3RlVGV4dCAmJiAhbV9zYXdG
aXJzdEVsZW1lbnQpKSB7Ci0gICAgICAgIGhhbmRsZUVycm9yKGZhdGFsLCBxUHJpbnRhYmxlKG1f
c3RyZWFtLmVycm9yU3RyaW5nKCkpLCBsaW5lTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAg
IGNvbHVtbk51bWJlcigpKTsKLSAgICB9Ci0jZW5kaWYKKyAgICBkb0VuZCgpOwogICAgIAogICAg
IGlmIChtX3Nhd0Vycm9yKQogICAgICAgICBpbnNlcnRFcnJvck1lc3NhZ2VCbG9jaygpOwpAQCAt
MTU0Myw2MyArMzAzLDYgQEAgYm9vbCBYTUxUb2tlbml6ZXI6OmlzV2FpdGluZ0ZvclNjcmlwdHMo
KSBjb25zdAogICAgIHJldHVybiBtX3BlbmRpbmdTY3JpcHQgIT0gMDsKIH0KIAotI2lmIEVOQUJM
RShYU0xUKQotdm9pZCogeG1sRG9jUHRyRm9yU3RyaW5nKERvY0xvYWRlciogZG9jTG9hZGVyLCBj
b25zdCBTdHJpbmcmIHNvdXJjZSwgY29uc3QgU3RyaW5nJiB1cmwpCi17Ci0gICAgaWYgKHNvdXJj
ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gUGFyc2UgaW4gYSBzaW5n
bGUgY2h1bmsgaW50byBhbiB4bWxEb2NQdHIKLSAgICAvLyBGSVhNRTogSG9vayB1cCBlcnJvciBo
YW5kbGVycyBzbyB0aGF0IGEgZmFpbHVyZSB0byBwYXJzZSB0aGUgbWFpbiBkb2N1bWVudCByZXN1
bHRzIGluCi0gICAgLy8gZ29vZCBlcnJvciBtZXNzYWdlcy4KLSAgICBjb25zdCBVQ2hhciBCT00g
PSAweEZFRkY7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciBCT01IaWdoQnl0ZSA9ICpyZWludGVy
cHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigmQk9NKTsKLQotICAgIHhtbEdlbmVyaWNF
cnJvckZ1bmMgb2xkRXJyb3JGdW5jID0geG1sR2VuZXJpY0Vycm9yOwotICAgIHZvaWQqIG9sZEVy
cm9yQ29udGV4dCA9IHhtbEdlbmVyaWNFcnJvckNvbnRleHQ7Ci0gICAgCi0gICAgc2V0TG9hZGVy
Rm9yTGliWE1MQ2FsbGJhY2tzKGRvY0xvYWRlcik7ICAgICAgICAKLSAgICB4bWxTZXRHZW5lcmlj
RXJyb3JGdW5jKDAsIGVycm9yRnVuYyk7Ci0gICAgCi0gICAgeG1sRG9jUHRyIHNvdXJjZURvYyA9
IHhtbFJlYWRNZW1vcnkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc291cmNlLmNoYXJh
Y3RlcnMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNl
Lmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB1cmwubGF0aW4xKCkuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEJPTUhpZ2hCeXRlID09IDB4RkYgPyAiVVRGLTE2TEUiIDogIlVURi0x
NkJFIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNMVF9QQVJT
RV9PUFRJT05TKTsKLSAgICAKLSAgICBzZXRMb2FkZXJGb3JMaWJYTUxDYWxsYmFja3MoMCk7Ci0g
ICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyhvbGRFcnJvckNvbnRleHQsIG9sZEVycm9yRnVuYyk7
Ci0gICAgCi0gICAgcmV0dXJuIHNvdXJjZURvYzsKLX0KLSNlbmRpZgotCi1pbnQgWE1MVG9rZW5p
emVyOjpsaW5lTnVtYmVyKCkgY29uc3QKLXsKLSNpZm5kZWYgVVNFX1FYTUxTVFJFQU0KLSAgICBy
ZXR1cm4gbV9jb250ZXh0ID8gbV9jb250ZXh0LT5pbnB1dC0+bGluZSA6IDE7Ci0jZWxzZQotICAg
IHJldHVybiBtX3N0cmVhbS5saW5lTnVtYmVyKCk7Ci0jZW5kaWYKLX0KLQotaW50IFhNTFRva2Vu
aXplcjo6Y29sdW1uTnVtYmVyKCkgY29uc3QKLXsKLSNpZm5kZWYgVVNFX1FYTUxTVFJFQU0KLSAg
ICByZXR1cm4gbV9jb250ZXh0ID8gbV9jb250ZXh0LT5pbnB1dC0+Y29sIDogMTsKLSNlbHNlCi0g
ICAgcmV0dXJuIG1fc3RyZWFtLmNvbHVtbk51bWJlcigpOwotI2VuZGlmCi19Ci0KLXZvaWQgWE1M
VG9rZW5pemVyOjpzdG9wUGFyc2luZygpCi17Ci0gICAgVG9rZW5pemVyOjpzdG9wUGFyc2luZygp
OwotI2lmbmRlZiBVU0VfUVhNTFNUUkVBTQotICAgIHhtbFN0b3BQYXJzZXIobV9jb250ZXh0KTsK
LSNlbmRpZgotfQotCiB2b2lkIFhNTFRva2VuaXplcjo6cGF1c2VQYXJzaW5nKCkKIHsKICAgICBp
ZiAobV9wYXJzaW5nRnJhZ21lbnQpCkBAIC0xNjA4LDUzOSArMzExLDYgQEAgdm9pZCBYTUxUb2tl
bml6ZXI6OnBhdXNlUGFyc2luZygpCiAgICAgbV9wYXJzZXJQYXVzZWQgPSB0cnVlOwogfQogCi12
b2lkIFhNTFRva2VuaXplcjo6cmVzdW1lUGFyc2luZygpCi17Ci0gICAgQVNTRVJUKG1fcGFyc2Vy
UGF1c2VkKTsKLSAgICAKLSAgICBtX3BhcnNlclBhdXNlZCA9IGZhbHNlOwotCi0gICAgLy8gRmly
c3QsIGV4ZWN1dGUgYW55IHBlbmRpbmcgY2FsbGJhY2tzCi0jaWZuZGVmIFVTRV9RWE1MU1RSRUFN
Ci0gICAgd2hpbGUgKCFtX3BlbmRpbmdDYWxsYmFja3MtPmlzRW1wdHkoKSkgewotICAgICAgICBt
X3BlbmRpbmdDYWxsYmFja3MtPmNhbGxBbmRSZW1vdmVGaXJzdENhbGxiYWNrKHRoaXMpOwotICAg
ICAgICAKLSAgICAgICAgLy8gQSBjYWxsYmFjayBwYXVzZWQgdGhlIHBhcnNlcgotICAgICAgICBp
ZiAobV9wYXJzZXJQYXVzZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotI2Vsc2UKLSAg
ICBwYXJzZSgpOwotICAgIGlmIChtX3BhcnNlclBhdXNlZCkKLSAgICAgICAgcmV0dXJuOwotI2Vu
ZGlmCi0KLSAgICAvLyBUaGVuLCB3cml0ZSBhbnkgcGVuZGluZyBkYXRhCi0gICAgU2VnbWVudGVk
U3RyaW5nIHJlc3QgPSBtX3BlbmRpbmdTcmM7Ci0gICAgbV9wZW5kaW5nU3JjLmNsZWFyKCk7Ci0g
ICAgd3JpdGUocmVzdCwgZmFsc2UpOwotCi0gICAgLy8gRmluYWxseSwgaWYgZmluaXNoKCkgaGFz
IGJlZW4gY2FsbGVkIGFuZCB3cml0ZSgpIGRpZG4ndCByZXN1bHQKLSAgICAvLyBpbiBhbnkgZnVy
dGhlciBjYWxsYmFja3MgYmVpbmcgcXVldWVkLCBjYWxsIGVuZCgpCi0gICAgaWYgKG1fZmluaXNo
Q2FsbGVkCi0jaWZuZGVmIFVTRV9RWE1MU1RSRUFNCi0gICAgICAgICYmIG1fcGVuZGluZ0NhbGxi
YWNrcy0+aXNFbXB0eSgpKQotI2Vsc2UKLSAgICAgICAgJiYgIW1fcGFyc2VyUGF1c2VkICYmICFt
X3BlbmRpbmdTY3JpcHQKLSAgICAgICAgKQotI2VuZGlmCi0gICAgICAgIGVuZCgpOwotfQotCi1i
b29sIHBhcnNlWE1MRG9jdW1lbnRGcmFnbWVudChjb25zdCBTdHJpbmcmIGNodW5rLCBEb2N1bWVu
dEZyYWdtZW50KiBmcmFnbWVudCwgRWxlbWVudCogcGFyZW50KQotewotICAgIGlmICghY2h1bmsu
bGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgWE1MVG9rZW5pemVyIHRva2Vu
aXplcihmcmFnbWVudCwgcGFyZW50KTsKLSAgICAKLSNpZm5kZWYgVVNFX1FYTUxTVFJFQU0KLSAg
ICB0b2tlbml6ZXIuaW5pdGlhbGl6ZVBhcnNlckNvbnRleHQoY2h1bmsudXRmOCgpLmRhdGEoKSk7
Ci0KLSAgICB4bWxQYXJzZUNvbnRlbnQodG9rZW5pemVyLm1fY29udGV4dCk7Ci0KLSAgICB0b2tl
bml6ZXIuZW5kRG9jdW1lbnQoKTsKLQotICAgIC8vIENoZWNrIGlmIGFsbCB0aGUgY2h1bmsgaGFz
IGJlZW4gcHJvY2Vzc2VkLgotICAgIGxvbmcgYnl0ZXNQcm9jZXNzZWQgPSB4bWxCeXRlQ29uc3Vt
ZWQodG9rZW5pemVyLm1fY29udGV4dCk7Ci0gICAgaWYgKGJ5dGVzUHJvY2Vzc2VkID09IC0xIHx8
ICgodW5zaWduZWQgbG9uZylieXRlc1Byb2Nlc3NlZCkgPT0gc2l6ZW9mKFVDaGFyKSAqIGNodW5r
Lmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBObyBlcnJvciBpZiB0
aGUgY2h1bmsgaXMgd2VsbCBmb3JtZWQgb3IgaXQgaXMgbm90IGJ1dCB3ZSBoYXZlIG5vIGVycm9y
LgotICAgIHJldHVybiB0b2tlbml6ZXIubV9jb250ZXh0LT53ZWxsRm9ybWVkIHx8IHhtbEN0eHRH
ZXRMYXN0RXJyb3IodG9rZW5pemVyLm1fY29udGV4dCkgPT0gMDsKLSNlbHNlCi0gICAgdG9rZW5p
emVyLndyaXRlKFN0cmluZygiPHF4bWxzdHJlYW1kdW1teWVsZW1lbnQ+IiksIGZhbHNlKTsKLSAg
ICB0b2tlbml6ZXIud3JpdGUoY2h1bmssIGZhbHNlKTsKLSAgICB0b2tlbml6ZXIud3JpdGUoU3Ry
aW5nKCI8L3F4bWxzdHJlYW1kdW1teWVsZW1lbnQ+IiksIGZhbHNlKTsKLSAgICB0b2tlbml6ZXIu
ZmluaXNoKCk7Ci0gICAgcmV0dXJuICF0b2tlbml6ZXIuaGFzRXJyb3IoKTsKLSNlbmRpZgotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgQXR0cmlidXRl
UGFyc2VTdGF0ZSB7Ci0gICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlczsKLSAg
ICBib29sIGdvdEF0dHJpYnV0ZXM7Ci19OwotCi0jaWZuZGVmIFVTRV9RWE1MU1RSRUFNCi1zdGF0
aWMgdm9pZCBhdHRyaWJ1dGVzU3RhcnRFbGVtZW50TnNIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNv
bnN0IHhtbENoYXIqIHhtbExvY2FsTmFtZSwgY29uc3QgeG1sQ2hhciogeG1sUHJlZml4LAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyKiB4
bWxVUkksIGludCBuYl9uYW1lc3BhY2VzLCBjb25zdCB4bWxDaGFyKiogbmFtZXNwYWNlcywKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX2F0dHJpYnV0
ZXMsIGludCBuYl9kZWZhdWx0ZWQsIGNvbnN0IHhtbENoYXIqKiBsaWJ4bWxBdHRyaWJ1dGVzKQot
ewotICAgIGlmIChzdHJjbXAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oeG1sTG9jYWxO
YW1lKSwgImF0dHJzIikgIT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHhtbFBhcnNl
ckN0eHRQdHIgY3R4dCA9IHN0YXRpY19jYXN0PHhtbFBhcnNlckN0eHRQdHI+KGNsb3N1cmUpOwot
ICAgIEF0dHJpYnV0ZVBhcnNlU3RhdGUqIHN0YXRlID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlUGFy
c2VTdGF0ZSo+KGN0eHQtPl9wcml2YXRlKTsKLSAgICAKLSAgICBzdGF0ZS0+Z290QXR0cmlidXRl
cyA9IHRydWU7Ci0gICAgCi0gICAgeG1sU0FYMkF0dHJpYnV0ZXMqIGF0dHJpYnV0ZXMgPSByZWlu
dGVycHJldF9jYXN0PHhtbFNBWDJBdHRyaWJ1dGVzKj4obGlieG1sQXR0cmlidXRlcyk7Ci0gICAg
Zm9yKGludCBpID0gMDsgaSA8IG5iX2F0dHJpYnV0ZXM7IGkrKykgewotICAgICAgICBTdHJpbmcg
YXR0ckxvY2FsTmFtZSA9IHRvU3RyaW5nKGF0dHJpYnV0ZXNbaV0ubG9jYWxuYW1lKTsKLSAgICAg
ICAgaW50IHZhbHVlTGVuZ3RoID0gKGludCkgKGF0dHJpYnV0ZXNbaV0uZW5kIC0gYXR0cmlidXRl
c1tpXS52YWx1ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSB0b1N0cmluZyhhdHRyaWJ1
dGVzW2ldLnZhbHVlLCB2YWx1ZUxlbmd0aCk7Ci0gICAgICAgIFN0cmluZyBhdHRyUHJlZml4ID0g
dG9TdHJpbmcoYXR0cmlidXRlc1tpXS5wcmVmaXgpOwotICAgICAgICBTdHJpbmcgYXR0clFOYW1l
ID0gYXR0clByZWZpeC5pc0VtcHR5KCkgPyBhdHRyTG9jYWxOYW1lIDogYXR0clByZWZpeCArICI6
IiArIGF0dHJMb2NhbE5hbWU7Ci0gICAgICAgIAotICAgICAgICBzdGF0ZS0+YXR0cmlidXRlcy5z
ZXQoYXR0clFOYW1lLCBhdHRyVmFsdWUpOwotICAgIH0KLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBh
dHRyaWJ1dGVzU3RhcnRFbGVtZW50TnNIYW5kbGVyKEF0dHJpYnV0ZVBhcnNlU3RhdGUqIHN0YXRl
LCBjb25zdCBRWG1sU3RyZWFtQXR0cmlidXRlcyYgYXR0cnMpCi17Ci0gICAgaWYgKGF0dHJzLmNv
dW50KCkgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3RhdGUtPmdvdEF0dHJpYnV0ZXMg
PSB0cnVlOwotCi0gICAgZm9yKGludCBpID0gMDsgaSA8IGF0dHJzLmNvdW50KCk7IGkrKykgewot
ICAgICAgICBjb25zdCBRWG1sU3RyZWFtQXR0cmlidXRlJiBhdHRyID0gYXR0cnNbaV07Ci0gICAg
ICAgIFN0cmluZyBhdHRyTG9jYWxOYW1lID0gYXR0ci5uYW1lKCk7Ci0gICAgICAgIFN0cmluZyBh
dHRyVmFsdWUgICAgID0gYXR0ci52YWx1ZSgpOwotICAgICAgICBTdHJpbmcgYXR0clVSSSAgICAg
ICA9IGF0dHIubmFtZXNwYWNlVXJpKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyUU5hbWUgICAgID0g
YXR0ci5xdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgIHN0YXRlLT5hdHRyaWJ1dGVzLnNldChhdHRy
UU5hbWUsIGF0dHJWYWx1ZSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLUhhc2hNYXA8U3RyaW5nLCBT
dHJpbmc+IHBhcnNlQXR0cmlidXRlcyhjb25zdCBTdHJpbmcmIHN0cmluZywgYm9vbCYgYXR0cnNP
SykKLXsKLSAgICBBdHRyaWJ1dGVQYXJzZVN0YXRlIHN0YXRlOwotICAgIHN0YXRlLmdvdEF0dHJp
YnV0ZXMgPSBmYWxzZTsKLQotI2lmbmRlZiBVU0VfUVhNTFNUUkVBTQotICAgIHhtbFNBWEhhbmRs
ZXIgc2F4OwotICAgIG1lbXNldCgmc2F4LCAwLCBzaXplb2Yoc2F4KSk7Ci0gICAgc2F4LnN0YXJ0
RWxlbWVudE5zID0gYXR0cmlidXRlc1N0YXJ0RWxlbWVudE5zSGFuZGxlcjsKLSAgICBzYXguaW5p
dGlhbGl6ZWQgPSBYTUxfU0FYMl9NQUdJQzsKLSAgICB4bWxQYXJzZXJDdHh0UHRyIHBhcnNlciA9
IGNyZWF0ZVN0cmluZ1BhcnNlcigmc2F4LCAmc3RhdGUpOwotICAgIFN0cmluZyBwYXJzZVN0cmlu
ZyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PjxhdHRycyAiICsgc3RyaW5nICsgIiAvPiI7Ci0g
ICAgeG1sUGFyc2VDaHVuayhwYXJzZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBh
cnNlU3RyaW5nLmNoYXJhY3RlcnMoKSksIHBhcnNlU3RyaW5nLmxlbmd0aCgpICogc2l6ZW9mKFVD
aGFyKSwgMSk7Ci0gICAgaWYgKHBhcnNlci0+bXlEb2MpCi0gICAgICAgIHhtbEZyZWVEb2MocGFy
c2VyLT5teURvYyk7Ci0gICAgeG1sRnJlZVBhcnNlckN0eHQocGFyc2VyKTsKLSNlbHNlCi0gICAg
UVhtbFN0cmVhbVJlYWRlciBzdHJlYW07Ci0gICAgUVN0cmluZyBkdW1teSA9IFFTdHJpbmcoUUxh
dGluMVN0cmluZygiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48YXR0cnMgJTEgLz4iKSkuYXJnKHN0
cmluZyk7Ci0gICAgc3RyZWFtLmFkZERhdGEoZHVtbXkpOwotICAgIHdoaWxlICghc3RyZWFtLmF0
RW5kKCkpIHsKLSAgICAgICAgc3RyZWFtLnJlYWROZXh0KCk7Ci0gICAgICAgIGlmIChzdHJlYW0u
aXNTdGFydEVsZW1lbnQoKSkgewotICAgICAgICAgICAgYXR0cmlidXRlc1N0YXJ0RWxlbWVudE5z
SGFuZGxlcigmc3RhdGUsIHN0cmVhbS5hdHRyaWJ1dGVzKCkpOwotICAgICAgICB9Ci0gICAgfQot
I2VuZGlmCi0gICAgYXR0cnNPSyA9IHN0YXRlLmdvdEF0dHJpYnV0ZXM7Ci0gICAgcmV0dXJuIHN0
YXRlLmF0dHJpYnV0ZXM7Ci19Ci0KLSNpZmRlZiBVU0VfUVhNTFNUUkVBTQotc3RhdGljIGlubGlu
ZSBTdHJpbmcgcHJlZml4RnJvbVFOYW1lKGNvbnN0IFFTdHJpbmcmIHFOYW1lKQotewotICAgIGNv
bnN0IGludCBvZmZzZXQgPSBxTmFtZS5pbmRleE9mKFFMYXRpbjFDaGFyKCc6JykpOwotICAgIGlm
IChvZmZzZXQgPD0gMCkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAgIGVsc2UKLSAgICAg
ICAgcmV0dXJuIHFOYW1lLmxlZnQob2Zmc2V0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhh
bmRsZUVsZW1lbnROYW1lc3BhY2VzKEVsZW1lbnQqIG5ld0VsZW1lbnQsIGNvbnN0IFFYbWxTdHJl
YW1OYW1lc3BhY2VEZWNsYXJhdGlvbnMgJm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbnMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFFYbWxTdHJlYW1OYW1lc3Bh
Y2VEZWNsYXJhdGlvbiAmZGVjbCA9IG5zW2ldOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJ
ID0gZGVjbC5uYW1lc3BhY2VVcmkoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVFOYW1lID0g
ZGVjbC5wcmVmaXgoKS5pc0VtcHR5KCkgPyBTdHJpbmcoInhtbG5zIikgOiBTdHJpbmcoInhtbG5z
OiIpICsgZGVjbC5wcmVmaXgoKTsKLSAgICAgICAgbmV3RWxlbWVudC0+c2V0QXR0cmlidXRlTlMo
Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwgbmFtZXNwYWNlUU5hbWUsIG5hbWVzcGFj
ZVVSSSwgZWMpOwotICAgICAgICBpZiAoZWMpIC8vIGV4Y2VwdGlvbiBzZXR0aW5nIGF0dHJpYnV0
ZXMKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBo
YW5kbGVFbGVtZW50QXR0cmlidXRlcyhFbGVtZW50KiBuZXdFbGVtZW50LCBjb25zdCBRWG1sU3Ry
ZWFtQXR0cmlidXRlcyAmYXR0cnMsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgYXR0cnMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFFYbWxTdHJl
YW1BdHRyaWJ1dGUgJmF0dHIgPSBhdHRyc1tpXTsKLSAgICAgICAgU3RyaW5nIGF0dHJMb2NhbE5h
bWUgPSBhdHRyLm5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSAgICAgPSBhdHRyLnZh
bHVlKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyVVJJICAgICAgID0gYXR0ci5uYW1lc3BhY2VVcmko
KS5pc0VtcHR5KCkgPyBTdHJpbmcoKSA6IFN0cmluZyhhdHRyLm5hbWVzcGFjZVVyaSgpKTsKLSAg
ICAgICAgU3RyaW5nIGF0dHJRTmFtZSAgICAgPSBhdHRyLnF1YWxpZmllZE5hbWUoKTsKLSAgICAg
ICAgbmV3RWxlbWVudC0+c2V0QXR0cmlidXRlTlMoYXR0clVSSSwgYXR0clFOYW1lLCBhdHRyVmFs
dWUsIGVjKTsKLSAgICAgICAgaWYgKGVjKSAvLyBleGNlcHRpb24gc2V0dGluZyBhdHRyaWJ1dGVz
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi12b2lkIFhNTFRva2VuaXplcjo6cGFy
c2UoKQotewotICAgIHdoaWxlICghbV9wYXJzZXJTdG9wcGVkICYmICFtX3BhcnNlclBhdXNlZCAm
JiAhbV9zdHJlYW0uYXRFbmQoKSkgewotICAgICAgICBtX3N0cmVhbS5yZWFkTmV4dCgpOwotICAg
ICAgICBzd2l0Y2ggKG1fc3RyZWFtLnRva2VuVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUVhtbFN0
cmVhbVJlYWRlcjo6U3RhcnREb2N1bWVudDogewotICAgICAgICAgICAgc3RhcnREb2N1bWVudCgp
OwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRWG1sU3RyZWFt
UmVhZGVyOjpFbmREb2N1bWVudDogewotICAgICAgICAgICAgZW5kRG9jdW1lbnQoKTsKLSAgICAg
ICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUVhtbFN0cmVhbVJlYWRlcjo6
U3RhcnRFbGVtZW50OiB7Ci0gICAgICAgICAgICBwYXJzZVN0YXJ0RWxlbWVudCgpOwotICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpF
bmRFbGVtZW50OiB7Ci0gICAgICAgICAgICBwYXJzZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUVhtbFN0cmVhbVJlYWRlcjo6Q2hhcmFj
dGVyczogewotICAgICAgICAgICAgaWYgKG1fc3RyZWFtLmlzQ0RBVEEoKSkgewotICAgICAgICAg
ICAgICAgIC8vY2RhdGEKLSAgICAgICAgICAgICAgICBwYXJzZUNkYXRhKCk7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vY2hhcmFjdGVycwotICAgICAgICAgICAgICAg
IHBhcnNlQ2hhcmFjdGVycygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpDb21tZW50OiB7Ci0gICAg
ICAgICAgICBwYXJzZUNvbW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgUVhtbFN0cmVhbVJlYWRlcjo6RFREOiB7Ci0gICAgICAgICAgICAvL3FEZWJ1
ZygpPDwiLS0tLS0tLS0tLS0tLSBEVEQiOwotICAgICAgICAgICAgcGFyc2VEdGQoKTsKLSAgICAg
ICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUVhtbFN0cmVhbVJlYWRlcjo6
RW50aXR5UmVmZXJlbmNlOiB7Ci0gICAgICAgICAgICAvL3FEZWJ1ZygpPDwiLS0tLS0tLS0tLSBF
TlRJVFkgPSAiPDxtX3N0cmVhbS5uYW1lKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgLy8gICAg
ICAgIDw8IiwgdCA9ICI8PG1fc3RyZWFtLnRleHQoKS50b1N0cmluZygpOwotICAgICAgICAgICAg
aWYgKGlzWEhUTUxEb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgUVN0cmluZyBlbnRpdHkg
PSBtX3N0cmVhbS5uYW1lKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBVQ2hhciBjID0g
ZGVjb2RlTmFtZWRFbnRpdHkoZW50aXR5LnRvVXRmOCgpLmNvbnN0RGF0YSgpKTsKLSAgICAgICAg
ICAgICAgICBpZiAobV9jdXJyZW50Tm9kZS0+aXNUZXh0Tm9kZSgpIHx8IGVudGVyVGV4dCgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICAgICAg
ICAgICAgICBTdHJpbmcgc3RyKCZjLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgLy9xRGVidWco
KTw8IiAtLS0tLS0tIGFkZGluZyBlbnRpdHkgIjw8c3RyOwotICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxUZXh0Kj4obV9jdXJyZW50Tm9kZSktPmFwcGVuZERhdGEoc3RyLCBlYyk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b246IHsKLSAgICAgICAgICAgIHBhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7Ci0gICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBp
ZiAobV9zdHJlYW0uZXJyb3IoKSAhPSBRWG1sU3RyZWFtUmVhZGVyOjpQcmVtYXR1cmVFbmRPZkRv
Y3VtZW50RXJyb3IpIHsKLSAgICAgICAgICAgICAgICBFcnJvclR5cGUgdHlwZSA9IChtX3N0cmVh
bS5lcnJvcigpID09IFFYbWxTdHJlYW1SZWFkZXI6Ok5vdFdlbGxGb3JtZWRFcnJvcikgPwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwgOiB3YXJuaW5nOwotICAgICAgICAg
ICAgICAgIGhhbmRsZUVycm9yKHR5cGUsIHFQcmludGFibGUobV9zdHJlYW0uZXJyb3JTdHJpbmco
KSksIGxpbmVOdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1i
ZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgfQotfQotCi12b2lkIFhNTFRva2VuaXplcjo6c3RhcnREb2N1bWVudCgpCi17
Ci0gICAgaW5pdGlhbGl6ZVBhcnNlckNvbnRleHQoKTsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKLQotICAgIGlmICghbV9wYXJzaW5nRnJhZ21lbnQpIHsKLSAgICAgICAgbV9kb2MtPnNldFhN
TFN0YW5kYWxvbmUobV9zdHJlYW0uaXNTdGFuZGFsb25lRG9jdW1lbnQoKSwgZWMpOwotCi0jaWYg
UVRfVkVSU0lPTiA+PSAweDA0MDQwMAotICAgICAgICBRU3RyaW5nUmVmIHZlcnNpb24gPSBtX3N0
cmVhbS5kb2N1bWVudFZlcnNpb24oKTsKLSAgICAgICAgaWYgKCF2ZXJzaW9uLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIG1fZG9jLT5zZXRYTUxWZXJzaW9uKHZlcnNpb24sIGVjKTsKLSAgICAgICAg
UVN0cmluZ1JlZiBlbmNvZGluZyA9IG1fc3RyZWFtLmRvY3VtZW50RW5jb2RpbmcoKTsKLSAgICAg
ICAgaWYgKCFlbmNvZGluZy5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtX2RvYy0+c2V0WE1MRW5j
b2RpbmcoZW5jb2RpbmcpOwotI2VuZGlmCi0gICAgfQotfQotCi12b2lkIFhNTFRva2VuaXplcjo6
cGFyc2VTdGFydEVsZW1lbnQoKQotewotICAgIGlmICghbV9zYXdGaXJzdEVsZW1lbnQgJiYgbV9w
YXJzaW5nRnJhZ21lbnQpIHsKLSAgICAgICAgLy8gc2tpcCBkdW1teSBlbGVtZW50IGZvciBmcmFn
bWVudHMKLSAgICAgICAgbV9zYXdGaXJzdEVsZW1lbnQgPSB0cnVlOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIG1fc2F3Rmlyc3RFbGVtZW50ID0gdHJ1ZTsKLQotICAgIGV4aXRUZXh0KCk7
Ci0KLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gbV9zdHJlYW0ubmFtZSgpOwotICAgIFN0cmluZyB1
cmkgICAgICAgPSBtX3N0cmVhbS5uYW1lc3BhY2VVcmkoKTsKLSAgICBTdHJpbmcgcHJlZml4ICAg
ID0gcHJlZml4RnJvbVFOYW1lKG1fc3RyZWFtLnF1YWxpZmllZE5hbWUoKS50b1N0cmluZygpKTsK
LQotICAgIGlmIChtX3BhcnNpbmdGcmFnbWVudCAmJiB1cmkuaXNOdWxsKCkpIHsKLSAgICAgICAg
UV9BU1NFUlQgKHByZWZpeC5pc051bGwoKSk7Ci0gICAgICAgIHVyaSA9IG1fZGVmYXVsdE5hbWVz
cGFjZVVSSTsKLSAgICB9Ci0KLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBRdWFsaWZp
ZWROYW1lIHFOYW1lKHByZWZpeCwgbG9jYWxOYW1lLCB1cmkpOwotICAgIFJlZlB0cjxFbGVtZW50
PiBuZXdFbGVtZW50ID0gbV9kb2MtPmNyZWF0ZUVsZW1lbnQocU5hbWUsIHRydWUsIGVjKTsKLSAg
ICBpZiAoIW5ld0VsZW1lbnQpIHsKLSAgICAgICAgc3RvcFBhcnNpbmcoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGhhbmRsZUVsZW1lbnROYW1lc3BhY2VzKG5ld0VsZW1lbnQuZ2V0
KCksIG1fc3RyZWFtLm5hbWVzcGFjZURlY2xhcmF0aW9ucygpLCBlYyk7Ci0gICAgaWYgKGVjKSB7
Ci0gICAgICAgIHN0b3BQYXJzaW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBo
YW5kbGVFbGVtZW50QXR0cmlidXRlcyhuZXdFbGVtZW50LmdldCgpLCBtX3N0cmVhbS5hdHRyaWJ1
dGVzKCksIGVjKTsKLSAgICBpZiAoZWMpIHsKLSAgICAgICAgc3RvcFBhcnNpbmcoKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV2ZW50dWFsbHlNYXJrQXNQYXJzZXJDcmVhdGVkKG5l
d0VsZW1lbnQuZ2V0KCkpOwotCi0gICAgaWYgKGlzU2NyaXB0RWxlbWVudChuZXdFbGVtZW50Lmdl
dCgpKSkKLSAgICAgICAgbV9zY3JpcHRTdGFydExpbmUgPSBsaW5lTnVtYmVyKCk7Ci0KLSAgICBp
ZiAoIW1fY3VycmVudE5vZGUtPmFkZENoaWxkKG5ld0VsZW1lbnQuZ2V0KCkpKSB7Ci0gICAgICAg
IHN0b3BQYXJzaW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzZXRDdXJyZW50
Tm9kZShuZXdFbGVtZW50LmdldCgpKTsKLSAgICBpZiAobV92aWV3ICYmICFuZXdFbGVtZW50LT5h
dHRhY2hlZCgpKQotICAgICAgICBuZXdFbGVtZW50LT5hdHRhY2goKTsKLX0KLQotdm9pZCBYTUxU
b2tlbml6ZXI6OnBhcnNlRW5kRWxlbWVudCgpCi17Ci0gICAgZXhpdFRleHQoKTsKLQotICAgIE5v
ZGUqIG4gPSBtX2N1cnJlbnROb2RlOwotICAgIFJlZlB0cjxOb2RlPiBwYXJlbnQgPSBuLT5wYXJl
bnROb2RlKCk7Ci0gICAgbi0+ZmluaXNoUGFyc2luZ0NoaWxkcmVuKCk7Ci0KLSAgICAvLyBkb24n
dCBsb2FkIGV4dGVybmFsIHNjcmlwdHMgZm9yIHN0YW5kYWxvbmUgZG9jdW1lbnRzIChmb3Igbm93
KQotICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkgJiYgbV92aWV3ICYmIGlzU2NyaXB0RWxlbWVu
dChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obikpKSB7Ci0gICAgICAgIEFTU0VSVCghbV9wZW5kaW5n
U2NyaXB0KTsKLSAgICAgICAgbV9yZXF1ZXN0aW5nU2NyaXB0ID0gdHJ1ZTsKLQotICAgICAgICBF
bGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOyAKLSAgICAgICAgU2Ny
aXB0RWxlbWVudCogc2NyaXB0RWxlbWVudCA9IGNhc3RUb1NjcmlwdEVsZW1lbnQoZWxlbWVudCk7
Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdEhyZWYgPSBzY3JpcHRFbGVtZW50LT5zb3VyY2VBdHRy
aWJ1dGVWYWx1ZSgpOwotICAgICAgICBpZiAoIXNjcmlwdEhyZWYuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgICAgICAvLyB3ZSBoYXZlIGEgc3JjIGF0dHJpYnV0ZQotICAgICAgICAgICAgU3RyaW5nIHNj
cmlwdENoYXJzZXQgPSBzY3JpcHRFbGVtZW50LT5jaGFyc2V0QXR0cmlidXRlVmFsdWUoKTsKLSAg
ICAgICAgICAgIGlmICgobV9wZW5kaW5nU2NyaXB0ID0gbV9kb2MtPmRvY0xvYWRlcigpLT5yZXF1
ZXN0U2NyaXB0KHNjcmlwdEhyZWYsIHNjcmlwdENoYXJzZXQpKSkgewotICAgICAgICAgICAgICAg
IG1fc2NyaXB0RWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgbV9wZW5kaW5nU2Ny
aXB0LT5hZGRDbGllbnQodGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBtX3BlbmRpbmdTY3Jp
cHQgd2lsbCBiZSAwIGlmIHNjcmlwdCB3YXMgYWxyZWFkeSBsb2FkZWQgYW5kIHJlZigpIGV4ZWN1
dGVkIGl0Ci0gICAgICAgICAgICAgICAgaWYgKG1fcGVuZGluZ1NjcmlwdCkKLSAgICAgICAgICAg
ICAgICAgICAgcGF1c2VQYXJzaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
ICAgICBtX3NjcmlwdEVsZW1lbnQgPSAwOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBTdHJpbmcgc2NyaXB0Q29kZSA9IHNjcmlwdEVsZW1lbnQtPnNjcmlwdENvbnRlbnQoKTsKLSAg
ICAgICAgICAgIG1fdmlldy0+ZnJhbWUoKS0+bG9hZGVyKCktPmV4ZWN1dGVTY3JpcHQobV9kb2Mt
PnVybCgpLnN0cmluZygpLCBtX3NjcmlwdFN0YXJ0TGluZSwgc2NyaXB0Q29kZSk7Ci0gICAgICAg
IH0KLQotICAgICAgICBtX3JlcXVlc3RpbmdTY3JpcHQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBz
ZXRDdXJyZW50Tm9kZShwYXJlbnQuZ2V0KCkpOwotfQotCi12b2lkIFhNTFRva2VuaXplcjo6cGFy
c2VDaGFyYWN0ZXJzKCkKLXsKLSAgICBpZiAobV9jdXJyZW50Tm9kZS0+aXNUZXh0Tm9kZSgpIHx8
IGVudGVyVGV4dCgpKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBz
dGF0aWNfY2FzdDxUZXh0Kj4obV9jdXJyZW50Tm9kZSktPmFwcGVuZERhdGEobV9zdHJlYW0udGV4
dCgpLCBlYyk7Ci0gICAgfQotfQotCi12b2lkIFhNTFRva2VuaXplcjo6cGFyc2VQcm9jZXNzaW5n
SW5zdHJ1Y3Rpb24oKQotewotICAgIGV4aXRUZXh0KCk7Ci0KLSAgICAvLyAjIyMgaGFuZGxlIGV4
Y2VwdGlvbnMKLSAgICBpbnQgZXhjZXB0aW9uID0gMDsKLSAgICBSZWZQdHI8UHJvY2Vzc2luZ0lu
c3RydWN0aW9uPiBwaSA9IG1fZG9jLT5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCi0gICAg
ICAgIG1fc3RyZWFtLnByb2Nlc3NpbmdJbnN0cnVjdGlvblRhcmdldCgpLAotICAgICAgICBtX3N0
cmVhbS5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EYXRhKCksIGV4Y2VwdGlvbik7Ci0gICAgaWYgKGV4
Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcGktPnNldENyZWF0ZWRCeVBhcnNlcih0
cnVlKTsKLQotICAgIGlmICghbV9jdXJyZW50Tm9kZS0+YWRkQ2hpbGQocGkuZ2V0KCkpKQotICAg
ICAgICByZXR1cm47Ci0gICAgaWYgKG1fdmlldyAmJiAhcGktPmF0dGFjaGVkKCkpCi0gICAgICAg
IHBpLT5hdHRhY2goKTsKLQotICAgIHBpLT5maW5pc2hQYXJzaW5nQ2hpbGRyZW4oKTsKLQotI2lm
IEVOQUJMRShYU0xUKQotICAgIG1fc2F3WFNMVHJhbnNmb3JtID0gIW1fc2F3Rmlyc3RFbGVtZW50
ICYmIHBpLT5pc1hTTCgpOwotICAgIGlmIChtX3Nhd1hTTFRyYW5zZm9ybSAmJiAhbV9kb2MtPnRy
YW5zZm9ybVNvdXJjZURvY3VtZW50KCkpKQotICAgICAgICBzdG9wUGFyc2luZygpOwotI2VuZGlm
Ci19Ci0KLXZvaWQgWE1MVG9rZW5pemVyOjpwYXJzZUNkYXRhKCkKLXsKLSAgICBleGl0VGV4dCgp
OwotCi0gICAgUmVmUHRyPE5vZGU+IG5ld05vZGUgPSBuZXcgQ0RBVEFTZWN0aW9uKG1fZG9jLCBt
X3N0cmVhbS50ZXh0KCkpOwotICAgIGlmICghbV9jdXJyZW50Tm9kZS0+YWRkQ2hpbGQobmV3Tm9k
ZS5nZXQoKSkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAobV92aWV3ICYmICFuZXdOb2RlLT5h
dHRhY2hlZCgpKQotICAgICAgICBuZXdOb2RlLT5hdHRhY2goKTsKLX0KLQotdm9pZCBYTUxUb2tl
bml6ZXI6OnBhcnNlQ29tbWVudCgpCi17Ci0gICAgZXhpdFRleHQoKTsKLQotICAgIFJlZlB0cjxO
b2RlPiBuZXdOb2RlID0gbmV3IENvbW1lbnQobV9kb2MsIG1fc3RyZWFtLnRleHQoKSk7Ci0gICAg
bV9jdXJyZW50Tm9kZS0+YWRkQ2hpbGQobmV3Tm9kZS5nZXQoKSk7Ci0gICAgaWYgKG1fdmlldyAm
JiAhbmV3Tm9kZS0+YXR0YWNoZWQoKSkKLSAgICAgICAgbmV3Tm9kZS0+YXR0YWNoKCk7Ci19Ci0K
LXZvaWQgWE1MVG9rZW5pemVyOjplbmREb2N1bWVudCgpCi17Ci19Ci0KLWJvb2wgWE1MVG9rZW5p
emVyOjpoYXNFcnJvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc3RyZWFtLmhhc0Vycm9yKCk7
Ci19Ci0KLSNpZiBRVF9WRVJTSU9OIDwgMHgwNDA0MDAKLXN0YXRpYyBRU3RyaW5nIHBhcnNlSWQo
Y29uc3QgUVN0cmluZyAmZHRkLCBpbnQgKnBvcywgYm9vbCAqb2spCi17Ci0gICAgKm9rID0gdHJ1
ZTsKLSAgICBpbnQgc3RhcnQgPSAqcG9zICsgMTsKLSAgICBpbnQgZW5kID0gc3RhcnQ7Ci0gICAg
aWYgKGR0ZC5hdCgqcG9zKSA9PSBRTGF0aW4xQ2hhcignXCcnKSkKLSAgICAgICAgd2hpbGUgKHN0
YXJ0IDwgZHRkLmxlbmd0aCgpICYmIGR0ZC5hdChlbmQpICE9IFFMYXRpbjFDaGFyKCdcJycpKQot
ICAgICAgICAgICAgKytlbmQ7Ci0gICAgZWxzZSBpZiAoZHRkLmF0KCpwb3MpID09IFFMYXRpbjFD
aGFyKCdcIicpKQotICAgICAgICB3aGlsZSAoc3RhcnQgPCBkdGQubGVuZ3RoKCkgJiYgZHRkLmF0
KGVuZCkgIT0gUUxhdGluMUNoYXIoJ1wiJykpCi0gICAgICAgICAgICArK2VuZDsKLSAgICBlbHNl
IHsKLSAgICAgICAgKm9rID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBRU3RyaW5nKCk7Ci0gICAg
fQotICAgICpwb3MgPSBlbmQgKyAxOwotICAgIHJldHVybiBkdGQubWlkKHN0YXJ0LCBlbmQgLSBz
dGFydCk7Ci19Ci0jZW5kaWYKLQotdm9pZCBYTUxUb2tlbml6ZXI6OnBhcnNlRHRkKCkKLXsKLSNp
ZiBRVF9WRVJTSU9OID49IDB4MDQwNDAwCi0gICAgUVN0cmluZ1JlZiBuYW1lID0gbV9zdHJlYW0u
ZHRkTmFtZSgpOwotICAgIFFTdHJpbmdSZWYgcHVibGljSWQgPSBtX3N0cmVhbS5kdGRQdWJsaWNJ
ZCgpOwotICAgIFFTdHJpbmdSZWYgc3lzdGVtSWQgPSBtX3N0cmVhbS5kdGRTeXN0ZW1JZCgpOwot
I2Vsc2UKLSAgICBRU3RyaW5nIGR0ZCA9IG1fc3RyZWFtLnRleHQoKS50b1N0cmluZygpOwotCi0g
ICAgaW50IHN0YXJ0ID0gZHRkLmluZGV4T2YoIjwhRE9DVFlQRSAiKSArIDEwOwotICAgIHdoaWxl
IChzdGFydCA8IGR0ZC5sZW5ndGgoKSAmJiBkdGQuYXQoc3RhcnQpLmlzU3BhY2UoKSkKLSAgICAg
ICAgKytzdGFydDsKLSAgICBpbnQgZW5kID0gc3RhcnQ7Ci0gICAgd2hpbGUgKHN0YXJ0IDwgZHRk
Lmxlbmd0aCgpICYmICFkdGQuYXQoZW5kKS5pc1NwYWNlKCkpCi0gICAgICAgICsrZW5kOwotICAg
IFFTdHJpbmcgbmFtZSA9IGR0ZC5taWQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQotICAgIHN0YXJ0
ID0gZW5kOwotICAgIHdoaWxlIChzdGFydCA8IGR0ZC5sZW5ndGgoKSAmJiBkdGQuYXQoc3RhcnQp
LmlzU3BhY2UoKSkKLSAgICAgICAgKytzdGFydDsKLSAgICBlbmQgPSBzdGFydDsKLSAgICB3aGls
ZSAoc3RhcnQgPCBkdGQubGVuZ3RoKCkgJiYgIWR0ZC5hdChlbmQpLmlzU3BhY2UoKSkKLSAgICAg
ICAgKytlbmQ7Ci0gICAgUVN0cmluZyBpZCA9IGR0ZC5taWQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsK
LSAgICBzdGFydCA9IGVuZDsKLSAgICB3aGlsZSAoc3RhcnQgPCBkdGQubGVuZ3RoKCkgJiYgZHRk
LmF0KHN0YXJ0KS5pc1NwYWNlKCkpCi0gICAgICAgICsrc3RhcnQ7Ci0gICAgUVN0cmluZyBwdWJs
aWNJZDsKLSAgICBRU3RyaW5nIHN5c3RlbUlkOwotICAgIGlmIChpZCA9PSBRTGF0aW4xU3RyaW5n
KCJQVUJMSUMiKSkgewotICAgICAgICBib29sIG9rOwotICAgICAgICBwdWJsaWNJZCA9IHBhcnNl
SWQoZHRkLCAmc3RhcnQsICZvayk7Ci0gICAgICAgIGlmICghb2spIHsKLSAgICAgICAgICAgIGhh
bmRsZUVycm9yKGZhdGFsLCAiSW52YWxpZCBET0NUWVBFIiwgbGluZU51bWJlcigpLCBjb2x1bW5O
dW1iZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUg
KHN0YXJ0IDwgZHRkLmxlbmd0aCgpICYmIGR0ZC5hdChzdGFydCkuaXNTcGFjZSgpKQotICAgICAg
ICAgICAgKytzdGFydDsKLSAgICAgICAgc3lzdGVtSWQgPSBwYXJzZUlkKGR0ZCwgJnN0YXJ0LCAm
b2spOwotICAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcihmYXRhbCwg
IkludmFsaWQgRE9DVFlQRSIsIGxpbmVOdW1iZXIoKSwgY29sdW1uTnVtYmVyKCkpOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpZCA9PSBRTGF0aW4xU3Ry
aW5nKCJTWVNURU0iKSkgewotICAgICAgICBib29sIG9rOwotICAgICAgICBzeXN0ZW1JZCA9IHBh
cnNlSWQoZHRkLCAmc3RhcnQsICZvayk7Ci0gICAgICAgIGlmICghb2spIHsKLSAgICAgICAgICAg
IGhhbmRsZUVycm9yKGZhdGFsLCAiSW52YWxpZCBET0NUWVBFIiwgbGluZU51bWJlcigpLCBjb2x1
bW5OdW1iZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVsc2Ug
aWYgKGlkID09IFFMYXRpbjFTdHJpbmcoIlsiKSB8fCBpZCA9PSBRTGF0aW4xU3RyaW5nKCI+Iikp
IHsKLSAgICB9IGVsc2UgewotICAgICAgICBoYW5kbGVFcnJvcihmYXRhbCwgIkludmFsaWQgRE9D
VFlQRSIsIGxpbmVOdW1iZXIoKSwgY29sdW1uTnVtYmVyKCkpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotI2VuZGlmICAgIAotCi0gICAgLy9xRGVidWcoKSA8PCBkdGQgPDwgbmFtZSA8PCBwdWJs
aWNJZCA8PCBzeXN0ZW1JZDsKLSAgICBpZiAoKHB1YmxpY0lkID09IFFMYXRpbjFTdHJpbmcoIi0v
L1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIikpCi0gICAgICAgIHx8IChwdWJs
aWNJZCA9PSBRTGF0aW4xU3RyaW5nKCItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIikpCi0gICAg
ICAgIHx8IChwdWJsaWNJZCA9PSBRTGF0aW4xU3RyaW5nKCItLy9XM0MvL0RURCBYSFRNTCAxLjAg
U3RyaWN0Ly9FTiIpKQotICAgICAgICB8fCAocHVibGljSWQgPT0gUUxhdGluMVN0cmluZygiLS8v
VzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIpKQotICAgICAgICB8fCAocHVibGljSWQg
PT0gUUxhdGluMVN0cmluZygiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIpKQotICAg
ICAgICB8fCAocHVibGljSWQgPT0gUUxhdGluMVN0cmluZygiLS8vVzNDLy9EVEQgWEhUTUwgMS4x
IHBsdXMgTWF0aE1MIDIuMC8vRU4iKSkKLSAgICAgICAgfHwgKHB1YmxpY0lkID09IFFMYXRpbjFT
dHJpbmcoIi0vL1czQy8vRFREIFhIVE1MIDEuMSBwbHVzIE1hdGhNTCAyLjAgcGx1cyBTVkcgMS4x
Ly9FTiIpKQotICAgICAgICB8fCAocHVibGljSWQgPT0gUUxhdGluMVN0cmluZygiLS8vV0FQRk9S
VU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIpKSkgewotICAgICAgICBzZXRJc1hIVE1MRG9j
dW1lbnQodHJ1ZSk7IC8vIGNvbnRyb2xzIGlmIHdlIHJlcGxhY2UgZW50aXRpZXMgb3Igbm90Lgot
ICAgIH0KLSAgICBpZiAoIW1fcGFyc2luZ0ZyYWdtZW50KQotICAgICAgICBtX2RvYy0+YWRkQ2hp
bGQoRG9jdW1lbnRUeXBlOjpjcmVhdGUobV9kb2MsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkp
OwotICAgIAotfQotI2VuZGlmCiB9CiAKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vWE1MVG9r
ZW5pemVyLmggYi9XZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXIuaAppbmRleCAzODBlOGI4Li4wMzRi
YjYwIDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXIuaAorKysgYi9XZWJDb3Jl
L2RvbS9YTUxUb2tlbml6ZXIuaApAQCAtMjUsMTYgKzI1LDE5IEBACiAjZGVmaW5lIFhNTFRva2Vu
aXplcl9oCiAKICNpbmNsdWRlICJDYWNoZWRSZXNvdXJjZUNsaWVudC5oIgorI2luY2x1ZGUgIkhU
TUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxTY3JpcHRFbGVtZW50LmgiCisjaW5jbHVkZSAiU2Ny
aXB0RWxlbWVudC5oIgogI2luY2x1ZGUgIlNlZ21lbnRlZFN0cmluZy5oIgogI2luY2x1ZGUgIlN0
cmluZ0hhc2guaCIKICNpbmNsdWRlICJUb2tlbml6ZXIuaCIKICNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KIAotI2lmIFBMQVRGT1JNKFFUKQotI2lmICFF
TkFCTEUoWFNMVCkKLSNkZWZpbmUgVVNFX1FYTUxTVFJFQU0KLSNlbmRpZgorI2lmIEVOQUJMRShT
VkcpCisjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdTY3JpcHRFbGVtZW50Lmgi
CisjaW5jbHVkZSAiU1ZHU3R5bGVFbGVtZW50LmgiCiAjZW5kaWYKIAogI2lmbmRlZiBVU0VfUVhN
TFNUUkVBTQpAQCAtODAsMTAgKzgzLDE2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAg
Ly8gZnJvbSBDYWNoZWRSZXNvdXJjZUNsaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5
RmluaXNoZWQoQ2FjaGVkUmVzb3VyY2UqIGZpbmlzaGVkT2JqKTsKIAotI2lmbmRlZiBVU0VfUVhN
TFNUUkVBTQogCi0gICAgICAgIGZyaWVuZCBib29sIHBhcnNlWE1MRG9jdW1lbnRGcmFnbWVudChj
b25zdCBTdHJpbmcmIGNodW5rLCBEb2N1bWVudEZyYWdtZW50KiBmcmFnbWVudCwgRWxlbWVudCog
cGFyZW50KTsKKyAgICAgICAgdm9pZCBoYW5kbGVFcnJvcihFcnJvclR5cGUgdHlwZSwgY29uc3Qg
Y2hhciogbSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpOworCisgICAgICAgIHZp
cnR1YWwgYm9vbCB3ZWxsRm9ybWVkKCkgY29uc3QgeyByZXR1cm4gIW1fc2F3RXJyb3I7IH0KIAor
ICAgICAgICBpbnQgbGluZU51bWJlcigpIGNvbnN0OworICAgICAgICBpbnQgY29sdW1uTnVtYmVy
KCkgY29uc3Q7CisKKyNpZm5kZWYgVVNFX1FYTUxTVFJFQU0KK3B1YmxpYzoKICAgICAgICAgLy8g
Y2FsbGJhY2tzIGZyb20gcGFyc2VyIFNBWAogICAgICAgICB2b2lkIGVycm9yKEVycm9yVHlwZSwg
Y29uc3QgY2hhciogbWVzc2FnZSwgdmFfbGlzdCBhcmdzKSBXVEZfQVRUUklCVVRFX1BSSU5URigz
LCAwKTsgCiAgICAgICAgIHZvaWQgc3RhcnRFbGVtZW50TnMoY29uc3QgeG1sQ2hhciogeG1sTG9j
YWxOYW1lLCBjb25zdCB4bWxDaGFyKiB4bWxQcmVmaXgsIGNvbnN0IHhtbENoYXIqIHhtbFVSSSwg
aW50IG5iX25hbWVzcGFjZXMsCkBAIC05Nyw2ICsxMDYsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgICAgIHZvaWQgaW50ZXJuYWxTdWJzZXQoY29uc3QgeG1sQ2hhciogbmFtZSwgY29uc3Qg
eG1sQ2hhciogZXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciogc3lzdGVtSUQpOwogICAgICAgICB2
b2lkIGVuZERvY3VtZW50KCk7CiAjZWxzZQorcHJpdmF0ZToKICAgICAgICAgdm9pZCBwYXJzZSgp
OwogICAgICAgICB2b2lkIHN0YXJ0RG9jdW1lbnQoKTsKICAgICAgICAgdm9pZCBwYXJzZVN0YXJ0
RWxlbWVudCgpOwpAQCAtMTA5LDE1ICsxMTksMzQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAg
ICAgICB2b2lkIHBhcnNlRHRkKCk7CiAgICAgICAgIGJvb2wgaGFzRXJyb3IoKSBjb25zdDsKICNl
bmRpZgorICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBib29sIHBhcnNlWE1MRG9jdW1lbnRG
cmFnbWVudChjb25zdCBTdHJpbmcmIGNodW5rLCBEb2N1bWVudEZyYWdtZW50KiBmcmFnbWVudCwg
RWxlbWVudCogcGFyZW50KTsKIAotICAgICAgICB2b2lkIGhhbmRsZUVycm9yKEVycm9yVHlwZSB0
eXBlLCBjb25zdCBjaGFyKiBtLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcik7Ci0K
LSAgICAgICAgdmlydHVhbCBib29sIHdlbGxGb3JtZWQoKSBjb25zdCB7IHJldHVybiAhbV9zYXdF
cnJvcjsgfQorICAgICAgICBzdGF0aWMgdm9pZCBldmVudHVhbGx5TWFya0FzUGFyc2VyQ3JlYXRl
ZChFbGVtZW50KiBlbGVtZW50KTsKKyAgICAgICAgc3RhdGljIGlubGluZSBib29sIGlzU2NyaXB0
RWxlbWVudChFbGVtZW50KiBlbGVtZW50KSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJu
IGVsZW1lbnQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3JpcHRUYWcpCisjaWYgRU5BQkxFKFNW
RykKKyAgICAgICAgICAgICAgICB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzY3Jp
cHRUYWcpCisjZW5kaWYKKyAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBpbmxp
bmUgU2NyaXB0RWxlbWVudCogY2FzdFRvU2NyaXB0RWxlbWVudChFbGVtZW50KiBlbGVtZW50KQor
ICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoaXNTY3JpcHRFbGVtZW50KGVsZW1lbnQpKTsK
KworICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzY3JpcHRU
YWcpKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MU2NyaXB0RWxlbWVu
dCo+KGVsZW1lbnQpOworCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgICAgIGlmIChlbGVtZW50
LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzY3JpcHRUYWcpKQorICAgICAgICAgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxTVkdTY3JpcHRFbGVtZW50Kj4oZWxlbWVudCk7CisjZW5kaWYKIAotICAg
ICAgICBpbnQgbGluZU51bWJlcigpIGNvbnN0OwotICAgICAgICBpbnQgY29sdW1uTnVtYmVyKCkg
Y29uc3Q7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICB9CiAKLSAgICBwcml2YXRlOgogICAgICAgICB2b2lkIGluaXRpYWxp
emVQYXJzZXJDb250ZXh0KGNvbnN0IGNoYXIqIGNodW5rID0gMCk7CiAgICAgICAgIHZvaWQgc2V0
Q3VycmVudE5vZGUoTm9kZSopOwogCkBAIC0xMjYsNiArMTU1LDkgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogICAgICAgICBib29sIGVudGVyVGV4dCgpOwogICAgICAgICB2b2lkIGV4aXRUZXh0KCk7
CiAKKyAgICAgICAgdm9pZCBkb1dyaXRlKGNvbnN0IFN0cmluZyYpOworICAgICAgICB2b2lkIGRv
RW5kKCk7CisKICAgICAgICAgRG9jdW1lbnQqIG1fZG9jOwogICAgICAgICBGcmFtZVZpZXcqIG1f
dmlldzsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vWE1MVG9rZW5pemVyTGlieG1sMi5jcHAg
Yi9XZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXJMaWJ4bWwyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi5kZTI2ZDhiCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9kb20v
WE1MVG9rZW5pemVyTGlieG1sMi5jcHAKQEAgLTAsMCArMSwxMzU0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDAwIFBldGVyIEtlbGx5IChwbWtAcG9zdC5jb20pCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDUsIDIwMDYsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQHdlYmtpdC5vcmcpCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDcgU2FtdWVsIFdlaW5pZyAoc2FtQHdlYmtpdC5vcmcpCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcgVHJvbGx0ZWNoIEFTQQorICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdl
ciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJYTUxU
b2tlbml6ZXIuaCIKKworI2luY2x1ZGUgIkNEQVRBU2VjdGlvbi5oIgorI2luY2x1ZGUgIkNTdHJp
bmcuaCIKKyNpbmNsdWRlICJDYWNoZWRTY3JpcHQuaCIKKyNpbmNsdWRlICJDb21tZW50LmgiCisj
aW5jbHVkZSAiRG9jTG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJE
b2N1bWVudEZyYWdtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRUeXBlLmgiCisjaW5jbHVkZSAi
RXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXIu
aCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJIVE1MTGlua0VsZW1lbnQuaCIK
KyNpbmNsdWRlICJIVE1MU3R5bGVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFRva2VuaXplci5o
IgorI2luY2x1ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJSZXNvdXJjZUVycm9yLmgiCisjaW5jbHVkZSAiUmVzb3Vy
Y2VIYW5kbGUuaCIKKyNpbmNsdWRlICJSZXNvdXJjZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJSZXNv
dXJjZVJlc3BvbnNlLmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1
ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+
CisjaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8d3RmL1N0cmluZ0V4dHJhcy5o
PgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisK
KyNpZiBFTkFCTEUoWFNMVCkKKyNpbmNsdWRlIDxsaWJ4c2x0L3hzbHQuaD4KKyNlbmRpZgorCisK
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFt
ZXNwYWNlIEV2ZW50TmFtZXM7CisKK2NsYXNzIFBlbmRpbmdDYWxsYmFja3MgeworcHVibGljOgor
ICAgIFBlbmRpbmdDYWxsYmFja3MoKQorICAgIHsKKyAgICAgICAgbV9jYWxsYmFja3Muc2V0QXV0
b0RlbGV0ZSh0cnVlKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBhcHBlbmRTdGFydEVsZW1lbnRO
U0NhbGxiYWNrKGNvbnN0IHhtbENoYXIqIHhtbExvY2FsTmFtZSwgY29uc3QgeG1sQ2hhciogeG1s
UHJlZml4LCBjb25zdCB4bWxDaGFyKiB4bWxVUkksIGludCBuYl9uYW1lc3BhY2VzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyKiogbmFtZXNwYWNl
cywgaW50IG5iX2F0dHJpYnV0ZXMsIGludCBuYl9kZWZhdWx0ZWQsIGNvbnN0IHhtbENoYXIqKiBh
dHRyaWJ1dGVzKQorICAgIHsKKyAgICAgICAgUGVuZGluZ1N0YXJ0RWxlbWVudE5TQ2FsbGJhY2sq
IGNhbGxiYWNrID0gbmV3IFBlbmRpbmdTdGFydEVsZW1lbnROU0NhbGxiYWNrOworICAgICAgICAK
KyAgICAgICAgY2FsbGJhY2stPnhtbExvY2FsTmFtZSA9IHhtbFN0cmR1cCh4bWxMb2NhbE5hbWUp
OworICAgICAgICBjYWxsYmFjay0+eG1sUHJlZml4ID0geG1sU3RyZHVwKHhtbFByZWZpeCk7Cisg
ICAgICAgIGNhbGxiYWNrLT54bWxVUkkgPSB4bWxTdHJkdXAoeG1sVVJJKTsKKyAgICAgICAgY2Fs
bGJhY2stPm5iX25hbWVzcGFjZXMgPSBuYl9uYW1lc3BhY2VzOworICAgICAgICBjYWxsYmFjay0+
bmFtZXNwYWNlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8eG1sQ2hhcioqPih4bWxNYWxsb2Moc2l6ZW9m
KHhtbENoYXIqKSAqIG5iX25hbWVzcGFjZXMgKiAyKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbmJfbmFtZXNwYWNlcyAqIDIgOyBpKyspCisgICAgICAgICAgICBjYWxsYmFjay0+bmFt
ZXNwYWNlc1tpXSA9IHhtbFN0cmR1cChuYW1lc3BhY2VzW2ldKTsKKyAgICAgICAgY2FsbGJhY2st
Pm5iX2F0dHJpYnV0ZXMgPSBuYl9hdHRyaWJ1dGVzOworICAgICAgICBjYWxsYmFjay0+bmJfZGVm
YXVsdGVkID0gbmJfZGVmYXVsdGVkOworICAgICAgICBjYWxsYmFjay0+YXR0cmlidXRlcyA9ICBy
ZWludGVycHJldF9jYXN0PHhtbENoYXIqKj4oeG1sTWFsbG9jKHNpemVvZih4bWxDaGFyKikgKiBu
Yl9hdHRyaWJ1dGVzICogNSkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iX2F0dHJp
YnV0ZXM7IGkrKykgeworICAgICAgICAgICAgLy8gRWFjaCBhdHRyaWJ1dGUgaGFzIDUgZWxlbWVu
dHMgaW4gdGhlIGFycmF5OgorICAgICAgICAgICAgLy8gbmFtZSwgcHJlZml4LCB1cmksIHZhbHVl
IGFuZCBhbiBlbmQgcG9pbnRlci4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQg
aiA9IDA7IGogPCAzOyBqKyspCisgICAgICAgICAgICAgICAgY2FsbGJhY2stPmF0dHJpYnV0ZXNb
aSAqIDUgKyBqXSA9IHhtbFN0cmR1cChhdHRyaWJ1dGVzW2kgKiA1ICsgal0pOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBpbnQgbGVuID0gYXR0cmlidXRlc1tpICogNSArIDRdIC0gYXR0cmli
dXRlc1tpICogNSArIDNdOworCisgICAgICAgICAgICBjYWxsYmFjay0+YXR0cmlidXRlc1tpICog
NSArIDNdID0geG1sU3RybmR1cChhdHRyaWJ1dGVzW2kgKiA1ICsgM10sIGxlbik7CisgICAgICAg
ICAgICBjYWxsYmFjay0+YXR0cmlidXRlc1tpICogNSArIDRdID0gY2FsbGJhY2stPmF0dHJpYnV0
ZXNbaSAqIDUgKyAzXSArIGxlbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9jYWxs
YmFja3MuYXBwZW5kKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICB2b2lkIGFwcGVuZEVuZEVsZW1l
bnROU0NhbGxiYWNrKCkKKyAgICB7CisgICAgICAgIFBlbmRpbmdFbmRFbGVtZW50TlNDYWxsYmFj
ayogY2FsbGJhY2sgPSBuZXcgUGVuZGluZ0VuZEVsZW1lbnROU0NhbGxiYWNrOworICAgICAgICAK
KyAgICAgICAgbV9jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKTsKKyAgICB9CisgICAgCisgICAg
dm9pZCBhcHBlbmRDaGFyYWN0ZXJzQ2FsbGJhY2soY29uc3QgeG1sQ2hhciogcywgaW50IGxlbikK
KyAgICB7CisgICAgICAgIFBlbmRpbmdDaGFyYWN0ZXJzQ2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3
IFBlbmRpbmdDaGFyYWN0ZXJzQ2FsbGJhY2s7CisgICAgICAgIAorICAgICAgICBjYWxsYmFjay0+
cyA9IHhtbFN0cm5kdXAocywgbGVuKTsKKyAgICAgICAgY2FsbGJhY2stPmxlbiA9IGxlbjsKKyAg
ICAgICAgCisgICAgICAgIG1fY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjayk7ICAgICAgICAKKyAg
ICB9CisgICAgCisgICAgdm9pZCBhcHBlbmRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25DYWxsYmFjayhj
b25zdCB4bWxDaGFyKiB0YXJnZXQsIGNvbnN0IHhtbENoYXIqIGRhdGEpCisgICAgeworICAgICAg
ICBQZW5kaW5nUHJvY2Vzc2luZ0luc3RydWN0aW9uQ2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBl
bmRpbmdQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25DYWxsYmFjazsKKyAgICAgICAgCisgICAgICAgIGNh
bGxiYWNrLT50YXJnZXQgPSB4bWxTdHJkdXAodGFyZ2V0KTsKKyAgICAgICAgY2FsbGJhY2stPmRh
dGEgPSB4bWxTdHJkdXAoZGF0YSk7CisgICAgICAgIAorICAgICAgICBtX2NhbGxiYWNrcy5hcHBl
bmQoY2FsbGJhY2spOworICAgIH0KKyAgICAKKyAgICB2b2lkIGFwcGVuZENEQVRBQmxvY2tDYWxs
YmFjayhjb25zdCB4bWxDaGFyKiBzLCBpbnQgbGVuKQorICAgIHsKKyAgICAgICAgUGVuZGluZ0NE
QVRBQmxvY2tDYWxsYmFjayogY2FsbGJhY2sgPSBuZXcgUGVuZGluZ0NEQVRBQmxvY2tDYWxsYmFj
azsKKyAgICAgICAgCisgICAgICAgIGNhbGxiYWNrLT5zID0geG1sU3RybmR1cChzLCBsZW4pOwor
ICAgICAgICBjYWxsYmFjay0+bGVuID0gbGVuOworICAgICAgICAKKyAgICAgICAgbV9jYWxsYmFj
a3MuYXBwZW5kKGNhbGxiYWNrKTsgICAgICAgIAorICAgIH0KKworICAgIHZvaWQgYXBwZW5kQ29t
bWVudENhbGxiYWNrKGNvbnN0IHhtbENoYXIqIHMpCisgICAgeworICAgICAgICBQZW5kaW5nQ29t
bWVudENhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nQ29tbWVudENhbGxiYWNrOworICAg
ICAgICAKKyAgICAgICAgY2FsbGJhY2stPnMgPSB4bWxTdHJkdXAocyk7CisgICAgICAgIAorICAg
ICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spOyAgICAgICAgCisgICAgfQorCisgICAg
dm9pZCBhcHBlbmRJbnRlcm5hbFN1YnNldENhbGxiYWNrKGNvbnN0IHhtbENoYXIqIG5hbWUsIGNv
bnN0IHhtbENoYXIqIGV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIqIHN5c3RlbUlEKQorICAgIHsK
KyAgICAgICAgUGVuZGluZ0ludGVybmFsU3Vic2V0Q2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBl
bmRpbmdJbnRlcm5hbFN1YnNldENhbGxiYWNrOworICAgICAgICAKKyAgICAgICAgY2FsbGJhY2st
Pm5hbWUgPSB4bWxTdHJkdXAobmFtZSk7CisgICAgICAgIGNhbGxiYWNrLT5leHRlcm5hbElEID0g
eG1sU3RyZHVwKGV4dGVybmFsSUQpOworICAgICAgICBjYWxsYmFjay0+c3lzdGVtSUQgPSB4bWxT
dHJkdXAoc3lzdGVtSUQpOworICAgICAgICAKKyAgICAgICAgbV9jYWxsYmFja3MuYXBwZW5kKGNh
bGxiYWNrKTsgICAgICAgIAorICAgIH0KKyAgICAKKyAgICB2b2lkIGFwcGVuZEVycm9yQ2FsbGJh
Y2soWE1MVG9rZW5pemVyOjpFcnJvclR5cGUgdHlwZSwgY29uc3QgY2hhciogbWVzc2FnZSwgaW50
IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpCisgICAgeworICAgICAgICBQZW5kaW5nRXJy
b3JDYWxsYmFjayogY2FsbGJhY2sgPSBuZXcgUGVuZGluZ0Vycm9yQ2FsbGJhY2s7CisgICAgICAg
IAorICAgICAgICBjYWxsYmFjay0+bWVzc2FnZSA9IHN0cmR1cChtZXNzYWdlKTsKKyAgICAgICAg
Y2FsbGJhY2stPnR5cGUgPSB0eXBlOworICAgICAgICBjYWxsYmFjay0+bGluZU51bWJlciA9IGxp
bmVOdW1iZXI7CisgICAgICAgIGNhbGxiYWNrLT5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7
CisgICAgICAgIAorICAgICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spOworICAgIH0K
KworICAgIHZvaWQgY2FsbEFuZFJlbW92ZUZpcnN0Q2FsbGJhY2soWE1MVG9rZW5pemVyKiB0b2tl
bml6ZXIpCisgICAgeworICAgICAgICBQZW5kaW5nQ2FsbGJhY2sqIGNiID0gbV9jYWxsYmFja3Mu
Z2V0Rmlyc3QoKTsKKyAgICAgICAgICAgIAorICAgICAgICBjYi0+Y2FsbCh0b2tlbml6ZXIpOwor
ICAgICAgICBtX2NhbGxiYWNrcy5yZW1vdmVGaXJzdCgpOworICAgIH0KKyAgICAKKyAgICBib29s
IGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2NhbGxiYWNrcy5pc0VtcHR5KCk7IH0KKyAgICAK
K3ByaXZhdGU6ICAgIAorICAgIHN0cnVjdCBQZW5kaW5nQ2FsbGJhY2sgeyAgICAgICAgCisgICAg
ICAgIAorICAgICAgICB2aXJ0dWFsIH5QZW5kaW5nQ2FsbGJhY2soKSB7IH0gCisKKyAgICAgICAg
dmlydHVhbCB2b2lkIGNhbGwoWE1MVG9rZW5pemVyKiB0b2tlbml6ZXIpID0gMDsKKyAgICB9OyAg
CisgICAgCisgICAgc3RydWN0IFBlbmRpbmdTdGFydEVsZW1lbnROU0NhbGxiYWNrIDogcHVibGlj
IFBlbmRpbmdDYWxsYmFjayB7ICAgICAgICAKKyAgICAgICAgdmlydHVhbCB+UGVuZGluZ1N0YXJ0
RWxlbWVudE5TQ2FsbGJhY2soKSB7CisgICAgICAgICAgICB4bWxGcmVlKHhtbExvY2FsTmFtZSk7
CisgICAgICAgICAgICB4bWxGcmVlKHhtbFByZWZpeCk7CisgICAgICAgICAgICB4bWxGcmVlKHht
bFVSSSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iX25hbWVzcGFjZXMgKiAy
OyBpKyspCisgICAgICAgICAgICAgICAgeG1sRnJlZShuYW1lc3BhY2VzW2ldKTsKKyAgICAgICAg
ICAgIHhtbEZyZWUobmFtZXNwYWNlcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IG5iX2F0dHJpYnV0ZXM7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8
IDQ7IGorKykgCisgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoYXR0cmlidXRlc1tpICogNSAr
IGpdKTsKKyAgICAgICAgICAgIHhtbEZyZWUoYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTFRva2VuaXplciogdG9rZW5pemVyKSB7
CisgICAgICAgICAgICB0b2tlbml6ZXItPnN0YXJ0RWxlbWVudE5zKHhtbExvY2FsTmFtZSwgeG1s
UHJlZml4LCB4bWxVUkksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
Yl9uYW1lc3BhY2VzLCAoY29uc3QgeG1sQ2hhcioqKW5hbWVzcGFjZXMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2F0dHJpYnV0ZXMsIG5iX2RlZmF1bHRlZCwgKGNv
bnN0IHhtbENoYXIqKikoYXR0cmlidXRlcykpOworICAgICAgICB9CisKKyAgICAgICAgeG1sQ2hh
ciogeG1sTG9jYWxOYW1lOworICAgICAgICB4bWxDaGFyKiB4bWxQcmVmaXg7CisgICAgICAgIHht
bENoYXIqIHhtbFVSSTsKKyAgICAgICAgaW50IG5iX25hbWVzcGFjZXM7CisgICAgICAgIHhtbENo
YXIqKiBuYW1lc3BhY2VzOworICAgICAgICBpbnQgbmJfYXR0cmlidXRlczsKKyAgICAgICAgaW50
IG5iX2RlZmF1bHRlZDsKKyAgICAgICAgeG1sQ2hhcioqIGF0dHJpYnV0ZXM7CisgICAgfTsKKyAg
ICAKKyAgICBzdHJ1Y3QgUGVuZGluZ0VuZEVsZW1lbnROU0NhbGxiYWNrIDogcHVibGljIFBlbmRp
bmdDYWxsYmFjayB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTFRva2VuaXplciogdG9r
ZW5pemVyKSAKKyAgICAgICAgeworICAgICAgICAgICAgdG9rZW5pemVyLT5lbmRFbGVtZW50TnMo
KTsKKyAgICAgICAgfQorICAgIH07CisgICAgCisgICAgc3RydWN0IFBlbmRpbmdDaGFyYWN0ZXJz
Q2FsbGJhY2sgOiBwdWJsaWMgUGVuZGluZ0NhbGxiYWNrIHsKKyAgICAgICAgdmlydHVhbCB+UGVu
ZGluZ0NoYXJhY3RlcnNDYWxsYmFjaygpIAorICAgICAgICB7CisgICAgICAgICAgICB4bWxGcmVl
KHMpOworICAgICAgICB9CisgICAgCisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTFRva2Vu
aXplciogdG9rZW5pemVyKSAKKyAgICAgICAgeworICAgICAgICAgICAgdG9rZW5pemVyLT5jaGFy
YWN0ZXJzKHMsIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHhtbENoYXIqIHM7
CisgICAgICAgIGludCBsZW47CisgICAgfTsKKworICAgIHN0cnVjdCBQZW5kaW5nUHJvY2Vzc2lu
Z0luc3RydWN0aW9uQ2FsbGJhY2sgOiBwdWJsaWMgUGVuZGluZ0NhbGxiYWNrIHsKKyAgICAgICAg
dmlydHVhbCB+UGVuZGluZ1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkNhbGxiYWNrKCkgCisgICAgICAg
IHsKKyAgICAgICAgICAgIHhtbEZyZWUodGFyZ2V0KTsKKyAgICAgICAgICAgIHhtbEZyZWUoZGF0
YSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTFRv
a2VuaXplciogdG9rZW5pemVyKSAKKyAgICAgICAgeworICAgICAgICAgICAgdG9rZW5pemVyLT5w
cm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgeG1sQ2hhciogdGFyZ2V0OworICAgICAgICB4bWxDaGFyKiBkYXRhOworICAgIH07
CisgICAgCisgICAgc3RydWN0IFBlbmRpbmdDREFUQUJsb2NrQ2FsbGJhY2sgOiBwdWJsaWMgUGVu
ZGluZ0NhbGxiYWNrIHsKKyAgICAgICAgdmlydHVhbCB+UGVuZGluZ0NEQVRBQmxvY2tDYWxsYmFj
aygpIAorICAgICAgICB7CisgICAgICAgICAgICB4bWxGcmVlKHMpOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikg
CisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuaXplci0+Y2RhdGFCbG9jayhzLCBsZW4pOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICB4bWxDaGFyKiBzOworICAgICAgICBpbnQgbGVu
OworICAgIH07CisKKyAgICBzdHJ1Y3QgUGVuZGluZ0NvbW1lbnRDYWxsYmFjayA6IHB1YmxpYyBQ
ZW5kaW5nQ2FsbGJhY2sgeworICAgICAgICB2aXJ0dWFsIH5QZW5kaW5nQ29tbWVudENhbGxiYWNr
KCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHhtbEZyZWUocyk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTFRva2VuaXplciogdG9rZW5pemVyKSAK
KyAgICAgICAgeworICAgICAgICAgICAgdG9rZW5pemVyLT5jb21tZW50KHMpOworICAgICAgICB9
CisKKyAgICAgICAgeG1sQ2hhciogczsKKyAgICB9OworICAgIAorICAgIHN0cnVjdCBQZW5kaW5n
SW50ZXJuYWxTdWJzZXRDYWxsYmFjayA6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgeworICAgICAg
ICB2aXJ0dWFsIH5QZW5kaW5nSW50ZXJuYWxTdWJzZXRDYWxsYmFjaygpIAorICAgICAgICB7Cisg
ICAgICAgICAgICB4bWxGcmVlKG5hbWUpOworICAgICAgICAgICAgeG1sRnJlZShleHRlcm5hbElE
KTsKKyAgICAgICAgICAgIHhtbEZyZWUoc3lzdGVtSUQpOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxUb2tlbml6ZXIqIHRva2VuaXplcikKKyAgICAg
ICAgeworICAgICAgICAgICAgdG9rZW5pemVyLT5pbnRlcm5hbFN1YnNldChuYW1lLCBleHRlcm5h
bElELCBzeXN0ZW1JRCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHhtbENoYXIqIG5h
bWU7CisgICAgICAgIHhtbENoYXIqIGV4dGVybmFsSUQ7CisgICAgICAgIHhtbENoYXIqIHN5c3Rl
bUlEOyAgICAgICAgCisgICAgfTsKKyAgICAKKyAgICBzdHJ1Y3QgUGVuZGluZ0Vycm9yQ2FsbGJh
Y2s6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgeworICAgICAgICB2aXJ0dWFsIH5QZW5kaW5nRXJy
b3JDYWxsYmFjaygpIAorICAgICAgICB7CisgICAgICAgICAgICBmcmVlIChtZXNzYWdlKTsKKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgdmlydHVhbCB2b2lkIGNhbGwoWE1MVG9rZW5pemVy
KiB0b2tlbml6ZXIpIAorICAgICAgICB7CisgICAgICAgICAgICB0b2tlbml6ZXItPmhhbmRsZUVy
cm9yKHR5cGUsIG1lc3NhZ2UsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcik7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIFhNTFRva2VuaXplcjo6RXJyb3JUeXBlIHR5cGU7CisgICAgICAg
IGNoYXIqIG1lc3NhZ2U7CisgICAgICAgIGludCBsaW5lTnVtYmVyOworICAgICAgICBpbnQgY29s
dW1uTnVtYmVyOworICAgIH07CisgICAgCitwdWJsaWM6CisgICAgRGVwcmVjYXRlZFB0ckxpc3Q8
UGVuZGluZ0NhbGxiYWNrPiBtX2NhbGxiYWNrczsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IGdsb2JhbERlc2NyaXB0b3IgPSAwOworc3RhdGlj
IERvY0xvYWRlciogZ2xvYmFsRG9jTG9hZGVyID0gMDsKK3N0YXRpYyBUaHJlYWRJZGVudGlmaWVy
IGxpYnhtbExvYWRlclRocmVhZCA9IDA7CisKK3N0YXRpYyBpbnQgbWF0Y2hGdW5jKGNvbnN0IGNo
YXIqIHVyaSkKK3sKKyAgICAvLyBPbmx5IG1hdGNoIGxvYWRzIGluaXRpYXRlZCBkdWUgdG8gdXNl
cyBvZiBsaWJ4bWwyIGZyb20gd2l0aGluIFhNTFRva2VuaXplciB0byBhdm9pZAorICAgIC8vIGlu
dGVyZmVyaW5nIHdpdGggY2xpZW50IGFwcGxpY2F0aW9ucyB0aGF0IGFsc28gdXNlIGxpYnhtbDIu
ICBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzM1MworICAgIHJldHVy
biBnbG9iYWxEb2NMb2FkZXIgJiYgY3VycmVudFRocmVhZCgpID09IGxpYnhtbExvYWRlclRocmVh
ZDsKK30KKworY2xhc3MgT2Zmc2V0QnVmZmVyIHsKK3B1YmxpYzoKKyAgICBPZmZzZXRCdWZmZXIo
Y29uc3QgVmVjdG9yPGNoYXI+JiBiKSA6IG1fYnVmZmVyKGIpLCBtX2N1cnJlbnRPZmZzZXQoMCkg
eyB9CisgICAgCisgICAgaW50IHJlYWRPdXRCeXRlcyhjaGFyKiBvdXRwdXRCdWZmZXIsIHVuc2ln
bmVkIGFza2VkVG9SZWFkKSB7CisgICAgICAgIHVuc2lnbmVkIGJ5dGVzTGVmdCA9IG1fYnVmZmVy
LnNpemUoKSAtIG1fY3VycmVudE9mZnNldDsKKyAgICAgICAgdW5zaWduZWQgbGVuVG9Db3B5ID0g
bWluKGFza2VkVG9SZWFkLCBieXRlc0xlZnQpOworICAgICAgICBpZiAobGVuVG9Db3B5KSB7Cisg
ICAgICAgICAgICBtZW1jcHkob3V0cHV0QnVmZmVyLCBtX2J1ZmZlci5kYXRhKCkgKyBtX2N1cnJl
bnRPZmZzZXQsIGxlblRvQ29weSk7CisgICAgICAgICAgICBtX2N1cnJlbnRPZmZzZXQgKz0gbGVu
VG9Db3B5OworICAgICAgICB9CisgICAgICAgIHJldHVybiBsZW5Ub0NvcHk7CisgICAgfQorCitw
cml2YXRlOgorICAgIFZlY3RvcjxjaGFyPiBtX2J1ZmZlcjsKKyAgICB1bnNpZ25lZCBtX2N1cnJl
bnRPZmZzZXQ7Cit9OworCitzdGF0aWMgYm9vbCBzaG91bGRBbGxvd0V4dGVybmFsTG9hZChjb25z
dCBLVVJMJiB1cmwpCit7CisgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC5zdHJpbmcoKTsKKwor
ICAgIC8vIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBsaWJ4bWwgYXNrcyBmb3IgdGhpcyBVUkws
IHRoZQorICAgIC8vICJYTUxfWE1MX0RFRkFVTFRfQ0FUQUxPRyIsIG9uIGluaXRpYWxpemF0aW9u
LgorICAgIGlmICh1cmxTdHJpbmcgPT0gImZpbGU6Ly8vZXRjL3htbC9jYXRhbG9nIikKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT24gV2luZG93cywgbGlieG1sIGNvbXB1dGVzIGEg
VVJMIHJlbGF0aXZlIHRvIHdoZXJlIGl0cyBETEwgcmVzaWRlcy4KKyAgICBpZiAodXJsU3RyaW5n
LnN0YXJ0c1dpdGgoImZpbGU6Ly8vIiwgZmFsc2UpICYmIHVybFN0cmluZy5lbmRzV2l0aCgiL2V0
Yy9jYXRhbG9nIiwgZmFsc2UpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUaGUg
bW9zdCBjb21tb24gRFRELiAgVGhlcmUgaXNuJ3QgbXVjaCBwb2ludCBpbiBoYW1tZXJpbmcgd3d3
LnczYy5vcmcKKyAgICAvLyBieSByZXF1ZXN0aW5nIHRoaXMgVVJMIGZvciBldmVyeSBYSFRNTCBk
b2N1bWVudC4KKyAgICBpZiAodXJsU3RyaW5nLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cudzMub3Jn
L1RSL3hodG1sIiwgZmFsc2UpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBTaW1p
bGFybHksIHRoZXJlIGlzbid0IG11Y2ggcG9pbnQgaW4gcmVxdWVzdGluZyB0aGUgU1ZHIERURC4K
KyAgICBpZiAodXJsU3RyaW5nLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNz
L1NWRyIsIGZhbHNlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGxpYnht
bCBkb2Vzbid0IGdpdmUgdXMgYSBsb3Qgb2YgY29udGV4dCBmb3IgZGVjaWRpbmcgd2hldGhlciB0
bworICAgIC8vIGFsbG93IHRoaXMgcmVxdWVzdC4gIEluIHRoZSB3b3JzdCBjYXNlLCB0aGlzIGxv
YWQgY291bGQgYmUgZm9yIGFuCisgICAgLy8gZXh0ZXJuYWwgZW50aXR5IGFuZCB0aGUgcmVzdWx0
aW5nIGRvY3VtZW50IGNvdWxkIHNpbXBseSByZWFkIHRoZQorICAgIC8vIHJldHJpZXZlZCBjb250
ZW50LiAgSWYgd2UgaGFkIG1vcmUgY29udGV4dCwgd2UgY291bGQgcG90ZW50aWFsbHkgYWxsb3cK
KyAgICAvLyB0aGUgcGFyc2VyIHRvIGxvYWQgYSBEVEQuICBBcyB0aGluZ3Mgc3RhbmQsIHdlIHRh
a2UgdGhlIGNvbnNlcnZhdGl2ZQorICAgIC8vIHJvdXRlIGFuZCBhbGxvdyBzYW1lLW9yaWdpbiBy
ZXF1ZXN0cyBvbmx5LgorICAgIGlmICghZ2xvYmFsRG9jTG9hZGVyLT5kb2MoKS0+c2VjdXJpdHlP
cmlnaW4oKS0+Y2FuUmVxdWVzdCh1cmwpKSB7CisgICAgICAgIGdsb2JhbERvY0xvYWRlci0+cHJp
bnRBY2Nlc3NEZW5pZWRNZXNzYWdlKHVybCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQqIG9wZW5GdW5jKGNvbnN0IGNo
YXIqIHVyaSkKK3sKKyAgICBBU1NFUlQoZ2xvYmFsRG9jTG9hZGVyKTsKKyAgICBBU1NFUlQoY3Vy
cmVudFRocmVhZCgpID09IGxpYnhtbExvYWRlclRocmVhZCk7CisKKyAgICBLVVJMIHVybCh1cmkp
OworCisgICAgaWYgKCFzaG91bGRBbGxvd0V4dGVybmFsTG9hZCh1cmwpKQorICAgICAgICByZXR1
cm4gJmdsb2JhbERlc2NyaXB0b3I7CisKKyAgICBSZXNvdXJjZUVycm9yIGVycm9yOworICAgIFJl
c291cmNlUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgCisg
ICAgRG9jTG9hZGVyKiBkb2NMb2FkZXIgPSBnbG9iYWxEb2NMb2FkZXI7CisgICAgZ2xvYmFsRG9j
TG9hZGVyID0gMDsKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFs
IGdsb2JhbCBlcnJvciBoYW5kbGVyIGFzIHdlbGwuCisKKyAgICBpZiAoZG9jTG9hZGVyLT5mcmFt
ZSgpKSAKKyAgICAgICAgZG9jTG9hZGVyLT5mcmFtZSgpLT5sb2FkZXIoKS0+bG9hZFJlc291cmNl
U3luY2hyb25vdXNseSh1cmwsIGVycm9yLCByZXNwb25zZSwgZGF0YSk7CisKKyAgICBnbG9iYWxE
b2NMb2FkZXIgPSBkb2NMb2FkZXI7CisKKyAgICByZXR1cm4gbmV3IE9mZnNldEJ1ZmZlcihkYXRh
KTsKK30KKworc3RhdGljIGludCByZWFkRnVuYyh2b2lkKiBjb250ZXh0LCBjaGFyKiBidWZmZXIs
IGludCBsZW4pCit7CisgICAgLy8gRG8gMC1ieXRlIHJlYWRzIGluIGNhc2Ugb2YgYSBudWxsIGRl
c2NyaXB0b3IKKyAgICBpZiAoY29udGV4dCA9PSAmZ2xvYmFsRGVzY3JpcHRvcikKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIAorICAgIE9mZnNldEJ1ZmZlciogZGF0YSA9IHN0YXRpY19jYXN0
PE9mZnNldEJ1ZmZlcio+KGNvbnRleHQpOworICAgIHJldHVybiBkYXRhLT5yZWFkT3V0Qnl0ZXMo
YnVmZmVyLCBsZW4pOworfQorCitzdGF0aWMgaW50IHdyaXRlRnVuYyh2b2lkKiBjb250ZXh0LCBj
b25zdCBjaGFyKiBidWZmZXIsIGludCBsZW4pCit7CisgICAgLy8gQWx3YXlzIGp1c3QgZG8gMC1i
eXRlIHdyaXRlcworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsb3NlRnVuYyh2b2lk
KiBjb250ZXh0KQoreworICAgIGlmIChjb250ZXh0ICE9ICZnbG9iYWxEZXNjcmlwdG9yKSB7Cisg
ICAgICAgIE9mZnNldEJ1ZmZlciogZGF0YSA9IHN0YXRpY19jYXN0PE9mZnNldEJ1ZmZlcio+KGNv
bnRleHQpOworICAgICAgICBkZWxldGUgZGF0YTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisK
K3N0YXRpYyB2b2lkIGVycm9yRnVuYyh2b2lkKiwgY29uc3QgY2hhciosIC4uLikKK3sKKyAgICAv
LyBGSVhNRTogSXQgd291bGQgYmUgbmljZSB0byBkaXNwbGF5IGVycm9yIG1lc3NhZ2VzIHNvbWV3
aGVyZS4KK30KKwordm9pZCBzZXRMb2FkZXJGb3JMaWJYTUxDYWxsYmFja3MoRG9jTG9hZGVyKiBk
b2NMb2FkZXIpCit7CisgICAgZ2xvYmFsRG9jTG9hZGVyID0gZG9jTG9hZGVyOworfQorCitzdGF0
aWMgYm9vbCBkaWRJbml0ID0gZmFsc2U7CisKK3N0YXRpYyB4bWxQYXJzZXJDdHh0UHRyIGNyZWF0
ZVN0cmluZ1BhcnNlcih4bWxTQVhIYW5kbGVyUHRyIGhhbmRsZXJzLCB2b2lkKiB1c2VyRGF0YSkK
K3sKKyAgICBpZiAoIWRpZEluaXQpIHsKKyAgICAgICAgeG1sSW5pdFBhcnNlcigpOworICAgICAg
ICB4bWxSZWdpc3RlcklucHV0Q2FsbGJhY2tzKG1hdGNoRnVuYywgb3BlbkZ1bmMsIHJlYWRGdW5j
LCBjbG9zZUZ1bmMpOworICAgICAgICB4bWxSZWdpc3Rlck91dHB1dENhbGxiYWNrcyhtYXRjaEZ1
bmMsIG9wZW5GdW5jLCB3cml0ZUZ1bmMsIGNsb3NlRnVuYyk7CisgICAgICAgIGxpYnhtbExvYWRl
clRocmVhZCA9IGN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgZGlkSW5pdCA9IHRydWU7CisgICAg
fQorCisgICAgeG1sUGFyc2VyQ3R4dFB0ciBwYXJzZXIgPSB4bWxDcmVhdGVQdXNoUGFyc2VyQ3R4
dChoYW5kbGVycywgMCwgMCwgMCwgMCk7CisgICAgcGFyc2VyLT5fcHJpdmF0ZSA9IHVzZXJEYXRh
OworICAgIHBhcnNlci0+cmVwbGFjZUVudGl0aWVzID0gdHJ1ZTsKKyAgICBjb25zdCBVQ2hhciBC
T00gPSAweEZFRkY7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBCT01IaWdoQnl0ZSA9ICpyZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigmQk9NKTsKKyAgICB4bWxTd2l0Y2hF
bmNvZGluZyhwYXJzZXIsIEJPTUhpZ2hCeXRlID09IDB4RkYgPyBYTUxfQ0hBUl9FTkNPRElOR19V
VEYxNkxFIDogWE1MX0NIQVJfRU5DT0RJTkdfVVRGMTZCRSk7CisKKyAgICByZXR1cm4gcGFyc2Vy
OworfQorCisKKy8vIENodW5rIHNob3VsZCBiZSBlbmNvZGVkIGluIFVURi04CitzdGF0aWMgeG1s
UGFyc2VyQ3R4dFB0ciBjcmVhdGVNZW1vcnlQYXJzZXIoeG1sU0FYSGFuZGxlclB0ciBoYW5kbGVy
cywgdm9pZCogdXNlckRhdGEsIGNvbnN0IGNoYXIqIGNodW5rKQoreworICAgIGlmICghZGlkSW5p
dCkgeworICAgICAgICB4bWxJbml0UGFyc2VyKCk7CisgICAgICAgIHhtbFJlZ2lzdGVySW5wdXRD
YWxsYmFja3MobWF0Y2hGdW5jLCBvcGVuRnVuYywgcmVhZEZ1bmMsIGNsb3NlRnVuYyk7CisgICAg
ICAgIHhtbFJlZ2lzdGVyT3V0cHV0Q2FsbGJhY2tzKG1hdGNoRnVuYywgb3BlbkZ1bmMsIHdyaXRl
RnVuYywgY2xvc2VGdW5jKTsKKyAgICAgICAgbGlieG1sTG9hZGVyVGhyZWFkID0gY3VycmVudFRo
cmVhZCgpOworICAgICAgICBkaWRJbml0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB4bWxQYXJzZXJD
dHh0UHRyIHBhcnNlciA9IHhtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoY2h1bmssIHhtbFN0cmxl
bigoY29uc3QgeG1sQ2hhciopY2h1bmspKTsKKworICAgIGlmICghcGFyc2VyKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIC8vIENvcHkgdGhlIHNheCBoYW5kbGVyCisgICAgbWVtY3B5KHBhcnNl
ci0+c2F4LCBoYW5kbGVycywgc2l6ZW9mKHhtbFNBWEhhbmRsZXIpKTsKKworICAgIC8vIFNldCBw
YXJzZXIgb3B0aW9ucy4KKyAgICAvLyBYTUxfUEFSU0VfTk9ESUNUOiBkZWZhdWx0IGRpY3Rpb25h
cnkgb3B0aW9uLgorICAgIC8vIFhNTF9QQVJTRV9OT0VOVDogZm9yY2UgZW50aXRpZXMgc3Vic3Rp
dHV0aW9ucy4KKyAgICB4bWxDdHh0VXNlT3B0aW9ucyhwYXJzZXIsIFhNTF9QQVJTRV9OT0RJQ1Qg
fCBYTUxfUEFSU0VfTk9FTlQpOworCisgICAgLy8gSW50ZXJuYWwgaW5pdGlhbGl6YXRpb24KKyAg
ICBwYXJzZXItPnNheDIgPSAxOworICAgIHBhcnNlci0+aW5zdGF0ZSA9IFhNTF9QQVJTRVJfQ09O
VEVOVDsgLy8gV2UgYXJlIHBhcnNpbmcgYSBDT05URU5UCisgICAgcGFyc2VyLT5kZXB0aCA9IDA7
CisgICAgcGFyc2VyLT5zdHJfeG1sID0geG1sRGljdExvb2t1cChwYXJzZXItPmRpY3QsIEJBRF9D
QVNUICJ4bWwiLCAzKTsKKyAgICBwYXJzZXItPnN0cl94bWxucyA9IHhtbERpY3RMb29rdXAocGFy
c2VyLT5kaWN0LCBCQURfQ0FTVCAieG1sbnMiLCA1KTsKKyAgICBwYXJzZXItPnN0cl94bWxfbnMg
PSB4bWxEaWN0TG9va3VwKHBhcnNlci0+ZGljdCwgWE1MX1hNTF9OQU1FU1BBQ0UsIDM2KTsKKyAg
ICBwYXJzZXItPl9wcml2YXRlID0gdXNlckRhdGE7CisKKyAgICByZXR1cm4gcGFyc2VyOworfQor
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitYTUxUb2tlbml6ZXI6OlhN
TFRva2VuaXplcihEb2N1bWVudCogX2RvYywgRnJhbWVWaWV3KiBfdmlldykKKyAgICA6IG1fZG9j
KF9kb2MpCisgICAgLCBtX3ZpZXcoX3ZpZXcpCisgICAgLCBtX2NvbnRleHQoMCkKKyAgICAsIG1f
Y3VycmVudE5vZGUoX2RvYykKKyAgICAsIG1fY3VycmVudE5vZGVJc1JlZmVyZW5jZWQoZmFsc2Up
CisgICAgLCBtX3Nhd0Vycm9yKGZhbHNlKQorICAgICwgbV9zYXdYU0xUcmFuc2Zvcm0oZmFsc2Up
CisgICAgLCBtX3Nhd0ZpcnN0RWxlbWVudChmYWxzZSkKKyAgICAsIG1faXNYSFRNTERvY3VtZW50
KGZhbHNlKQorICAgICwgbV9wYXJzZXJQYXVzZWQoZmFsc2UpCisgICAgLCBtX3JlcXVlc3RpbmdT
Y3JpcHQoZmFsc2UpCisgICAgLCBtX2ZpbmlzaENhbGxlZChmYWxzZSkKKyAgICAsIG1fZXJyb3JD
b3VudCgwKQorICAgICwgbV9sYXN0RXJyb3JMaW5lKDApCisgICAgLCBtX2xhc3RFcnJvckNvbHVt
bigwKQorICAgICwgbV9wZW5kaW5nU2NyaXB0KDApCisgICAgLCBtX3NjcmlwdFN0YXJ0TGluZSgw
KQorICAgICwgbV9wYXJzaW5nRnJhZ21lbnQoZmFsc2UpCisgICAgLCBtX3BlbmRpbmdDYWxsYmFj
a3MobmV3IFBlbmRpbmdDYWxsYmFja3MpCit7Cit9CisKK1hNTFRva2VuaXplcjo6WE1MVG9rZW5p
emVyKERvY3VtZW50RnJhZ21lbnQqIGZyYWdtZW50LCBFbGVtZW50KiBwYXJlbnRFbGVtZW50KQor
ICAgIDogbV9kb2MoZnJhZ21lbnQtPmRvY3VtZW50KCkpCisgICAgLCBtX3ZpZXcoMCkKKyAgICAs
IG1fY29udGV4dCgwKQorICAgICwgbV9jdXJyZW50Tm9kZShmcmFnbWVudCkKKyAgICAsIG1fY3Vy
cmVudE5vZGVJc1JlZmVyZW5jZWQoZnJhZ21lbnQpCisgICAgLCBtX3Nhd0Vycm9yKGZhbHNlKQor
ICAgICwgbV9zYXdYU0xUcmFuc2Zvcm0oZmFsc2UpCisgICAgLCBtX3Nhd0ZpcnN0RWxlbWVudChm
YWxzZSkKKyAgICAsIG1faXNYSFRNTERvY3VtZW50KGZhbHNlKQorICAgICwgbV9wYXJzZXJQYXVz
ZWQoZmFsc2UpCisgICAgLCBtX3JlcXVlc3RpbmdTY3JpcHQoZmFsc2UpCisgICAgLCBtX2Zpbmlz
aENhbGxlZChmYWxzZSkKKyAgICAsIG1fZXJyb3JDb3VudCgwKQorICAgICwgbV9sYXN0RXJyb3JM
aW5lKDApCisgICAgLCBtX2xhc3RFcnJvckNvbHVtbigwKQorICAgICwgbV9wZW5kaW5nU2NyaXB0
KDApCisgICAgLCBtX3NjcmlwdFN0YXJ0TGluZSgwKQorICAgICwgbV9wYXJzaW5nRnJhZ21lbnQo
dHJ1ZSkKKyAgICAsIG1fcGVuZGluZ0NhbGxiYWNrcyhuZXcgUGVuZGluZ0NhbGxiYWNrcykKK3sK
KyAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgIGZyYWdtZW50LT5yZWYoKTsKKyAgICBpZiAobV9k
b2MpCisgICAgICAgIG1fZG9jLT5yZWYoKTsKKyAgICAgICAgICAKKyAgICAvLyBBZGQgbmFtZXNw
YWNlcyBiYXNlZCBvbiB0aGUgcGFyZW50IG5vZGUKKyAgICBWZWN0b3I8RWxlbWVudCo+IGVsZW1T
dGFjazsKKyAgICB3aGlsZSAocGFyZW50RWxlbWVudCkgeworICAgICAgICBlbGVtU3RhY2suYXBw
ZW5kKHBhcmVudEVsZW1lbnQpOworICAgICAgICAKKyAgICAgICAgTm9kZSogbiA9IHBhcmVudEVs
ZW1lbnQtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgaWYgKCFuIHx8ICFuLT5pc0VsZW1lbnROb2Rl
KCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcGFyZW50RWxlbWVudCA9IHN0YXRpY19j
YXN0PEVsZW1lbnQqPihuKTsKKyAgICB9CisgICAgCisgICAgaWYgKGVsZW1TdGFjay5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyNpZiAhUExBVEZPUk0oUVQpIHx8IFFUX1ZFUlNJ
T04gPCAweDA0MDQwMAorICAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IGVsZW1TdGFjay5sYXN0
KCk7ICFlbGVtU3RhY2suaXNFbXB0eSgpOyBlbGVtU3RhY2sucmVtb3ZlTGFzdCgpKSB7CisgICAg
ICAgIGlmIChOYW1lZEF0dHJNYXAqIGF0dHJzID0gZWxlbWVudC0+YXR0cmlidXRlcygpKSB7Cisg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0cnMtPmxlbmd0aCgpOyBpKysp
IHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGUqIGF0dHIgPSBhdHRycy0+YXR0cmlidXRlSXRl
bShpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bG9jYWxOYW1lKCkgPT0gInhtbG5zIikK
KyAgICAgICAgICAgICAgICAgICAgbV9kZWZhdWx0TmFtZXNwYWNlVVJJID0gYXR0ci0+dmFsdWUo
KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyLT5wcmVmaXgoKSA9PSAieG1sbnMiKQor
ICAgICAgICAgICAgICAgICAgICBtX3ByZWZpeFRvTmFtZXNwYWNlTWFwLnNldChhdHRyLT5sb2Nh
bE5hbWUoKSwgYXR0ci0+dmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisjZWxzZQorICAgIFFYbWxTdHJlYW1OYW1lc3BhY2VEZWNsYXJhdGlvbnMgbmFtZXNwYWNlczsK
KyAgICBmb3IgKEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVtU3RhY2subGFzdCgpOyAhZWxlbVN0YWNr
LmlzRW1wdHkoKTsgZWxlbVN0YWNrLnJlbW92ZUxhc3QoKSkgeworICAgICAgICBpZiAoTmFtZWRB
dHRyTWFwKiBhdHRycyA9IGVsZW1lbnQtPmF0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGF0dHJzLT5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAg
ICAgICAgQXR0cmlidXRlKiBhdHRyID0gYXR0cnMtPmF0dHJpYnV0ZUl0ZW0oaSk7CisgICAgICAg
ICAgICAgICAgaWYgKGF0dHItPmxvY2FsTmFtZSgpID09ICJ4bWxucyIpCisgICAgICAgICAgICAg
ICAgICAgIG1fZGVmYXVsdE5hbWVzcGFjZVVSSSA9IGF0dHItPnZhbHVlKCk7CisgICAgICAgICAg
ICAgICAgZWxzZSBpZiAoYXR0ci0+cHJlZml4KCkgPT0gInhtbG5zIikKKyAgICAgICAgICAgICAg
ICAgICAgbmFtZXNwYWNlcy5hcHBlbmQoUVhtbFN0cmVhbU5hbWVzcGFjZURlY2xhcmF0aW9uKGF0
dHItPmxvY2FsTmFtZSgpLCBhdHRyLT52YWx1ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisgICAgbV9zdHJlYW0uYWRkRXh0cmFOYW1lc3BhY2VEZWNsYXJhdGlvbnMobmFt
ZXNwYWNlcyk7CisgICAgbV9zdHJlYW0uc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29s
dmVyKTsKKyNlbmRpZgorCisgICAgLy8gSWYgdGhlIHBhcmVudCBlbGVtZW50IGlzIG5vdCBpbiBk
b2N1bWVudCB0cmVlLCB0aGVyZSBtYXkgYmUgbm8geG1sbnMgYXR0cmlidXRlOyBqdXN0IGRlZmF1
bHQgdG8gdGhlIHBhcmVudCdzIG5hbWVzcGFjZS4KKyAgICBpZiAobV9kZWZhdWx0TmFtZXNwYWNl
VVJJLmlzTnVsbCgpICYmICFwYXJlbnRFbGVtZW50LT5pbkRvY3VtZW50KCkpCisgICAgICAgIG1f
ZGVmYXVsdE5hbWVzcGFjZVVSSSA9IHBhcmVudEVsZW1lbnQtPm5hbWVzcGFjZVVSSSgpOworfQor
CitYTUxUb2tlbml6ZXI6On5YTUxUb2tlbml6ZXIoKQoreworICAgIHNldEN1cnJlbnROb2RlKDAp
OworICAgIGlmIChtX3BhcnNpbmdGcmFnbWVudCAmJiBtX2RvYykKKyAgICAgICAgbV9kb2MtPmRl
cmVmKCk7CisgICAgaWYgKG1fcGVuZGluZ1NjcmlwdCkKKyAgICAgICAgbV9wZW5kaW5nU2NyaXB0
LT5yZW1vdmVDbGllbnQodGhpcyk7CisgICAgaWYgKG1fY29udGV4dCkKKyAgICAgICAgeG1sRnJl
ZVBhcnNlckN0eHQobV9jb250ZXh0KTsKK30KKwordm9pZCBYTUxUb2tlbml6ZXI6OmRvV3JpdGUo
Y29uc3QgU3RyaW5nJiBwYXJzZVN0cmluZykKK3sKKyAgICBpZiAoIW1fY29udGV4dCkKKyAgICAg
ICAgaW5pdGlhbGl6ZVBhcnNlckNvbnRleHQoKTsKKyAgICAKKyAgICAvLyBsaWJYTUwgdGhyb3dz
IGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gc3dpdGNoIHRoZSBlbmNvZGluZyBmb3IgYW4gZW1wdHkg
c3RyaW5nLgorICAgIGlmIChwYXJzZVN0cmluZy5sZW5ndGgoKSkgeworICAgICAgICAvLyBIYWNr
IGFyb3VuZCBsaWJ4bWwyJ3MgbGFjayBvZiBlbmNvZGluZyBvdmVyaWRlIHN1cHBvcnQgYnkgbWFu
dWFsbHkKKyAgICAgICAgLy8gcmVzZXR0aW5nIHRoZSBlbmNvZGluZyB0byBVVEYtMTYgYmVmb3Jl
IGV2ZXJ5IGNodW5rLiAgT3RoZXJ3aXNlIGxpYnhtbAorICAgICAgICAvLyB3aWxsIGRldGVjdCA8
P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSI8ZW5jb2RpbmcgbmFtZT4iPz4gYmxvY2tzIAor
ICAgICAgICAvLyBhbmQgc3dpdGNoIGVuY29kaW5ncywgY2F1c2luZyB0aGUgcGFyc2UgdG8gZmFp
bC4KKyAgICAgICAgY29uc3QgVUNoYXIgQk9NID0gMHhGRUZGOworICAgICAgICBjb25zdCB1bnNp
Z25lZCBjaGFyIEJPTUhpZ2hCeXRlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQg
Y2hhcio+KCZCT00pOworICAgICAgICB4bWxTd2l0Y2hFbmNvZGluZyhtX2NvbnRleHQsIEJPTUhp
Z2hCeXRlID09IDB4RkYgPyBYTUxfQ0hBUl9FTkNPRElOR19VVEYxNkxFIDogWE1MX0NIQVJfRU5D
T0RJTkdfVVRGMTZCRSk7CisKKyAgICAgICAgeG1sUGFyc2VDaHVuayhtX2NvbnRleHQsIHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBhcnNlU3RyaW5nLmNoYXJhY3RlcnMoKSksIHNpemVv
ZihVQ2hhcikgKiBwYXJzZVN0cmluZy5sZW5ndGgoKSwgMCk7CisgICAgfQorICAgIAorICAgIGlm
IChtX2RvYy0+ZGVjb2RlcigpICYmIG1fZG9jLT5kZWNvZGVyKCktPnNhd0Vycm9yKCkpIHsKKyAg
ICAgICAgLy8gSWYgdGhlIGRlY29kZXIgc2F3IGFuIGVycm9yLCByZXBvcnQgaXQgYXMgZmF0YWwg
KHN0b3BzIHBhcnNpbmcpCisgICAgICAgIGhhbmRsZUVycm9yKGZhdGFsLCAiRW5jb2RpbmcgZXJy
b3IiLCBsaW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKKyAgICB9CisKKyAgICByZXR1cm47
Cit9CisKK3N0YXRpYyBpbmxpbmUgU3RyaW5nIHRvU3RyaW5nKGNvbnN0IHhtbENoYXIqIHN0ciwg
dW5zaWduZWQgbGVuKQoreworICAgIHJldHVybiBVVEY4RW5jb2RpbmcoKS5kZWNvZGUocmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3RyKSwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBT
dHJpbmcgdG9TdHJpbmcoY29uc3QgeG1sQ2hhciogc3RyKQoreworICAgIGlmICghc3RyKQorICAg
ICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgCisgICAgcmV0dXJuIFVURjhFbmNvZGluZygpLmRl
Y29kZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzdHIpLCBzdHJsZW4ocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oc3RyKSkpOworfQorCitzdHJ1Y3QgX3htbFNBWDJOYW1lc3Bh
Y2UgeworICAgIGNvbnN0IHhtbENoYXIqIHByZWZpeDsKKyAgICBjb25zdCB4bWxDaGFyKiB1cmk7
Cit9OwordHlwZWRlZiBzdHJ1Y3QgX3htbFNBWDJOYW1lc3BhY2UgeG1sU0FYMk5hbWVzcGFjZTsK
Kworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZUVsZW1lbnROYW1lc3BhY2VzKEVsZW1lbnQqIG5l
d0VsZW1lbnQsIGNvbnN0IHhtbENoYXIqKiBsaWJ4bWxOYW1lc3BhY2VzLCBpbnQgbmJfbmFtZXNw
YWNlcywgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgeG1sU0FYMk5hbWVzcGFjZSogbmFtZXNw
YWNlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8eG1sU0FYMk5hbWVzcGFjZSo+KGxpYnhtbE5hbWVzcGFj
ZXMpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuYl9uYW1lc3BhY2VzOyBpKyspIHsKKyAgICAg
ICAgU3RyaW5nIG5hbWVzcGFjZVFOYW1lID0gInhtbG5zIjsKKyAgICAgICAgU3RyaW5nIG5hbWVz
cGFjZVVSSSA9IHRvU3RyaW5nKG5hbWVzcGFjZXNbaV0udXJpKTsKKyAgICAgICAgaWYgKG5hbWVz
cGFjZXNbaV0ucHJlZml4KQorICAgICAgICAgICAgbmFtZXNwYWNlUU5hbWUgPSAieG1sbnM6IiAr
IHRvU3RyaW5nKG5hbWVzcGFjZXNbaV0ucHJlZml4KTsKKyAgICAgICAgbmV3RWxlbWVudC0+c2V0
QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwgbmFtZXNwYWNlUU5h
bWUsIG5hbWVzcGFjZVVSSSwgZWMpOworICAgICAgICBpZiAoZWMpIC8vIGV4Y2VwdGlvbiBzZXR0
aW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0cnVjdCBf
eG1sU0FYMkF0dHJpYnV0ZXMgeworICAgIGNvbnN0IHhtbENoYXIqIGxvY2FsbmFtZTsKKyAgICBj
b25zdCB4bWxDaGFyKiBwcmVmaXg7CisgICAgY29uc3QgeG1sQ2hhciogdXJpOworICAgIGNvbnN0
IHhtbENoYXIqIHZhbHVlOworICAgIGNvbnN0IHhtbENoYXIqIGVuZDsKK307Cit0eXBlZGVmIHN0
cnVjdCBfeG1sU0FYMkF0dHJpYnV0ZXMgeG1sU0FYMkF0dHJpYnV0ZXM7CisKK3N0YXRpYyBpbmxp
bmUgdm9pZCBoYW5kbGVFbGVtZW50QXR0cmlidXRlcyhFbGVtZW50KiBuZXdFbGVtZW50LCBjb25z
dCB4bWxDaGFyKiogbGlieG1sQXR0cmlidXRlcywgaW50IG5iX2F0dHJpYnV0ZXMsIEV4Y2VwdGlv
bkNvZGUmIGVjKQoreworICAgIHhtbFNBWDJBdHRyaWJ1dGVzKiBhdHRyaWJ1dGVzID0gcmVpbnRl
cnByZXRfY2FzdDx4bWxTQVgyQXR0cmlidXRlcyo+KGxpYnhtbEF0dHJpYnV0ZXMpOworICAgIGZv
cihpbnQgaSA9IDA7IGkgPCBuYl9hdHRyaWJ1dGVzOyBpKyspIHsKKyAgICAgICAgU3RyaW5nIGF0
dHJMb2NhbE5hbWUgPSB0b1N0cmluZyhhdHRyaWJ1dGVzW2ldLmxvY2FsbmFtZSk7CisgICAgICAg
IGludCB2YWx1ZUxlbmd0aCA9IChpbnQpIChhdHRyaWJ1dGVzW2ldLmVuZCAtIGF0dHJpYnV0ZXNb
aV0udmFsdWUpOworICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gdG9TdHJpbmcoYXR0cmlidXRl
c1tpXS52YWx1ZSwgdmFsdWVMZW5ndGgpOworICAgICAgICBTdHJpbmcgYXR0clByZWZpeCA9IHRv
U3RyaW5nKGF0dHJpYnV0ZXNbaV0ucHJlZml4KTsKKyAgICAgICAgU3RyaW5nIGF0dHJVUkkgPSBh
dHRyUHJlZml4LmlzRW1wdHkoKSA/IFN0cmluZygpIDogdG9TdHJpbmcoYXR0cmlidXRlc1tpXS51
cmkpOworICAgICAgICBTdHJpbmcgYXR0clFOYW1lID0gYXR0clByZWZpeC5pc0VtcHR5KCkgPyBh
dHRyTG9jYWxOYW1lIDogYXR0clByZWZpeCArICI6IiArIGF0dHJMb2NhbE5hbWU7CisgICAgICAg
IAorICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGVOUyhhdHRyVVJJLCBhdHRyUU5hbWUs
IGF0dHJWYWx1ZSwgZWMpOworICAgICAgICBpZiAoZWMpIC8vIGV4Y2VwdGlvbiBzZXR0aW5nIGF0
dHJpYnV0ZXMKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgWE1MVG9rZW5p
emVyOjpzdGFydEVsZW1lbnROcyhjb25zdCB4bWxDaGFyKiB4bWxMb2NhbE5hbWUsIGNvbnN0IHht
bENoYXIqIHhtbFByZWZpeCwgY29uc3QgeG1sQ2hhciogeG1sVVJJLCBpbnQgbmJfbmFtZXNwYWNl
cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyKiogbGli
eG1sTmFtZXNwYWNlcywgaW50IG5iX2F0dHJpYnV0ZXMsIGludCBuYl9kZWZhdWx0ZWQsIGNvbnN0
IHhtbENoYXIqKiBsaWJ4bWxBdHRyaWJ1dGVzKQoreworICAgIGlmIChtX3BhcnNlclN0b3BwZWQp
CisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAg
ICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5hcHBlbmRTdGFydEVsZW1lbnROU0NhbGxiYWNrKHhtbExv
Y2FsTmFtZSwgeG1sUHJlZml4LCB4bWxVUkksIG5iX25hbWVzcGFjZXMsIGxpYnhtbE5hbWVzcGFj
ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBuYl9hdHRyaWJ1dGVzLCBuYl9kZWZhdWx0ZWQsIGxpYnhtbEF0dHJpYnV0ZXMpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIG1fc2F3Rmlyc3RFbGVtZW50ID0gdHJ1ZTsK
KworICAgIGV4aXRUZXh0KCk7CisKKyAgICBTdHJpbmcgbG9jYWxOYW1lID0gdG9TdHJpbmcoeG1s
TG9jYWxOYW1lKTsKKyAgICBTdHJpbmcgdXJpID0gdG9TdHJpbmcoeG1sVVJJKTsKKyAgICBTdHJp
bmcgcHJlZml4ID0gdG9TdHJpbmcoeG1sUHJlZml4KTsKKworICAgIGlmIChtX3BhcnNpbmdGcmFn
bWVudCAmJiB1cmkuaXNOdWxsKCkpIHsKKyAgICAgICAgaWYgKCFwcmVmaXguaXNOdWxsKCkpCisg
ICAgICAgICAgICB1cmkgPSBtX3ByZWZpeFRvTmFtZXNwYWNlTWFwLmdldChwcmVmaXgpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICB1cmkgPSBtX2RlZmF1bHROYW1lc3BhY2VVUkk7CisgICAg
fQorCisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgUXVhbGlmaWVkTmFtZSBxTmFtZShw
cmVmaXgsIGxvY2FsTmFtZSwgdXJpKTsKKyAgICBSZWZQdHI8RWxlbWVudD4gbmV3RWxlbWVudCA9
IG1fZG9jLT5jcmVhdGVFbGVtZW50KHFOYW1lLCB0cnVlLCBlYyk7CisgICAgaWYgKCFuZXdFbGVt
ZW50KSB7CisgICAgICAgIHN0b3BQYXJzaW5nKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgCisgICAgaGFuZGxlRWxlbWVudE5hbWVzcGFjZXMobmV3RWxlbWVudC5nZXQoKSwgbGlieG1s
TmFtZXNwYWNlcywgbmJfbmFtZXNwYWNlcywgZWMpOworICAgIGlmIChlYykgeworICAgICAgICBz
dG9wUGFyc2luZygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2NyaXB0Q29udHJv
bGxlcioganNQcm94eSA9IG1fZG9jLT5mcmFtZSgpID8gbV9kb2MtPmZyYW1lKCktPnNjcmlwdCgp
IDogMDsKKyAgICBpZiAoanNQcm94eSAmJiBtX2RvYy0+ZnJhbWUoKS0+c2NyaXB0KCktPmlzRW5h
YmxlZCgpKQorICAgICAgICBqc1Byb3h5LT5zZXRFdmVudEhhbmRsZXJMaW5lbm8obGluZU51bWJl
cigpKTsKKworICAgIGhhbmRsZUVsZW1lbnRBdHRyaWJ1dGVzKG5ld0VsZW1lbnQuZ2V0KCksIGxp
YnhtbEF0dHJpYnV0ZXMsIG5iX2F0dHJpYnV0ZXMsIGVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAg
ICAgc3RvcFBhcnNpbmcoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChqc1By
b3h5KQorICAgICAgICBqc1Byb3h5LT5zZXRFdmVudEhhbmRsZXJMaW5lbm8oMCk7CisKKyAgICBu
ZXdFbGVtZW50LT5iZWdpblBhcnNpbmdDaGlsZHJlbigpOworICAgIGV2ZW50dWFsbHlNYXJrQXNQ
YXJzZXJDcmVhdGVkKG5ld0VsZW1lbnQuZ2V0KCkpOworCisgICAgaWYgKGlzU2NyaXB0RWxlbWVu
dChuZXdFbGVtZW50LmdldCgpKSkKKyAgICAgICAgbV9zY3JpcHRTdGFydExpbmUgPSBsaW5lTnVt
YmVyKCk7CisKKyAgICBpZiAoIW1fY3VycmVudE5vZGUtPmFkZENoaWxkKG5ld0VsZW1lbnQuZ2V0
KCkpKSB7CisgICAgICAgIHN0b3BQYXJzaW5nKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBzZXRDdXJyZW50Tm9kZShuZXdFbGVtZW50LmdldCgpKTsKKyAgICBpZiAobV92aWV3ICYm
ICFuZXdFbGVtZW50LT5hdHRhY2hlZCgpKQorICAgICAgICBuZXdFbGVtZW50LT5hdHRhY2goKTsK
K30KKwordm9pZCBYTUxUb2tlbml6ZXI6OmVuZEVsZW1lbnROcygpCit7CisgICAgaWYgKG1fcGFy
c2VyU3RvcHBlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcGFyc2VyUGF1c2VkKSB7
CisgICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+YXBwZW5kRW5kRWxlbWVudE5TQ2FsbGJhY2so
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBleGl0VGV4dCgpOworCisgICAg
Tm9kZSogbiA9IG1fY3VycmVudE5vZGU7CisgICAgUmVmUHRyPE5vZGU+IHBhcmVudCA9IG4tPnBh
cmVudE5vZGUoKTsKKyAgICBuLT5maW5pc2hQYXJzaW5nQ2hpbGRyZW4oKTsKKyAgICAKKyAgICAv
LyBkb24ndCBsb2FkIGV4dGVybmFsIHNjcmlwdHMgZm9yIHN0YW5kYWxvbmUgZG9jdW1lbnRzIChm
b3Igbm93KQorICAgIGlmIChuLT5pc0VsZW1lbnROb2RlKCkgJiYgbV92aWV3ICYmIGlzU2NyaXB0
RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obikpKSB7CisgICAgICAgIEFTU0VSVCghbV9w
ZW5kaW5nU2NyaXB0KTsKKyAgICAgICAgbV9yZXF1ZXN0aW5nU2NyaXB0ID0gdHJ1ZTsKKworICAg
ICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOyAKKyAgICAg
ICAgU2NyaXB0RWxlbWVudCogc2NyaXB0RWxlbWVudCA9IGNhc3RUb1NjcmlwdEVsZW1lbnQoZWxl
bWVudCk7CisKKyAgICAgICAgU3RyaW5nIHNjcmlwdEhyZWYgPSBzY3JpcHRFbGVtZW50LT5zb3Vy
Y2VBdHRyaWJ1dGVWYWx1ZSgpOworICAgICAgICBpZiAoIXNjcmlwdEhyZWYuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgc3JjIGF0dHJpYnV0ZSAKKyAgICAgICAgICAgIFN0
cmluZyBzY3JpcHRDaGFyc2V0ID0gc2NyaXB0RWxlbWVudC0+Y2hhcnNldEF0dHJpYnV0ZVZhbHVl
KCk7CisgICAgICAgICAgICBpZiAoKG1fcGVuZGluZ1NjcmlwdCA9IG1fZG9jLT5kb2NMb2FkZXIo
KS0+cmVxdWVzdFNjcmlwdChzY3JpcHRIcmVmLCBzY3JpcHRDaGFyc2V0KSkpIHsKKyAgICAgICAg
ICAgICAgICBtX3NjcmlwdEVsZW1lbnQgPSBlbGVtZW50OworICAgICAgICAgICAgICAgIG1fcGVu
ZGluZ1NjcmlwdC0+YWRkQ2xpZW50KHRoaXMpOworCisgICAgICAgICAgICAgICAgLy8gbV9wZW5k
aW5nU2NyaXB0IHdpbGwgYmUgMCBpZiBzY3JpcHQgd2FzIGFscmVhZHkgbG9hZGVkIGFuZCByZWYo
KSBleGVjdXRlZCBpdAorICAgICAgICAgICAgICAgIGlmIChtX3BlbmRpbmdTY3JpcHQpCisgICAg
ICAgICAgICAgICAgICAgIHBhdXNlUGFyc2luZygpOworICAgICAgICAgICAgfSBlbHNlIAorICAg
ICAgICAgICAgICAgIG1fc2NyaXB0RWxlbWVudCA9IDA7CisKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIFN0cmluZyBzY3JpcHRDb2RlID0gc2NyaXB0RWxlbWVudC0+c2NyaXB0Q29udGVu
dCgpOworICAgICAgICAgICAgbV92aWV3LT5mcmFtZSgpLT5sb2FkZXIoKS0+ZXhlY3V0ZVNjcmlw
dChtX2RvYy0+dXJsKCkuc3RyaW5nKCksIG1fc2NyaXB0U3RhcnRMaW5lLCBzY3JpcHRDb2RlKTsK
KyAgICAgICAgfQorCisgICAgICAgIG1fcmVxdWVzdGluZ1NjcmlwdCA9IGZhbHNlOworICAgIH0K
KworICAgIHNldEN1cnJlbnROb2RlKHBhcmVudC5nZXQoKSk7Cit9CisKK3ZvaWQgWE1MVG9rZW5p
emVyOjpjaGFyYWN0ZXJzKGNvbnN0IHhtbENoYXIqIHMsIGludCBsZW4pCit7CisgICAgaWYgKG1f
cGFyc2VyU3RvcHBlZCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGlmIChtX3BhcnNlclBh
dXNlZCkgeworICAgICAgICBtX3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZENoYXJhY3RlcnNDYWxs
YmFjayhzLCBsZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChtX2N1
cnJlbnROb2RlLT5pc1RleHROb2RlKCkgfHwgZW50ZXJUZXh0KCkpCisgICAgICAgIG1fYnVmZmVy
ZWRUZXh0LmFwcGVuZChzLCBsZW4pOworfQorCit2b2lkIFhNTFRva2VuaXplcjo6ZXJyb3IoRXJy
b3JUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHZhX2xpc3QgYXJncykKK3sKKyAgICBp
ZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47CisKKyNpZiBQTEFURk9STShXSU5f
T1MpCisgICAgY2hhciBtWzEwMjRdOworICAgIHZzbnByaW50ZihtLCBzaXplb2YobSkgLSAxLCBt
ZXNzYWdlLCBhcmdzKTsKKyNlbHNlCisgICAgY2hhciogbTsKKyAgICB2YXNwcmludGYoJm0sIG1l
c3NhZ2UsIGFyZ3MpOworI2VuZGlmCisgICAgCisgICAgaWYgKG1fcGFyc2VyUGF1c2VkKQorICAg
ICAgICBtX3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZEVycm9yQ2FsbGJhY2sodHlwZSwgbSwgbGlu
ZU51bWJlcigpLCBjb2x1bW5OdW1iZXIoKSk7CisgICAgZWxzZQorICAgICAgICBoYW5kbGVFcnJv
cih0eXBlLCBtLCBsaW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKKworI2lmICFQTEFURk9S
TShXSU5fT1MpCisgICAgZnJlZShtKTsKKyNlbmRpZgorfQorCit2b2lkIFhNTFRva2VuaXplcjo6
cHJvY2Vzc2luZ0luc3RydWN0aW9uKGNvbnN0IHhtbENoYXIqIHRhcmdldCwgY29uc3QgeG1sQ2hh
ciogZGF0YSkKK3sKKyAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5h
cHBlbmRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25DYWxsYmFjayh0YXJnZXQsIGRhdGEpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIGV4aXRUZXh0KCk7CisKKyAgICAvLyAjIyMgaGFu
ZGxlIGV4Y2VwdGlvbnMKKyAgICBpbnQgZXhjZXB0aW9uID0gMDsKKyAgICBSZWZQdHI8UHJvY2Vz
c2luZ0luc3RydWN0aW9uPiBwaSA9IG1fZG9jLT5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24o
CisgICAgICAgIHRvU3RyaW5nKHRhcmdldCksIHRvU3RyaW5nKGRhdGEpLCBleGNlcHRpb24pOwor
ICAgIGlmIChleGNlcHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIHBpLT5zZXRDcmVhdGVk
QnlQYXJzZXIodHJ1ZSk7CisgICAgCisgICAgaWYgKCFtX2N1cnJlbnROb2RlLT5hZGRDaGlsZChw
aS5nZXQoKSkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAobV92aWV3ICYmICFwaS0+YXR0YWNo
ZWQoKSkKKyAgICAgICAgcGktPmF0dGFjaCgpOworCisgICAgcGktPmZpbmlzaFBhcnNpbmdDaGls
ZHJlbigpOworCisjaWYgRU5BQkxFKFhTTFQpCisgICAgbV9zYXdYU0xUcmFuc2Zvcm0gPSAhbV9z
YXdGaXJzdEVsZW1lbnQgJiYgcGktPmlzWFNMKCk7CisgICAgaWYgKG1fc2F3WFNMVHJhbnNmb3Jt
ICYmICFtX2RvYy0+dHJhbnNmb3JtU291cmNlRG9jdW1lbnQoKSkKKyAgICAgICAgc3RvcFBhcnNp
bmcoKTsKKyNlbmRpZgorfQorCit2b2lkIFhNTFRva2VuaXplcjo6Y2RhdGFCbG9jayhjb25zdCB4
bWxDaGFyKiBzLCBpbnQgbGVuKQoreworICAgIGlmIChtX3BhcnNlclN0b3BwZWQpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChtX3BhcnNlclBhdXNlZCkgeworICAgICAgICBtX3BlbmRpbmdD
YWxsYmFja3MtPmFwcGVuZENEQVRBQmxvY2tDYWxsYmFjayhzLCBsZW4pOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIAorICAgIGV4aXRUZXh0KCk7CisKKyAgICBSZWZQdHI8Tm9kZT4gbmV3
Tm9kZSA9IG5ldyBDREFUQVNlY3Rpb24obV9kb2MsIHRvU3RyaW5nKHMsIGxlbikpOworICAgIGlm
ICghbV9jdXJyZW50Tm9kZS0+YWRkQ2hpbGQobmV3Tm9kZS5nZXQoKSkpCisgICAgICAgIHJldHVy
bjsKKyAgICBpZiAobV92aWV3ICYmICFuZXdOb2RlLT5hdHRhY2hlZCgpKQorICAgICAgICBuZXdO
b2RlLT5hdHRhY2goKTsKK30KKwordm9pZCBYTUxUb2tlbml6ZXI6OmNvbW1lbnQoY29uc3QgeG1s
Q2hhciogcykKK3sKKyAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5h
cHBlbmRDb21tZW50Q2FsbGJhY2socyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisg
ICAgZXhpdFRleHQoKTsKKworICAgIFJlZlB0cjxOb2RlPiBuZXdOb2RlID0gbmV3IENvbW1lbnQo
bV9kb2MsIHRvU3RyaW5nKHMpKTsKKyAgICBtX2N1cnJlbnROb2RlLT5hZGRDaGlsZChuZXdOb2Rl
LmdldCgpKTsKKyAgICBpZiAobV92aWV3ICYmICFuZXdOb2RlLT5hdHRhY2hlZCgpKQorICAgICAg
ICBuZXdOb2RlLT5hdHRhY2goKTsKK30KKwordm9pZCBYTUxUb2tlbml6ZXI6OnN0YXJ0RG9jdW1l
bnQoY29uc3QgeG1sQ2hhciogdmVyc2lvbiwgY29uc3QgeG1sQ2hhciogZW5jb2RpbmcsIGludCBz
dGFuZGFsb25lKQoreworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworCisgICAgaWYgKHZlcnNp
b24pCisgICAgICAgIG1fZG9jLT5zZXRYTUxWZXJzaW9uKHRvU3RyaW5nKHZlcnNpb24pLCBlYyk7
CisgICAgbV9kb2MtPnNldFhNTFN0YW5kYWxvbmUoc3RhbmRhbG9uZSA9PSAxLCBlYyk7IC8vIHBv
c3NpYmxlIHZhbHVlcyBhcmUgMCwgMSwgYW5kIC0xCisgICAgaWYgKGVuY29kaW5nKQorICAgICAg
ICBtX2RvYy0+c2V0WE1MRW5jb2RpbmcodG9TdHJpbmcoZW5jb2RpbmcpKTsKK30KKwordm9pZCBY
TUxUb2tlbml6ZXI6OmVuZERvY3VtZW50KCkKK3sKKyAgICBleGl0VGV4dCgpOworfQorCit2b2lk
IFhNTFRva2VuaXplcjo6aW50ZXJuYWxTdWJzZXQoY29uc3QgeG1sQ2hhciogbmFtZSwgY29uc3Qg
eG1sQ2hhciogZXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciogc3lzdGVtSUQpCit7CisgICAgaWYg
KG1fcGFyc2VyU3RvcHBlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcGFyc2VyUGF1
c2VkKSB7CisgICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+YXBwZW5kSW50ZXJuYWxTdWJzZXRD
YWxsYmFjayhuYW1lLCBleHRlcm5hbElELCBzeXN0ZW1JRCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgCisgICAgaWYgKG1fZG9jKQorICAgICAgICBtX2RvYy0+YWRkQ2hpbGQoRG9jdW1l
bnRUeXBlOjpjcmVhdGUobV9kb2MsIHRvU3RyaW5nKG5hbWUpLCB0b1N0cmluZyhleHRlcm5hbElE
KSwgdG9TdHJpbmcoc3lzdGVtSUQpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgWE1MVG9rZW5pemVy
KiBnZXRUb2tlbml6ZXIodm9pZCogY2xvc3VyZSkKK3sKKyAgICB4bWxQYXJzZXJDdHh0UHRyIGN0
eHQgPSBzdGF0aWNfY2FzdDx4bWxQYXJzZXJDdHh0UHRyPihjbG9zdXJlKTsKKyAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8WE1MVG9rZW5pemVyKj4oY3R4dC0+X3ByaXZhdGUpOworfQorCisvLyBUaGlz
IGlzIGEgaGFjayBhcm91bmQgaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTU5MjE5CisvLyBPdGhlcndpc2UgbGlieG1sIHNlZW1zIHRvIGNhbGwgYWxsIHRoZSBTQVgg
Y2FsbGJhY2tzIHR3aWNlIGZvciBhbnkgcmVwbGFjZWQgZW50aXR5Lgorc3RhdGljIGlubGluZSBi
b29sIGhhY2tBcm91bmRMaWJYTUxFbnRpdHlCdWcodm9pZCogY2xvc3VyZSkKK3sKKyNpZiBMSUJY
TUxfVkVSU0lPTiA+PSAyMDYyNworICAgIC8vIFRoaXMgYnVnIGhhcyBiZWVuIGZpeGVkIGluIGxp
YnhtbCAyLjYuMjcuCisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8eG1sUGFyc2VyQ3R4dFB0cj4oY2xvc3VyZSktPm5vZGU7CisjZW5kaWYKK30KKworc3Rh
dGljIHZvaWQgc3RhcnRFbGVtZW50TnNIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHhtbENo
YXIqIGxvY2FsbmFtZSwgY29uc3QgeG1sQ2hhciogcHJlZml4LCBjb25zdCB4bWxDaGFyKiB1cmks
IGludCBuYl9uYW1lc3BhY2VzLCBjb25zdCB4bWxDaGFyKiogbmFtZXNwYWNlcywgaW50IG5iX2F0
dHJpYnV0ZXMsIGludCBuYl9kZWZhdWx0ZWQsIGNvbnN0IHhtbENoYXIqKiBsaWJ4bWxBdHRyaWJ1
dGVzKQoreworICAgIGlmIChoYWNrQXJvdW5kTGliWE1MRW50aXR5QnVnKGNsb3N1cmUpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBnZXRUb2tlbml6ZXIoY2xvc3VyZSktPnN0YXJ0RWxlbWVudE5z
KGxvY2FsbmFtZSwgcHJlZml4LCB1cmksIG5iX25hbWVzcGFjZXMsIG5hbWVzcGFjZXMsIG5iX2F0
dHJpYnV0ZXMsIG5iX2RlZmF1bHRlZCwgbGlieG1sQXR0cmlidXRlcyk7Cit9CisKK3N0YXRpYyB2
b2lkIGVuZEVsZW1lbnROc0hhbmRsZXIodm9pZCogY2xvc3VyZSwgY29uc3QgeG1sQ2hhciogbG9j
YWxuYW1lLCBjb25zdCB4bWxDaGFyKiBwcmVmaXgsIGNvbnN0IHhtbENoYXIqIHVyaSkKK3sKKyAg
ICBpZiAoaGFja0Fyb3VuZExpYlhNTEVudGl0eUJ1ZyhjbG9zdXJlKSkKKyAgICAgICAgcmV0dXJu
OworICAgIAorICAgIGdldFRva2VuaXplcihjbG9zdXJlKS0+ZW5kRWxlbWVudE5zKCk7Cit9CisK
K3N0YXRpYyB2b2lkIGNoYXJhY3RlcnNIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHhtbENo
YXIqIHMsIGludCBsZW4pCit7CisgICAgaWYgKGhhY2tBcm91bmRMaWJYTUxFbnRpdHlCdWcoY2xv
c3VyZSkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBnZXRUb2tlbml6ZXIoY2xvc3VyZSkt
PmNoYXJhY3RlcnMocywgbGVuKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0
aW9uSGFuZGxlcih2b2lkKiBjbG9zdXJlLCBjb25zdCB4bWxDaGFyKiB0YXJnZXQsIGNvbnN0IHht
bENoYXIqIGRhdGEpCit7CisgICAgaWYgKGhhY2tBcm91bmRMaWJYTUxFbnRpdHlCdWcoY2xvc3Vy
ZSkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBnZXRUb2tlbml6ZXIoY2xvc3VyZSktPnBy
b2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBjZGF0
YUJsb2NrSGFuZGxlcih2b2lkKiBjbG9zdXJlLCBjb25zdCB4bWxDaGFyKiBzLCBpbnQgbGVuKQor
eworICAgIGlmIChoYWNrQXJvdW5kTGliWE1MRW50aXR5QnVnKGNsb3N1cmUpKQorICAgICAgICBy
ZXR1cm47CisgICAgCisgICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5jZGF0YUJsb2NrKHMsIGxl
bik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbW1lbnRIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0
IHhtbENoYXIqIGNvbW1lbnQpCit7CisgICAgaWYgKGhhY2tBcm91bmRMaWJYTUxFbnRpdHlCdWco
Y2xvc3VyZSkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBnZXRUb2tlbml6ZXIoY2xvc3Vy
ZSktPmNvbW1lbnQoY29tbWVudCk7Cit9CisKK1dURl9BVFRSSUJVVEVfUFJJTlRGKDIsIDMpCitz
dGF0aWMgdm9pZCB3YXJuaW5nSGFuZGxlcih2b2lkKiBjbG9zdXJlLCBjb25zdCBjaGFyKiBtZXNz
YWdlLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIG1lc3Nh
Z2UpOworICAgIGdldFRva2VuaXplcihjbG9zdXJlKS0+ZXJyb3IoWE1MVG9rZW5pemVyOjp3YXJu
aW5nLCBtZXNzYWdlLCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKK1dURl9BVFRSSUJV
VEVfUFJJTlRGKDIsIDMpCitzdGF0aWMgdm9pZCBmYXRhbEVycm9ySGFuZGxlcih2b2lkKiBjbG9z
dXJlLCBjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAg
IHZhX3N0YXJ0KGFyZ3MsIG1lc3NhZ2UpOworICAgIGdldFRva2VuaXplcihjbG9zdXJlKS0+ZXJy
b3IoWE1MVG9rZW5pemVyOjpmYXRhbCwgbWVzc2FnZSwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3Mp
OworfQorCitXVEZfQVRUUklCVVRFX1BSSU5URigyLCAzKQorc3RhdGljIHZvaWQgbm9ybWFsRXJy
b3JIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLikKK3sKKyAg
ICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgbWVzc2FnZSk7CisgICAgZ2V0VG9r
ZW5pemVyKGNsb3N1cmUpLT5lcnJvcihYTUxUb2tlbml6ZXI6Om5vbkZhdGFsLCBtZXNzYWdlLCBh
cmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKy8vIFVzaW5nIGEgZ2xvYmFsIHZhcmlhYmxl
IGVudGl0eSBhbmQgbWFya2luZyBpdCBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFkgaXMK
Ky8vIGEgaGFjayB0byBhdm9pZCBtYWxsb2MvZnJlZS4gVXNpbmcgYSBnbG9iYWwgdmFyaWFibGUg
bGlrZSB0aGlzIGNvdWxkIGNhdXNlIHRyb3VibGUKKy8vIGlmIGxpYnhtbCBpbXBsZW1lbnRhdGlv
biBkZXRhaWxzIHdlcmUgdG8gY2hhbmdlCitzdGF0aWMgeG1sQ2hhciBzaGFyZWRYSFRNTEVudGl0
eVJlc3VsdFs1XSA9IHswLDAsMCwwLDB9Oworc3RhdGljIHhtbEVudGl0eSBzaGFyZWRYSFRNTEVu
dGl0eSA9IHsKKyAgICAwLCBYTUxfRU5USVRZX0RFQ0wsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIAor
ICAgIHNoYXJlZFhIVE1MRW50aXR5UmVzdWx0LCBzaGFyZWRYSFRNTEVudGl0eVJlc3VsdCwgMCwK
KyAgICBYTUxfSU5URVJOQUxfUFJFREVGSU5FRF9FTlRJVFksIDAsIDAsIDAsIDAsIDAsCisjaWYg
TElCWE1MX1ZFUlNJT04gPj0gMjA2MjcKKyAgICAvLyB4bWxFbnRpdHkgZ2FpbmVkIGFuIGV4dHJh
IG1lbWJlciBpbiAyLjYuMjcuCisgICAgMQorI2VuZGlmCit9OworCitzdGF0aWMgeG1sRW50aXR5
UHRyIGdldFhIVE1MRW50aXR5KGNvbnN0IHhtbENoYXIqIG5hbWUpCit7CisgICAgVUNoYXIgYyA9
IGRlY29kZU5hbWVkRW50aXR5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5hbWUpKTsK
KyAgICBpZiAoIWMpCisgICAgICAgIHJldHVybiAwOworCisgICAgQ1N0cmluZyB2YWx1ZSA9IFN0
cmluZygmYywgMSkudXRmOCgpOworICAgIEFTU0VSVCh2YWx1ZS5sZW5ndGgoKSA8IDUpOworICAg
IHNoYXJlZFhIVE1MRW50aXR5Lmxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworICAgIHNoYXJlZFhI
VE1MRW50aXR5Lm5hbWUgPSBuYW1lOworICAgIG1lbWNweShzaGFyZWRYSFRNTEVudGl0eVJlc3Vs
dCwgdmFsdWUuZGF0YSgpLCBzaGFyZWRYSFRNTEVudGl0eS5sZW5ndGggKyAxKTsKKworICAgIHJl
dHVybiAmc2hhcmVkWEhUTUxFbnRpdHk7Cit9CisKK3N0YXRpYyB4bWxFbnRpdHlQdHIgZ2V0RW50
aXR5SGFuZGxlcih2b2lkKiBjbG9zdXJlLCBjb25zdCB4bWxDaGFyKiBuYW1lKQoreworICAgIHht
bFBhcnNlckN0eHRQdHIgY3R4dCA9IHN0YXRpY19jYXN0PHhtbFBhcnNlckN0eHRQdHI+KGNsb3N1
cmUpOworICAgIHhtbEVudGl0eVB0ciBlbnQgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5KG5hbWUp
OworICAgIGlmIChlbnQpIHsKKyAgICAgICAgZW50LT5ldHlwZSA9IFhNTF9JTlRFUk5BTF9QUkVE
RUZJTkVEX0VOVElUWTsKKyAgICAgICAgcmV0dXJuIGVudDsKKyAgICB9CisKKyAgICBlbnQgPSB4
bWxHZXREb2NFbnRpdHkoY3R4dC0+bXlEb2MsIG5hbWUpOworICAgIGlmICghZW50ICYmIGdldFRv
a2VuaXplcihjbG9zdXJlKS0+aXNYSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgZW50ID0gZ2V0
WEhUTUxFbnRpdHkobmFtZSk7CisgICAgICAgIGlmIChlbnQpCisgICAgICAgICAgICBlbnQtPmV0
eXBlID0gWE1MX0lOVEVSTkFMX0dFTkVSQUxfRU5USVRZOworICAgIH0KKyAgICAKKyAgICByZXR1
cm4gZW50OworfQorCitzdGF0aWMgdm9pZCBzdGFydERvY3VtZW50SGFuZGxlcih2b2lkKiBjbG9z
dXJlKQoreworICAgIHhtbFBhcnNlckN0eHQqIGN0eHQgPSBzdGF0aWNfY2FzdDx4bWxQYXJzZXJD
dHh0Kj4oY2xvc3VyZSk7CisgICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5zdGFydERvY3VtZW50
KGN0eHQtPnZlcnNpb24sIGN0eHQtPmVuY29kaW5nLCBjdHh0LT5zdGFuZGFsb25lKTsKKyAgICB4
bWxTQVgyU3RhcnREb2N1bWVudChjbG9zdXJlKTsKK30KKworc3RhdGljIHZvaWQgZW5kRG9jdW1l
bnRIYW5kbGVyKHZvaWQqIGNsb3N1cmUpCit7CisgICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5l
bmREb2N1bWVudCgpOworICAgIHhtbFNBWDJFbmREb2N1bWVudChjbG9zdXJlKTsKK30KKworc3Rh
dGljIHZvaWQgaW50ZXJuYWxTdWJzZXRIYW5kbGVyKHZvaWQqIGNsb3N1cmUsIGNvbnN0IHhtbENo
YXIqIG5hbWUsIGNvbnN0IHhtbENoYXIqIGV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIqIHN5c3Rl
bUlEKQoreworICAgIGdldFRva2VuaXplcihjbG9zdXJlKS0+aW50ZXJuYWxTdWJzZXQobmFtZSwg
ZXh0ZXJuYWxJRCwgc3lzdGVtSUQpOworICAgIHhtbFNBWDJJbnRlcm5hbFN1YnNldChjbG9zdXJl
LCBuYW1lLCBleHRlcm5hbElELCBzeXN0ZW1JRCk7Cit9CisKK3N0YXRpYyB2b2lkIGV4dGVybmFs
U3Vic2V0SGFuZGxlcih2b2lkKiBjbG9zdXJlLCBjb25zdCB4bWxDaGFyKiBuYW1lLCBjb25zdCB4
bWxDaGFyKiBleHRlcm5hbElkLCBjb25zdCB4bWxDaGFyKiBzeXN0ZW1JZCkKK3sKKyAgICBTdHJp
bmcgZXh0SWQgPSB0b1N0cmluZyhleHRlcm5hbElkKTsKKyAgICBpZiAoKGV4dElkID09ICItLy9X
M0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIpCisgICAgICAgIHx8IChleHRJZCA9
PSAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIpCisgICAgICAgIHx8IChleHRJZCA9PSAiLS8v
VzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iKQorICAgICAgICB8fCAoZXh0SWQgPT0gIi0v
L1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iKQorICAgICAgICB8fCAoZXh0SWQgPT0g
Ii0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iKQorICAgICAgICB8fCAoZXh0SWQgPT0g
Ii0vL1czQy8vRFREIFhIVE1MIDEuMSBwbHVzIE1hdGhNTCAyLjAvL0VOIikKKyAgICAgICAgfHwg
KGV4dElkID09ICItLy9XM0MvL0RURCBYSFRNTCAxLjEgcGx1cyBNYXRoTUwgMi4wIHBsdXMgU1ZH
IDEuMS8vRU4iKQorICAgICAgICB8fCAoZXh0SWQgPT0gIi0vL1dBUEZPUlVNLy9EVEQgWEhUTUwg
TW9iaWxlIDEuMC8vRU4iKSkKKyAgICAgICAgZ2V0VG9rZW5pemVyKGNsb3N1cmUpLT5zZXRJc1hI
VE1MRG9jdW1lbnQodHJ1ZSk7IC8vIGNvbnRyb2xzIGlmIHdlIHJlcGxhY2UgZW50aXRpZXMgb3Ig
bm90LgorfQorCitzdGF0aWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlSGFuZGxlcih2b2lkKiBj
dHgsIGNvbnN0IHhtbENoYXIqIGNoLCBpbnQgbGVuKQoreworICAgIC8vIG5vdGhpbmcgdG8gZG8s
IGJ1dCB3ZSBuZWVkIHRoaXMgdG8gd29yayBhcm91bmQgYSBjcmFzaGVyCisgICAgLy8gaHR0cDov
L2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcyMjU1CisgICAgLy8gaHR0cDov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc5MgorfQorCit2b2lkIFhNTFRva2Vu
aXplcjo6aW5pdGlhbGl6ZVBhcnNlckNvbnRleHQoY29uc3QgY2hhciogY2h1bmspCit7CisgICAg
eG1sU0FYSGFuZGxlciBzYXg7CisgICAgbWVtc2V0KCZzYXgsIDAsIHNpemVvZihzYXgpKTsKKwor
ICAgIHNheC5lcnJvciA9IG5vcm1hbEVycm9ySGFuZGxlcjsKKyAgICBzYXguZmF0YWxFcnJvciA9
IGZhdGFsRXJyb3JIYW5kbGVyOworICAgIHNheC5jaGFyYWN0ZXJzID0gY2hhcmFjdGVyc0hhbmRs
ZXI7CisgICAgc2F4LnByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IHByb2Nlc3NpbmdJbnN0cnVjdGlv
bkhhbmRsZXI7CisgICAgc2F4LmNkYXRhQmxvY2sgPSBjZGF0YUJsb2NrSGFuZGxlcjsKKyAgICBz
YXguY29tbWVudCA9IGNvbW1lbnRIYW5kbGVyOworICAgIHNheC53YXJuaW5nID0gd2FybmluZ0hh
bmRsZXI7CisgICAgc2F4LnN0YXJ0RWxlbWVudE5zID0gc3RhcnRFbGVtZW50TnNIYW5kbGVyOwor
ICAgIHNheC5lbmRFbGVtZW50TnMgPSBlbmRFbGVtZW50TnNIYW5kbGVyOworICAgIHNheC5nZXRF
bnRpdHkgPSBnZXRFbnRpdHlIYW5kbGVyOworICAgIHNheC5zdGFydERvY3VtZW50ID0gc3RhcnRE
b2N1bWVudEhhbmRsZXI7CisgICAgc2F4LmVuZERvY3VtZW50ID0gZW5kRG9jdW1lbnRIYW5kbGVy
OworICAgIHNheC5pbnRlcm5hbFN1YnNldCA9IGludGVybmFsU3Vic2V0SGFuZGxlcjsKKyAgICBz
YXguZXh0ZXJuYWxTdWJzZXQgPSBleHRlcm5hbFN1YnNldEhhbmRsZXI7CisgICAgc2F4Lmlnbm9y
YWJsZVdoaXRlc3BhY2UgPSBpZ25vcmFibGVXaGl0ZXNwYWNlSGFuZGxlcjsKKyAgICBzYXguZW50
aXR5RGVjbCA9IHhtbFNBWDJFbnRpdHlEZWNsOworICAgIHNheC5pbml0aWFsaXplZCA9IFhNTF9T
QVgyX01BR0lDOworICAgIG1fcGFyc2VyU3RvcHBlZCA9IGZhbHNlOworICAgIG1fc2F3RXJyb3Ig
PSBmYWxzZTsKKyAgICBtX3Nhd1hTTFRyYW5zZm9ybSA9IGZhbHNlOworICAgIG1fc2F3Rmlyc3RF
bGVtZW50ID0gZmFsc2U7CisKKyAgICBpZiAobV9wYXJzaW5nRnJhZ21lbnQpCisgICAgICAgIG1f
Y29udGV4dCA9IGNyZWF0ZU1lbW9yeVBhcnNlcigmc2F4LCB0aGlzLCBjaHVuayk7CisgICAgZWxz
ZQorICAgICAgICBtX2NvbnRleHQgPSBjcmVhdGVTdHJpbmdQYXJzZXIoJnNheCwgdGhpcyk7Cit9
CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpkb0VuZCgpCit7CisjaWYgRU5BQkxFKFhTTFQpCisgICAg
aWYgKG1fc2F3WFNMVHJhbnNmb3JtKSB7CisgICAgICAgIG1fZG9jLT5zZXRUcmFuc2Zvcm1Tb3Vy
Y2UoeG1sRG9jUHRyRm9yU3RyaW5nKG1fZG9jLT5kb2NMb2FkZXIoKSwgbV9vcmlnaW5hbFNvdXJj
ZUZvclRyYW5zZm9ybSwgbV9kb2MtPnVybCgpLnN0cmluZygpKSk7CisgICAgICAgIAorICAgICAg
ICBtX2RvYy0+c2V0UGFyc2luZyhmYWxzZSk7IC8vIE1ha2UgdGhlIGRvYyB0aGluayBpdCdzIGRv
bmUsIHNvIGl0IHdpbGwgYXBwbHkgeHNsIHNoZWV0cy4KKyAgICAgICAgbV9kb2MtPnVwZGF0ZVN0
eWxlU2VsZWN0b3IoKTsKKyAgICAgICAgbV9kb2MtPnNldFBhcnNpbmcodHJ1ZSk7CisgICAgICAg
IG1fcGFyc2VyU3RvcHBlZCA9IHRydWU7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobV9jb250
ZXh0KSB7CisgICAgICAgIC8vIFRlbGwgbGlieG1sIHdlJ3JlIGRvbmUuCisgICAgICAgIHhtbFBh
cnNlQ2h1bmsobV9jb250ZXh0LCAwLCAwLCAxKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtX2Nv
bnRleHQtPm15RG9jKQorICAgICAgICAgICAgeG1sRnJlZURvYyhtX2NvbnRleHQtPm15RG9jKTsK
KyAgICAgICAgeG1sRnJlZVBhcnNlckN0eHQobV9jb250ZXh0KTsKKyAgICAgICAgbV9jb250ZXh0
ID0gMDsKKyAgICB9Cit9CisKKyNpZiBFTkFCTEUoWFNMVCkKK3ZvaWQqIHhtbERvY1B0ckZvclN0
cmluZyhEb2NMb2FkZXIqIGRvY0xvYWRlciwgY29uc3QgU3RyaW5nJiBzb3VyY2UsIGNvbnN0IFN0
cmluZyYgdXJsKQoreworICAgIGlmIChzb3VyY2UuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIC8vIFBhcnNlIGluIGEgc2luZ2xlIGNodW5rIGludG8gYW4geG1sRG9jUHRyCisg
ICAgLy8gRklYTUU6IEhvb2sgdXAgZXJyb3IgaGFuZGxlcnMgc28gdGhhdCBhIGZhaWx1cmUgdG8g
cGFyc2UgdGhlIG1haW4gZG9jdW1lbnQgcmVzdWx0cyBpbgorICAgIC8vIGdvb2QgZXJyb3IgbWVz
c2FnZXMuCisgICAgY29uc3QgVUNoYXIgQk9NID0gMHhGRUZGOworICAgIGNvbnN0IHVuc2lnbmVk
IGNoYXIgQk9NSGlnaEJ5dGUgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFy
Kj4oJkJPTSk7CisKKyAgICB4bWxHZW5lcmljRXJyb3JGdW5jIG9sZEVycm9yRnVuYyA9IHhtbEdl
bmVyaWNFcnJvcjsKKyAgICB2b2lkKiBvbGRFcnJvckNvbnRleHQgPSB4bWxHZW5lcmljRXJyb3JD
b250ZXh0OworICAgIAorICAgIHNldExvYWRlckZvckxpYlhNTENhbGxiYWNrcyhkb2NMb2FkZXIp
OyAgICAgICAgCisgICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYygwLCBlcnJvckZ1bmMpOworICAg
IAorICAgIHhtbERvY1B0ciBzb3VyY2VEb2MgPSB4bWxSZWFkTWVtb3J5KHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgY2hhcio+KHNvdXJjZS5jaGFyYWN0ZXJzKCkpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5sZW5ndGgoKSAqIHNpemVvZihVQ2hhciksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmxhdGluMSgpLmRhdGEo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT01IaWdoQnl0ZSA9
PSAweEZGID8gIlVURi0xNkxFIiA6ICJVVEYtMTZCRSIsIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFhTTFRfUEFSU0VfT1BUSU9OUyk7CisgICAgCisgICAgc2V0TG9h
ZGVyRm9yTGliWE1MQ2FsbGJhY2tzKDApOworICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMob2xk
RXJyb3JDb250ZXh0LCBvbGRFcnJvckZ1bmMpOworICAgIAorICAgIHJldHVybiBzb3VyY2VEb2M7
Cit9CisjZW5kaWYKKworaW50IFhNTFRva2VuaXplcjo6bGluZU51bWJlcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fY29udGV4dCA/IG1fY29udGV4dC0+aW5wdXQtPmxpbmUgOiAxOworfQorCitp
bnQgWE1MVG9rZW5pemVyOjpjb2x1bW5OdW1iZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX2Nv
bnRleHQgPyBtX2NvbnRleHQtPmlucHV0LT5jb2wgOiAxOworfQorCit2b2lkIFhNTFRva2VuaXpl
cjo6c3RvcFBhcnNpbmcoKQoreworICAgIFRva2VuaXplcjo6c3RvcFBhcnNpbmcoKTsKKyAgICB4
bWxTdG9wUGFyc2VyKG1fY29udGV4dCk7Cit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpyZXN1bWVQ
YXJzaW5nKCkKK3sKKyAgICBBU1NFUlQobV9wYXJzZXJQYXVzZWQpOworICAgIAorICAgIG1fcGFy
c2VyUGF1c2VkID0gZmFsc2U7CisKKyAgICAvLyBGaXJzdCwgZXhlY3V0ZSBhbnkgcGVuZGluZyBj
YWxsYmFja3MKKyAgICB3aGlsZSAoIW1fcGVuZGluZ0NhbGxiYWNrcy0+aXNFbXB0eSgpKSB7Cisg
ICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+Y2FsbEFuZFJlbW92ZUZpcnN0Q2FsbGJhY2sodGhp
cyk7CisgICAgICAgIAorICAgICAgICAvLyBBIGNhbGxiYWNrIHBhdXNlZCB0aGUgcGFyc2VyCisg
ICAgICAgIGlmIChtX3BhcnNlclBhdXNlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICAvLyBUaGVuLCB3cml0ZSBhbnkgcGVuZGluZyBkYXRhCisgICAgU2VnbWVudGVkU3RyaW5n
IHJlc3QgPSBtX3BlbmRpbmdTcmM7CisgICAgbV9wZW5kaW5nU3JjLmNsZWFyKCk7CisgICAgd3Jp
dGUocmVzdCwgZmFsc2UpOworCisgICAgLy8gRmluYWxseSwgaWYgZmluaXNoKCkgaGFzIGJlZW4g
Y2FsbGVkIGFuZCB3cml0ZSgpIGRpZG4ndCByZXN1bHQKKyAgICAvLyBpbiBhbnkgZnVydGhlciBj
YWxsYmFja3MgYmVpbmcgcXVldWVkLCBjYWxsIGVuZCgpCisgICAgaWYgKG1fZmluaXNoQ2FsbGVk
ICYmIG1fcGVuZGluZ0NhbGxiYWNrcy0+aXNFbXB0eSgpKQorICAgICAgICBlbmQoKTsKK30KKwor
Ym9vbCBwYXJzZVhNTERvY3VtZW50RnJhZ21lbnQoY29uc3QgU3RyaW5nJiBjaHVuaywgRG9jdW1l
bnRGcmFnbWVudCogZnJhZ21lbnQsIEVsZW1lbnQqIHBhcmVudCkKK3sKKyAgICBpZiAoIWNodW5r
Lmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFhNTFRva2VuaXplciB0b2tl
bml6ZXIoZnJhZ21lbnQsIHBhcmVudCk7CisgICAgCisgICAgdG9rZW5pemVyLmluaXRpYWxpemVQ
YXJzZXJDb250ZXh0KGNodW5rLnV0ZjgoKS5kYXRhKCkpOworCisgICAgeG1sUGFyc2VDb250ZW50
KHRva2VuaXplci5tX2NvbnRleHQpOworCisgICAgdG9rZW5pemVyLmVuZERvY3VtZW50KCk7CisK
KyAgICAvLyBDaGVjayBpZiBhbGwgdGhlIGNodW5rIGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAgICBs
b25nIGJ5dGVzUHJvY2Vzc2VkID0geG1sQnl0ZUNvbnN1bWVkKHRva2VuaXplci5tX2NvbnRleHQp
OworICAgIGlmIChieXRlc1Byb2Nlc3NlZCA9PSAtMSB8fCAoKHVuc2lnbmVkIGxvbmcpYnl0ZXNQ
cm9jZXNzZWQpID09IHNpemVvZihVQ2hhcikgKiBjaHVuay5sZW5ndGgoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gTm8gZXJyb3IgaWYgdGhlIGNodW5rIGlzIHdlbGwgZm9ybWVk
IG9yIGl0IGlzIG5vdCBidXQgd2UgaGF2ZSBubyBlcnJvci4KKyAgICByZXR1cm4gdG9rZW5pemVy
Lm1fY29udGV4dC0+d2VsbEZvcm1lZCB8fCB4bWxDdHh0R2V0TGFzdEVycm9yKHRva2VuaXplci5t
X2NvbnRleHQpID09IDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CisKK3N0cnVjdCBBdHRyaWJ1dGVQYXJzZVN0YXRlIHsKKyAgICBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPiBhdHRyaWJ1dGVzOworICAgIGJvb2wgZ290QXR0cmlidXRlczsKK307CisKK3N0YXRpYyB2
b2lkIGF0dHJpYnV0ZXNTdGFydEVsZW1lbnROc0hhbmRsZXIodm9pZCogY2xvc3VyZSwgY29uc3Qg
eG1sQ2hhciogeG1sTG9jYWxOYW1lLCBjb25zdCB4bWxDaGFyKiB4bWxQcmVmaXgsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIqIHhtbFVS
SSwgaW50IG5iX25hbWVzcGFjZXMsIGNvbnN0IHhtbENoYXIqKiBuYW1lc3BhY2VzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfYXR0cmlidXRlcywg
aW50IG5iX2RlZmF1bHRlZCwgY29uc3QgeG1sQ2hhcioqIGxpYnhtbEF0dHJpYnV0ZXMpCit7Cisg
ICAgaWYgKHN0cmNtcChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih4bWxMb2NhbE5hbWUp
LCAiYXR0cnMiKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgeG1sUGFyc2VyQ3R4
dFB0ciBjdHh0ID0gc3RhdGljX2Nhc3Q8eG1sUGFyc2VyQ3R4dFB0cj4oY2xvc3VyZSk7CisgICAg
QXR0cmlidXRlUGFyc2VTdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGVQYXJzZVN0
YXRlKj4oY3R4dC0+X3ByaXZhdGUpOworICAgIAorICAgIHN0YXRlLT5nb3RBdHRyaWJ1dGVzID0g
dHJ1ZTsKKyAgICAKKyAgICB4bWxTQVgyQXR0cmlidXRlcyogYXR0cmlidXRlcyA9IHJlaW50ZXJw
cmV0X2Nhc3Q8eG1sU0FYMkF0dHJpYnV0ZXMqPihsaWJ4bWxBdHRyaWJ1dGVzKTsKKyAgICBmb3Io
aW50IGkgPSAwOyBpIDwgbmJfYXR0cmlidXRlczsgaSsrKSB7CisgICAgICAgIFN0cmluZyBhdHRy
TG9jYWxOYW1lID0gdG9TdHJpbmcoYXR0cmlidXRlc1tpXS5sb2NhbG5hbWUpOworICAgICAgICBp
bnQgdmFsdWVMZW5ndGggPSAoaW50KSAoYXR0cmlidXRlc1tpXS5lbmQgLSBhdHRyaWJ1dGVzW2ld
LnZhbHVlKTsKKyAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IHRvU3RyaW5nKGF0dHJpYnV0ZXNb
aV0udmFsdWUsIHZhbHVlTGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nIGF0dHJQcmVmaXggPSB0b1N0
cmluZyhhdHRyaWJ1dGVzW2ldLnByZWZpeCk7CisgICAgICAgIFN0cmluZyBhdHRyUU5hbWUgPSBh
dHRyUHJlZml4LmlzRW1wdHkoKSA/IGF0dHJMb2NhbE5hbWUgOiBhdHRyUHJlZml4ICsgIjoiICsg
YXR0ckxvY2FsTmFtZTsKKyAgICAgICAgCisgICAgICAgIHN0YXRlLT5hdHRyaWJ1dGVzLnNldChh
dHRyUU5hbWUsIGF0dHJWYWx1ZSk7CisgICAgfQorfQorCitIYXNoTWFwPFN0cmluZywgU3RyaW5n
PiBwYXJzZUF0dHJpYnV0ZXMoY29uc3QgU3RyaW5nJiBzdHJpbmcsIGJvb2wmIGF0dHJzT0spCit7
CisgICAgQXR0cmlidXRlUGFyc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGF0ZS5nb3RBdHRyaWJ1dGVz
ID0gZmFsc2U7CisKKyAgICB4bWxTQVhIYW5kbGVyIHNheDsKKyAgICBtZW1zZXQoJnNheCwgMCwg
c2l6ZW9mKHNheCkpOworICAgIHNheC5zdGFydEVsZW1lbnROcyA9IGF0dHJpYnV0ZXNTdGFydEVs
ZW1lbnROc0hhbmRsZXI7CisgICAgc2F4LmluaXRpYWxpemVkID0gWE1MX1NBWDJfTUFHSUM7Cisg
ICAgeG1sUGFyc2VyQ3R4dFB0ciBwYXJzZXIgPSBjcmVhdGVTdHJpbmdQYXJzZXIoJnNheCwgJnN0
YXRlKTsKKyAgICBTdHJpbmcgcGFyc2VTdHJpbmcgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48
YXR0cnMgIiArIHN0cmluZyArICIgLz4iOworICAgIHhtbFBhcnNlQ2h1bmsocGFyc2VyLCByZWlu
dGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwYXJzZVN0cmluZy5jaGFyYWN0ZXJzKCkpLCBwYXJz
ZVN0cmluZy5sZW5ndGgoKSAqIHNpemVvZihVQ2hhciksIDEpOworICAgIGlmIChwYXJzZXItPm15
RG9jKQorICAgICAgICB4bWxGcmVlRG9jKHBhcnNlci0+bXlEb2MpOworICAgIHhtbEZyZWVQYXJz
ZXJDdHh0KHBhcnNlcik7CisgICAgYXR0cnNPSyA9IHN0YXRlLmdvdEF0dHJpYnV0ZXM7CisgICAg
cmV0dXJuIHN0YXRlLmF0dHJpYnV0ZXM7Cit9CisKK30KKworCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L2RvbS9YTUxUb2tlbml6ZXJRdC5jcHAgYi9XZWJDb3JlL2RvbS9YTUxUb2tlbml6ZXJRdC5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlOGYyMwotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvZG9tL1hNTFRva2VuaXplclF0LmNwcApAQCAtMCwwICsxLDc2MSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBQZXRlciBLZWxseSAocG1rQHBvc3QuY29tKQorICog
Q29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292IChhcEB3ZWJr
aXQub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDA3IFNhbXVlbCBXZWluaWcgKHNhbUB3ZWJraXQu
b3JnKQorICogQ29weXJpZ2h0IChDKSAyMDA3IFRyb2xsdGVjaCBBU0EKKyAqIENvcHlyaWdodCAo
QykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiWE1MVG9rZW5pemVyLmgiCisKKyNpbmNsdWRlICJDREFUQVNlY3Rpb24uaCIKKyNp
bmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiQ2FjaGVkU2NyaXB0LmgiCisjaW5jbHVkZSAi
Q29tbWVudC5oIgorI2luY2x1ZGUgIkRvY0xvYWRlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CisjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50VHlwZS5o
IgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUg
IkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRNTExp
bmtFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIkhU
TUxUb2tlbml6ZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAi
UHJvY2Vzc2luZ0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VFcnJvci5oIgorI2lu
Y2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0LmgiCisj
aW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29k
ZXIuaCIKKyNpbmNsdWRlIDxRRGVidWc+CisjaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+CisjaW5j
bHVkZSA8d3RmL1N0cmluZ0V4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKyNp
bmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Cit1c2luZyBuYW1lc3Bh
Y2UgSFRNTE5hbWVzOworCitjb25zdCBpbnQgbWF4RXJyb3JzID0gMjU7CisKKyNpZiBRVF9WRVJT
SU9OID49IDB4MDQwNDAwCitjbGFzcyBFbnRpdHlSZXNvbHZlciA6IHB1YmxpYyBRWG1sU3RyZWFt
RW50aXR5UmVzb2x2ZXIKK3sKKyAgICB2aXJ0dWFsIFFTdHJpbmcgcmVzb2x2ZVVuZGVjbGFyZWRF
bnRpdHkoY29uc3QgUVN0cmluZyAmbmFtZSk7Cit9OworCitRU3RyaW5nIEVudGl0eVJlc29sdmVy
OjpyZXNvbHZlVW5kZWNsYXJlZEVudGl0eShjb25zdCBRU3RyaW5nICZuYW1lKQoreworICAgIFVD
aGFyIGMgPSBkZWNvZGVOYW1lZEVudGl0eShuYW1lLnRvVXRmOCgpLmNvbnN0RGF0YSgpKTsKKyAg
ICByZXR1cm4gUVN0cmluZyhjKTsKK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorCitYTUxUb2tlbml6ZXI6OlhNTFRva2VuaXplcihEb2N1bWVudCogX2Rv
YywgRnJhbWVWaWV3KiBfdmlldykKKyAgICA6IG1fZG9jKF9kb2MpCisgICAgLCBtX3ZpZXcoX3Zp
ZXcpCisgICAgLCBtX3dyb3RlVGV4dChmYWxzZSkKKyAgICAsIG1fY3VycmVudE5vZGUoX2RvYykK
KyAgICAsIG1fY3VycmVudE5vZGVJc1JlZmVyZW5jZWQoZmFsc2UpCisgICAgLCBtX3Nhd0Vycm9y
KGZhbHNlKQorICAgICwgbV9zYXdYU0xUcmFuc2Zvcm0oZmFsc2UpCisgICAgLCBtX3Nhd0ZpcnN0
RWxlbWVudChmYWxzZSkKKyAgICAsIG1faXNYSFRNTERvY3VtZW50KGZhbHNlKQorICAgICwgbV9w
YXJzZXJQYXVzZWQoZmFsc2UpCisgICAgLCBtX3JlcXVlc3RpbmdTY3JpcHQoZmFsc2UpCisgICAg
LCBtX2ZpbmlzaENhbGxlZChmYWxzZSkKKyAgICAsIG1fZXJyb3JDb3VudCgwKQorICAgICwgbV9s
YXN0RXJyb3JMaW5lKDApCisgICAgLCBtX2xhc3RFcnJvckNvbHVtbigwKQorICAgICwgbV9wZW5k
aW5nU2NyaXB0KDApCisgICAgLCBtX3NjcmlwdFN0YXJ0TGluZSgwKQorICAgICwgbV9wYXJzaW5n
RnJhZ21lbnQoZmFsc2UpCit7CisjaWYgUVRfVkVSU0lPTiA+PSAweDA0MDQwMAorICAgIG1fc3Ry
ZWFtLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcik7CisjZW5kaWYKK30KKwor
WE1MVG9rZW5pemVyOjpYTUxUb2tlbml6ZXIoRG9jdW1lbnRGcmFnbWVudCogZnJhZ21lbnQsIEVs
ZW1lbnQqIHBhcmVudEVsZW1lbnQpCisgICAgOiBtX2RvYyhmcmFnbWVudC0+ZG9jdW1lbnQoKSkK
KyAgICAsIG1fdmlldygwKQorICAgICwgbV93cm90ZVRleHQoZmFsc2UpCisgICAgLCBtX2N1cnJl
bnROb2RlKGZyYWdtZW50KQorICAgICwgbV9jdXJyZW50Tm9kZUlzUmVmZXJlbmNlZChmcmFnbWVu
dCkKKyAgICAsIG1fc2F3RXJyb3IoZmFsc2UpCisgICAgLCBtX3Nhd1hTTFRyYW5zZm9ybShmYWxz
ZSkKKyAgICAsIG1fc2F3Rmlyc3RFbGVtZW50KGZhbHNlKQorICAgICwgbV9pc1hIVE1MRG9jdW1l
bnQoZmFsc2UpCisgICAgLCBtX3BhcnNlclBhdXNlZChmYWxzZSkKKyAgICAsIG1fcmVxdWVzdGlu
Z1NjcmlwdChmYWxzZSkKKyAgICAsIG1fZmluaXNoQ2FsbGVkKGZhbHNlKQorICAgICwgbV9lcnJv
ckNvdW50KDApCisgICAgLCBtX2xhc3RFcnJvckxpbmUoMCkKKyAgICAsIG1fbGFzdEVycm9yQ29s
dW1uKDApCisgICAgLCBtX3BlbmRpbmdTY3JpcHQoMCkKKyAgICAsIG1fc2NyaXB0U3RhcnRMaW5l
KDApCisgICAgLCBtX3BhcnNpbmdGcmFnbWVudCh0cnVlKQoreworICAgIGlmIChmcmFnbWVudCkK
KyAgICAgICAgZnJhZ21lbnQtPnJlZigpOworICAgIGlmIChtX2RvYykKKyAgICAgICAgbV9kb2Mt
PnJlZigpOworICAgICAgICAgIAorICAgIC8vIEFkZCBuYW1lc3BhY2VzIGJhc2VkIG9uIHRoZSBw
YXJlbnQgbm9kZQorICAgIFZlY3RvcjxFbGVtZW50Kj4gZWxlbVN0YWNrOworICAgIHdoaWxlIChw
YXJlbnRFbGVtZW50KSB7CisgICAgICAgIGVsZW1TdGFjay5hcHBlbmQocGFyZW50RWxlbWVudCk7
CisgICAgICAgIAorICAgICAgICBOb2RlKiBuID0gcGFyZW50RWxlbWVudC0+cGFyZW50Tm9kZSgp
OworICAgICAgICBpZiAoIW4gfHwgIW4tPmlzRWxlbWVudE5vZGUoKSkKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBwYXJlbnRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwor
ICAgIH0KKyAgICAKKyAgICBpZiAoZWxlbVN0YWNrLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIAorI2lmIFFUX1ZFUlNJT04gPCAweDA0MDQwMAorICAgIGZvciAoRWxlbWVudCogZWxl
bWVudCA9IGVsZW1TdGFjay5sYXN0KCk7ICFlbGVtU3RhY2suaXNFbXB0eSgpOyBlbGVtU3RhY2su
cmVtb3ZlTGFzdCgpKSB7CisgICAgICAgIGlmIChOYW1lZEF0dHJNYXAqIGF0dHJzID0gZWxlbWVu
dC0+YXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
YXR0cnMtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGUqIGF0dHIg
PSBhdHRycy0+YXR0cmlidXRlSXRlbShpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bG9j
YWxOYW1lKCkgPT0gInhtbG5zIikKKyAgICAgICAgICAgICAgICAgICAgbV9kZWZhdWx0TmFtZXNw
YWNlVVJJID0gYXR0ci0+dmFsdWUoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyLT5w
cmVmaXgoKSA9PSAieG1sbnMiKQorICAgICAgICAgICAgICAgICAgICBtX3ByZWZpeFRvTmFtZXNw
YWNlTWFwLnNldChhdHRyLT5sb2NhbE5hbWUoKSwgYXR0ci0+dmFsdWUoKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIFFYbWxTdHJlYW1OYW1lc3BhY2VEZWNs
YXJhdGlvbnMgbmFtZXNwYWNlczsKKyAgICBmb3IgKEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVtU3Rh
Y2subGFzdCgpOyAhZWxlbVN0YWNrLmlzRW1wdHkoKTsgZWxlbVN0YWNrLnJlbW92ZUxhc3QoKSkg
eworICAgICAgICBpZiAoTmFtZWRBdHRyTWFwKiBhdHRycyA9IGVsZW1lbnQtPmF0dHJpYnV0ZXMo
KSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGF0dHJzLT5sZW5ndGgo
KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlKiBhdHRyID0gYXR0cnMtPmF0dHJp
YnV0ZUl0ZW0oaSk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHItPmxvY2FsTmFtZSgpID09ICJ4
bWxucyIpCisgICAgICAgICAgICAgICAgICAgIG1fZGVmYXVsdE5hbWVzcGFjZVVSSSA9IGF0dHIt
PnZhbHVlKCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0ci0+cHJlZml4KCkgPT0gInht
bG5zIikKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hcHBlbmQoUVhtbFN0cmVhbU5h
bWVzcGFjZURlY2xhcmF0aW9uKGF0dHItPmxvY2FsTmFtZSgpLCBhdHRyLT52YWx1ZSgpKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbV9zdHJlYW0uYWRkRXh0cmFOYW1l
c3BhY2VEZWNsYXJhdGlvbnMobmFtZXNwYWNlcyk7CisgICAgbV9zdHJlYW0uc2V0RW50aXR5UmVz
b2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKTsKKyNlbmRpZgorCisgICAgLy8gSWYgdGhlIHBhcmVu
dCBlbGVtZW50IGlzIG5vdCBpbiBkb2N1bWVudCB0cmVlLCB0aGVyZSBtYXkgYmUgbm8geG1sbnMg
YXR0cmlidXRlOyBqdXN0IGRlZmF1bHQgdG8gdGhlIHBhcmVudCdzIG5hbWVzcGFjZS4KKyAgICBp
ZiAobV9kZWZhdWx0TmFtZXNwYWNlVVJJLmlzTnVsbCgpICYmICFwYXJlbnRFbGVtZW50LT5pbkRv
Y3VtZW50KCkpCisgICAgICAgIG1fZGVmYXVsdE5hbWVzcGFjZVVSSSA9IHBhcmVudEVsZW1lbnQt
Pm5hbWVzcGFjZVVSSSgpOworfQorCitYTUxUb2tlbml6ZXI6On5YTUxUb2tlbml6ZXIoKQorewor
ICAgIHNldEN1cnJlbnROb2RlKDApOworICAgIGlmIChtX3BhcnNpbmdGcmFnbWVudCAmJiBtX2Rv
YykKKyAgICAgICAgbV9kb2MtPmRlcmVmKCk7CisgICAgaWYgKG1fcGVuZGluZ1NjcmlwdCkKKyAg
ICAgICAgbV9wZW5kaW5nU2NyaXB0LT5yZW1vdmVDbGllbnQodGhpcyk7CisjaWYgUVRfVkVSU0lP
TiA+PSAweDA0MDQwMAorICAgIGRlbGV0ZSBtX3N0cmVhbS5lbnRpdHlSZXNvbHZlcigpOworI2Vu
ZGlmCit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpkb1dyaXRlKGNvbnN0IFN0cmluZyYgcGFyc2VT
dHJpbmcpCit7CisgICAgbV93cm90ZVRleHQgPSB0cnVlOworICAgIFFTdHJpbmcgZGF0YShwYXJz
ZVN0cmluZyk7CisgICAgaWYgKCFkYXRhLmlzRW1wdHkoKSkgeworI2lmIFFUX1ZFUlNJT04gPCAw
eDA0MDQwMAorICAgICAgICBpZiAoIW1fc2F3Rmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICBp
bnQgaWR4ID0gZGF0YS5pbmRleE9mKFFMYXRpbjFTdHJpbmcoIjw/eG1sIikpOworICAgICAgICAg
ICAgaWYgKGlkeCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGlkeCArIDU7
CisgICAgICAgICAgICAgICAgaW50IGVuZCA9IGRhdGEuaW5kZXhPZihRTGF0aW4xU3RyaW5nKCI/
PiIpLCBzdGFydCk7CisgICAgICAgICAgICAgICAgUVN0cmluZyBjb250ZW50ID0gZGF0YS5taWQo
c3RhcnQsIGVuZC1zdGFydCk7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IHRydWU7CisgICAg
ICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cnMgPSBwYXJzZUF0dHJpYnV0
ZXMoY29udGVudCwgb2spOworICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gYXR0cnMu
Z2V0KCJ2ZXJzaW9uIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gYXR0cnMu
Z2V0KCJlbmNvZGluZyIpOworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwor
ICAgICAgICAgICAgICAgIGlmICghbV9wYXJzaW5nRnJhZ21lbnQpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCF2ZXJzaW9uLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
ZG9jLT5zZXRYTUxWZXJzaW9uKHZlcnNpb24sIGVjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCFlbmNvZGluZy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX2RvYy0+c2V0
WE1MRW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorI2VuZGlmCisgICAgCisgICAgICAgIGlmIChtX2RvYy0+ZGVjb2RlcigpICYm
IG1fZG9jLT5kZWNvZGVyKCktPnNhd0Vycm9yKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBk
ZWNvZGVyIHNhdyBhbiBlcnJvciwgcmVwb3J0IGl0IGFzIGZhdGFsIChzdG9wcyBwYXJzaW5nKQor
ICAgICAgICAgICAgaGFuZGxlRXJyb3IoZmF0YWwsICJFbmNvZGluZyBlcnJvciIsIGxpbmVOdW1i
ZXIoKSwgY29sdW1uTnVtYmVyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgbV9zdHJlYW0uYWRkRGF0YShkYXRhKTsKKyAgICAgICAgcGFyc2UoKTsKKyAgICB9
IGVsc2UgaWYgKG1fZG9jLT5kZWNvZGVyKCkgJiYgbV9kb2MtPmRlY29kZXIoKS0+c2F3RXJyb3Io
KSkgeworICAgICAgICAvLyBJZiB0aGUgZGVjb2RlciBzYXcgYW4gZXJyb3IsIHJlcG9ydCBpdCBh
cyBmYXRhbCAoc3RvcHMgcGFyc2luZykKKyAgICAgICAgaGFuZGxlRXJyb3IoZmF0YWwsICJFbmNv
ZGluZyBlcnJvciIsIGxpbmVOdW1iZXIoKSwgY29sdW1uTnVtYmVyKCkpOworICAgIH0KKworICAg
IHJldHVybjsKK30KKwordm9pZCBYTUxUb2tlbml6ZXI6OmluaXRpYWxpemVQYXJzZXJDb250ZXh0
KGNvbnN0IGNoYXIqIGNodW5rKQoreworICAgIG1fcGFyc2VyU3RvcHBlZCA9IGZhbHNlOworICAg
IG1fc2F3RXJyb3IgPSBmYWxzZTsKKyAgICBtX3Nhd1hTTFRyYW5zZm9ybSA9IGZhbHNlOworICAg
IG1fc2F3Rmlyc3RFbGVtZW50ID0gZmFsc2U7Cit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpkb0Vu
ZCgpCit7CisjaWYgRU5BQkxFKFhTTFQpCisgICAgI3dhcm5pbmcgTG9vayBhdCBYTUxUb2tlbml6
ZXJMaWJYbWwuY3BwCisjZW5kaWYKKworICAgIGlmIChtX3N0cmVhbS5lcnJvcigpID09IFFYbWxT
dHJlYW1SZWFkZXI6OlByZW1hdHVyZUVuZE9mRG9jdW1lbnRFcnJvciB8fCAobV93cm90ZVRleHQg
JiYgIW1fc2F3Rmlyc3RFbGVtZW50KSkgeworICAgICAgICBoYW5kbGVFcnJvcihmYXRhbCwgcVBy
aW50YWJsZShtX3N0cmVhbS5lcnJvclN0cmluZygpKSwgbGluZU51bWJlcigpLAorICAgICAgICAg
ICAgICAgICAgICBjb2x1bW5OdW1iZXIoKSk7CisgICAgfQorfQorCisjaWYgRU5BQkxFKFhTTFQp
Cit2b2lkKiB4bWxEb2NQdHJGb3JTdHJpbmcoRG9jTG9hZGVyKiBkb2NMb2FkZXIsIGNvbnN0IFN0
cmluZyYgc291cmNlLCBjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICBpZiAoc291cmNlLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBQYXJzZSBpbiBhIHNpbmdsZSBjaHVu
ayBpbnRvIGFuIHhtbERvY1B0cgorICAgIC8vIEZJWE1FOiBIb29rIHVwIGVycm9yIGhhbmRsZXJz
IHNvIHRoYXQgYSBmYWlsdXJlIHRvIHBhcnNlIHRoZSBtYWluIGRvY3VtZW50IHJlc3VsdHMgaW4K
KyAgICAvLyBnb29kIGVycm9yIG1lc3NhZ2VzLgorICAgIGNvbnN0IFVDaGFyIEJPTSA9IDB4RkVG
RjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEJPTUhpZ2hCeXRlID0gKnJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZCT00pOworCisgICAgeG1sR2VuZXJpY0Vycm9yRnVu
YyBvbGRFcnJvckZ1bmMgPSB4bWxHZW5lcmljRXJyb3I7CisgICAgdm9pZCogb2xkRXJyb3JDb250
ZXh0ID0geG1sR2VuZXJpY0Vycm9yQ29udGV4dDsKKyAgICAKKyAgICBzZXRMb2FkZXJGb3JMaWJY
TUxDYWxsYmFja3MoZG9jTG9hZGVyKTsgICAgICAgIAorICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1
bmMoMCwgZXJyb3JGdW5jKTsKKyAgICAKKyAgICB4bWxEb2NQdHIgc291cmNlRG9jID0geG1sUmVh
ZE1lbW9yeShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzb3VyY2UuY2hhcmFjdGVycygp
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubGVuZ3Ro
KCkgKiBzaXplb2YoVUNoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHVybC5sYXRpbjEoKS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgQk9NSGlnaEJ5dGUgPT0gMHhGRiA/ICJVVEYtMTZMRSIgOiAiVVRGLTE2QkUiLCAK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0xUX1BBUlNFX09QVElP
TlMpOworICAgIAorICAgIHNldExvYWRlckZvckxpYlhNTENhbGxiYWNrcygwKTsKKyAgICB4bWxT
ZXRHZW5lcmljRXJyb3JGdW5jKG9sZEVycm9yQ29udGV4dCwgb2xkRXJyb3JGdW5jKTsKKyAgICAK
KyAgICByZXR1cm4gc291cmNlRG9jOworfQorI2VuZGlmCisKK2ludCBYTUxUb2tlbml6ZXI6Omxp
bmVOdW1iZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0cmVhbS5saW5lTnVtYmVyKCk7Cit9
CisKK2ludCBYTUxUb2tlbml6ZXI6OmNvbHVtbk51bWJlcigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fc3RyZWFtLmNvbHVtbk51bWJlcigpOworfQorCit2b2lkIFhNTFRva2VuaXplcjo6c3RvcFBh
cnNpbmcoKQoreworICAgIFRva2VuaXplcjo6c3RvcFBhcnNpbmcoKTsKK30KKwordm9pZCBYTUxU
b2tlbml6ZXI6OnJlc3VtZVBhcnNpbmcoKQoreworICAgIEFTU0VSVChtX3BhcnNlclBhdXNlZCk7
CisgICAgCisgICAgbV9wYXJzZXJQYXVzZWQgPSBmYWxzZTsKKworICAgIC8vIEZpcnN0LCBleGVj
dXRlIGFueSBwZW5kaW5nIGNhbGxiYWNrcworICAgIHBhcnNlKCk7CisgICAgaWYgKG1fcGFyc2Vy
UGF1c2VkKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGVuLCB3cml0ZSBhbnkgcGVuZGlu
ZyBkYXRhCisgICAgU2VnbWVudGVkU3RyaW5nIHJlc3QgPSBtX3BlbmRpbmdTcmM7CisgICAgbV9w
ZW5kaW5nU3JjLmNsZWFyKCk7CisgICAgd3JpdGUocmVzdCwgZmFsc2UpOworCisgICAgLy8gRmlu
YWxseSwgaWYgZmluaXNoKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCB3cml0ZSgpIGRpZG4ndCByZXN1
bHQKKyAgICAvLyBpbiBhbnkgZnVydGhlciBjYWxsYmFja3MgYmVpbmcgcXVldWVkLCBjYWxsIGVu
ZCgpCisgICAgaWYgKG1fZmluaXNoQ2FsbGVkICYmICFtX3BhcnNlclBhdXNlZCAmJiAhbV9wZW5k
aW5nU2NyaXB0KQorICAgICAgICBlbmQoKTsKK30KKworYm9vbCBwYXJzZVhNTERvY3VtZW50RnJh
Z21lbnQoY29uc3QgU3RyaW5nJiBjaHVuaywgRG9jdW1lbnRGcmFnbWVudCogZnJhZ21lbnQsIEVs
ZW1lbnQqIHBhcmVudCkKK3sKKyAgICBpZiAoIWNodW5rLmxlbmd0aCgpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIFhNTFRva2VuaXplciB0b2tlbml6ZXIoZnJhZ21lbnQsIHBhcmVudCk7
CisgICAgCisgICAgdG9rZW5pemVyLndyaXRlKFN0cmluZygiPHF4bWxzdHJlYW1kdW1teWVsZW1l
bnQ+IiksIGZhbHNlKTsKKyAgICB0b2tlbml6ZXIud3JpdGUoY2h1bmssIGZhbHNlKTsKKyAgICB0
b2tlbml6ZXIud3JpdGUoU3RyaW5nKCI8L3F4bWxzdHJlYW1kdW1teWVsZW1lbnQ+IiksIGZhbHNl
KTsKKyAgICB0b2tlbml6ZXIuZmluaXNoKCk7CisgICAgcmV0dXJuICF0b2tlbml6ZXIuaGFzRXJy
b3IoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0
IEF0dHJpYnV0ZVBhcnNlU3RhdGUgeworICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJp
YnV0ZXM7CisgICAgYm9vbCBnb3RBdHRyaWJ1dGVzOworfTsKKworc3RhdGljIHZvaWQgYXR0cmli
dXRlc1N0YXJ0RWxlbWVudE5zSGFuZGxlcihBdHRyaWJ1dGVQYXJzZVN0YXRlKiBzdGF0ZSwgY29u
c3QgUVhtbFN0cmVhbUF0dHJpYnV0ZXMmIGF0dHJzKQoreworICAgIGlmIChhdHRycy5jb3VudCgp
IDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXRlLT5nb3RBdHRyaWJ1dGVzID0gdHJ1
ZTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhdHRycy5jb3VudCgpOyBpKyspIHsKKyAgICAg
ICAgY29uc3QgUVhtbFN0cmVhbUF0dHJpYnV0ZSYgYXR0ciA9IGF0dHJzW2ldOworICAgICAgICBT
dHJpbmcgYXR0ckxvY2FsTmFtZSA9IGF0dHIubmFtZSgpOworICAgICAgICBTdHJpbmcgYXR0clZh
bHVlICAgICA9IGF0dHIudmFsdWUoKTsKKyAgICAgICAgU3RyaW5nIGF0dHJVUkkgICAgICAgPSBh
dHRyLm5hbWVzcGFjZVVyaSgpOworICAgICAgICBTdHJpbmcgYXR0clFOYW1lICAgICA9IGF0dHIu
cXVhbGlmaWVkTmFtZSgpOworICAgICAgICBzdGF0ZS0+YXR0cmlidXRlcy5zZXQoYXR0clFOYW1l
LCBhdHRyVmFsdWUpOworICAgIH0KK30KKworSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyc2VB
dHRyaWJ1dGVzKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBib29sJiBhdHRyc09LKQoreworICAgIEF0
dHJpYnV0ZVBhcnNlU3RhdGUgc3RhdGU7CisgICAgc3RhdGUuZ290QXR0cmlidXRlcyA9IGZhbHNl
OworCisgICAgUVhtbFN0cmVhbVJlYWRlciBzdHJlYW07CisgICAgUVN0cmluZyBkdW1teSA9IFFT
dHJpbmcoUUxhdGluMVN0cmluZygiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48YXR0cnMgJTEgLz4i
KSkuYXJnKHN0cmluZyk7CisgICAgc3RyZWFtLmFkZERhdGEoZHVtbXkpOworICAgIHdoaWxlICgh
c3RyZWFtLmF0RW5kKCkpIHsKKyAgICAgICAgc3RyZWFtLnJlYWROZXh0KCk7CisgICAgICAgIGlm
IChzdHJlYW0uaXNTdGFydEVsZW1lbnQoKSkgeworICAgICAgICAgICAgYXR0cmlidXRlc1N0YXJ0
RWxlbWVudE5zSGFuZGxlcigmc3RhdGUsIHN0cmVhbS5hdHRyaWJ1dGVzKCkpOworICAgICAgICB9
CisgICAgfQorICAgIGF0dHJzT0sgPSBzdGF0ZS5nb3RBdHRyaWJ1dGVzOworICAgIHJldHVybiBz
dGF0ZS5hdHRyaWJ1dGVzOworfQorCitzdGF0aWMgaW5saW5lIFN0cmluZyBwcmVmaXhGcm9tUU5h
bWUoY29uc3QgUVN0cmluZyYgcU5hbWUpCit7CisgICAgY29uc3QgaW50IG9mZnNldCA9IHFOYW1l
LmluZGV4T2YoUUxhdGluMUNoYXIoJzonKSk7CisgICAgaWYgKG9mZnNldCA8PSAwKQorICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcU5hbWUubGVmdChv
ZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlRWxlbWVudE5hbWVzcGFjZXMo
RWxlbWVudCogbmV3RWxlbWVudCwgY29uc3QgUVhtbFN0cmVhbU5hbWVzcGFjZURlY2xhcmF0aW9u
cyAmbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0
aW9uQ29kZSYgZWMpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucy5jb3VudCgpOyArK2kp
IHsKKyAgICAgICAgY29uc3QgUVhtbFN0cmVhbU5hbWVzcGFjZURlY2xhcmF0aW9uICZkZWNsID0g
bnNbaV07CisgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBkZWNsLm5hbWVzcGFjZVVyaSgp
OworICAgICAgICBTdHJpbmcgbmFtZXNwYWNlUU5hbWUgPSBkZWNsLnByZWZpeCgpLmlzRW1wdHko
KSA/IFN0cmluZygieG1sbnMiKSA6IFN0cmluZygieG1sbnM6IikgKyBkZWNsLnByZWZpeCgpOwor
ICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMjAw
MC94bWxucy8iLCBuYW1lc3BhY2VRTmFtZSwgbmFtZXNwYWNlVVJJLCBlYyk7CisgICAgICAgIGlm
IChlYykgLy8gZXhjZXB0aW9uIHNldHRpbmcgYXR0cmlidXRlcworICAgICAgICAgICAgcmV0dXJu
OworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZUVsZW1lbnRBdHRyaWJ1dGVz
KEVsZW1lbnQqIG5ld0VsZW1lbnQsIGNvbnN0IFFYbWxTdHJlYW1BdHRyaWJ1dGVzICZhdHRycywg
RXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5jb3Vu
dCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgUVhtbFN0cmVhbUF0dHJpYnV0ZSAmYXR0ciA9IGF0
dHJzW2ldOworICAgICAgICBTdHJpbmcgYXR0ckxvY2FsTmFtZSA9IGF0dHIubmFtZSgpOworICAg
ICAgICBTdHJpbmcgYXR0clZhbHVlICAgICA9IGF0dHIudmFsdWUoKTsKKyAgICAgICAgU3RyaW5n
IGF0dHJVUkkgICAgICAgPSBhdHRyLm5hbWVzcGFjZVVyaSgpLmlzRW1wdHkoKSA/IFN0cmluZygp
IDogU3RyaW5nKGF0dHIubmFtZXNwYWNlVXJpKCkpOworICAgICAgICBTdHJpbmcgYXR0clFOYW1l
ICAgICA9IGF0dHIucXVhbGlmaWVkTmFtZSgpOworICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRy
aWJ1dGVOUyhhdHRyVVJJLCBhdHRyUU5hbWUsIGF0dHJWYWx1ZSwgZWMpOworICAgICAgICBpZiAo
ZWMpIC8vIGV4Y2VwdGlvbiBzZXR0aW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICB9Cit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpwYXJzZSgpCit7CisgICAgd2hpbGUgKCFt
X3BhcnNlclN0b3BwZWQgJiYgIW1fcGFyc2VyUGF1c2VkICYmICFtX3N0cmVhbS5hdEVuZCgpKSB7
CisgICAgICAgIG1fc3RyZWFtLnJlYWROZXh0KCk7CisgICAgICAgIHN3aXRjaCAobV9zdHJlYW0u
dG9rZW5UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpTdGFydERvY3Vt
ZW50OiB7CisgICAgICAgICAgICBzdGFydERvY3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIFFYbWxTdHJlYW1SZWFkZXI6OkVuZERvY3VtZW50OiB7
CisgICAgICAgICAgICBlbmREb2N1bWVudCgpOworICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpTdGFydEVsZW1lbnQ6IHsKKyAgICAg
ICAgICAgIHBhcnNlU3RhcnRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIFFYbWxTdHJlYW1SZWFkZXI6OkVuZEVsZW1lbnQ6IHsKKyAgICAgICAg
ICAgIHBhcnNlRW5kRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpDaGFyYWN0ZXJzOiB7CisgICAgICAgICAgICBp
ZiAobV9zdHJlYW0uaXNDREFUQSgpKSB7CisgICAgICAgICAgICAgICAgLy9jZGF0YQorICAgICAg
ICAgICAgICAgIHBhcnNlQ2RhdGEoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgLy9jaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgcGFyc2VDaGFyYWN0ZXJzKCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFFYbWxTdHJlYW1SZWFkZXI6OkNvbW1lbnQ6IHsKKyAgICAgICAgICAgIHBhcnNlQ29tbWVudCgp
OworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRWG1sU3RyZWFt
UmVhZGVyOjpEVEQ6IHsKKyAgICAgICAgICAgIC8vcURlYnVnKCk8PCItLS0tLS0tLS0tLS0tIERU
RCI7CisgICAgICAgICAgICBwYXJzZUR0ZCgpOworICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBRWG1sU3RyZWFtUmVhZGVyOjpFbnRpdHlSZWZlcmVuY2U6IHsKKyAg
ICAgICAgICAgIC8vcURlYnVnKCk8PCItLS0tLS0tLS0tIEVOVElUWSA9ICI8PG1fc3RyZWFtLm5h
bWUoKS50b1N0cmluZygpCisgICAgICAgICAgICAvLyAgICAgICAgPDwiLCB0ID0gIjw8bV9zdHJl
YW0udGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoaXNYSFRNTERvY3VtZW50KCkp
IHsKKyAgICAgICAgICAgICAgICBRU3RyaW5nIGVudGl0eSA9IG1fc3RyZWFtLm5hbWUoKS50b1N0
cmluZygpOworICAgICAgICAgICAgICAgIFVDaGFyIGMgPSBkZWNvZGVOYW1lZEVudGl0eShlbnRp
dHkudG9VdGY4KCkuY29uc3REYXRhKCkpOworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRO
b2RlLT5pc1RleHROb2RlKCkgfHwgZW50ZXJUZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIoJmMs
IDEpOworICAgICAgICAgICAgICAgICAgICAvL3FEZWJ1ZygpPDwiIC0tLS0tLS0gYWRkaW5nIGVu
dGl0eSAiPDxzdHI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRleHQqPihtX2N1
cnJlbnROb2RlKS0+YXBwZW5kRGF0YShzdHIsIGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFFY
bWxTdHJlYW1SZWFkZXI6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjogeworICAgICAgICAgICAgcGFy
c2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGlmIChtX3N0cmVhbS5lcnJvcigpICE9
IFFYbWxTdHJlYW1SZWFkZXI6OlByZW1hdHVyZUVuZE9mRG9jdW1lbnRFcnJvcikgeworICAgICAg
ICAgICAgICAgIEVycm9yVHlwZSB0eXBlID0gKG1fc3RyZWFtLmVycm9yKCkgPT0gUVhtbFN0cmVh
bVJlYWRlcjo6Tm90V2VsbEZvcm1lZEVycm9yKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmYXRhbCA6IHdhcm5pbmc7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IodHlw
ZSwgcVByaW50YWJsZShtX3N0cmVhbS5lcnJvclN0cmluZygpKSwgbGluZU51bWJlcigpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcigpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Zv
aWQgWE1MVG9rZW5pemVyOjpzdGFydERvY3VtZW50KCkKK3sKKyAgICBpbml0aWFsaXplUGFyc2Vy
Q29udGV4dCgpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworCisgICAgaWYgKCFtX3BhcnNp
bmdGcmFnbWVudCkgeworICAgICAgICBtX2RvYy0+c2V0WE1MU3RhbmRhbG9uZShtX3N0cmVhbS5p
c1N0YW5kYWxvbmVEb2N1bWVudCgpLCBlYyk7CisKKyNpZiBRVF9WRVJTSU9OID49IDB4MDQwNDAw
CisgICAgICAgIFFTdHJpbmdSZWYgdmVyc2lvbiA9IG1fc3RyZWFtLmRvY3VtZW50VmVyc2lvbigp
OworICAgICAgICBpZiAoIXZlcnNpb24uaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9kb2MtPnNl
dFhNTFZlcnNpb24odmVyc2lvbiwgZWMpOworICAgICAgICBRU3RyaW5nUmVmIGVuY29kaW5nID0g
bV9zdHJlYW0uZG9jdW1lbnRFbmNvZGluZygpOworICAgICAgICBpZiAoIWVuY29kaW5nLmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIG1fZG9jLT5zZXRYTUxFbmNvZGluZyhlbmNvZGluZyk7CisjZW5k
aWYKKyAgICB9Cit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpwYXJzZVN0YXJ0RWxlbWVudCgpCit7
CisgICAgaWYgKCFtX3Nhd0ZpcnN0RWxlbWVudCAmJiBtX3BhcnNpbmdGcmFnbWVudCkgeworICAg
ICAgICAvLyBza2lwIGR1bW15IGVsZW1lbnQgZm9yIGZyYWdtZW50cworICAgICAgICBtX3Nhd0Zp
cnN0RWxlbWVudCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9zYXdGaXJz
dEVsZW1lbnQgPSB0cnVlOworCisgICAgZXhpdFRleHQoKTsKKworICAgIFN0cmluZyBsb2NhbE5h
bWUgPSBtX3N0cmVhbS5uYW1lKCk7CisgICAgU3RyaW5nIHVyaSAgICAgICA9IG1fc3RyZWFtLm5h
bWVzcGFjZVVyaSgpOworICAgIFN0cmluZyBwcmVmaXggICAgPSBwcmVmaXhGcm9tUU5hbWUobV9z
dHJlYW0ucXVhbGlmaWVkTmFtZSgpLnRvU3RyaW5nKCkpOworCisgICAgaWYgKG1fcGFyc2luZ0Zy
YWdtZW50ICYmIHVyaS5pc051bGwoKSkgeworICAgICAgICBRX0FTU0VSVCAocHJlZml4LmlzTnVs
bCgpKTsKKyAgICAgICAgdXJpID0gbV9kZWZhdWx0TmFtZXNwYWNlVVJJOworICAgIH0KKworICAg
IEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIFF1YWxpZmllZE5hbWUgcU5hbWUocHJlZml4LCBs
b2NhbE5hbWUsIHVyaSk7CisgICAgUmVmUHRyPEVsZW1lbnQ+IG5ld0VsZW1lbnQgPSBtX2RvYy0+
Y3JlYXRlRWxlbWVudChxTmFtZSwgdHJ1ZSwgZWMpOworICAgIGlmICghbmV3RWxlbWVudCkgewor
ICAgICAgICBzdG9wUGFyc2luZygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaGFu
ZGxlRWxlbWVudE5hbWVzcGFjZXMobmV3RWxlbWVudC5nZXQoKSwgbV9zdHJlYW0ubmFtZXNwYWNl
RGVjbGFyYXRpb25zKCksIGVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAgICAgc3RvcFBhcnNpbmco
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGhhbmRsZUVsZW1lbnRBdHRyaWJ1dGVz
KG5ld0VsZW1lbnQuZ2V0KCksIG1fc3RyZWFtLmF0dHJpYnV0ZXMoKSwgZWMpOworICAgIGlmIChl
YykgeworICAgICAgICBzdG9wUGFyc2luZygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgZXZlbnR1YWxseU1hcmtBc1BhcnNlckNyZWF0ZWQobmV3RWxlbWVudC5nZXQoKSk7CisKKyAg
ICBpZiAoaXNTY3JpcHRFbGVtZW50KG5ld0VsZW1lbnQuZ2V0KCkpKQorICAgICAgICBtX3Njcmlw
dFN0YXJ0TGluZSA9IGxpbmVOdW1iZXIoKTsKKworICAgIGlmICghbV9jdXJyZW50Tm9kZS0+YWRk
Q2hpbGQobmV3RWxlbWVudC5nZXQoKSkpIHsKKyAgICAgICAgc3RvcFBhcnNpbmcoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIHNldEN1cnJlbnROb2RlKG5ld0VsZW1lbnQuZ2V0KCkp
OworICAgIGlmIChtX3ZpZXcgJiYgIW5ld0VsZW1lbnQtPmF0dGFjaGVkKCkpCisgICAgICAgIG5l
d0VsZW1lbnQtPmF0dGFjaCgpOworfQorCit2b2lkIFhNTFRva2VuaXplcjo6cGFyc2VFbmRFbGVt
ZW50KCkKK3sKKyAgICBleGl0VGV4dCgpOworCisgICAgTm9kZSogbiA9IG1fY3VycmVudE5vZGU7
CisgICAgUmVmUHRyPE5vZGU+IHBhcmVudCA9IG4tPnBhcmVudE5vZGUoKTsKKyAgICBuLT5maW5p
c2hQYXJzaW5nQ2hpbGRyZW4oKTsKKworICAgIC8vIGRvbid0IGxvYWQgZXh0ZXJuYWwgc2NyaXB0
cyBmb3Igc3RhbmRhbG9uZSBkb2N1bWVudHMgKGZvciBub3cpCisgICAgaWYgKG4tPmlzRWxlbWVu
dE5vZGUoKSAmJiBtX3ZpZXcgJiYgaXNTY3JpcHRFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQq
PihuKSkpIHsKKyAgICAgICAgQVNTRVJUKCFtX3BlbmRpbmdTY3JpcHQpOworICAgICAgICBtX3Jl
cXVlc3RpbmdTY3JpcHQgPSB0cnVlOworCisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obik7IAorICAgICAgICBTY3JpcHRFbGVtZW50KiBzY3JpcHRFbGVt
ZW50ID0gY2FzdFRvU2NyaXB0RWxlbWVudChlbGVtZW50KTsKKworICAgICAgICBTdHJpbmcgc2Ny
aXB0SHJlZiA9IHNjcmlwdEVsZW1lbnQtPnNvdXJjZUF0dHJpYnV0ZVZhbHVlKCk7CisgICAgICAg
IGlmICghc2NyaXB0SHJlZi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBz
cmMgYXR0cmlidXRlCisgICAgICAgICAgICBTdHJpbmcgc2NyaXB0Q2hhcnNldCA9IHNjcmlwdEVs
ZW1lbnQtPmNoYXJzZXRBdHRyaWJ1dGVWYWx1ZSgpOworICAgICAgICAgICAgaWYgKChtX3BlbmRp
bmdTY3JpcHQgPSBtX2RvYy0+ZG9jTG9hZGVyKCktPnJlcXVlc3RTY3JpcHQoc2NyaXB0SHJlZiwg
c2NyaXB0Q2hhcnNldCkpKSB7CisgICAgICAgICAgICAgICAgbV9zY3JpcHRFbGVtZW50ID0gZWxl
bWVudDsKKyAgICAgICAgICAgICAgICBtX3BlbmRpbmdTY3JpcHQtPmFkZENsaWVudCh0aGlzKTsK
KworICAgICAgICAgICAgICAgIC8vIG1fcGVuZGluZ1NjcmlwdCB3aWxsIGJlIDAgaWYgc2NyaXB0
IHdhcyBhbHJlYWR5IGxvYWRlZCBhbmQgcmVmKCkgZXhlY3V0ZWQgaXQKKyAgICAgICAgICAgICAg
ICBpZiAobV9wZW5kaW5nU2NyaXB0KQorICAgICAgICAgICAgICAgICAgICBwYXVzZVBhcnNpbmco
KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG1fc2NyaXB0RWxlbWVudCA9
IDA7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBzY3JpcHRDb2RlID0g
c2NyaXB0RWxlbWVudC0+c2NyaXB0Q29udGVudCgpOworICAgICAgICAgICAgbV92aWV3LT5mcmFt
ZSgpLT5sb2FkZXIoKS0+ZXhlY3V0ZVNjcmlwdChtX2RvYy0+dXJsKCkuc3RyaW5nKCksIG1fc2Ny
aXB0U3RhcnRMaW5lLCBzY3JpcHRDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fcmVxdWVz
dGluZ1NjcmlwdCA9IGZhbHNlOworICAgIH0KKworICAgIHNldEN1cnJlbnROb2RlKHBhcmVudC5n
ZXQoKSk7Cit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpwYXJzZUNoYXJhY3RlcnMoKQoreworICAg
IGlmIChtX2N1cnJlbnROb2RlLT5pc1RleHROb2RlKCkgfHwgZW50ZXJUZXh0KCkpIHsKKyAgICAg
ICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIHN0YXRpY19jYXN0PFRleHQqPihtX2N1
cnJlbnROb2RlKS0+YXBwZW5kRGF0YShtX3N0cmVhbS50ZXh0KCksIGVjKTsKKyAgICB9Cit9CisK
K3ZvaWQgWE1MVG9rZW5pemVyOjpwYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigpCit7CisgICAg
ZXhpdFRleHQoKTsKKworICAgIC8vICMjIyBoYW5kbGUgZXhjZXB0aW9ucworICAgIGludCBleGNl
cHRpb24gPSAwOworICAgIFJlZlB0cjxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IHBpID0gbV9kb2Mt
PmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigKKyAgICAgICAgbV9zdHJlYW0ucHJvY2Vzc2lu
Z0luc3RydWN0aW9uVGFyZ2V0KCksCisgICAgICAgIG1fc3RyZWFtLnByb2Nlc3NpbmdJbnN0cnVj
dGlvbkRhdGEoKSwgZXhjZXB0aW9uKTsKKyAgICBpZiAoZXhjZXB0aW9uKQorICAgICAgICByZXR1
cm47CisKKyAgICBwaS0+c2V0Q3JlYXRlZEJ5UGFyc2VyKHRydWUpOworCisgICAgaWYgKCFtX2N1
cnJlbnROb2RlLT5hZGRDaGlsZChwaS5nZXQoKSkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAo
bV92aWV3ICYmICFwaS0+YXR0YWNoZWQoKSkKKyAgICAgICAgcGktPmF0dGFjaCgpOworCisgICAg
cGktPmZpbmlzaFBhcnNpbmdDaGlsZHJlbigpOworCisjaWYgRU5BQkxFKFhTTFQpCisgICAgbV9z
YXdYU0xUcmFuc2Zvcm0gPSAhbV9zYXdGaXJzdEVsZW1lbnQgJiYgcGktPmlzWFNMKCk7CisgICAg
aWYgKG1fc2F3WFNMVHJhbnNmb3JtICYmICFtX2RvYy0+dHJhbnNmb3JtU291cmNlRG9jdW1lbnQo
KSkpCisgICAgICAgIHN0b3BQYXJzaW5nKCk7CisjZW5kaWYKK30KKwordm9pZCBYTUxUb2tlbml6
ZXI6OnBhcnNlQ2RhdGEoKQoreworICAgIGV4aXRUZXh0KCk7CisKKyAgICBSZWZQdHI8Tm9kZT4g
bmV3Tm9kZSA9IG5ldyBDREFUQVNlY3Rpb24obV9kb2MsIG1fc3RyZWFtLnRleHQoKSk7CisgICAg
aWYgKCFtX2N1cnJlbnROb2RlLT5hZGRDaGlsZChuZXdOb2RlLmdldCgpKSkKKyAgICAgICAgcmV0
dXJuOworICAgIGlmIChtX3ZpZXcgJiYgIW5ld05vZGUtPmF0dGFjaGVkKCkpCisgICAgICAgIG5l
d05vZGUtPmF0dGFjaCgpOworfQorCit2b2lkIFhNTFRva2VuaXplcjo6cGFyc2VDb21tZW50KCkK
K3sKKyAgICBleGl0VGV4dCgpOworCisgICAgUmVmUHRyPE5vZGU+IG5ld05vZGUgPSBuZXcgQ29t
bWVudChtX2RvYywgbV9zdHJlYW0udGV4dCgpKTsKKyAgICBtX2N1cnJlbnROb2RlLT5hZGRDaGls
ZChuZXdOb2RlLmdldCgpKTsKKyAgICBpZiAobV92aWV3ICYmICFuZXdOb2RlLT5hdHRhY2hlZCgp
KQorICAgICAgICBuZXdOb2RlLT5hdHRhY2goKTsKK30KKwordm9pZCBYTUxUb2tlbml6ZXI6OmVu
ZERvY3VtZW50KCkKK3sKK30KKworYm9vbCBYTUxUb2tlbml6ZXI6Omhhc0Vycm9yKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9zdHJlYW0uaGFzRXJyb3IoKTsKK30KKworI2lmIFFUX1ZFUlNJT04g
PCAweDA0MDQwMAorc3RhdGljIFFTdHJpbmcgcGFyc2VJZChjb25zdCBRU3RyaW5nICZkdGQsIGlu
dCAqcG9zLCBib29sICpvaykKK3sKKyAgICAqb2sgPSB0cnVlOworICAgIGludCBzdGFydCA9ICpw
b3MgKyAxOworICAgIGludCBlbmQgPSBzdGFydDsKKyAgICBpZiAoZHRkLmF0KCpwb3MpID09IFFM
YXRpbjFDaGFyKCdcJycpKQorICAgICAgICB3aGlsZSAoc3RhcnQgPCBkdGQubGVuZ3RoKCkgJiYg
ZHRkLmF0KGVuZCkgIT0gUUxhdGluMUNoYXIoJ1wnJykpCisgICAgICAgICAgICArK2VuZDsKKyAg
ICBlbHNlIGlmIChkdGQuYXQoKnBvcykgPT0gUUxhdGluMUNoYXIoJ1wiJykpCisgICAgICAgIHdo
aWxlIChzdGFydCA8IGR0ZC5sZW5ndGgoKSAmJiBkdGQuYXQoZW5kKSAhPSBRTGF0aW4xQ2hhcign
XCInKSkKKyAgICAgICAgICAgICsrZW5kOworICAgIGVsc2UgeworICAgICAgICAqb2sgPSBmYWxz
ZTsKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICB9CisgICAgKnBvcyA9IGVuZCArIDE7
CisgICAgcmV0dXJuIGR0ZC5taWQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKK30KKyNlbmRpZgorCit2
b2lkIFhNTFRva2VuaXplcjo6cGFyc2VEdGQoKQoreworI2lmIFFUX1ZFUlNJT04gPj0gMHgwNDA0
MDAKKyAgICBRU3RyaW5nUmVmIG5hbWUgPSBtX3N0cmVhbS5kdGROYW1lKCk7CisgICAgUVN0cmlu
Z1JlZiBwdWJsaWNJZCA9IG1fc3RyZWFtLmR0ZFB1YmxpY0lkKCk7CisgICAgUVN0cmluZ1JlZiBz
eXN0ZW1JZCA9IG1fc3RyZWFtLmR0ZFN5c3RlbUlkKCk7CisjZWxzZQorICAgIFFTdHJpbmcgZHRk
ID0gbV9zdHJlYW0udGV4dCgpLnRvU3RyaW5nKCk7CisKKyAgICBpbnQgc3RhcnQgPSBkdGQuaW5k
ZXhPZigiPCFET0NUWVBFICIpICsgMTA7CisgICAgd2hpbGUgKHN0YXJ0IDwgZHRkLmxlbmd0aCgp
ICYmIGR0ZC5hdChzdGFydCkuaXNTcGFjZSgpKQorICAgICAgICArK3N0YXJ0OworICAgIGludCBl
bmQgPSBzdGFydDsKKyAgICB3aGlsZSAoc3RhcnQgPCBkdGQubGVuZ3RoKCkgJiYgIWR0ZC5hdChl
bmQpLmlzU3BhY2UoKSkKKyAgICAgICAgKytlbmQ7CisgICAgUVN0cmluZyBuYW1lID0gZHRkLm1p
ZChzdGFydCwgZW5kIC0gc3RhcnQpOworCisgICAgc3RhcnQgPSBlbmQ7CisgICAgd2hpbGUgKHN0
YXJ0IDwgZHRkLmxlbmd0aCgpICYmIGR0ZC5hdChzdGFydCkuaXNTcGFjZSgpKQorICAgICAgICAr
K3N0YXJ0OworICAgIGVuZCA9IHN0YXJ0OworICAgIHdoaWxlIChzdGFydCA8IGR0ZC5sZW5ndGgo
KSAmJiAhZHRkLmF0KGVuZCkuaXNTcGFjZSgpKQorICAgICAgICArK2VuZDsKKyAgICBRU3RyaW5n
IGlkID0gZHRkLm1pZChzdGFydCwgZW5kIC0gc3RhcnQpOworICAgIHN0YXJ0ID0gZW5kOworICAg
IHdoaWxlIChzdGFydCA8IGR0ZC5sZW5ndGgoKSAmJiBkdGQuYXQoc3RhcnQpLmlzU3BhY2UoKSkK
KyAgICAgICAgKytzdGFydDsKKyAgICBRU3RyaW5nIHB1YmxpY0lkOworICAgIFFTdHJpbmcgc3lz
dGVtSWQ7CisgICAgaWYgKGlkID09IFFMYXRpbjFTdHJpbmcoIlBVQkxJQyIpKSB7CisgICAgICAg
IGJvb2wgb2s7CisgICAgICAgIHB1YmxpY0lkID0gcGFyc2VJZChkdGQsICZzdGFydCwgJm9rKTsK
KyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZmF0YWwsICJJbnZh
bGlkIERPQ1RZUEUiLCBsaW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoc3RhcnQgPCBkdGQubGVuZ3RoKCkg
JiYgZHRkLmF0KHN0YXJ0KS5pc1NwYWNlKCkpCisgICAgICAgICAgICArK3N0YXJ0OworICAgICAg
ICBzeXN0ZW1JZCA9IHBhcnNlSWQoZHRkLCAmc3RhcnQsICZvayk7CisgICAgICAgIGlmICghb2sp
IHsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKGZhdGFsLCAiSW52YWxpZCBET0NUWVBFIiwgbGlu
ZU51bWJlcigpLCBjb2x1bW5OdW1iZXIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9IGVsc2UgaWYgKGlkID09IFFMYXRpbjFTdHJpbmcoIlNZU1RFTSIpKSB7CisgICAg
ICAgIGJvb2wgb2s7CisgICAgICAgIHN5c3RlbUlkID0gcGFyc2VJZChkdGQsICZzdGFydCwgJm9r
KTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZmF0YWwsICJJ
bnZhbGlkIERPQ1RZUEUiLCBsaW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaWQgPT0gUUxhdGluMVN0cmlu
ZygiWyIpIHx8IGlkID09IFFMYXRpbjFTdHJpbmcoIj4iKSkgeworICAgIH0gZWxzZSB7CisgICAg
ICAgIGhhbmRsZUVycm9yKGZhdGFsLCAiSW52YWxpZCBET0NUWVBFIiwgbGluZU51bWJlcigpLCBj
b2x1bW5OdW1iZXIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgICAgCisKKyAg
ICAvL3FEZWJ1ZygpIDw8IGR0ZCA8PCBuYW1lIDw8IHB1YmxpY0lkIDw8IHN5c3RlbUlkOworICAg
IGlmICgocHVibGljSWQgPT0gUUxhdGluMVN0cmluZygiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRy
YW5zaXRpb25hbC8vRU4iKSkKKyAgICAgICAgfHwgKHB1YmxpY0lkID09IFFMYXRpbjFTdHJpbmco
Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iKSkKKyAgICAgICAgfHwgKHB1YmxpY0lkID09IFFM
YXRpbjFTdHJpbmcoIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIikpCisgICAgICAg
IHx8IChwdWJsaWNJZCA9PSBRTGF0aW4xU3RyaW5nKCItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJh
bWVzZXQvL0VOIikpCisgICAgICAgIHx8IChwdWJsaWNJZCA9PSBRTGF0aW4xU3RyaW5nKCItLy9X
M0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIikpCisgICAgICAgIHx8IChwdWJsaWNJZCA9PSBR
TGF0aW4xU3RyaW5nKCItLy9XM0MvL0RURCBYSFRNTCAxLjEgcGx1cyBNYXRoTUwgMi4wLy9FTiIp
KQorICAgICAgICB8fCAocHVibGljSWQgPT0gUUxhdGluMVN0cmluZygiLS8vVzNDLy9EVEQgWEhU
TUwgMS4xIHBsdXMgTWF0aE1MIDIuMCBwbHVzIFNWRyAxLjEvL0VOIikpCisgICAgICAgIHx8IChw
dWJsaWNJZCA9PSBRTGF0aW4xU3RyaW5nKCItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAx
LjAvL0VOIikpKSB7CisgICAgICAgIHNldElzWEhUTUxEb2N1bWVudCh0cnVlKTsgLy8gY29udHJv
bHMgaWYgd2UgcmVwbGFjZSBlbnRpdGllcyBvciBub3QuCisgICAgfQorICAgIGlmICghbV9wYXJz
aW5nRnJhZ21lbnQpCisgICAgICAgIG1fZG9jLT5hZGRDaGlsZChEb2N1bWVudFR5cGU6OmNyZWF0
ZShtX2RvYywgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSk7CisgICAgCit9Cit9CisKKwotLSAK
MS41LjQuMwoK
</data>
<flag name="review"
          id="10170"
          type_id="1"
          status="+"
          setter="mrowe"
    />
          </attachment>
      

    </bug>

</bugzilla>