<?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>15681</bug_id>
          
          <creation_ts>2007-10-24 20:29:59 -0700</creation_ts>
          <short_desc>Add a new JSGlobalObject class and make Interpreter (and Context) use it</short_desc>
          <delta_ts>2007-10-24 23:49:17 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>523.x (Safari 3)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>59391</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-24 20:29:59 -0700</bug_when>
    <thetext>Add a new JSGlobalObject class and make Interpreter (and Context) use it

So I have a partial patch.  Not quite done because I ran into trouble with:
JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass)

which expects to be able to make a JSCallbackObject and pass that off as the global object.  I might have to make JSGlobalObject an interface instead of a class.  (That would also make things nicer for Window, which wants to inherit from DOMObject.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59397</commentid>
    <comment_count>1</comment_count>
      <attachid>16851</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-24 21:45:06 -0700</bug_when>
    <thetext>Created attachment 16851
a first stab (using templates, ick)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59399</commentid>
    <comment_count>2</comment_count>
      <attachid>16852</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-24 22:33:08 -0700</bug_when>
    <thetext>Created attachment 16852
full patch (minus changelog), 0.5% on SunSpider</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59401</commentid>
    <comment_count>3</comment_count>
      <attachid>16853</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-24 22:45:25 -0700</bug_when>
    <thetext>Created attachment 16853
full patch, 0.5% speedup on SunSpider</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59403</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-24 23:05:47 -0700</bug_when>
    <thetext>Actually, turns out this is 0.8% faster.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59404</commentid>
    <comment_count>5</comment_count>
      <attachid>16853</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-10-24 23:19:41 -0700</bug_when>
    <thetext>Comment on attachment 16853
full patch, 0.5% speedup on SunSpider

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59405</commentid>
    <comment_count>6</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-10-24 23:20:05 -0700</bug_when>
    <thetext>(assuming tests pass)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>59409</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-10-24 23:49:17 -0700</bug_when>
    <thetext>Landed as r27022.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>16851</attachid>
            <date>2007-10-24 21:45:06 -0700</date>
            <delta_ts>2007-10-24 22:33:08 -0700</delta_ts>
            <desc>a first stab (using templates, ick)</desc>
            <filename>stab.patch</filename>
            <type>text/plain</type>
            <size>65390</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjIsOSAr
MTIyLDggQEAgX19aTjNLSlMxMUludGVycHJldGVyNG1hcmtFdgogX19aTjNLSlMxMUludGVycHJl
dGVyNnNfaG9va0UKIF9fWk4zS0pTMTFJbnRlcnByZXRlcjhldmFsdWF0ZUVSS05TXzdVU3RyaW5n
RWlQS05TXzVVQ2hhckVpUE5TXzdKU1ZhbHVlRQogX19aTjNLSlMxMUludGVycHJldGVyOGV2YWx1
YXRlRVJLTlNfN1VTdHJpbmdFaVMzX1BOU183SlNWYWx1ZUUKLV9fWk4zS0pTMTFJbnRlcnByZXRl
ckMxRVBOU184SlNPYmplY3RFCitfX1pOM0tKUzExSW50ZXJwcmV0ZXJDMUVQTlNfMTRKU0dsb2Jh
bE9iamVjdEUKIF9fWk4zS0pTMTFJbnRlcnByZXRlckMxRXYKLV9fWk4zS0pTMTFJbnRlcnByZXRl
ckMyRVBOU184SlNPYmplY3RFCiBfX1pOM0tKUzExSW50ZXJwcmV0ZXJEMUV2CiBfX1pOM0tKUzEx
SW50ZXJwcmV0ZXJEMkV2CiBfX1pOM0tKUzExSlNJbW1lZGlhdGU0dHlwZUVQS05TXzdKU1ZhbHVl
RQpJbmRleDogSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tPYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0LmNwcAkocmV2aXNpb24g
MjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJBUElDYXN0LmgiCiAjaW5jbHVk
ZSAiSlNDYWxsYmFja0Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiSlNDbGFzc1JlZi5oIgorI2luY2x1
ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAiSlNPYmplY3RSZWYuaCIKICNpbmNsdWRl
ICJKU1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5LmgiCkBAIC0zOCw0
MzYgKzM5LDcgQEAKIAogbmFtZXNwYWNlIEtKUyB7CiAKLWNvbnN0IENsYXNzSW5mbyBKU0NhbGxi
YWNrT2JqZWN0OjppbmZvID0geyAiQ2FsbGJhY2tPYmplY3QiLCAwLCAwLCAwIH07Ci0KLUpTQ2Fs
bGJhY2tPYmplY3Q6OkpTQ2FsbGJhY2tPYmplY3QoRXhlY1N0YXRlKiBleGVjLCBKU0NsYXNzUmVm
IGpzQ2xhc3MsIEpTVmFsdWUqIHByb3RvdHlwZSwgdm9pZCogZGF0YSkKLSAgICA6IEpTT2JqZWN0
KHByb3RvdHlwZSkKLSAgICAsIG1fY2xhc3MoMCkKLSAgICAsIG1faXNJbml0aWFsaXplZChmYWxz
ZSkKLXsKLSAgICBpbml0KGV4ZWMsIGpzQ2xhc3MsIGRhdGEpOwotfQotCi12b2lkIEpTQ2FsbGJh
Y2tPYmplY3Q6OmluaXQoRXhlY1N0YXRlKiBleGVjLCBKU0NsYXNzUmVmIGpzQ2xhc3MsIHZvaWQq
IGRhdGEpCi17Ci0gICAgbV9wcml2YXRlRGF0YSA9IGRhdGE7Ci0gICAgSlNDbGFzc1JlZiBvbGRD
bGFzcyA9IG1fY2xhc3M7Ci0gICAgbV9jbGFzcyA9IEpTQ2xhc3NSZXRhaW4oanNDbGFzcyk7Ci0g
ICAgaWYgKG9sZENsYXNzKQotICAgICAgICBKU0NsYXNzUmVsZWFzZShvbGRDbGFzcyk7Ci0KLSAg
ICBpZiAoIWV4ZWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxKU09iamVjdEluaXRp
YWxpemVDYWxsYmFjaywgMTY+IGluaXRSb3V0aW5lczsKLSAgICBkbyB7Ci0gICAgICAgIGlmIChK
U09iamVjdEluaXRpYWxpemVDYWxsYmFjayBpbml0aWFsaXplID0ganNDbGFzcy0+aW5pdGlhbGl6
ZSkKLSAgICAgICAgICAgIGluaXRSb3V0aW5lcy5hcHBlbmQoaW5pdGlhbGl6ZSk7Ci0gICAgfSB3
aGlsZSAoKGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykpOwotICAgIAotICAgIC8vIGlu
aXRpYWxpemUgZnJvbSBiYXNlIHRvIGRlcml2ZWQKLSAgICBmb3IgKGludCBpID0gc3RhdGljX2Nh
c3Q8aW50Pihpbml0Um91dGluZXMuc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAg
IEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgSlNPYmplY3RJbml0
aWFsaXplQ2FsbGJhY2sgaW5pdGlhbGl6ZSA9IGluaXRSb3V0aW5lc1tpXTsKLSAgICAgICAgaW5p
dGlhbGl6ZSh0b1JlZihleGVjKSwgdG9SZWYodGhpcykpOwotICAgIH0KLSAgICBtX2lzSW5pdGlh
bGl6ZWQgPSB0cnVlOwotfQotCi1KU0NhbGxiYWNrT2JqZWN0Ojp+SlNDYWxsYmFja09iamVjdCgp
Ci17Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIAotICAgIGZv
ciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xh
c3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoSlNPYmplY3RGaW5hbGl6ZUNhbGxiYWNrIGZp
bmFsaXplID0ganNDbGFzcy0+ZmluYWxpemUpIHsKLSAgICAgICAgICAgIGZpbmFsaXplKHRoaXNS
ZWYpOwotICAgICAgICB9Ci0gICAgCi0gICAgSlNDbGFzc1JlbGVhc2UobV9jbGFzcyk7Ci19Ci0K
LXZvaWQgSlNDYWxsYmFja09iamVjdDo6aW5pdGlhbGl6ZUlmTmVlZGVkKEV4ZWNTdGF0ZSogZXhl
YykKLXsKLSAgICBpZiAobV9pc0luaXRpYWxpemVkKQotICAgICAgICByZXR1cm47Ci0gICAgaW5p
dChleGVjLCBtX2NsYXNzLCBtX3ByaXZhdGVEYXRhKTsKLX0KLQotVVN0cmluZyBKU0NhbGxiYWNr
T2JqZWN0OjpjbGFzc05hbWUoKSBjb25zdAotewotICAgIGlmICghbV9jbGFzcy0+Y2xhc3NOYW1l
LmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gbV9jbGFzcy0+Y2xhc3NOYW1lOwotICAgIAotICAg
IHJldHVybiBKU09iamVjdDo6Y2xhc3NOYW1lKCk7Ci19Ci0KLWJvb2wgSlNDYWxsYmFja09iamVj
dDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYg
cHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgSlNDb250ZXh0UmVmIGN0
eCA9IHRvUmVmKGV4ZWMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsK
LSAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0
cmluZygpLnJlcCgpKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsg
anNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAgIC8vIG9w
dGlvbmFsIG9wdGltaXphdGlvbiB0byBieXBhc3MgZ2V0UHJvcGVydHkgaW4gY2FzZXMgd2hlbiB3
ZSBvbmx5IG5lZWQgdG8ga25vdyBpZiB0aGUgcHJvcGVydHkgZXhpc3RzCi0gICAgICAgIGlmIChK
U09iamVjdEhhc1Byb3BlcnR5Q2FsbGJhY2sgaGFzUHJvcGVydHkgPSBqc0NsYXNzLT5oYXNQcm9w
ZXJ0eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwot
ICAgICAgICAgICAgaWYgKGhhc1Byb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVm
KSkgewotICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIGNhbGxiYWNrR2V0dGVy
KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fSBlbHNlIGlmIChKU09iamVjdEdldFByb3BlcnR5Q2FsbGJhY2sgZ2V0UHJvcGVydHkgPSBqc0Ns
YXNzLT5nZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJv
cEFsbExvY2tzOwotICAgICAgICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBnZXRQcm9wZXJ0
eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xv
dCgpKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgdmFsdWUgc28gd2UgZG9uJ3Qg
aGF2ZSB0byBjb21wdXRlIGl0IGFnYWluCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMg
dmlvbGF0ZXMgdGhlIFByb3BlcnR5U2xvdCBkZXNpZ24gYSBsaXR0bGUgYml0LgotICAgICAgICAg
ICAgICAgIC8vIFdlIHNob3VsZCBlaXRoZXIgdXNlIHRoaXMgb3B0aW1pemF0aW9uIGV2ZXJ5d2hl
cmUsIG9yIG5vd2hlcmUuCi0gICAgICAgICAgICAgICAgc2xvdC5zZXRDdXN0b20ocmVpbnRlcnBy
ZXRfY2FzdDxKU09iamVjdCo+KHRvSlModmFsdWUpKSwgY2FjaGVkVmFsdWVHZXR0ZXIpOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMg
PSBqc0NsYXNzLT5zdGF0aWNWYWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0aWNWYWx1ZXMt
PmNvbnRhaW5zKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7Ci0gICAgICAgICAgICAg
ICAgc2xvdC5zZXRDdXN0b20odGhpcywgc3RhdGljVmFsdWVHZXR0ZXIpOwotICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAg
ICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0
aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9ucykgewotICAgICAgICAgICAgaWYgKHN0YXRp
Y0Z1bmN0aW9ucy0+Y29udGFpbnMocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKLSAg
ICAgICAgICAgICAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBzdGF0aWNGdW5jdGlvbkdldHRlcik7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICByZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChleGVjLCBw
cm9wZXJ0eU5hbWUsIHNsb3QpOwotfQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmdldE93blBy
b3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgUHJvcGVy
dHlTbG90JiBzbG90KQotewotICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgSWRl
bnRpZmllcjo6ZnJvbShwcm9wZXJ0eU5hbWUpLCBzbG90KTsKLX0KLQotdm9pZCBKU0NhbGxiYWNr
T2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5h
bWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKLXsKLSAgICBKU0NvbnRleHRSZWYgY3R4ID0g
dG9SZWYoZXhlYyk7Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAg
IEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5n
KCkucmVwKCkpOwotICAgIEpTVmFsdWVSZWYgdmFsdWVSZWYgPSB0b1JlZih2YWx1ZSk7Ci0KLSAg
ICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBq
c0NsYXNzLT5wYXJlbnRDbGFzcykgewotICAgICAgICBpZiAoSlNPYmplY3RTZXRQcm9wZXJ0eUNh
bGxiYWNrIHNldFByb3BlcnR5ID0ganNDbGFzcy0+c2V0UHJvcGVydHkpIHsKLSAgICAgICAgICAg
IEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAgIGlmIChzZXRQ
cm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdmFsdWVSZWYsIHRvUmVmKGV4
ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotICAgIAotICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUqIHN0
YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgewotICAgICAgICAgICAgaWYgKFN0
YXRpY1ZhbHVlRW50cnkqIGVudHJ5ID0gc3RhdGljVmFsdWVzLT5nZXQocHJvcGVydHlOYW1lLnVz
dHJpbmcoKS5yZXAoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMg
JiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5KQotICAgICAgICAgICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgICAgICAgICAgaWYgKEpTT2JqZWN0U2V0UHJvcGVydHlDYWxsYmFjayBzZXRQ
cm9wZXJ0eSA9IGVudHJ5LT5zZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICBKU0xv
Y2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChz
ZXRQcm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdmFsdWVSZWYsIHRvUmVm
KGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9y
KGV4ZWMsIFJlZmVyZW5jZUVycm9yLCAiQXR0ZW1wdCB0byBzZXQgYSBwcm9wZXJ0eSB0aGF0IGlz
IG5vdCBzZXR0YWJsZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAg
ICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNGdW5j
dGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChTdGF0
aWNGdW5jdGlvbkVudHJ5KiBlbnRyeSA9IHN0YXRpY0Z1bmN0aW9ucy0+Z2V0KHByb3BlcnR5TmFt
ZS51c3RyaW5nKCkucmVwKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5hdHRyaWJ1
dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSkKLSAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICAgICAgICAgIHB1dERpcmVjdChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBh
dHRyKTsgLy8gcHV0IGFzIG92ZXJyaWRlIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEpTT2JqZWN0
OjpwdXQoZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSwgYXR0cik7Ci19Ci0KLXZvaWQgSlNDYWxs
YmFja09iamVjdDo6cHV0KEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBK
U1ZhbHVlKiB2YWx1ZSwgaW50IGF0dHIpCi17Ci0gICAgcmV0dXJuIHB1dChleGVjLCBJZGVudGlm
aWVyOjpmcm9tKHByb3BlcnR5TmFtZSksIHZhbHVlLCBhdHRyKTsKLX0KLQotYm9vbCBKU0NhbGxi
YWNrT2JqZWN0OjpkZWxldGVQcm9wZXJ0eShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZp
ZXImIHByb3BlcnR5TmFtZSkKLXsKLSAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7
Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIEpTU3RyaW5nUmVm
IHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOwot
ICAgIAotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganND
bGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAgIGlmIChKU09iamVjdERlbGV0
ZVByb3BlcnR5Q2FsbGJhY2sgZGVsZXRlUHJvcGVydHkgPSBqc0NsYXNzLT5kZWxldGVQcm9wZXJ0
eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAg
ICAgICAgICAgaWYgKGRlbGV0ZVByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVm
LCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNWYWx1
ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFsdWVzKSB7Ci0gICAgICAg
ICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdldChwcm9w
ZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+
YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSkKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoT3BhcXVlSlNDbGFz
czo6U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRp
Y0Z1bmN0aW9ucykgewotICAgICAgICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5
ID0gc3RhdGljRnVuY3Rpb25zLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsK
LSAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJp
YnV0ZURvbnREZWxldGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiBKU09iamVjdDo6ZGVsZXRlUHJvcGVydHkoZXhlYywgcHJvcGVydHlOYW1l
KTsKLX0KLQotYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjpkZWxldGVQcm9wZXJ0eShFeGVjU3RhdGUq
IGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSkKLXsKLSAgICByZXR1cm4gZGVsZXRlUHJvcGVy
dHkoZXhlYywgSWRlbnRpZmllcjo6ZnJvbShwcm9wZXJ0eU5hbWUpKTsKLX0KLQotYm9vbCBKU0Nh
bGxiYWNrT2JqZWN0OjppbXBsZW1lbnRzQ29uc3RydWN0KCkgY29uc3QKLXsKLSAgICBmb3IgKEpT
Q2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5w
YXJlbnRDbGFzcykKLSAgICAgICAgaWYgKGpzQ2xhc3MtPmNhbGxBc0NvbnN0cnVjdG9yKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUpTT2JqZWN0
KiBKU0NhbGxiYWNrT2JqZWN0Ojpjb25zdHJ1Y3QoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBMaXN0
JiBhcmdzKQotewotICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7Ci0gICAg
SlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIAotICAgIGZvciAoSlNDbGFz
c1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVu
dENsYXNzKSB7Ci0gICAgICAgIGlmIChKU09iamVjdENhbGxBc0NvbnN0cnVjdG9yQ2FsbGJhY2sg
Y2FsbEFzQ29uc3RydWN0b3IgPSBqc0NsYXNzLT5jYWxsQXNDb25zdHJ1Y3RvcikgewotICAgICAg
ICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3Muc2l6ZSgpKTsK
LSAgICAgICAgICAgIFZlY3RvcjxKU1ZhbHVlUmVmLCAxNj4gYXJndW1lbnRzKGFyZ3VtZW50Q291
bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50OyBpKysp
Ci0gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gdG9SZWYoYXJnc1tpXSk7Ci0gICAgICAg
ICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICByZXR1
cm4gdG9KUyhjYWxsQXNDb25zdHJ1Y3RvcihleGVjUmVmLCB0aGlzUmVmLCBhcmd1bWVudENvdW50
LCBhcmd1bWVudHMuZGF0YSgpLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1lbnRzQ29uc3RydWN0
IHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgaGVyZQotICAgIHJldHVybiAwOwotfQot
Ci1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmltcGxlbWVudHNIYXNJbnN0YW5jZSgpIGNvbnN0Ci17
Ci0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNz
ID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChqc0NsYXNzLT5oYXNJbnN0YW5j
ZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIEpTQ2FsbGJhY2tPYmplY3Q6Omhhc0luc3RhbmNlKEV4ZWNTdGF0ZSAqZXhlYywgSlNWYWx1
ZSAqdmFsdWUpCi17Ci0gICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKLSAg
ICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KLSAgICBmb3IgKEpTQ2xhc3NS
ZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRD
bGFzcykKLSAgICAgICAgaWYgKEpTT2JqZWN0SGFzSW5zdGFuY2VDYWxsYmFjayBoYXNJbnN0YW5j
ZSA9IGpzQ2xhc3MtPmhhc0luc3RhbmNlKSB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxM
b2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICByZXR1cm4gaGFzSW5zdGFuY2UoZXhlY1Jl
ZiwgdGhpc1JlZiwgdG9SZWYodmFsdWUpLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKTsK
LSAgICAgICAgfQotCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1lbnRzSGFzSW5zdGFuY2Ugc2hv
dWxkIHByZXZlbnQgdXMgZnJvbSByZWFjaGluZyBoZXJlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQot
Ym9vbCBKU0NhbGxiYWNrT2JqZWN0OjppbXBsZW1lbnRzQ2FsbCgpIGNvbnN0Ci17Ci0gICAgZm9y
IChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFz
cy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChqc0NsYXNzLT5jYWxsQXNGdW5jdGlvbikKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotSlNW
YWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBK
U09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCAmYXJncykKLXsKLSAgICBKU0NvbnRleHRSZWYg
ZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0
aGlzKTsKLSAgICBKU09iamVjdFJlZiB0aGlzT2JqUmVmID0gdG9SZWYodGhpc09iaik7Ci0KLSAg
ICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBq
c0NsYXNzLT5wYXJlbnRDbGFzcykgewotICAgICAgICBpZiAoSlNPYmplY3RDYWxsQXNGdW5jdGlv
bkNhbGxiYWNrIGNhbGxBc0Z1bmN0aW9uID0ganNDbGFzcy0+Y2FsbEFzRnVuY3Rpb24pIHsKLSAg
ICAgICAgICAgIGludCBhcmd1bWVudENvdW50ID0gc3RhdGljX2Nhc3Q8aW50PihhcmdzLnNpemUo
KSk7Ci0gICAgICAgICAgICBWZWN0b3I8SlNWYWx1ZVJlZiwgMTY+IGFyZ3VtZW50cyhhcmd1bWVu
dENvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDb3VudDsg
aSsrKQotICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IHRvUmVmKGFyZ3NbaV0pOwotICAg
ICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAgICAgICAgICAg
cmV0dXJuIHRvSlMoY2FsbEFzRnVuY3Rpb24oZXhlY1JlZiwgdGhpc1JlZiwgdGhpc09ialJlZiwg
YXJndW1lbnRDb3VudCwgYXJndW1lbnRzLmRhdGEoKSwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xv
dCgpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1lbnRz
Q2FsbCBzaG91bGQgcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIGhlcmUKLSAgICByZXR1cm4gMDsK
LX0KLQotdm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpnZXRQcm9wZXJ0eU5hbWVzKEV4ZWNTdGF0ZSog
ZXhlYywgUHJvcGVydHlOYW1lQXJyYXkmIHByb3BlcnR5TmFtZXMpCi17Ci0gICAgSlNDb250ZXh0
UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9S
ZWYodGhpcyk7Ci0KLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xh
c3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgewotICAgICAgICBpZiAoSlNPYmpl
Y3RHZXRQcm9wZXJ0eU5hbWVzQ2FsbGJhY2sgZ2V0UHJvcGVydHlOYW1lcyA9IGpzQ2xhc3MtPmdl
dFByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BB
bGxMb2NrczsKLSAgICAgICAgICAgIGdldFByb3BlcnR5TmFtZXMoZXhlY1JlZiwgdGhpc1JlZiwg
dG9SZWYoJnByb3BlcnR5TmFtZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChPcGFxdWVK
U0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGlj
VmFsdWVzKSB7Ci0gICAgICAgICAgICB0eXBlZGVmIE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVl
c1RhYmxlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgICAgIGl0ZXJhdG9yIGVu
ZCA9IHN0YXRpY1ZhbHVlcy0+ZW5kKCk7Ci0gICAgICAgICAgICBmb3IgKGl0ZXJhdG9yIGl0ID0g
c3RhdGljVmFsdWVzLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgICAg
ICBVU3RyaW5nOjpSZXAqIG5hbWUgPSBpdC0+Zmlyc3QuZ2V0KCk7Ci0gICAgICAgICAgICAgICAg
U3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgIGlm
IChlbnRyeS0+Z2V0UHJvcGVydHkgJiYgIShlbnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5
QXR0cmlidXRlRG9udEVudW0pKQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVzLmFk
ZChJZGVudGlmaWVyKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25z
ID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7Ci0gICAgICAgICAgICB0eXBlZGVmIE9wYXF1
ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsK
LSAgICAgICAgICAgIGl0ZXJhdG9yIGVuZCA9IHN0YXRpY0Z1bmN0aW9ucy0+ZW5kKCk7Ci0gICAg
ICAgICAgICBmb3IgKGl0ZXJhdG9yIGl0ID0gc3RhdGljRnVuY3Rpb25zLT5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBVU3RyaW5nOjpSZXAqIG5hbWUgPSBpdC0+
Zmlyc3QuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgU3RhdGljRnVuY3Rpb25FbnRyeSogZW50cnkg
PSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgIGlmICghKGVudHJ5LT5hdHRyaWJ1dGVzICYg
a0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RW51bSkpCi0gICAgICAgICAgICAgICAgICAgIHByb3Bl
cnR5TmFtZXMuYWRkKElkZW50aWZpZXIobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotCi0gICAgSlNPYmplY3Q6OmdldFByb3BlcnR5TmFtZXMoZXhlYywgcHJvcGVydHlO
YW1lcyk7Ci19Ci0KLWRvdWJsZSBKU0NhbGxiYWNrT2JqZWN0Ojp0b051bWJlcihFeGVjU3RhdGUq
IGV4ZWMpIGNvbnN0Ci17Ci0gICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwotICAg
IEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKLQotICAgIGZvciAoSlNDbGFzc1Jl
ZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENs
YXNzKQotICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0VG9UeXBlQ2FsbGJhY2sgY29udmVydFRv
VHlwZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsKLSAgICAgICAgICAgIEpTTG9jazo6RHJv
cEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVl
ID0gY29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtKU1R5cGVOdW1iZXIsIHRvUmVmKGV4ZWMt
PmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKS0+
Z2V0TnVtYmVyKCk7Ci0gICAgICAgIH0KLQotICAgIHJldHVybiBKU09iamVjdDo6dG9OdW1iZXIo
ZXhlYyk7Ci19Ci0KLVVTdHJpbmcgSlNDYWxsYmFja09iamVjdDo6dG9TdHJpbmcoRXhlY1N0YXRl
KiBleGVjKSBjb25zdAotewotICAgIEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKLSAg
ICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KLSAgICBmb3IgKEpTQ2xhc3NS
ZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRD
bGFzcykKLSAgICAgICAgaWYgKEpTT2JqZWN0Q29udmVydFRvVHlwZUNhbGxiYWNrIGNvbnZlcnRU
b1R5cGUgPSBqc0NsYXNzLT5jb252ZXJ0VG9UeXBlKSB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRy
b3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1
ZSA9IGNvbnZlcnRUb1R5cGUoY3R4LCB0aGlzUmVmLCBrSlNUeXBlU3RyaW5nLCB0b1JlZihleGVj
LT5leGNlcHRpb25TbG90KCkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9KUyh2YWx1ZSkt
PmdldFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICByZXR1cm4gSlNPYmplY3Q6OnRvU3RyaW5n
KGV4ZWMpOwotfQotCi12b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OnNldFByaXZhdGUodm9pZCogZGF0
YSkKLXsKLSAgICBtX3ByaXZhdGVEYXRhID0gZGF0YTsKLX0KLQotdm9pZCogSlNDYWxsYmFja09i
amVjdDo6Z2V0UHJpdmF0ZSgpCi17Ci0gICAgcmV0dXJuIG1fcHJpdmF0ZURhdGE7Ci19Ci0KLWJv
b2wgSlNDYWxsYmFja09iamVjdDo6aW5oZXJpdHMoSlNDbGFzc1JlZiBjKSBjb25zdAotewotICAg
IGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpz
Q2xhc3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoanNDbGFzcyA9PSBjKQotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUpTVmFsdWUqIEpTQ2Fs
bGJhY2tPYmplY3Q6OmNhY2hlZFZhbHVlR2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgY29u
c3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKLXsKLSAgICBKU1ZhbHVl
KiB2ID0gc2xvdC5zbG90QmFzZSgpOwotICAgIEFTU0VSVCh2KTsKLSAgICByZXR1cm4gdjsKLX0K
LQotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6c3RhdGljVmFsdWVHZXR0ZXIoRXhlY1N0YXRl
KiBleGVjLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3Qg
UHJvcGVydHlTbG90JiBzbG90KQotewotICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCktPmluaGVy
aXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSk7Ci0gICAgSlNDYWxsYmFja09iamVjdCogdGhp
c09iaiA9IHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNlKCkpOwot
Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXNPYmopOwotICAgIEpTU3RyaW5n
UmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkp
OwotCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNzOyBqc0Ns
YXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChPcGFxdWVK
U0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGlj
VmFsdWVzKQotICAgICAgICAgICAgaWYgKFN0YXRpY1ZhbHVlRW50cnkqIGVudHJ5ID0gc3RhdGlj
VmFsdWVzLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpCi0gICAgICAgICAgICAg
ICAgaWYgKEpTT2JqZWN0R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQcm9wZXJ0eSA9IGVudHJ5LT5n
ZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBk
cm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0g
Z2V0UHJvcGVydHkodG9SZWYoZXhlYyksIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYo
ZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dG9KUyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgcmV0dXJuIHRocm93RXJyb3Io
ZXhlYywgUmVmZXJlbmNlRXJyb3IsICJTdGF0aWMgdmFsdWUgcHJvcGVydHkgZGVmaW5lZCB3aXRo
IE5VTEwgZ2V0UHJvcGVydHkgY2FsbGJhY2suIik7Ci19Ci0KLUpTVmFsdWUqIEpTQ2FsbGJhY2tP
YmplY3Q6OnN0YXRpY0Z1bmN0aW9uR2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBj
b25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkK
LXsKLSAgICBBU1NFUlQoc2xvdC5zbG90QmFzZSgpLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVj
dDo6aW5mbykpOwotICAgIEpTQ2FsbGJhY2tPYmplY3QqIHRoaXNPYmogPSBzdGF0aWNfY2FzdDxK
U0NhbGxiYWNrT2JqZWN0Kj4oc2xvdC5zbG90QmFzZSgpKTsKLQotICAgIGlmIChKU1ZhbHVlKiBj
YWNoZWRPck92ZXJyaWRlVmFsdWUgPSB0aGlzT2JqLT5nZXREaXJlY3QocHJvcGVydHlOYW1lKSkK
LSAgICAgICAgcmV0dXJuIGNhY2hlZE9yT3ZlcnJpZGVWYWx1ZTsKLQotICAgIGZvciAoSlNDbGFz
c1JlZiBqc0NsYXNzID0gdGhpc09iai0+bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xh
c3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5j
dGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7
Ci0gICAgICAgICAgICBpZiAoU3RhdGljRnVuY3Rpb25FbnRyeSogZW50cnkgPSBzdGF0aWNGdW5j
dGlvbnMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAgICAg
ICAgIGlmIChKU09iamVjdENhbGxBc0Z1bmN0aW9uQ2FsbGJhY2sgY2FsbEFzRnVuY3Rpb24gPSBl
bnRyeS0+Y2FsbEFzRnVuY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPYmplY3QqIG8g
PSBuZXcgSlNDYWxsYmFja0Z1bmN0aW9uKGV4ZWMsIGNhbGxBc0Z1bmN0aW9uLCBwcm9wZXJ0eU5h
bWUpOwotICAgICAgICAgICAgICAgICAgICB0aGlzT2JqLT5wdXREaXJlY3QocHJvcGVydHlOYW1l
LCBvLCBlbnRyeS0+YXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFJlZmVyZW5jZUVycm9yLCAiU3RhdGljIGZ1bmN0aW9u
IHByb3BlcnR5IGRlZmluZWQgd2l0aCBOVUxMIGNhbGxBc0Z1bmN0aW9uIGNhbGxiYWNrLiIpOwot
fQotCi1KU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWxsYmFja0dldHRlcihFeGVjU3RhdGUq
IGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQ
cm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgQVNTRVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5oZXJp
dHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsKLSAgICBKU0NhbGxiYWNrT2JqZWN0KiB0aGlz
T2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0K
LSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpc09iaik7Ci0gICAgSlNTdHJpbmdS
ZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7
Ci0KLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNPYmotPm1fY2xhc3M7IGpzQ2xh
c3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKLSAgICAgICAgaWYgKEpTT2JqZWN0
R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQcm9wZXJ0eSA9IGpzQ2xhc3MtPmdldFByb3BlcnR5KSB7
Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAg
ICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1ZSA9IGdldFByb3BlcnR5KHRvUmVmKGV4ZWMpLCB0aGlz
UmVmLCBwcm9wZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAg
ICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgcmV0dXJu
IHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJoYXNQcm9wZXJ0eSBjYWxsYmFjayBy
ZXR1cm5lZCB0cnVlIGZvciBhIHByb3BlcnR5IHRoYXQgZG9lc24ndCBleGlzdC4iKTsKLX0KK3Rl
bXBsYXRlIDw+IGNvbnN0IENsYXNzSW5mbyBKU0NhbGxiYWNrT2JqZWN0PEpTT2JqZWN0Pjo6aW5m
byA9IHsgIkNhbGxiYWNrT2JqZWN0IiwgMCwgMCwgMCB9OwordGVtcGxhdGUgPD4gY29uc3QgQ2xh
c3NJbmZvIEpTQ2FsbGJhY2tPYmplY3Q8SlNHbG9iYWxPYmplY3Q+OjppbmZvID0geyAiQ2FsbGJh
Y2tHbG9iYWxPYmplY3QiLCAwLCAwLCAwIH07CiAKIH0gLy8gbmFtZXNwYWNlIEtKUwpJbmRleDog
SmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZh
U2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdC5oCShyZXZpc2lvbiAyNzAwNykKKysrIEph
dmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTMx
LDkgKzMxLDE5IEBACiAjaW5jbHVkZSAiSlNWYWx1ZVJlZi5oIgogI2luY2x1ZGUgIm9iamVjdC5o
IgogCisjaW5jbHVkZSAiQVBJQ2FzdC5oIgorI2luY2x1ZGUgIkpTQ2FsbGJhY2tGdW5jdGlvbi5o
IgorI2luY2x1ZGUgIkpTQ2xhc3NSZWYuaCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgor
I2luY2x1ZGUgIkpTU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAiUHJvcGVydHlOYW1lQXJyYXkuaCIK
KyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwogbmFtZXNw
YWNlIEtKUyB7CiAKLWNsYXNzIEpTQ2FsbGJhY2tPYmplY3QgOiBwdWJsaWMgSlNPYmplY3QKK3Rl
bXBsYXRlIDxjbGFzcyBCYXNlPgorY2xhc3MgSlNDYWxsYmFja09iamVjdCA6IHB1YmxpYyBCYXNl
CiB7CiBwdWJsaWM6CiAgICAgSlNDYWxsYmFja09iamVjdChFeGVjU3RhdGUqLCBKU0NsYXNzUmVm
LCBKU1ZhbHVlKiBwcm90b3R5cGUsIHZvaWQqIGRhdGEpOwpAQCAtOTAsNiArMTAwLDQ2NCBAQCBw
cml2YXRlOgogICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOwogfTsKIAordGVtcGxhdGUgPGNsYXNz
IEJhc2U+CitKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpKU0NhbGxiYWNrT2JqZWN0KEV4ZWNTdGF0
ZSogZXhlYywgSlNDbGFzc1JlZiBqc0NsYXNzLCBKU1ZhbHVlKiBwcm90b3R5cGUsIHZvaWQqIGRh
dGEpCis6IEJhc2UocHJvdG90eXBlKQorLCBtX2NsYXNzKDApCissIG1faXNJbml0aWFsaXplZChm
YWxzZSkKK3sKKyAgICBpbml0KGV4ZWMsIGpzQ2xhc3MsIGRhdGEpOworfQorCit0ZW1wbGF0ZSA8
Y2xhc3MgQmFzZT4KK3ZvaWQgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6aW5pdChFeGVjU3RhdGUq
IGV4ZWMsIEpTQ2xhc3NSZWYganNDbGFzcywgdm9pZCogZGF0YSkKK3sKKyAgICBtX3ByaXZhdGVE
YXRhID0gZGF0YTsKKyAgICBKU0NsYXNzUmVmIG9sZENsYXNzID0gbV9jbGFzczsKKyAgICBtX2Ns
YXNzID0gSlNDbGFzc1JldGFpbihqc0NsYXNzKTsKKyAgICBpZiAob2xkQ2xhc3MpCisgICAgICAg
IEpTQ2xhc3NSZWxlYXNlKG9sZENsYXNzKTsKKyAgICAKKyAgICBpZiAoIWV4ZWMpCisgICAgICAg
IHJldHVybjsKKyAgICAKKyAgICBWZWN0b3I8SlNPYmplY3RJbml0aWFsaXplQ2FsbGJhY2ssIDE2
PiBpbml0Um91dGluZXM7CisgICAgZG8geworICAgICAgICBpZiAoSlNPYmplY3RJbml0aWFsaXpl
Q2FsbGJhY2sgaW5pdGlhbGl6ZSA9IGpzQ2xhc3MtPmluaXRpYWxpemUpCisgICAgICAgICAgICBp
bml0Um91dGluZXMuYXBwZW5kKGluaXRpYWxpemUpOworICAgIH0gd2hpbGUgKChqc0NsYXNzID0g
anNDbGFzcy0+cGFyZW50Q2xhc3MpKTsKKyAgICAKKyAgICAvLyBpbml0aWFsaXplIGZyb20gYmFz
ZSB0byBkZXJpdmVkCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oaW5pdFJvdXRp
bmVzLnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBKU0xvY2s6OkRyb3BBbGxM
b2NrcyBkcm9wQWxsTG9ja3M7CisgICAgICAgIEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrIGlu
aXRpYWxpemUgPSBpbml0Um91dGluZXNbaV07CisgICAgICAgIGluaXRpYWxpemUodG9SZWYoZXhl
YyksIHRvUmVmKHRoaXMpKTsKKyAgICB9CisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30K
KwordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitKU0NhbGxiYWNrT2JqZWN0PEJhc2U+Ojp+SlNDYWxs
YmFja09iamVjdCgpCit7CisgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwor
ICAgIAorICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganND
bGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoSlNPYmplY3RGaW5hbGl6
ZUNhbGxiYWNrIGZpbmFsaXplID0ganNDbGFzcy0+ZmluYWxpemUpIHsKKyAgICAgICAgICAgIGZp
bmFsaXplKHRoaXNSZWYpOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEpT
Q2xhc3NSZWxlYXNlKG1fY2xhc3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK3ZvaWQg
SlNDYWxsYmFja09iamVjdDxCYXNlPjo6aW5pdGlhbGl6ZUlmTmVlZGVkKEV4ZWNTdGF0ZSogZXhl
YykKK3sKKyAgICBpZiAobV9pc0luaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgaW5p
dChleGVjLCBtX2NsYXNzLCBtX3ByaXZhdGVEYXRhKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJh
c2U+CitVU3RyaW5nIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmNsYXNzTmFtZSgpIGNvbnN0Cit7
CisgICAgaWYgKCFtX2NsYXNzLT5jbGFzc05hbWUuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBt
X2NsYXNzLT5jbGFzc05hbWU7CisgICAgCisgICAgcmV0dXJuIEpTT2JqZWN0OjpjbGFzc05hbWUo
KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8QmFz
ZT46OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXIm
IHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQoreworICAgIEpTQ29udGV4dFJlZiBj
dHggPSB0b1JlZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7
CisgICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVz
dHJpbmcoKS5yZXAoKSk7CisgICAgCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2Ns
YXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAg
Ly8gb3B0aW9uYWwgb3B0aW1pemF0aW9uIHRvIGJ5cGFzcyBnZXRQcm9wZXJ0eSBpbiBjYXNlcyB3
aGVuIHdlIG9ubHkgbmVlZCB0byBrbm93IGlmIHRoZSBwcm9wZXJ0eSBleGlzdHMKKyAgICAgICAg
aWYgKEpTT2JqZWN0SGFzUHJvcGVydHlDYWxsYmFjayBoYXNQcm9wZXJ0eSA9IGpzQ2xhc3MtPmhh
c1Byb3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9j
a3M7CisgICAgICAgICAgICBpZiAoaGFzUHJvcGVydHkoY3R4LCB0aGlzUmVmLCBwcm9wZXJ0eU5h
bWVSZWYpKSB7CisgICAgICAgICAgICAgICAgc2xvdC5zZXRDdXN0b20odGhpcywgY2FsbGJhY2tH
ZXR0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgaWYgKEpTT2JqZWN0R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQcm9wZXJ0eSA9
IGpzQ2xhc3MtPmdldFByb3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2Nr
cyBkcm9wQWxsTG9ja3M7CisgICAgICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1ZSA9IGdldFBy
b3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB0b1JlZihleGVjLT5leGNlcHRp
b25TbG90KCkpKSkgeworICAgICAgICAgICAgICAgIC8vIGNhY2hlIHRoZSB2YWx1ZSBzbyB3ZSBk
b24ndCBoYXZlIHRvIGNvbXB1dGUgaXQgYWdhaW4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyB2aW9sYXRlcyB0aGUgUHJvcGVydHlTbG90IGRlc2lnbiBhIGxpdHRsZSBiaXQuCisgICAg
ICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGVpdGhlciB1c2UgdGhpcyBvcHRpbWl6YXRpb24gZXZl
cnl3aGVyZSwgb3Igbm93aGVyZS4KKyAgICAgICAgICAgICAgICBzbG90LnNldEN1c3RvbShyZWlu
dGVycHJldF9jYXN0PEpTT2JqZWN0Kj4odG9KUyh2YWx1ZSkpLCBjYWNoZWRWYWx1ZUdldHRlcik7
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSog
c3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFsdWVzKSB7CisgICAgICAgICAgICBpZiAo
c3RhdGljVmFsdWVzLT5jb250YWlucyhwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewor
ICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIHN0YXRpY1ZhbHVlR2V0dGVyKTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxl
KiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKKyAgICAgICAg
ICAgIGlmIChzdGF0aWNGdW5jdGlvbnMtPmNvbnRhaW5zKHByb3BlcnR5TmFtZS51c3RyaW5nKCku
cmVwKCkpKSB7CisgICAgICAgICAgICAgICAgc2xvdC5zZXRDdXN0b20odGhpcywgc3RhdGljRnVu
Y3Rpb25HZXR0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBKU09iamVjdDo6Z2V0T3duUHJv
cGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFz
cyBCYXNlPgorYm9vbCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpnZXRPd25Qcm9wZXJ0eVNsb3Qo
RXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xv
dCkKK3sKKyAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIElkZW50aWZpZXI6OmZy
b20ocHJvcGVydHlOYW1lKSwgc2xvdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9p
ZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpwdXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVu
dGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKK3sKKyAgICBK
U0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9
IHRvUmVmKHRoaXMpOworICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHBy
b3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOworICAgIEpTVmFsdWVSZWYgdmFsdWVSZWYgPSB0
b1JlZih2YWx1ZSk7CisgICAgCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAgaWYg
KEpTT2JqZWN0U2V0UHJvcGVydHlDYWxsYmFjayBzZXRQcm9wZXJ0eSA9IGpzQ2xhc3MtPnNldFBy
b3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7
CisgICAgICAgICAgICBpZiAoc2V0UHJvcGVydHkoY3R4LCB0aGlzUmVmLCBwcm9wZXJ0eU5hbWVS
ZWYsIHZhbHVlUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChPcGFxdWVKU0Ns
YXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFs
dWVzKSB7CisgICAgICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNW
YWx1ZXMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgeworICAgICAgICAgICAg
ICAgIGlmIChlbnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoSlNPYmpl
Y3RTZXRQcm9wZXJ0eUNhbGxiYWNrIHNldFByb3BlcnR5ID0gZW50cnktPnNldFByb3BlcnR5KSB7
CisgICAgICAgICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHNldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVy
dHlOYW1lUmVmLCB2YWx1ZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJBdHRlbXB0
IHRvIHNldCBhIHByb3BlcnR5IHRoYXQgaXMgbm90IHNldHRhYmxlLiIpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGlj
RnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9u
cykgeworICAgICAgICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5ID0gc3RhdGlj
RnVuY3Rpb25zLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRP
bmx5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgSlNDYWxs
YmFja09iamVjdDxCYXNlPjo6cHV0RGlyZWN0KHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOyAv
LyBwdXQgYXMgb3ZlcnJpZGUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIEpTT2JqZWN0Ojpw
dXQoZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSwgYXR0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFz
cyBCYXNlPgordm9pZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpwdXQoRXhlY1N0YXRlKiBleGVj
LCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKK3sKKyAg
ICByZXR1cm4gcHV0KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSwgdmFsdWUs
IGF0dHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK2Jvb2wgSlNDYWxsYmFja09iamVj
dDxCYXNlPjo6ZGVsZXRlUHJvcGVydHkoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eU5hbWUpCit7CisgICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwor
ICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKKyAgICBKU1N0cmluZ1JlZiBw
cm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKKyAg
ICAKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xh
c3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgeworICAgICAgICBpZiAoSlNPYmplY3REZWxldGVQ
cm9wZXJ0eUNhbGxiYWNrIGRlbGV0ZVByb3BlcnR5ID0ganNDbGFzcy0+ZGVsZXRlUHJvcGVydHkp
IHsKKyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAg
ICAgICAgIGlmIChkZWxldGVQcm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwg
dG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0
aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFsdWVzKSB7Cisg
ICAgICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdl
dChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChl
bnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSkKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoT3BhcXVl
SlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3Mt
PnN0YXRpY0Z1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkq
IGVudHJ5ID0gc3RhdGljRnVuY3Rpb25zLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAo
KSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0
eUF0dHJpYnV0ZURvbnREZWxldGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKyAgICAKKyAgICByZXR1cm4gSlNPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KGV4ZWMsIHBy
b3BlcnR5TmFtZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorYm9vbCBKU0NhbGxiYWNr
T2JqZWN0PEJhc2U+OjpkZWxldGVQcm9wZXJ0eShFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHBy
b3BlcnR5TmFtZSkKK3sKKyAgICByZXR1cm4gZGVsZXRlUHJvcGVydHkoZXhlYywgSWRlbnRpZmll
cjo6ZnJvbShwcm9wZXJ0eU5hbWUpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29s
IEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmltcGxlbWVudHNDb25zdHJ1Y3QoKSBjb25zdAorewor
ICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9
IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoanNDbGFzcy0+Y2FsbEFzQ29uc3Ry
dWN0b3IpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorSlNPYmplY3QqIEpTQ2FsbGJhY2tPYmplY3Q8
QmFzZT46OmNvbnN0cnVjdChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IExpc3QmIGFyZ3MpCit7Cisg
ICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0
aGlzUmVmID0gdG9SZWYodGhpcyk7CisgICAgCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3Mg
PSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAg
ICAgICAgaWYgKEpTT2JqZWN0Q2FsbEFzQ29uc3RydWN0b3JDYWxsYmFjayBjYWxsQXNDb25zdHJ1
Y3RvciA9IGpzQ2xhc3MtPmNhbGxBc0NvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBpbnQgYXJn
dW1lbnRDb3VudCA9IHN0YXRpY19jYXN0PGludD4oYXJncy5zaXplKCkpOworICAgICAgICAgICAg
VmVjdG9yPEpTVmFsdWVSZWYsIDE2PiBhcmd1bWVudHMoYXJndW1lbnRDb3VudCk7CisgICAgICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q291bnQ7IGkrKykKKyAgICAgICAgICAg
ICAgICBhcmd1bWVudHNbaV0gPSB0b1JlZihhcmdzW2ldKTsKKyAgICAgICAgICAgIEpTTG9jazo6
RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIHJldHVybiB0b0pTKGNhbGxB
c0NvbnN0cnVjdG9yKGV4ZWNSZWYsIHRoaXNSZWYsIGFyZ3VtZW50Q291bnQsIGFyZ3VtZW50cy5k
YXRhKCksIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICBBU1NFUlQoMCk7IC8vIGltcGxlbWVudHNDb25zdHJ1Y3Qgc2hvdWxkIHByZXZl
bnQgdXMgZnJvbSByZWFjaGluZyBoZXJlCisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxj
bGFzcyBCYXNlPgorYm9vbCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjppbXBsZW1lbnRzSGFzSW5z
dGFuY2UoKSBjb25zdAoreworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsg
anNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoanND
bGFzcy0+aGFzSW5zdGFuY2UpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorYm9vbCBKU0NhbGxiYWNr
T2JqZWN0PEJhc2U+OjpoYXNJbnN0YW5jZShFeGVjU3RhdGUgKmV4ZWMsIEpTVmFsdWUgKnZhbHVl
KQoreworICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmpl
Y3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOworICAgIAorICAgIGZvciAoSlNDbGFzc1JlZiBq
c0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNz
KQorICAgICAgICBpZiAoSlNPYmplY3RIYXNJbnN0YW5jZUNhbGxiYWNrIGhhc0luc3RhbmNlID0g
anNDbGFzcy0+aGFzSW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tz
IGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIHJldHVybiBoYXNJbnN0YW5jZShleGVjUmVmLCB0
aGlzUmVmLCB0b1JlZih2YWx1ZSksIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpOworICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFTU0VSVCgwKTsgLy8gaW1wbGVtZW50
c0hhc0luc3RhbmNlIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgaGVyZQorICAgIHJl
dHVybiAwOworfQorCisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorYm9vbCBKU0NhbGxiYWNrT2Jq
ZWN0PEJhc2U+OjppbXBsZW1lbnRzQ2FsbCgpIGNvbnN0Cit7CisgICAgZm9yIChKU0NsYXNzUmVm
IGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xh
c3MpCisgICAgICAgIGlmIChqc0NsYXNzLT5jYWxsQXNGdW5jdGlvbikKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNz
IEJhc2U+CitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpjYWxsQXNGdW5jdGlvbihF
eGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0ICZhcmdzKQorewor
ICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYg
dGhpc1JlZiA9IHRvUmVmKHRoaXMpOworICAgIEpTT2JqZWN0UmVmIHRoaXNPYmpSZWYgPSB0b1Jl
Zih0aGlzT2JqKTsKKyAgICAKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7
IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgeworICAgICAgICBpZiAo
SlNPYmplY3RDYWxsQXNGdW5jdGlvbkNhbGxiYWNrIGNhbGxBc0Z1bmN0aW9uID0ganNDbGFzcy0+
Y2FsbEFzRnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGludCBhcmd1bWVudENvdW50ID0gc3RhdGlj
X2Nhc3Q8aW50PihhcmdzLnNpemUoKSk7CisgICAgICAgICAgICBWZWN0b3I8SlNWYWx1ZVJlZiwg
MTY+IGFyZ3VtZW50cyhhcmd1bWVudENvdW50KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgYXJndW1lbnRDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXSA9
IHRvUmVmKGFyZ3NbaV0pOworICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFs
bExvY2tzOworICAgICAgICAgICAgcmV0dXJuIHRvSlMoY2FsbEFzRnVuY3Rpb24oZXhlY1JlZiwg
dGhpc1JlZiwgdGhpc09ialJlZiwgYXJndW1lbnRDb3VudCwgYXJndW1lbnRzLmRhdGEoKSwgdG9S
ZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IEFTU0VSVCgwKTsgLy8gaW1wbGVtZW50c0NhbGwgc2hvdWxkIHByZXZlbnQgdXMgZnJvbSByZWFj
aGluZyBoZXJlCisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9p
ZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpnZXRQcm9wZXJ0eU5hbWVzKEV4ZWNTdGF0ZSogZXhl
YywgUHJvcGVydHlOYW1lQXJyYXkmIHByb3BlcnR5TmFtZXMpCit7CisgICAgSlNDb250ZXh0UmVm
IGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYo
dGhpcyk7CisgICAgCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0Ns
YXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAgaWYgKEpTT2Jq
ZWN0R2V0UHJvcGVydHlOYW1lc0NhbGxiYWNrIGdldFByb3BlcnR5TmFtZXMgPSBqc0NsYXNzLT5n
ZXRQcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9w
QWxsTG9ja3M7CisgICAgICAgICAgICBnZXRQcm9wZXJ0eU5hbWVzKGV4ZWNSZWYsIHRoaXNSZWYs
IHRvUmVmKCZwcm9wZXJ0eU5hbWVzKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
IChPcGFxdWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFz
cy0+c3RhdGljVmFsdWVzKSB7CisgICAgICAgICAgICB0eXBlZGVmIE9wYXF1ZUpTQ2xhc3M6OlN0
YXRpY1ZhbHVlc1RhYmxlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgICAgIGl0
ZXJhdG9yIGVuZCA9IHN0YXRpY1ZhbHVlcy0+ZW5kKCk7CisgICAgICAgICAgICBmb3IgKGl0ZXJh
dG9yIGl0ID0gc3RhdGljVmFsdWVzLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAg
ICAgICAgICAgICBVU3RyaW5nOjpSZXAqIG5hbWUgPSBpdC0+Zmlyc3QuZ2V0KCk7CisgICAgICAg
ICAgICAgICAgU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBpdC0+c2Vjb25kOworICAgICAgICAg
ICAgICAgIGlmIChlbnRyeS0+Z2V0UHJvcGVydHkgJiYgIShlbnRyeS0+YXR0cmlidXRlcyAmIGtK
U1Byb3BlcnR5QXR0cmlidXRlRG9udEVudW0pKQorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0
eU5hbWVzLmFkZChJZGVudGlmaWVyKG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxl
KiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKKyAgICAgICAg
ICAgIHR5cGVkZWYgT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGU6OmNvbnN0X2l0
ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gc3RhdGljRnVuY3Rp
b25zLT5lbmQoKTsKKyAgICAgICAgICAgIGZvciAoaXRlcmF0b3IgaXQgPSBzdGF0aWNGdW5jdGlv
bnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgICAgIFVTdHJpbmc6
OlJlcCogbmFtZSA9IGl0LT5maXJzdC5nZXQoKTsKKyAgICAgICAgICAgICAgICBTdGF0aWNGdW5j
dGlvbkVudHJ5KiBlbnRyeSA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKCEoZW50
cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnRFbnVtKSkKKyAgICAgICAg
ICAgICAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoSWRlbnRpZmllcihuYW1lKSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgSlNPYmplY3Q6OmdldFByb3BlcnR5
TmFtZXMoZXhlYywgcHJvcGVydHlOYW1lcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgor
ZG91YmxlIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OnRvTnVtYmVyKEV4ZWNTdGF0ZSogZXhlYykg
Y29uc3QKK3sKKyAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmpl
Y3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOworICAgIAorICAgIGZvciAoSlNDbGFzc1JlZiBq
c0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNz
KQorICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0VG9UeXBlQ2FsbGJhY2sgY29udmVydFRvVHlw
ZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsKKyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFs
bExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0g
Y29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtKU1R5cGVOdW1iZXIsIHRvUmVmKGV4ZWMtPmV4
Y2VwdGlvblNsb3QoKSkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKS0+Z2V0
TnVtYmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEpT
T2JqZWN0Ojp0b051bWJlcihleGVjKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitVU3Ry
aW5nIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OnRvU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYykgY29u
c3QKK3sKKyAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RS
ZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOworICAgIAorICAgIGZvciAoSlNDbGFzc1JlZiBqc0Ns
YXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQor
ICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0VG9UeXBlQ2FsbGJhY2sgY29udmVydFRvVHlwZSA9
IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsKKyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExv
Y2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gY29u
dmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtKU1R5cGVTdHJpbmcsIHRvUmVmKGV4ZWMtPmV4Y2Vw
dGlvblNsb3QoKSkpKQorICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKS0+Z2V0U3Ry
aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEpTT2Jq
ZWN0Ojp0b1N0cmluZyhleGVjKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+Cit2b2lkIEpT
Q2FsbGJhY2tPYmplY3Q8QmFzZT46OnNldFByaXZhdGUodm9pZCogZGF0YSkKK3sKKyAgICBtX3By
aXZhdGVEYXRhID0gZGF0YTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+Cit2b2lkKiBKU0Nh
bGxiYWNrT2JqZWN0PEJhc2U+OjpnZXRQcml2YXRlKCkKK3sKKyAgICByZXR1cm4gbV9wcml2YXRl
RGF0YTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8
QmFzZT46OmluaGVyaXRzKEpTQ2xhc3NSZWYgYykgY29uc3QKK3sKKyAgICBmb3IgKEpTQ2xhc3NS
ZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRD
bGFzcykKKyAgICAgICAgaWYgKGpzQ2xhc3MgPT0gYykKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitK
U1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpjYWNoZWRWYWx1ZUdldHRlcihFeGVjU3Rh
dGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNs
b3QpCit7CisgICAgSlNWYWx1ZSogdiA9IHNsb3Quc2xvdEJhc2UoKTsKKyAgICBBU1NFUlQodik7
CisgICAgcmV0dXJuIHY7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorSlNWYWx1ZSogSlND
YWxsYmFja09iamVjdDxCYXNlPjo6c3RhdGljVmFsdWVHZXR0ZXIoRXhlY1N0YXRlKiBleGVjLCBK
U09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlT
bG90JiBzbG90KQoreworICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCktPmluaGVyaXRzKCZKU0Nh
bGxiYWNrT2JqZWN0OjppbmZvKSk7CisgICAgSlNDYWxsYmFja09iamVjdCogdGhpc09iaiA9IHN0
YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNlKCkpOworICAgIAorICAg
IEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzT2JqKTsKKyAgICBKU1N0cmluZ1JlZiBw
cm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKKyAg
ICAKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNPYmotPm1fY2xhc3M7IGpzQ2xh
c3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKKyAgICAgICAgaWYgKE9wYXF1ZUpT
Q2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNW
YWx1ZXMpCisgICAgICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNW
YWx1ZXMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkKKyAgICAgICAgICAgICAg
ICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eUNhbGxiYWNrIGdldFByb3BlcnR5ID0gZW50cnktPmdl
dFByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRy
b3BBbGxMb2NrczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBn
ZXRQcm9wZXJ0eSh0b1JlZihleGVjKSwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB0b1JlZihl
eGVjLT5leGNlcHRpb25TbG90KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
b0pTKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwg
IlN0YXRpYyB2YWx1ZSBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggTlVMTCBnZXRQcm9wZXJ0eSBjYWxs
YmFjay4iKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitKU1ZhbHVlKiBKU0NhbGxiYWNr
T2JqZWN0PEJhc2U+OjpzdGF0aWNGdW5jdGlvbkdldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2Jq
ZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3Qm
IHNsb3QpCit7CisgICAgQVNTRVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2FsbGJh
Y2tPYmplY3Q6OmluZm8pKTsKKyAgICBKU0NhbGxiYWNrT2JqZWN0KiB0aGlzT2JqID0gc3RhdGlj
X2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7CisgICAgCisgICAgaWYg
KEpTVmFsdWUqIGNhY2hlZE9yT3ZlcnJpZGVWYWx1ZSA9IHRoaXNPYmotPmdldERpcmVjdChwcm9w
ZXJ0eU5hbWUpKQorICAgICAgICByZXR1cm4gY2FjaGVkT3JPdmVycmlkZVZhbHVlOworICAgIAor
ICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gdGhpc09iai0+bV9jbGFzczsganNDbGFzczsg
anNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7CisgICAgICAgIGlmIChPcGFxdWVKU0Ns
YXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3Rh
dGljRnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoU3RhdGljRnVuY3Rpb25FbnRyeSogZW50
cnkgPSBzdGF0aWNGdW5jdGlvbnMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkg
eworICAgICAgICAgICAgICAgIGlmIChKU09iamVjdENhbGxBc0Z1bmN0aW9uQ2FsbGJhY2sgY2Fs
bEFzRnVuY3Rpb24gPSBlbnRyeS0+Y2FsbEFzRnVuY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAg
ICAgSlNPYmplY3QqIG8gPSBuZXcgSlNDYWxsYmFja0Z1bmN0aW9uKGV4ZWMsIGNhbGxBc0Z1bmN0
aW9uLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0aGlzT2JqLT5wdXREaXJl
Y3QocHJvcGVydHlOYW1lLCBvLCBlbnRyeS0+YXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJv
ciwgIlN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggTlVMTCBjYWxsQXNGdW5j
dGlvbiBjYWxsYmFjay4iKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitKU1ZhbHVlKiBK
U0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpjYWxsYmFja0dldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpT
T2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNs
b3QmIHNsb3QpCit7CisgICAgQVNTRVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2Fs
bGJhY2tPYmplY3Q6OmluZm8pKTsKKyAgICBKU0NhbGxiYWNrT2JqZWN0KiB0aGlzT2JqID0gc3Rh
dGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7CisgICAgCisgICAg
SlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXNPYmopOworICAgIEpTU3RyaW5nUmVmIHBy
b3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOworICAg
IAorICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gdGhpc09iai0+bV9jbGFzczsganNDbGFz
czsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoSlNPYmplY3RH
ZXRQcm9wZXJ0eUNhbGxiYWNrIGdldFByb3BlcnR5ID0ganNDbGFzcy0+Z2V0UHJvcGVydHkpIHsK
KyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAg
ICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gZ2V0UHJvcGVydHkodG9SZWYoZXhlYyksIHRoaXNS
ZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRvSlModmFsdWUpOworICAgICAgICB9CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFJlZmVyZW5jZUVycm9yLCAiaGFz
UHJvcGVydHkgY2FsbGJhY2sgcmV0dXJuZWQgdHJ1ZSBmb3IgYSBwcm9wZXJ0eSB0aGF0IGRvZXNu
J3QgZXhpc3QuIik7Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgS0pTCiAKICNlbmRpZiAvLyBKU0Nh
bGxiYWNrT2JqZWN0X2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU0NsYXNzUmVmLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDbGFzc1JlZi5jcHAJKHJldmlzaW9u
IDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2xhc3NSZWYuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xNTYsNyArMTU2LDcgQEAgSlNPYmplY3QqIE9wYXF1ZUpTQ2xhc3M6OnByb3RvdHlw
ZShKU0NvbgogICAgICAgICAgICAgcGFyZW50UHJvdG90eXBlID0gcGFyZW50Q2xhc3MtPnByb3Rv
dHlwZShjdHgpOyAvLyBjYW4gYmUgbnVsbAogICAgICAgICBpZiAoIXBhcmVudFByb3RvdHlwZSkK
ICAgICAgICAgICAgIHBhcmVudFByb3RvdHlwZSA9IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigp
LT5idWlsdGluT2JqZWN0UHJvdG90eXBlKCk7Ci0gICAgICAgIGNhY2hlZFByb3RvdHlwZSA9IG5l
dyBKU0NhbGxiYWNrT2JqZWN0KGV4ZWMsIHByb3RvdHlwZUNsYXNzLCBwYXJlbnRQcm90b3R5cGUs
IHRoaXMpOyAvLyBzZXQgb3Vyc2VsZiBhcyB0aGUgb2JqZWN0J3MgcHJpdmF0ZSBkYXRhLCBzbyBp
dCBjYW4gY2xlYXIgb3VyIHJlZmVyZW5jZSBvbiBkZXN0cnVjdGlvbgorICAgICAgICBjYWNoZWRQ
cm90b3R5cGUgPSBuZXcgSlNDYWxsYmFja09iamVjdDxKU09iamVjdD4oZXhlYywgcHJvdG90eXBl
Q2xhc3MsIHBhcmVudFByb3RvdHlwZSwgdGhpcyk7IC8vIHNldCBvdXJzZWxmIGFzIHRoZSBvYmpl
Y3QncyBwcml2YXRlIGRhdGEsIHNvIGl0IGNhbiBjbGVhciBvdXIgcmVmZXJlbmNlIG9uIGRlc3Ry
dWN0aW9uCiAgICAgfQogICAgIHJldHVybiBjYWNoZWRQcm90b3R5cGU7CiB9CkluZGV4OiBKYXZh
U2NyaXB0Q29yZS9BUEkvSlNDb250ZXh0UmVmLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9BUEkvSlNDb250ZXh0UmVmLmNwcAkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0
Q29yZS9BUEkvSlNDb250ZXh0UmVmLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBA
QAogI2luY2x1ZGUgIkpTQ29udGV4dFJlZi5oIgogCiAjaW5jbHVkZSAiSlNDYWxsYmFja09iamVj
dC5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAiY29tcGxldGlvbi5o
IgogI2luY2x1ZGUgImludGVycHJldGVyLmgiCiAjaW5jbHVkZSAib2JqZWN0LmgiCkBAIC0zOSwx
NiArNDAsMTYgQEAgSlNHbG9iYWxDb250ZXh0UmVmIEpTR2xvYmFsQ29udGV4dENyZWF0ZQogewog
ICAgIEpTTG9jayBsb2NrOwogCi0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdDsKKyAgICBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0OwogICAgIGlmIChnbG9iYWxPYmplY3RDbGFzcykKICAg
ICAgICAgLy8gU3BlY2lmeSBqc051bGwoKSBhcyB0aGUgcHJvdG90eXBlLiAgSW50ZXJwcmV0ZXIg
d2lsbCBmaXggaXQgdXAgdG8gcG9pbnQgYXQgYnVpbHRpbk9iamVjdFByb3RvdHlwZSgpIGluIGl0
cyBjb25zdHJ1Y3RvcgotICAgICAgICBnbG9iYWxPYmplY3QgPSBuZXcgSlNDYWxsYmFja09iamVj
dCgwLCBnbG9iYWxPYmplY3RDbGFzcywganNOdWxsKCksIDApOworICAgICAgICBnbG9iYWxPYmpl
Y3QgPSBuZXcgSlNDYWxsYmFja09iamVjdDxKU0dsb2JhbE9iamVjdD4oMCwgZ2xvYmFsT2JqZWN0
Q2xhc3MsIGpzTnVsbCgpLCAwKTsKICAgICBlbHNlCi0gICAgICAgIGdsb2JhbE9iamVjdCA9IG5l
dyBKU09iamVjdCgpOworICAgICAgICBnbG9iYWxPYmplY3QgPSBuZXcgSlNHbG9iYWxPYmplY3Qo
KTsKIAogICAgIEludGVycHJldGVyKiBpbnRlcnByZXRlciA9IG5ldyBJbnRlcnByZXRlcihnbG9i
YWxPYmplY3QpOyAvLyBhZGRzIHRoZSBidWlsdC1pbiBvYmplY3QgcHJvdG90eXBlIHRvIHRoZSBn
bG9iYWwgb2JqZWN0CiAgICAgaWYgKGdsb2JhbE9iamVjdENsYXNzKQotICAgICAgICBzdGF0aWNf
Y2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4oZ2xvYmFsT2JqZWN0KS0+aW5pdGlhbGl6ZUlmTmVlZGVk
KGludGVycHJldGVyLT5nbG9iYWxFeGVjKCkpOworICAgICAgICBzdGF0aWNfY2FzdDxKU0NhbGxi
YWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KGdsb2JhbE9iamVjdCktPmluaXRpYWxpemVJZk5l
ZWRlZChpbnRlcnByZXRlci0+Z2xvYmFsRXhlYygpKTsKICAgICBKU0dsb2JhbENvbnRleHRSZWYg
Y3R4ID0gcmVpbnRlcnByZXRfY2FzdDxKU0dsb2JhbENvbnRleHRSZWY+KGludGVycHJldGVyLT5n
bG9iYWxFeGVjKCkpOwogICAgIHJldHVybiBKU0dsb2JhbENvbnRleHRSZXRhaW4oY3R4KTsKIH0K
SW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU09iamVjdFJlZi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvQVBJL0pTT2JqZWN0UmVmLmNwcAkocmV2aXNpb24gMjcwMDcpCisrKyBK
YXZhU2NyaXB0Q29yZS9BUEkvSlNPYmplY3RSZWYuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2
ICszMiw3IEBACiAjaW5jbHVkZSAiSlNDYWxsYmFja0Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiSlND
YWxsYmFja09iamVjdC5oIgogI2luY2x1ZGUgIkpTQ2xhc3NSZWYuaCIKKyNpbmNsdWRlICJKU0ds
b2JhbE9iamVjdC5oIgogCiAjaW5jbHVkZSAiaWRlbnRpZmllci5oIgogI2luY2x1ZGUgImZ1bmN0
aW9uLmgiCkBAIC03Nyw3ICs3OCw3IEBAIEpTT2JqZWN0UmVmIEpTT2JqZWN0TWFrZShKU0NvbnRl
eHRSZWYgY3QKICAgICBpZiAoIWpzUHJvdG90eXBlKQogICAgICAgICBqc1Byb3RvdHlwZSA9IGV4
ZWMtPmxleGljYWxJbnRlcnByZXRlcigpLT5idWlsdGluT2JqZWN0UHJvdG90eXBlKCk7CiAKLSAg
ICByZXR1cm4gdG9SZWYobmV3IEpTQ2FsbGJhY2tPYmplY3QoZXhlYywganNDbGFzcywganNQcm90
b3R5cGUsIGRhdGEpKTsKKyAgICByZXR1cm4gdG9SZWYobmV3IEpTQ2FsbGJhY2tPYmplY3Q8SlNP
YmplY3Q+KGV4ZWMsIGpzQ2xhc3MsIGpzUHJvdG90eXBlLCBkYXRhKSk7CiB9CiAKIEpTT2JqZWN0
UmVmIEpTT2JqZWN0TWFrZUZ1bmN0aW9uV2l0aENhbGxiYWNrKEpTQ29udGV4dFJlZiBjdHgsIEpT
U3RyaW5nUmVmIG5hbWUsIEpTT2JqZWN0Q2FsbEFzRnVuY3Rpb25DYWxsYmFjayBjYWxsQXNGdW5j
dGlvbikKQEAgLTIzNSw4ICsyMzYsMTAgQEAgdm9pZCogSlNPYmplY3RHZXRQcml2YXRlKEpTT2Jq
ZWN0UmVmIG9iagogewogICAgIEpTT2JqZWN0KiBqc09iamVjdCA9IHRvSlMob2JqZWN0KTsKICAg
ICAKLSAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSkK
LSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihqc09iamVjdCkt
PmdldFByaXZhdGUoKTsKKyAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0NhbGxiYWNrT2Jq
ZWN0PEpTR2xvYmFsT2JqZWN0Pjo6aW5mbykpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxK
U0NhbGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KGpzT2JqZWN0KS0+Z2V0UHJpdmF0ZSgp
OworICAgIGVsc2UgaWYgKGpzT2JqZWN0LT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDxKU09i
amVjdD46OmluZm8pKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVj
dDxKU09iamVjdD4qPihqc09iamVjdCktPmdldFByaXZhdGUoKTsKICAgICAKICAgICByZXR1cm4g
MDsKIH0KQEAgLTI0NSw4ICsyNDgsMTEgQEAgYm9vbCBKU09iamVjdFNldFByaXZhdGUoSlNPYmpl
Y3RSZWYgb2JqZQogewogICAgIEpTT2JqZWN0KiBqc09iamVjdCA9IHRvSlMob2JqZWN0KTsKICAg
ICAKLSAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSkg
ewotICAgICAgICBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4oanNPYmplY3QpLT5zZXRQ
cml2YXRlKGRhdGEpOworICAgIGlmIChqc09iamVjdC0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmpl
Y3Q8SlNHbG9iYWxPYmplY3Q+OjppbmZvKSkgeworICAgICAgICBzdGF0aWNfY2FzdDxKU0NhbGxi
YWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KGpzT2JqZWN0KS0+c2V0UHJpdmF0ZShkYXRhKTsK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChqc09iamVjdC0+aW5oZXJpdHMo
JkpTQ2FsbGJhY2tPYmplY3Q8SlNPYmplY3Q+OjppbmZvKSkgeworICAgICAgICBzdGF0aWNfY2Fz
dDxKU0NhbGxiYWNrT2JqZWN0PEpTT2JqZWN0Pio+KGpzT2JqZWN0KS0+c2V0UHJpdmF0ZShkYXRh
KTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgICAgICAKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL0FQSS9KU1ZhbHVlUmVmLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9B
UEkvSlNWYWx1ZVJlZi5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUvQVBJ
L0pTVmFsdWVSZWYuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVk
ZSAiSlNWYWx1ZVJlZi5oIgogCiAjaW5jbHVkZSA8a2pzL0pTVHlwZS5oPgorI2luY2x1ZGUgPGtq
cy9KU0dsb2JhbE9iamVjdC5oPgogI2luY2x1ZGUgPGtqcy9pbnRlcm5hbC5oPgogI2luY2x1ZGUg
PGtqcy9vcGVyYXRpb25zLmg+CiAjaW5jbHVkZSA8a2pzL3Byb3RlY3QuaD4KQEAgLTEwNCw5ICsx
MDUsMTIgQEAgYm9vbCBKU1ZhbHVlSXNPYmplY3RPZkNsYXNzKEpTQ29udGV4dFJlZgogewogICAg
IEpTVmFsdWUqIGpzVmFsdWUgPSB0b0pTKHZhbHVlKTsKICAgICAKLSAgICBpZiAoSlNPYmplY3Qq
IG8gPSBqc1ZhbHVlLT5nZXRPYmplY3QoKSkKLSAgICAgICAgaWYgKG8tPmluaGVyaXRzKCZKU0Nh
bGxiYWNrT2JqZWN0OjppbmZvKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU0Nh
bGxiYWNrT2JqZWN0Kj4obyktPmluaGVyaXRzKGpzQ2xhc3MpOworICAgIGlmIChKU09iamVjdCog
byA9IGpzVmFsdWUtPmdldE9iamVjdCgpKSB7CisgICAgICAgIGlmIChvLT5pbmhlcml0cygmSlND
YWxsYmFja09iamVjdDxKU09iamVjdD46OmluZm8pKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PEpTQ2FsbGJhY2tPYmplY3Q8SlNPYmplY3Q+Kj4obyktPmluaGVyaXRzKGpzQ2xhc3Mp
OworICAgICAgICBlbHNlIGlmIChvLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDxKU0dsb2Jh
bE9iamVjdD46OmluZm8pKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTQ2FsbGJh
Y2tPYmplY3Q8SlNHbG9iYWxPYmplY3Q+Kj4obyktPmluaGVyaXRzKGpzQ2xhc3MpOworICAgIH0K
ICAgICByZXR1cm4gZmFsc2U7CiB9CiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjcw
MDcpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0yMzEsNiArMjMxLDcgQEAKIAkJOTNFMjZDRjcwOEIy
OUExQzAwRjg1MjI2IC8qIHBjcmVfZ2V0LmMgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA5M0UyNkNGNjA4QjI5QTFDMDBGODUyMjYgLyogcGNyZV9nZXQuYyAq
LzsgfTsKIAkJOTNGMEIzQUMwOUJCNERDMDAwNjhGQ0UzIC8qIFBhcnNlci5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTNGMEIzQUEwOUJCNERDMDAwNjhG
Q0UzIC8qIFBhcnNlci5oICovOyB9OwogCQk5NUMxOEQ0OTBDOTBFODI2MDBFNzJGNzMgLyogSlNS
ZXRhaW5QdHIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDk1QzE4RDNFMEM5MEU3RUYwMEU3MkY3MyAvKiBKU1JldGFpblB0ci5oICovOyBzZXR0aW5ncyA9
IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUE4RTg5MEMyMENEMDM4QTcwMDM2
NzE3OSAvKiBKU0dsb2JhbE9iamVjdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQThFODkwQzAwQ0QwMzhBNzAwMzY3MTc5IC8qIEpTR2xvYmFsT2JqZWN0
LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQkNG
NjU1NTkwQTIwNDk3MTAwMzhBMTk0IC8qIE1hdGhFeHRyYXMuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRjY1NTNCMEEyMDQ4REUwMDM4QTE5NCAvKiBN
YXRoRXh0cmFzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKIAkJRDIxMjAyMkIwQUQ0MzEwRDAwRUQ3OUI2IC8qIERhdGVNYXRoLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEMjEyMDIyOTBBRDQzMTBDMDBFRDc5
QjYgLyogRGF0ZU1hdGguaCAqLzsgfTsKIAkJRTExRDUxNzYwQjJFNzk4RDAwNTZDMTg4IC8qIFN0
cmluZ0V4dHJhcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTExRDUxNzUwQjJFNzk4RDAwNTZDMTg4IC8qIFN0cmluZ0V4dHJhcy5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC01ODYsNiArNTg3LDcgQEAK
IAkJOTNGMEIzQUEwOUJCNERDMDAwNjhGQ0UzIC8qIFBhcnNlci5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
OTNGMTk4MUEwODI0NUFBRTAwMUU5QUJDIC8qIGtleXdvcmRzLnRhYmxlICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0ga2V5d29yZHMudGFibGU7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IHRhYldpZHRoID0gODsgfTsKIAkJOTVDMThEM0UwQzkwRTdFRjAwRTcyRjczIC8q
IEpTUmV0YWluUHRyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTUmV0YWlu
UHRyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4RTg5MEMwMENEMDM4QTcwMDM2
NzE3OSAvKiBKU0dsb2JhbE9iamVjdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBKU0dsb2JhbE9iamVjdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0Y2NTUz
QjBBMjA0OERFMDAzOEExOTQgLyogTWF0aEV4dHJhcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gTWF0aEV4dHJhcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlE
MjEyMDIyODBBRDQzMTBDMDBFRDc5QjYgLyogRGF0ZU1hdGguY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERhdGVNYXRoLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJRDIxMjAyMjkwQUQ0MzEwQzAwRUQ3OUI2IC8qIERhdGVNYXRoLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBEYXRlTWF0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwpAQCAtMTAzOCw2ICsxMDQwLDcgQEAKIAkJCQkxNEJENTM0QTBBM0UwQUVBMDBCQUY1
OUMgLyogU2F2ZWRCdWlsdGlucy5oICovLAogCQkJCTE0QkQ1M0YzMEEzRTEyRDgwMEJBRjU5QyAv
KiBFeGVjU3RhdGUuaCAqLywKIAkJCQkxNEJENTNGNDBBM0UxMkQ4MDBCQUY1OUMgLyogRXhlY1N0
YXRlLmNwcCAqLywKKwkJCQlBOEU4OTBDMDBDRDAzOEE3MDAzNjcxNzkgLyogSlNHbG9iYWxPYmpl
Y3QuaCAqLywKIAkJCSk7CiAJCQlwYXRoID0ga2pzOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsKQEAgLTEyNTYsNiArMTI1OSw3IEBACiAJCQkJOTM4QzRGNkEwQ0EwNkJDNzAwRDkzMTBBIC8q
IEFTQ0lJQ1R5cGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzOEM0RjZDMENBMDZCQ0UwMEQ5MzEw
QSAvKiBEaXNhbGxvd0NUeXBlLmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTg2MTExRTBDQzgyNDkw
MDA4MTQxMkIgLyogRGVxdWUuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4RTg5MEMyMENEMDM4QTcw
MDM2NzE3OSAvKiBKU0dsb2JhbE9iamVjdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVu
T25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xMzcxLDcgKzEz
NzUsNiBAQAogCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8g
PSB7CiAJCQlpc2EgPSBQQlhQcm9qZWN0OwogCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDE0
OUMyNzcxMDg5MDJBRkUwMDhBOUVGQyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBC
WFByb2plY3QgIkphdmFTY3JpcHRDb3JlIiAqLzsKLQkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0g
Ilhjb2RlIDIuNCI7CiAJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKIAkJCW1haW5Hcm91
cCA9IDA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBKYXZhU2NyaXB0Q29yZSAqLzsKIAkJCXBy
b2R1Y3RSZWZHcm91cCA9IDAzNDc2OERGRkYzOEE1MDQxMURCOUM4QiAvKiBQcm9kdWN0cyAqLzsK
SW5kZXg6IEphdmFTY3JpcHRDb3JlL2JpbmRpbmdzL2MvY191dGlsaXR5LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBKYXZhU2NyaXB0Q29yZS9iaW5kaW5ncy9jL2NfdXRpbGl0eS5jcHAJKHJldmlzaW9uIDI3
MDA3KQorKysgSmF2YVNjcmlwdENvcmUvYmluZGluZ3MvYy9jX3V0aWxpdHkuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zMSw3ICszMSw4IEBACiAjaW5jbHVkZSAiY191dGlsaXR5LmgiCiAKICNpbmNs
dWRlICJOUF9qc29iamVjdC5oIgotI2luY2x1ZGUgImNfaW5zdGFuY2UuaCIgCisjaW5jbHVkZSAi
Y19pbnN0YW5jZS5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAibnBy
dW50aW1lX2ltcGwuaCIKICNpbmNsdWRlICJucHJ1bnRpbWVfcHJpdi5oIgogI2luY2x1ZGUgInJ1
bnRpbWVfb2JqZWN0LmgiCkBAIC0xMzAsOSArMTMxLDggQEAgdm9pZCBjb252ZXJ0VmFsdWVUb05Q
VmFyaWFudChFeGVjU3RhdGUgKgogICAgICAgICAgICAgUm9vdE9iamVjdCogb3JpZ2luUm9vdE9i
amVjdCA9IGZpbmRSb290T2JqZWN0KG9yaWdpbkludGVycHJldGVyKTsKIAogICAgICAgICAgICAg
SW50ZXJwcmV0ZXIqIGludGVycHJldGVyID0gMDsKLSAgICAgICAgICAgIGlmIChvcmlnaW5JbnRl
cnByZXRlci0+aXNHbG9iYWxPYmplY3QodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJw
cmV0ZXIgPSBvcmlnaW5JbnRlcnByZXRlci0+aW50ZXJwcmV0ZXJGb3JHbG9iYWxPYmplY3QodmFs
dWUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iamVjdC0+aXNHbG9iYWxPYmpl
Y3QoKSkKKyAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IHN0YXRpY19jYXN0PEpTR2xvYmFs
T2JqZWN0Kj4ob2JqZWN0KS0+aW50ZXJwcmV0ZXIoKTsKIAogICAgICAgICAgICAgaWYgKCFpbnRl
cnByZXRlcikKICAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IG9yaWdpbkludGVycHJldGVy
OwpJbmRleDogSmF2YVNjcmlwdENvcmUvYmluZGluZ3Mvam5pL2puaV9qc29iamVjdC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvYmluZGluZ3Mvam5pL2puaV9qc29iamVjdC5jcHAJ
KHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUvYmluZGluZ3Mvam5pL2puaV9qc29i
amVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJqbmlf
anNvYmplY3QuaCIKICNpbmNsdWRlICJqbmlfcnVudGltZS5oIgogI2luY2x1ZGUgImpuaV91dGls
aXR5LmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJsaXN0LmgiCiAj
aW5jbHVkZSAicnVudGltZV9vYmplY3QuaCIKICNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL2JpbmRpbmdzL29iamMvb2JqY191dGlsaXR5Lm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL2JpbmRpbmdzL29iamMvb2JqY191dGlsaXR5Lm1tCShyZXZp
c2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2JpbmRpbmdzL29iamMvb2JqY191dGlsaXR5
Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAib2JqY191dGls
aXR5LmgiCiAKICNpbmNsdWRlICJvYmpjX2luc3RhbmNlLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxP
YmplY3QuaCIKICNpbmNsdWRlICJydW50aW1lX2FycmF5LmgiCiAjaW5jbHVkZSAicnVudGltZV9v
YmplY3QuaCIKICNpbmNsdWRlICJXZWJTY3JpcHRPYmplY3QuaCIKQEAgLTE0MCw4ICsxNDEsOCBA
QCBPYmpjVmFsdWUgY29udmVydFZhbHVlVG9PYmpjVmFsdWUoRXhlY1N0CiAgICAgICAgICAgICBS
b290T2JqZWN0KiBvcmlnaW5Sb290T2JqZWN0ID0gZmluZFJvb3RPYmplY3Qob3JpZ2luSW50ZXJw
cmV0ZXIpOwogCiAgICAgICAgICAgICBJbnRlcnByZXRlciAqaW50ZXJwcmV0ZXIgPSAwOwotICAg
ICAgICAgICAgaWYgKG9yaWdpbkludGVycHJldGVyLT5pc0dsb2JhbE9iamVjdCh2YWx1ZSkpCi0g
ICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBvcmlnaW5JbnRlcnByZXRlci0+aW50ZXJwcmV0
ZXJGb3JHbG9iYWxPYmplY3QodmFsdWUpOworICAgICAgICAgICAgaWYgKHZhbHVlLT5pc09iamVj
dCgpICYmIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4odmFsdWUpLT5pc0dsb2JhbE9iamVjdCgpKQor
ICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gc3RhdGljX2Nhc3Q8SlNHbG9iYWxPYmplY3Qq
Pih2YWx1ZSktPmludGVycHJldGVyKCk7CiAKICAgICAgICAgICAgIGlmICghaW50ZXJwcmV0ZXIp
CiAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBvcmlnaW5JbnRlcnByZXRlcjsKSW5kZXg6
IEphdmFTY3JpcHRDb3JlL2tqcy9Db250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9ranMvQ29udGV4dC5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUv
a2pzL0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3Bh
Y2UgS0pTIHsKIAogLy8gRUNNQSAxMC4yCi1Db250ZXh0OjpDb250ZXh0KEpTT2JqZWN0KiBnbG9i
LCBJbnRlcnByZXRlciogaW50ZXJwcmV0ZXIsIEpTT2JqZWN0KiB0aGlzViwgCitDb250ZXh0OjpD
b250ZXh0KEpTR2xvYmFsT2JqZWN0KiBnbG9iLCBJbnRlcnByZXRlciogaW50ZXJwcmV0ZXIsIEpT
T2JqZWN0KiB0aGlzViwgCiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQm9keU5vZGUqIGN1cnJl
bnRCb2R5LCBDb2RlVHlwZSB0eXBlLCBDb250ZXh0KiBjYWxsaW5nQ29uLCAKICAgICAgICAgICAg
ICAgICAgRnVuY3Rpb25JbXAqIGZ1bmMsIGNvbnN0IExpc3QqIGFyZ3MpCiAgICAgOiBtX2ludGVy
cHJldGVyKGludGVycHJldGVyKQpJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL0V4ZWNTdGF0ZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL0V4ZWNTdGF0ZS5jcHAJKHJldmlz
aW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL0V4ZWNTdGF0ZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwLDE1ICszMCwxNCBAQCBuYW1lc3BhY2UgS0pTIHsKIAogSW50ZXJwcmV0ZXIq
IEV4ZWNTdGF0ZTo6bGV4aWNhbEludGVycHJldGVyKCkgY29uc3QKIHsKLSAgaWYgKCFtX2NvbnRl
eHQpCi0gICAgcmV0dXJuIGR5bmFtaWNJbnRlcnByZXRlcigpOwotCi0gIEludGVycHJldGVyKiBy
ZXN1bHQgPSBJbnRlcnByZXRlcjo6aW50ZXJwcmV0ZXJXaXRoR2xvYmFsT2JqZWN0KG1fY29udGV4
dC0+c2NvcGVDaGFpbigpLmJvdHRvbSgpKTsKKyAgICBpZiAoIW1fY29udGV4dCkKKyAgICAgICAg
cmV0dXJuIGR5bmFtaWNJbnRlcnByZXRlcigpOworICAgIAorICAgIEpTT2JqZWN0KiBvYmplY3Qg
PSBtX2NvbnRleHQtPnNjb3BlQ2hhaW4oKS5ib3R0b20oKTsKKyAgICBpZiAob2JqZWN0ICYmIG9i
amVjdC0+aXNHbG9iYWxPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTR2xv
YmFsT2JqZWN0Kj4ob2JqZWN0KS0+aW50ZXJwcmV0ZXIoKTsKIAotICBpZiAoIXJlc3VsdCkKICAg
ICByZXR1cm4gZHluYW1pY0ludGVycHJldGVyKCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKIH0KIAog
fSAvLyBuYW1lc3BhY2UgS0pTCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvSlNHbG9iYWxPYmpl
Y3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvSlNHbG9iYWxPYmplY3QuaAko
cmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9KU0dsb2JhbE9iamVjdC5oCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDQzIEBACisvLyAtKi0gYy1iYXNpYy1vZmZzZXQ6IDIgLSotCisv
KgorICogIENvcHlyaWdodCAoQykgMjAwNyBFcmljIFNlaWRlbAorICoKKyAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lm
bmRlZiBLSlNfR2xvYmFsT2JqZWN0X2gKKyNkZWZpbmUgS0pTX0dsb2JhbE9iamVjdF9oCisKKyNp
bmNsdWRlICJvYmplY3QuaCIKKworbmFtZXNwYWNlIEtKUyB7CisgICAgY2xhc3MgSW50ZXJwcmV0
ZXI7CisgICAgY2xhc3MgSlNHbG9iYWxPYmplY3QgOiBwdWJsaWMgSlNPYmplY3QgeworICAgIHB1
YmxpYzoKKyAgICAgICAgSlNHbG9iYWxPYmplY3QoKSB7IH0KKyAgICAgICAgSlNHbG9iYWxPYmpl
Y3QoSlNWYWx1ZSogcHJvdG8pIDogSlNPYmplY3QocHJvdG8pIHsgfQorICAgICAgICAKKyAgICAg
ICAgdmlydHVhbCBib29sIGlzR2xvYmFsT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQor
ICAgICAgICAKKyAgICAgICAgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyKCkgY29uc3QgeyByZXR1
cm4gbV9pbnRlcnByZXRlcjsgfQorICAgICAgICB2b2lkIHNldEludGVycHJldGVyKEludGVycHJl
dGVyKiBpKSB7IG1faW50ZXJwcmV0ZXIgPSBpOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgSW50
ZXJwcmV0ZXIqIG1faW50ZXJwcmV0ZXI7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIEtKUworCisj
ZW5kaWYgLy8gS0pTX0dsb2JhbE9iamVjdF9oCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvYXJy
YXlfaW5zdGFuY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9hcnJheV9p
bnN0YW5jZS5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2FycmF5
X2luc3RhbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDkxLDcgKzQ5MSw3IEBAIHN0cnVjdCBD
b21wYXJlV2l0aENvbXBhcmVGdW5jdGlvbkFyZ3VtZW4KICAgICBFeGVjU3RhdGUgKmV4ZWM7CiAg
ICAgSlNPYmplY3QgKmNvbXBhcmVGdW5jdGlvbjsKICAgICBMaXN0IGFyZ3VtZW50czsKLSAgICBK
U09iamVjdCAqZ2xvYmFsT2JqZWN0OworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Q7
CiB9OwogCiBzdGF0aWMgQ29tcGFyZVdpdGhDb21wYXJlRnVuY3Rpb25Bcmd1bWVudHMqIGNvbXBh
cmVXaXRoQ29tcGFyZUZ1bmN0aW9uQXJndW1lbnRzID0gMDsKSW5kZXg6IEphdmFTY3JpcHRDb3Jl
L2tqcy9jb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2NvbnRleHQu
aAkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvY29udGV4dC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC01MCw3ICs1MCw3IEBAIG5hbWVzcGFjZSBLSlMgIHsKICAgICovCiAgIGNs
YXNzIENvbnRleHQgewogICBwdWJsaWM6Ci0gICAgQ29udGV4dChKU09iamVjdCogZ2xvYmFsLCBJ
bnRlcnByZXRlciosIEpTT2JqZWN0KiB0aGlzViwKKyAgICBDb250ZXh0KEpTR2xvYmFsT2JqZWN0
KiwgSW50ZXJwcmV0ZXIqLCBKU09iamVjdCogdGhpc1YsCiAgICAgICAgICAgICBGdW5jdGlvbkJv
ZHlOb2RlKiBjdXJyZW50Qm9keSwgQ29kZVR5cGUgdHlwZSA9IEdsb2JhbENvZGUsCiAgICAgICAg
ICAgICBDb250ZXh0KiBjYWxsaW5nQ29udGV4dCA9IDAsIEZ1bmN0aW9uSW1wKiBmdW5jdGlvbiA9
IDAsIGNvbnN0IExpc3QqIGFyZ3MgPSAwKTsKICAgICB+Q29udGV4dCgpOwpJbmRleDogSmF2YVNj
cmlwdENvcmUva2pzL2Z1bmN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9r
anMvZnVuY3Rpb24uY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9m
dW5jdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJk
dG9hLmgiCiAjaW5jbHVkZSAiZnVuY3Rpb25fb2JqZWN0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwu
aCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgogI2luY2x1ZGUgImxleGVyLmgiCiAjaW5j
bHVkZSAibm9kZXMuaCIKICNpbmNsdWRlICJvcGVyYXRpb25zLmgiCkBAIC02NSw3ICs2Niw3IEBA
IHZvaWQgRnVuY3Rpb25JbXA6Om1hcmsoKQogCiBKU1ZhbHVlKiBGdW5jdGlvbkltcDo6Y2FsbEFz
RnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYg
YXJncykKIHsKLSAgSlNPYmplY3QqIGdsb2JhbE9iaiA9IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRl
cigpLT5nbG9iYWxPYmplY3QoKTsKKyAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iaiA9IGV4ZWMt
PmR5bmFtaWNJbnRlcnByZXRlcigpLT5nbG9iYWxPYmplY3QoKTsKIAogICAvLyBlbnRlciBhIG5l
dyBleGVjdXRpb24gY29udGV4dAogICBDb250ZXh0IGN0eChnbG9iYWxPYmosIGV4ZWMtPmR5bmFt
aWNJbnRlcnByZXRlcigpLCB0aGlzT2JqLCBib2R5LmdldCgpLApAQCAtNzU0LDEwICs3NTUsMTAg
QEAgSlNWYWx1ZSogR2xvYmFsRnVuY0ltcDo6Y2FsbEFzRnVuY3Rpb24oRQogICAgICAgICBpZiAo
IXByb2dOb2RlKQogICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9y
LCBlcnJNc2csIGVyckxpbmUsIHNpZCwgTlVMTCk7CiAKLSAgICAgICAgYm9vbCBzd2l0Y2hHbG9i
YWwgPSB0aGlzT2JqICYmIGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5pc0dsb2JhbE9iamVj
dCh0aGlzT2JqKSAmJiB0aGlzT2JqICE9IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5nbG9i
YWxPYmplY3QoKTsKKyAgICAgICAgYm9vbCBzd2l0Y2hHbG9iYWwgPSB0aGlzT2JqICYmIHRoaXNP
YmogIT0gZXhlYy0+ZHluYW1pY0ludGVycHJldGVyKCktPmdsb2JhbE9iamVjdCgpOwogICAgICAg
ICAgIAogICAgICAgICAvLyBlbnRlciBhIG5ldyBleGVjdXRpb24gY29udGV4dAotICAgICAgICBJ
bnRlcnByZXRlciogaW50ZXJwcmV0ZXIgPSBzd2l0Y2hHbG9iYWwgPyBleGVjLT5keW5hbWljSW50
ZXJwcmV0ZXIoKS0+aW50ZXJwcmV0ZXJGb3JHbG9iYWxPYmplY3QodGhpc09iaikgOiBleGVjLT5k
eW5hbWljSW50ZXJwcmV0ZXIoKTsKKyAgICAgICAgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyID0g
c3dpdGNoR2xvYmFsID8gc3RhdGljX2Nhc3Q8SlNHbG9iYWxPYmplY3QqPih0aGlzT2JqKS0+aW50
ZXJwcmV0ZXIoKSA6IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpOwogICAgICAgICBKU09iamVj
dCogdGhpc1ZhbCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oZXhlYy0+Y29udGV4dCgpLT50aGlz
VmFsdWUoKSk7CiAgICAgICAgIENvbnRleHQgY3R4KGludGVycHJldGVyLT5nbG9iYWxPYmplY3Qo
KSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIsCkluZGV4OiBKYXZhU2NyaXB0
Q29yZS9ranMvaW50ZXJwcmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tq
cy9pbnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pz
L2ludGVycHJldGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzksOCArNzksOCBAQCBzdGF0aWMg
aW5saW5lIEludGVycHJldGVyTWFwICZpbnRlcnByZXRlCiAgICAgc3RhdGljIEludGVycHJldGVy
TWFwKiBtYXAgPSBuZXcgSW50ZXJwcmV0ZXJNYXA7CiAgICAgcmV0dXJuKiBtYXA7CiB9Ci0gICAg
Ci1JbnRlcnByZXRlcjo6SW50ZXJwcmV0ZXIoSlNPYmplY3QqIGdsb2JhbE9iamVjdCkKKworSW50
ZXJwcmV0ZXI6OkludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QpCiAgICAg
OiBtX2dsb2JhbEV4ZWModGhpcywgMCkKICAgICAsIG1fZ2xvYmFsT2JqZWN0KGdsb2JhbE9iamVj
dCkKIHsKQEAgLTg5LDcgKzg5LDcgQEAgSW50ZXJwcmV0ZXI6OkludGVycHJldGVyKEpTT2JqZWN0
KiBnbG9iYQogCiBJbnRlcnByZXRlcjo6SW50ZXJwcmV0ZXIoKQogICAgIDogbV9nbG9iYWxFeGVj
KHRoaXMsIDApCi0gICAgLCBtX2dsb2JhbE9iamVjdChuZXcgSlNPYmplY3QoKSkKKyAgICAsIG1f
Z2xvYmFsT2JqZWN0KG5ldyBKU0dsb2JhbE9iamVjdCgpKQogewogICAgIGluaXQoKTsKIH0KQEAg
LTExOCw3ICsxMTgsNiBAQCB2b2lkIEludGVycHJldGVyOjppbml0KCkKICAgICAgICAgLy8gVGhp
cyBpcyB0aGUgZmlyc3QgaW50ZXJwcmV0ZXIKICAgICAgICAgc19ob29rID0gbmV4dCA9IHByZXYg
PSB0aGlzOwogICAgIH0KLSAgICBpbnRlcnByZXRlck1hcCgpLnNldChtX2dsb2JhbE9iamVjdCwg
dGhpcyk7CiAKICAgICBpbml0R2xvYmFsT2JqZWN0KCk7CiB9CkBAIC0xMzcsMTkgKzEzNiwyMCBA
QCBJbnRlcnByZXRlcjo6fkludGVycHJldGVyKCkKICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxh
c3QgaW50ZXJwcmV0ZXIKICAgICAgICAgc19ob29rID0gMDsKICAgICB9Ci0gICAgaW50ZXJwcmV0
ZXJNYXAoKS5yZW1vdmUobV9nbG9iYWxPYmplY3QpOwogfQogCi1KU09iamVjdCogSW50ZXJwcmV0
ZXI6Omdsb2JhbE9iamVjdCgpIGNvbnN0CitKU0dsb2JhbE9iamVjdCogSW50ZXJwcmV0ZXI6Omds
b2JhbE9iamVjdCgpIGNvbnN0CiB7Ci0gIHJldHVybiBtX2dsb2JhbE9iamVjdDsKKyAgICByZXR1
cm4gbV9nbG9iYWxPYmplY3Q7CiB9CiAKIHZvaWQgSW50ZXJwcmV0ZXI6OmluaXRHbG9iYWxPYmpl
Y3QoKQogeworICAgIG1fZ2xvYmFsT2JqZWN0LT5zZXRJbnRlcnByZXRlcih0aGlzKTsKKwogICAg
IC8vIENsZWFyIGJlZm9yZSBpbml0aXRhbGl6aW5nLCB0byBhdm9pZCBtYXJraW5nIHVuaW5pdGlh
bGl6ZWQgKGRhbmdlcm91cykgb3IgCiAgICAgLy8gc3RhbGUgKHdhc3RlZnVsKSBwb2ludGVycyBk
dXJpbmcgaW5pdGlhbGl6YXRpb24uCi0KKyAgICAKICAgICAvLyBQcm90b3R5cGVzCiAgICAgbV9G
dW5jdGlvblByb3RvdHlwZSA9IDA7CiAgICAgbV9PYmplY3RQcm90b3R5cGUgPSAwOwpAQCAtMzQ3
LDcgKzM0Nyw3IEBAIENvbXBsZXRpb24gSW50ZXJwcmV0ZXI6OmV2YWx1YXRlKGNvbnN0IFUKICAg
ICAKICAgICBtX3JlY3Vyc2lvbisrOwogICAgIAotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmogPSBt
X2dsb2JhbE9iamVjdDsKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqID0gbV9nbG9iYWxP
YmplY3Q7CiAgICAgSlNPYmplY3QqIHRoaXNPYmogPSBnbG9iYWxPYmo7CiAgICAgCiAgICAgLy8g
InRoaXMiIG11c3QgYmUgYW4gb2JqZWN0Li4uIHVzZSBzYW1lIHJ1bGVzIGFzIEZ1bmN0aW9uLnBy
b3RvdHlwZS5hcHBseSgpCkBAIC02MTAsMTEgKzYxMCw2IEBAIHZvaWQgSW50ZXJwcmV0ZXI6Om1h
cmsoKQogICAgICAgICBtX1VyaUVycm9yUHJvdG90eXBlLT5tYXJrKCk7CiB9CiAKLUludGVycHJl
dGVyKiBJbnRlcnByZXRlcjo6aW50ZXJwcmV0ZXJXaXRoR2xvYmFsT2JqZWN0KEpTT2JqZWN0KiBn
bG9iYWxPYmplY3QpCi17Ci0gICAgcmV0dXJuIGludGVycHJldGVyTWFwKCkuZ2V0KGdsb2JhbE9i
amVjdCk7Ci19Ci0KICNpZmRlZiBLSlNfREVCVUdfTUVNCiAjaW5jbHVkZSAibGV4ZXIuaCIKIHZv
aWQgSW50ZXJwcmV0ZXI6OmZpbmFsQ2hlY2soKQpJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL2lu
dGVycHJldGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2ludGVycHJldGVy
LmgJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2ludGVycHJldGVyLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgbmFtZXNwYWNlIEtKUyB7CiAgIGNsYXNz
IEV2YWxFcnJvclByb3RvdHlwZTsKICAgY2xhc3MgRnVuY3Rpb25PYmplY3RJbXA7CiAgIGNsYXNz
IEZ1bmN0aW9uUHJvdG90eXBlOworICBjbGFzcyBKU0dsb2JhbE9iamVjdDsKICAgY2xhc3MgTmF0
aXZlRXJyb3JJbXA7CiAgIGNsYXNzIE5hdGl2ZUVycm9yUHJvdG90eXBlOwogICBjbGFzcyBOdW1i
ZXJPYmplY3RJbXA7CkBAIC05NCw3ICs5NSw3IEBAIG5hbWVzcGFjZSBLSlMgewogICAgICAqCiAg
ICAgICogQHBhcmFtIGdsb2JhbCBUaGUgb2JqZWN0IHRvIHVzZSBhcyB0aGUgZ2xvYmFsIG9iamVj
dCBmb3IgdGhpcyBpbnRlcnByZXRlcgogICAgICAqLwotICAgIEludGVycHJldGVyKEpTT2JqZWN0
KiBnbG9iYWxPYmplY3QpOworICAgIEludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0Kik7CiAgICAg
LyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnRlcnByZXRlci4gQSBnbG9iYWwgb2JqZWN0IHdp
bGwgYmUgY3JlYXRlZCBhbmQKICAgICAgKiBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFuZGFyZCBn
bG9iYWwgcHJvcGVydGllcy4KQEAgLTExMSw3ICsxMTIsNyBAQCBuYW1lc3BhY2UgS0pTIHsKICAg
ICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBpcyB1c2VkIGFzIHRoZSBnbG9iYWwgb2JqZWN0
IGR1cmluZyBhbGwgc2NyaXB0CiAgICAgICogZXhlY3V0aW9uIHBlcmZvcm1lZCBieSB0aGlzIGlu
dGVycHJldGVyCiAgICAgICovCi0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCgpIGNvbnN0Owor
ICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QoKSBjb25zdDsKIAogICAgIC8qKgogICAg
ICAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQg
dG8gZXhlY3V0ZQpAQCAtMzAwLDI0ICszMDEsNiBAQCBuYW1lc3BhY2UgS0pTIHsKIAogICAgIHZv
aWQgc2F2ZUJ1aWx0aW5zIChTYXZlZEJ1aWx0aW5zJikgY29uc3Q7CiAgICAgdm9pZCByZXN0b3Jl
QnVpbHRpbnMgKGNvbnN0IFNhdmVkQnVpbHRpbnMmKTsKLQotICAgIC8qKgotICAgICAqIERldGVy
bWluZSBpZiB0aGUgdmFsdWUgaXMgYSBnbG9iYWwgb2JqZWN0IChmb3IgYW55IGludGVycHJldGVy
KS4gIFRoaXMgbWF5Ci0gICAgICogYmUgZGlmZmljdWx0IHRvIGRldGVybWluZSBmb3IgbXVsdGlw
bGUgdXNlcyBvZiBKU0MgaW4gYSBwcm9jZXNzIHRoYXQgYXJlCi0gICAgICogbG9naWNhbGx5IGlu
ZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuICBJbiB0aGUgY2FzZSBvZiBXZWJDb3JlLCB0aGlzIG1l
dGhvZAotICAgICAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyB0aGUgV2lu
ZG93IG9iamVjdCBzbyB3ZSBjYW4gcGVyZm9ybQotICAgICAqIHNlY3VyaXR5IGNoZWNrcy4KLSAg
ICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNHbG9iYWxPYmplY3QoSlNWYWx1ZSopIHsgcmV0dXJu
IGZhbHNlOyB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIEZpbmQgdGhlIGludGVycHJldGVyIGZv
ciBhIHBhcnRpY3VsYXIgZ2xvYmFsIG9iamVjdC4gIFRoaXMgc2hvdWxkIHJlYWxseQotICAgICAq
IGJlIGEgc3RhdGljIG1ldGhvZCwgYnV0IHdlIGNhbid0IGRvIHRoYXQgaXMgQysrLiAgQWdhaW4s
IGFzIHdpdGggaXNHbG9iYWxPYmplY3QoKQotICAgICAqIGltcGxlbWVudGF0aW9uIHJlYWxseSBu
ZWVkIHRvIGtub3cgYWJvdXQgYWxsIGluc3RhbmNlcyBvZiBJbnRlcnByZXRlcgotICAgICAqIGNy
ZWF0ZWQgaW4gYW4gYXBwbGljYXRpb24gdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGlzIG1ldGhv
ZC4gIFRoZSBvbmx5Ci0gICAgICogb3ZlcnJpZGUgb2YgdGhpcyBtZXRob2QgaXMgY3VycmVudGx5
IGluIFdlYkNvcmUuCi0gICAgICovCi0gICAgdmlydHVhbCBJbnRlcnByZXRlciogaW50ZXJwcmV0
ZXJGb3JHbG9iYWxPYmplY3QoY29uc3QgSlNWYWx1ZSopIHsgcmV0dXJuIDA7IH0KICAgICAKICAg
ICAvKioKICAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGl0IGlzICdzYWZlJyB0byBleGVjdXRlIGNv
ZGUgaW4gdGhlIHRhcmdldCBpbnRlcnByZXRlciBmcm9tIGFuCkBAIC0zMzcsOSArMzIwLDcgQEAg
bmFtZXNwYWNlIEtKUyB7CiAgICAgCiAgICAgdm9pZCBzZXRDb250ZXh0KENvbnRleHQqIGMpIHsg
bV9jb250ZXh0ID0gYzsgfQogICAgIENvbnRleHQqIGNvbnRleHQoKSBjb25zdCB7IHJldHVybiBt
X2NvbnRleHQ7IH0KLSAgICAKLSAgICBzdGF0aWMgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyV2l0
aEdsb2JhbE9iamVjdChKU09iamVjdCopOwotICAgIAorICAgICAgICAKICAgICB2b2lkIHNldFRp
bWVvdXRUaW1lKHVuc2lnbmVkIHRpbWVvdXRUaW1lKSB7IG1fdGltZW91dFRpbWUgPSB0aW1lb3V0
VGltZTsgfQogCiAgICAgdm9pZCBzdGFydFRpbWVvdXRDaGVjaygpOwpAQCAtMzg4LDcgKzM2OSw3
IEBAIHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV90aWNrQ291bnQ7CiAgICAgdW5zaWduZWQgbV90
aWNrc1VudGlsTmV4dFRpbWVvdXRDaGVjazsKIAotICAgIEpTT2JqZWN0KiBtX2dsb2JhbE9iamVj
dDsKKyAgICBKU0dsb2JhbE9iamVjdCogbV9nbG9iYWxPYmplY3Q7CiAKICAgICBPYmplY3RPYmpl
Y3RJbXAqIG1fT2JqZWN0OwogICAgIEZ1bmN0aW9uT2JqZWN0SW1wKiBtX0Z1bmN0aW9uOwpJbmRl
eDogSmF2YVNjcmlwdENvcmUva2pzL2xvb2t1cC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRD
b3JlL2tqcy9sb29rdXAuaAkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMv
bG9va3VwLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDEyICsxOSwxMyBAQAogICoKICAqLwogCi0j
aWZuZGVmIF9LSlNMT09LVVBfSF8KLSNkZWZpbmUgX0tKU0xPT0tVUF9IXworI2lmbmRlZiBLSlNf
bG9va3VwX2gKKyNkZWZpbmUgS0pTX2xvb2t1cF9oCiAKICNpbmNsdWRlICJjb250ZXh0LmgiCiAj
aW5jbHVkZSAiaWRlbnRpZmllci5oIgogI2luY2x1ZGUgImludGVycHJldGVyLmgiCisjaW5jbHVk
ZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJvYmplY3QuaCIKICNpbmNsdWRlIDxzdGRp
by5oPgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CkBAIC0yNjksNyArMjcwLDcgQEAgbmFt
ZXNwYWNlIEtKUyB7CiAgIHRlbXBsYXRlIDxjbGFzcyBDbGFzc0N0b3I+CiAgIGlubGluZSBKU09i
amVjdCogY2FjaGVHbG9iYWxPYmplY3QoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eU5hbWUpCiAgIHsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gc3RhdGlj
X2Nhc3Q8SlNPYmplY3QqPihleGVjLT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0
KCkpOworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsSW50
ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCk7CiAgICAgSlNWYWx1ZSogb2JqID0gZ2xvYmFsT2Jq
ZWN0LT5nZXREaXJlY3QocHJvcGVydHlOYW1lKTsKICAgICBpZiAob2JqKSB7CiAgICAgICBBU1NF
UlQob2JqLT5pc09iamVjdCgpKTsKQEAgLTM1MSw0ICszNTIsNCBAQCBuYW1lc3BhY2UgS0pTIHsK
ICAgICBpbnQgaWQ7IFwKICAgfTsKIAotI2VuZGlmCisjZW5kaWYgLy8gS0pTX2xvb2t1cF9oCklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvb2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUva2pzL29iamVjdC5oCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tq
cy9vYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtNDU3LDYgKzQ1Nyw3IEBAIG5hbWVzcGFjZSBL
SlMgewogICAgIHZvaWQgcmVzdG9yZVByb3BlcnRpZXMoY29uc3QgU2F2ZWRQcm9wZXJ0aWVzICZw
KSB7IF9wcm9wLnJlc3RvcmUocCk7IH0KIAogICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRpb24o
KSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0dsb2JhbE9iamVjdCgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgIHByb3RlY3RlZDoKICAgICBQcm9wZXJ0eU1hcCBfcHJv
cDsKICAgcHJpdmF0ZToKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy90ZXN0a2pzLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvdGVzdGtqcy5jcHAJKHJldmlzaW9uIDI3MDA3
KQorKysgSmF2YVNjcmlwdENvcmUva2pzL3Rlc3RranMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Niw2ICsyNiw3IEBACiAjaW5jbHVkZSAiSlNMb2NrLmgiCiAjaW5jbHVkZSAiUGFyc2VyLmgiCiAj
aW5jbHVkZSAiY29sbGVjdG9yLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNs
dWRlICJvYmplY3QuaCIKICNpbmNsdWRlICJwcm90ZWN0LmgiCiAjaW5jbHVkZSA8bWF0aC5oPgpA
QCAtMTEwLDcgKzExMSw3IEBAIGxvbmcgU3RvcFdhdGNoOjpnZXRFbGFwc2VkTVMoKQogI2VuZGlm
CiB9CiAKLWNsYXNzIEdsb2JhbEltcCA6IHB1YmxpYyBKU09iamVjdCB7CitjbGFzcyBHbG9iYWxJ
bXAgOiBwdWJsaWMgSlNHbG9iYWxPYmplY3QgewogcHVibGljOgogICB2aXJ0dWFsIFVTdHJpbmcg
Y2xhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gImdsb2JhbCI7IH0KIH07CkluZGV4OiBXZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjcwMDcpCisrKyBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpA
QCAtMTM2MTMsNyArMTM2MTMsNiBAQAogCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJv
amVjdCBvYmplY3QgKi8gPSB7CiAJCQlpc2EgPSBQQlhQcm9qZWN0OwogCQkJYnVpbGRDb25maWd1
cmF0aW9uTGlzdCA9IDE0OUMyODQzMDg5MDJCMTEwMDhBOUVGQyAvKiBCdWlsZCBjb25maWd1cmF0
aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldlYkNvcmUiICovOwotCQkJY29tcGF0aWJpbGl0eVZl
cnNpb24gPSAiWGNvZGUgMi40IjsKIAkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOwogCQkJ
a25vd25SZWdpb25zID0gKAogCQkJCUVuZ2xpc2gsCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pz
L2tqc19iaW5kaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19i
aW5kaW5nLmNwcAkocmV2aXNpb24gMjcwMDcpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19i
aW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTMwLDcgKzEzMCw3IEBAIHN0YXRpYyBOb2Rl
UGVyRG9jTWFwJiBkb21Ob2Rlc1BlckRvY3VtZW4KICAgICByZXR1cm4gc3RhdGljRE9NTm9kZXNQ
ZXJEb2N1bWVudDsKIH0KIAotU2NyaXB0SW50ZXJwcmV0ZXI6OlNjcmlwdEludGVycHJldGVyKEpT
T2JqZWN0KiBnbG9iYWwsIEZyYW1lKiBmcmFtZSkKK1NjcmlwdEludGVycHJldGVyOjpTY3JpcHRJ
bnRlcnByZXRlcihKU0dsb2JhbE9iamVjdCogZ2xvYmFsLCBGcmFtZSogZnJhbWUpCiAgICAgOiBJ
bnRlcnByZXRlcihnbG9iYWwpCiAgICAgLCBtX2ZyYW1lKGZyYW1lKQogICAgICwgbV9jdXJyZW50
RXZlbnQoMCkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvanMva2pzX2JpbmRpbmcuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5kaW5nLmgJKHJldmlzaW9uIDI3MDA3
KQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfYmluZGluZy5oCSh3b3JraW5nIGNvcHkpCkBA
IC03Miw3ICs3Miw3IEBAIG5hbWVzcGFjZSBLSlMgewogICAgICAqLwogICAgIGNsYXNzIFNjcmlw
dEludGVycHJldGVyIDogcHVibGljIEludGVycHJldGVyIHsKICAgICBwdWJsaWM6Ci0gICAgICAg
IFNjcmlwdEludGVycHJldGVyKEpTT2JqZWN0KiBnbG9iYWwsIFdlYkNvcmU6OkZyYW1lKik7Cisg
ICAgICAgIFNjcmlwdEludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0KiwgV2ViQ29yZTo6RnJhbWUq
KTsKIAogICAgICAgICBzdGF0aWMgRE9NT2JqZWN0KiBnZXRET01PYmplY3Qodm9pZCogb2JqZWN0
SGFuZGxlKTsKICAgICAgICAgc3RhdGljIHZvaWQgcHV0RE9NT2JqZWN0KHZvaWQqIG9iamVjdEhh
bmRsZSwgRE9NT2JqZWN0Kik7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL29iamMvV2ViU2NyaXB0
T2JqZWN0Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mvb2JqYy9XZWJTY3JpcHRP
YmplY3QubW0JKHJldmlzaW9uIDI3MDA3KQorKysgV2ViQ29yZS9iaW5kaW5ncy9vYmpjL1dlYlNj
cmlwdE9iamVjdC5tbQkod29ya2luZyBjb3B5KQpAQCAtMTE1LDcgKzExNSw3IEBAIHN0YXRpYyB2
b2lkIF9kaWRFeGVjdXRlKFdlYlNjcmlwdE9iamVjdCAKICAgICBFeGVjU3RhdGUqIGV4ZWMgPSBy
b290LT5pbnRlcnByZXRlcigpLT5nbG9iYWxFeGVjKCk7CiAgICAgS0pTRGlkRXhlY3V0ZUZ1bmN0
aW9uUHRyIGZ1bmMgPSBJbnN0YW5jZTo6ZGlkRXhlY3V0ZUZ1bmN0aW9uKCk7CiAgICAgaWYgKGZ1
bmMpCi0gICAgICAgIGZ1bmMoZXhlYywgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihyb290LT5pbnRl
cnByZXRlcigpLT5nbG9iYWxPYmplY3QoKSkpOworICAgICAgICBmdW5jKGV4ZWMsIHJvb3QtPmlu
dGVycHJldGVyKCktPmdsb2JhbE9iamVjdCgpKTsKIH0KIAogLSAodm9pZClfc2V0SW1wOihKU09i
amVjdCopaW1wIG9yaWdpblJvb3RPYmplY3Q6KFBhc3NSZWZQdHI8Um9vdE9iamVjdD4pb3JpZ2lu
Um9vdE9iamVjdCByb290T2JqZWN0OihQYXNzUmVmUHRyPFJvb3RPYmplY3Q+KXJvb3RPYmplY3QK
SW5kZXg6IFdlYkNvcmUvYnJpZGdlL21hYy9XZWJDb3JlU2NyaXB0RGVidWdnZXIubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9icmlkZ2UvbWFjL1dlYkNvcmVTY3JpcHREZWJ1Z2dlci5tbQkocmV2
aXNpb24gMjcwMDcpCisrKyBXZWJDb3JlL2JyaWRnZS9tYWMvV2ViQ29yZVNjcmlwdERlYnVnZ2Vy
Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW1wb3J0ICJXZWJTY3JpcHRP
YmplY3RQcml2YXRlLmgiCiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9jb250ZXh0Lmg+CiAjaW1w
b3J0IDxKYXZhU2NyaXB0Q29yZS9kZWJ1Z2dlci5oPgorI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUv
SlNHbG9iYWxPYmplY3QuaD4KIAogdXNpbmcgbmFtZXNwYWNlIEtKUzsKIHVzaW5nIG5hbWVzcGFj
ZSBXZWJDb3JlOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>16852</attachid>
            <date>2007-10-24 22:33:08 -0700</date>
            <delta_ts>2007-10-24 22:45:25 -0700</delta_ts>
            <desc>full patch (minus changelog), 0.5% on SunSpider</desc>
            <filename>globalobj.patch</filename>
            <type>text/plain</type>
            <size>92132</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjIsOSAr
MTIyLDkgQEAgX19aTjNLSlMxMUludGVycHJldGVyNG1hcmtFdgogX19aTjNLSlMxMUludGVycHJl
dGVyNnNfaG9va0UKIF9fWk4zS0pTMTFJbnRlcnByZXRlcjhldmFsdWF0ZUVSS05TXzdVU3RyaW5n
RWlQS05TXzVVQ2hhckVpUE5TXzdKU1ZhbHVlRQogX19aTjNLSlMxMUludGVycHJldGVyOGV2YWx1
YXRlRVJLTlNfN1VTdHJpbmdFaVMzX1BOU183SlNWYWx1ZUUKLV9fWk4zS0pTMTFJbnRlcnByZXRl
ckMxRVBOU184SlNPYmplY3RFCitfX1pOM0tKUzExSW50ZXJwcmV0ZXJDMUVQTlNfMTRKU0dsb2Jh
bE9iamVjdEUKK19fWk4zS0pTMTFJbnRlcnByZXRlckMyRVBOU18xNEpTR2xvYmFsT2JqZWN0RQog
X19aTjNLSlMxMUludGVycHJldGVyQzFFdgotX19aTjNLSlMxMUludGVycHJldGVyQzJFUE5TXzhK
U09iamVjdEUKIF9fWk4zS0pTMTFJbnRlcnByZXRlckQxRXYKIF9fWk4zS0pTMTFJbnRlcnByZXRl
ckQyRXYKIF9fWk4zS0pTMTFKU0ltbWVkaWF0ZTR0eXBlRVBLTlNfN0pTVmFsdWVFCkluZGV4OiBK
YXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tPYmplY3QuY3BwCShyZXZpc2lvbiAyNzAwNykKKysr
IEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw2ICsxLDcgQEAKIC8vIC0qLSBtb2RlOiBjKys7IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLQog
LyoKICAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJr
aXQub3JnPgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNCw0NTAgKzI1LDEy
IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKICAqLwogCi0jaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+CiAj
aW5jbHVkZSAiSlNDYWxsYmFja09iamVjdC5oIgogCi0jaW5jbHVkZSAiQVBJQ2FzdC5oIgotI2lu
Y2x1ZGUgIkpTQ2FsbGJhY2tGdW5jdGlvbi5oIgotI2luY2x1ZGUgIkpTQ2xhc3NSZWYuaCIKLSNp
bmNsdWRlICJKU09iamVjdFJlZi5oIgotI2luY2x1ZGUgIkpTU3RyaW5nUmVmLmgiCi0jaW5jbHVk
ZSAiUHJvcGVydHlOYW1lQXJyYXkuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KLQogbmFtZXNwYWNlIEtKUyB7CiAKLWNvbnN0IENsYXNzSW5mbyBKU0Nh
bGxiYWNrT2JqZWN0OjppbmZvID0geyAiQ2FsbGJhY2tPYmplY3QiLCAwLCAwLCAwIH07Ci0KLUpT
Q2FsbGJhY2tPYmplY3Q6OkpTQ2FsbGJhY2tPYmplY3QoRXhlY1N0YXRlKiBleGVjLCBKU0NsYXNz
UmVmIGpzQ2xhc3MsIEpTVmFsdWUqIHByb3RvdHlwZSwgdm9pZCogZGF0YSkKLSAgICA6IEpTT2Jq
ZWN0KHByb3RvdHlwZSkKLSAgICAsIG1fY2xhc3MoMCkKLSAgICAsIG1faXNJbml0aWFsaXplZChm
YWxzZSkKLXsKLSAgICBpbml0KGV4ZWMsIGpzQ2xhc3MsIGRhdGEpOwotfQotCi12b2lkIEpTQ2Fs
bGJhY2tPYmplY3Q6OmluaXQoRXhlY1N0YXRlKiBleGVjLCBKU0NsYXNzUmVmIGpzQ2xhc3MsIHZv
aWQqIGRhdGEpCi17Ci0gICAgbV9wcml2YXRlRGF0YSA9IGRhdGE7Ci0gICAgSlNDbGFzc1JlZiBv
bGRDbGFzcyA9IG1fY2xhc3M7Ci0gICAgbV9jbGFzcyA9IEpTQ2xhc3NSZXRhaW4oanNDbGFzcyk7
Ci0gICAgaWYgKG9sZENsYXNzKQotICAgICAgICBKU0NsYXNzUmVsZWFzZShvbGRDbGFzcyk7Ci0K
LSAgICBpZiAoIWV4ZWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxKU09iamVjdElu
aXRpYWxpemVDYWxsYmFjaywgMTY+IGluaXRSb3V0aW5lczsKLSAgICBkbyB7Ci0gICAgICAgIGlm
IChKU09iamVjdEluaXRpYWxpemVDYWxsYmFjayBpbml0aWFsaXplID0ganNDbGFzcy0+aW5pdGlh
bGl6ZSkKLSAgICAgICAgICAgIGluaXRSb3V0aW5lcy5hcHBlbmQoaW5pdGlhbGl6ZSk7Ci0gICAg
fSB3aGlsZSAoKGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykpOwotICAgIAotICAgIC8v
IGluaXRpYWxpemUgZnJvbSBiYXNlIHRvIGRlcml2ZWQKLSAgICBmb3IgKGludCBpID0gc3RhdGlj
X2Nhc3Q8aW50Pihpbml0Um91dGluZXMuc2l6ZSgpKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAg
ICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgSlNPYmplY3RJ
bml0aWFsaXplQ2FsbGJhY2sgaW5pdGlhbGl6ZSA9IGluaXRSb3V0aW5lc1tpXTsKLSAgICAgICAg
aW5pdGlhbGl6ZSh0b1JlZihleGVjKSwgdG9SZWYodGhpcykpOwotICAgIH0KLSAgICBtX2lzSW5p
dGlhbGl6ZWQgPSB0cnVlOwotfQotCi1KU0NhbGxiYWNrT2JqZWN0Ojp+SlNDYWxsYmFja09iamVj
dCgpCi17Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIAotICAg
IGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpz
Q2xhc3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoSlNPYmplY3RGaW5hbGl6ZUNhbGxiYWNr
IGZpbmFsaXplID0ganNDbGFzcy0+ZmluYWxpemUpIHsKLSAgICAgICAgICAgIGZpbmFsaXplKHRo
aXNSZWYpOwotICAgICAgICB9Ci0gICAgCi0gICAgSlNDbGFzc1JlbGVhc2UobV9jbGFzcyk7Ci19
Ci0KLXZvaWQgSlNDYWxsYmFja09iamVjdDo6aW5pdGlhbGl6ZUlmTmVlZGVkKEV4ZWNTdGF0ZSog
ZXhlYykKLXsKLSAgICBpZiAobV9pc0luaXRpYWxpemVkKQotICAgICAgICByZXR1cm47Ci0gICAg
aW5pdChleGVjLCBtX2NsYXNzLCBtX3ByaXZhdGVEYXRhKTsKLX0KLQotVVN0cmluZyBKU0NhbGxi
YWNrT2JqZWN0OjpjbGFzc05hbWUoKSBjb25zdAotewotICAgIGlmICghbV9jbGFzcy0+Y2xhc3NO
YW1lLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gbV9jbGFzcy0+Y2xhc3NOYW1lOwotICAgIAot
ICAgIHJldHVybiBKU09iamVjdDo6Y2xhc3NOYW1lKCk7Ci19Ci0KLWJvb2wgSlNDYWxsYmFja09i
amVjdDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmll
ciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgSlNDb250ZXh0UmVm
IGN0eCA9IHRvUmVmKGV4ZWMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlz
KTsKLSAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUu
dXN0cmluZygpLnJlcCgpKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFz
czsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAgIC8v
IG9wdGlvbmFsIG9wdGltaXphdGlvbiB0byBieXBhc3MgZ2V0UHJvcGVydHkgaW4gY2FzZXMgd2hl
biB3ZSBvbmx5IG5lZWQgdG8ga25vdyBpZiB0aGUgcHJvcGVydHkgZXhpc3RzCi0gICAgICAgIGlm
IChKU09iamVjdEhhc1Byb3BlcnR5Q2FsbGJhY2sgaGFzUHJvcGVydHkgPSBqc0NsYXNzLT5oYXNQ
cm9wZXJ0eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tz
OwotICAgICAgICAgICAgaWYgKGhhc1Byb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1l
UmVmKSkgewotICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIGNhbGxiYWNrR2V0
dGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfSBlbHNlIGlmIChKU09iamVjdEdldFByb3BlcnR5Q2FsbGJhY2sgZ2V0UHJvcGVydHkgPSBq
c0NsYXNzLT5nZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3Mg
ZHJvcEFsbExvY2tzOwotICAgICAgICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBnZXRQcm9w
ZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9u
U2xvdCgpKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgdmFsdWUgc28gd2UgZG9u
J3QgaGF2ZSB0byBjb21wdXRlIGl0IGFnYWluCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IFRo
aXMgdmlvbGF0ZXMgdGhlIFByb3BlcnR5U2xvdCBkZXNpZ24gYSBsaXR0bGUgYml0LgotICAgICAg
ICAgICAgICAgIC8vIFdlIHNob3VsZCBlaXRoZXIgdXNlIHRoaXMgb3B0aW1pemF0aW9uIGV2ZXJ5
d2hlcmUsIG9yIG5vd2hlcmUuCi0gICAgICAgICAgICAgICAgc2xvdC5zZXRDdXN0b20ocmVpbnRl
cnByZXRfY2FzdDxKU09iamVjdCo+KHRvSlModmFsdWUpKSwgY2FjaGVkVmFsdWVHZXR0ZXIpOwot
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1
ZXMgPSBqc0NsYXNzLT5zdGF0aWNWYWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0aWNWYWx1
ZXMtPmNvbnRhaW5zKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7Ci0gICAgICAgICAg
ICAgICAgc2xvdC5zZXRDdXN0b20odGhpcywgc3RhdGljVmFsdWVHZXR0ZXIpOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1
bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9ucykgewotICAgICAgICAgICAgaWYgKHN0
YXRpY0Z1bmN0aW9ucy0+Y29udGFpbnMocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsK
LSAgICAgICAgICAgICAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBzdGF0aWNGdW5jdGlvbkdldHRl
cik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChleGVj
LCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwotfQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmdldE93
blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgUHJv
cGVydHlTbG90JiBzbG90KQotewotICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywg
SWRlbnRpZmllcjo6ZnJvbShwcm9wZXJ0eU5hbWUpLCBzbG90KTsKLX0KLQotdm9pZCBKU0NhbGxi
YWNrT2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0
eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKLXsKLSAgICBKU0NvbnRleHRSZWYgY3R4
ID0gdG9SZWYoZXhlYyk7Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwot
ICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3Ry
aW5nKCkucmVwKCkpOwotICAgIEpTVmFsdWVSZWYgdmFsdWVSZWYgPSB0b1JlZih2YWx1ZSk7Ci0K
LSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3Mg
PSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgewotICAgICAgICBpZiAoSlNPYmplY3RTZXRQcm9wZXJ0
eUNhbGxiYWNrIHNldFByb3BlcnR5ID0ganNDbGFzcy0+c2V0UHJvcGVydHkpIHsKLSAgICAgICAg
ICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAgIGlmIChz
ZXRQcm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdmFsdWVSZWYsIHRvUmVm
KGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgfQotICAgIAotICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUq
IHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgewotICAgICAgICAgICAgaWYg
KFN0YXRpY1ZhbHVlRW50cnkqIGVudHJ5ID0gc3RhdGljVmFsdWVzLT5nZXQocHJvcGVydHlOYW1l
LnVzdHJpbmcoKS5yZXAoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0
ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5KQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgICAgICAgICAgaWYgKEpTT2JqZWN0U2V0UHJvcGVydHlDYWxsYmFjayBz
ZXRQcm9wZXJ0eSA9IGVudHJ5LT5zZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICBK
U0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChzZXRQcm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdmFsdWVSZWYsIHRv
UmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvd0Vy
cm9yKGV4ZWMsIFJlZmVyZW5jZUVycm9yLCAiQXR0ZW1wdCB0byBzZXQgYSBwcm9wZXJ0eSB0aGF0
IGlzIG5vdCBzZXR0YWJsZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNG
dW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChT
dGF0aWNGdW5jdGlvbkVudHJ5KiBlbnRyeSA9IHN0YXRpY0Z1bmN0aW9ucy0+Z2V0KHByb3BlcnR5
TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5hdHRy
aWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSkKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHB1dERpcmVjdChwcm9wZXJ0eU5hbWUsIHZhbHVl
LCBhdHRyKTsgLy8gcHV0IGFzIG92ZXJyaWRlIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEpTT2Jq
ZWN0OjpwdXQoZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSwgYXR0cik7Ci19Ci0KLXZvaWQgSlND
YWxsYmFja09iamVjdDo6cHV0KEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgcHJvcGVydHlOYW1l
LCBKU1ZhbHVlKiB2YWx1ZSwgaW50IGF0dHIpCi17Ci0gICAgcmV0dXJuIHB1dChleGVjLCBJZGVu
dGlmaWVyOjpmcm9tKHByb3BlcnR5TmFtZSksIHZhbHVlLCBhdHRyKTsKLX0KLQotYm9vbCBKU0Nh
bGxiYWNrT2JqZWN0OjpkZWxldGVQcm9wZXJ0eShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50
aWZpZXImIHByb3BlcnR5TmFtZSkKLXsKLSAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhl
Yyk7Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIEpTU3RyaW5n
UmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkp
OwotICAgIAotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsg
anNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAgIGlmIChKU09iamVjdERl
bGV0ZVByb3BlcnR5Q2FsbGJhY2sgZGVsZXRlUHJvcGVydHkgPSBqc0NsYXNzLT5kZWxldGVQcm9w
ZXJ0eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwot
ICAgICAgICAgICAgaWYgKGRlbGV0ZVByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1l
UmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNW
YWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFsdWVzKSB7Ci0gICAg
ICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdldChw
cm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAgICAgICAgIGlmIChlbnRy
eS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSkKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoT3BhcXVlSlND
bGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0
YXRpY0Z1bmN0aW9ucykgewotICAgICAgICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVu
dHJ5ID0gc3RhdGljRnVuY3Rpb25zLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkp
IHsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZURvbnREZWxldGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0KLQotICAgIHJldHVybiBKU09iamVjdDo6ZGVsZXRlUHJvcGVydHkoZXhlYywgcHJvcGVydHlO
YW1lKTsKLX0KLQotYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjpkZWxldGVQcm9wZXJ0eShFeGVjU3Rh
dGUqIGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSkKLXsKLSAgICByZXR1cm4gZGVsZXRlUHJv
cGVydHkoZXhlYywgSWRlbnRpZmllcjo6ZnJvbShwcm9wZXJ0eU5hbWUpKTsKLX0KLQotYm9vbCBK
U0NhbGxiYWNrT2JqZWN0OjppbXBsZW1lbnRzQ29uc3RydWN0KCkgY29uc3QKLXsKLSAgICBmb3Ig
KEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNz
LT5wYXJlbnRDbGFzcykKLSAgICAgICAgaWYgKGpzQ2xhc3MtPmNhbGxBc0NvbnN0cnVjdG9yKQot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUpTT2Jq
ZWN0KiBKU0NhbGxiYWNrT2JqZWN0Ojpjb25zdHJ1Y3QoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBM
aXN0JiBhcmdzKQotewotICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7Ci0g
ICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIAotICAgIGZvciAoSlND
bGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBh
cmVudENsYXNzKSB7Ci0gICAgICAgIGlmIChKU09iamVjdENhbGxBc0NvbnN0cnVjdG9yQ2FsbGJh
Y2sgY2FsbEFzQ29uc3RydWN0b3IgPSBqc0NsYXNzLT5jYWxsQXNDb25zdHJ1Y3RvcikgewotICAg
ICAgICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3Muc2l6ZSgp
KTsKLSAgICAgICAgICAgIFZlY3RvcjxKU1ZhbHVlUmVmLCAxNj4gYXJndW1lbnRzKGFyZ3VtZW50
Q291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50OyBp
KyspCi0gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gdG9SZWYoYXJnc1tpXSk7Ci0gICAg
ICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICBy
ZXR1cm4gdG9KUyhjYWxsQXNDb25zdHJ1Y3RvcihleGVjUmVmLCB0aGlzUmVmLCBhcmd1bWVudENv
dW50LCBhcmd1bWVudHMuZGF0YSgpLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1lbnRzQ29uc3Ry
dWN0IHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgaGVyZQotICAgIHJldHVybiAwOwot
fQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmltcGxlbWVudHNIYXNJbnN0YW5jZSgpIGNvbnN0
Ci17Ci0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0Ns
YXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChqc0NsYXNzLT5oYXNJbnN0
YW5jZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6Omhhc0luc3RhbmNlKEV4ZWNTdGF0ZSAqZXhlYywgSlNW
YWx1ZSAqdmFsdWUpCi17Ci0gICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsK
LSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KLSAgICBmb3IgKEpTQ2xh
c3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJl
bnRDbGFzcykKLSAgICAgICAgaWYgKEpTT2JqZWN0SGFzSW5zdGFuY2VDYWxsYmFjayBoYXNJbnN0
YW5jZSA9IGpzQ2xhc3MtPmhhc0luc3RhbmNlKSB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BB
bGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICByZXR1cm4gaGFzSW5zdGFuY2UoZXhl
Y1JlZiwgdGhpc1JlZiwgdG9SZWYodmFsdWUpLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkp
KTsKLSAgICAgICAgfQotCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1lbnRzSGFzSW5zdGFuY2Ug
c2hvdWxkIHByZXZlbnQgdXMgZnJvbSByZWFjaGluZyBoZXJlCi0gICAgcmV0dXJuIDA7Ci19Ci0K
LQotYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjppbXBsZW1lbnRzQ2FsbCgpIGNvbnN0Ci17Ci0gICAg
Zm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganND
bGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChqc0NsYXNzLT5jYWxsQXNGdW5jdGlvbikK
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
SlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVj
LCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCAmYXJncykKLXsKLSAgICBKU0NvbnRleHRS
ZWYgZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1Jl
Zih0aGlzKTsKLSAgICBKU09iamVjdFJlZiB0aGlzT2JqUmVmID0gdG9SZWYodGhpc09iaik7Ci0K
LSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3Mg
PSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgewotICAgICAgICBpZiAoSlNPYmplY3RDYWxsQXNGdW5j
dGlvbkNhbGxiYWNrIGNhbGxBc0Z1bmN0aW9uID0ganNDbGFzcy0+Y2FsbEFzRnVuY3Rpb24pIHsK
LSAgICAgICAgICAgIGludCBhcmd1bWVudENvdW50ID0gc3RhdGljX2Nhc3Q8aW50PihhcmdzLnNp
emUoKSk7Ci0gICAgICAgICAgICBWZWN0b3I8SlNWYWx1ZVJlZiwgMTY+IGFyZ3VtZW50cyhhcmd1
bWVudENvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDb3Vu
dDsgaSsrKQotICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXSA9IHRvUmVmKGFyZ3NbaV0pOwot
ICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAgICAgICAg
ICAgcmV0dXJuIHRvSlMoY2FsbEFzRnVuY3Rpb24oZXhlY1JlZiwgdGhpc1JlZiwgdGhpc09ialJl
ZiwgYXJndW1lbnRDb3VudCwgYXJndW1lbnRzLmRhdGEoKSwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9u
U2xvdCgpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1l
bnRzQ2FsbCBzaG91bGQgcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIGhlcmUKLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpnZXRQcm9wZXJ0eU5hbWVzKEV4ZWNTdGF0
ZSogZXhlYywgUHJvcGVydHlOYW1lQXJyYXkmIHByb3BlcnR5TmFtZXMpCi17Ci0gICAgSlNDb250
ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0g
dG9SZWYodGhpcyk7Ci0KLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpz
Q2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgewotICAgICAgICBpZiAoSlNP
YmplY3RHZXRQcm9wZXJ0eU5hbWVzQ2FsbGJhY2sgZ2V0UHJvcGVydHlOYW1lcyA9IGpzQ2xhc3Mt
PmdldFByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRy
b3BBbGxMb2NrczsKLSAgICAgICAgICAgIGdldFByb3BlcnR5TmFtZXMoZXhlY1JlZiwgdGhpc1Jl
ZiwgdG9SZWYoJnByb3BlcnR5TmFtZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChPcGFx
dWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3Rh
dGljVmFsdWVzKSB7Ci0gICAgICAgICAgICB0eXBlZGVmIE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1Zh
bHVlc1RhYmxlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgICAgIGl0ZXJhdG9y
IGVuZCA9IHN0YXRpY1ZhbHVlcy0+ZW5kKCk7Ci0gICAgICAgICAgICBmb3IgKGl0ZXJhdG9yIGl0
ID0gc3RhdGljVmFsdWVzLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAg
ICAgICBVU3RyaW5nOjpSZXAqIG5hbWUgPSBpdC0+Zmlyc3QuZ2V0KCk7Ci0gICAgICAgICAgICAg
ICAgU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAg
IGlmIChlbnRyeS0+Z2V0UHJvcGVydHkgJiYgIShlbnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3Bl
cnR5QXR0cmlidXRlRG9udEVudW0pKQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVz
LmFkZChJZGVudGlmaWVyKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rp
b25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7Ci0gICAgICAgICAgICB0eXBlZGVmIE9w
YXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlOjpjb25zdF9pdGVyYXRvciBpdGVyYXRv
cjsKLSAgICAgICAgICAgIGl0ZXJhdG9yIGVuZCA9IHN0YXRpY0Z1bmN0aW9ucy0+ZW5kKCk7Ci0g
ICAgICAgICAgICBmb3IgKGl0ZXJhdG9yIGl0ID0gc3RhdGljRnVuY3Rpb25zLT5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBVU3RyaW5nOjpSZXAqIG5hbWUgPSBp
dC0+Zmlyc3QuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgU3RhdGljRnVuY3Rpb25FbnRyeSogZW50
cnkgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgIGlmICghKGVudHJ5LT5hdHRyaWJ1dGVz
ICYga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RW51bSkpCi0gICAgICAgICAgICAgICAgICAgIHBy
b3BlcnR5TmFtZXMuYWRkKElkZW50aWZpZXIobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgSlNPYmplY3Q6OmdldFByb3BlcnR5TmFtZXMoZXhlYywgcHJvcGVy
dHlOYW1lcyk7Ci19Ci0KLWRvdWJsZSBKU0NhbGxiYWNrT2JqZWN0Ojp0b051bWJlcihFeGVjU3Rh
dGUqIGV4ZWMpIGNvbnN0Ci17Ci0gICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwot
ICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKLQotICAgIGZvciAoSlNDbGFz
c1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVu
dENsYXNzKQotICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0VG9UeXBlQ2FsbGJhY2sgY29udmVy
dFRvVHlwZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsKLSAgICAgICAgICAgIEpTTG9jazo6
RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZh
bHVlID0gY29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtKU1R5cGVOdW1iZXIsIHRvUmVmKGV4
ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVl
KS0+Z2V0TnVtYmVyKCk7Ci0gICAgICAgIH0KLQotICAgIHJldHVybiBKU09iamVjdDo6dG9OdW1i
ZXIoZXhlYyk7Ci19Ci0KLVVTdHJpbmcgSlNDYWxsYmFja09iamVjdDo6dG9TdHJpbmcoRXhlY1N0
YXRlKiBleGVjKSBjb25zdAotewotICAgIEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsK
LSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KLSAgICBmb3IgKEpTQ2xh
c3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJl
bnRDbGFzcykKLSAgICAgICAgaWYgKEpTT2JqZWN0Q29udmVydFRvVHlwZUNhbGxiYWNrIGNvbnZl
cnRUb1R5cGUgPSBqc0NsYXNzLT5jb252ZXJ0VG9UeXBlKSB7Ci0gICAgICAgICAgICBKU0xvY2s6
OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2
YWx1ZSA9IGNvbnZlcnRUb1R5cGUoY3R4LCB0aGlzUmVmLCBrSlNUeXBlU3RyaW5nLCB0b1JlZihl
eGVjLT5leGNlcHRpb25TbG90KCkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9KUyh2YWx1
ZSktPmdldFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICByZXR1cm4gSlNPYmplY3Q6OnRvU3Ry
aW5nKGV4ZWMpOwotfQotCi12b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OnNldFByaXZhdGUodm9pZCog
ZGF0YSkKLXsKLSAgICBtX3ByaXZhdGVEYXRhID0gZGF0YTsKLX0KLQotdm9pZCogSlNDYWxsYmFj
a09iamVjdDo6Z2V0UHJpdmF0ZSgpCi17Ci0gICAgcmV0dXJuIG1fcHJpdmF0ZURhdGE7Ci19Ci0K
LWJvb2wgSlNDYWxsYmFja09iamVjdDo6aW5oZXJpdHMoSlNDbGFzc1JlZiBjKSBjb25zdAotewot
ICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9
IGpzQ2xhc3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoanNDbGFzcyA9PSBjKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUpTVmFsdWUqIEpT
Q2FsbGJhY2tPYmplY3Q6OmNhY2hlZFZhbHVlR2V0dGVyKEV4ZWNTdGF0ZSosIEpTT2JqZWN0Kiwg
Y29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKLXsKLSAgICBKU1Zh
bHVlKiB2ID0gc2xvdC5zbG90QmFzZSgpOwotICAgIEFTU0VSVCh2KTsKLSAgICByZXR1cm4gdjsK
LX0KLQotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6c3RhdGljVmFsdWVHZXR0ZXIoRXhlY1N0
YXRlKiBleGVjLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29u
c3QgUHJvcGVydHlTbG90JiBzbG90KQotewotICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCktPmlu
aGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSk7Ci0gICAgSlNDYWxsYmFja09iamVjdCog
dGhpc09iaiA9IHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNlKCkp
OwotCi0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXNPYmopOwotICAgIEpTU3Ry
aW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVw
KCkpOwotCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNzOyBq
c0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChPcGFx
dWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3Rh
dGljVmFsdWVzKQotICAgICAgICAgICAgaWYgKFN0YXRpY1ZhbHVlRW50cnkqIGVudHJ5ID0gc3Rh
dGljVmFsdWVzLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpCi0gICAgICAgICAg
ICAgICAgaWYgKEpTT2JqZWN0R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQcm9wZXJ0eSA9IGVudHJ5
LT5nZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2Nr
cyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVl
ID0gZ2V0UHJvcGVydHkodG9SZWYoZXhlYyksIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9S
ZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdG9KUyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgcmV0dXJuIHRocm93RXJy
b3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJTdGF0aWMgdmFsdWUgcHJvcGVydHkgZGVmaW5lZCB3
aXRoIE5VTEwgZ2V0UHJvcGVydHkgY2FsbGJhY2suIik7Ci19Ci0KLUpTVmFsdWUqIEpTQ2FsbGJh
Y2tPYmplY3Q6OnN0YXRpY0Z1bmN0aW9uR2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3Qq
LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xv
dCkKLXsKLSAgICBBU1NFUlQoc2xvdC5zbG90QmFzZSgpLT5pbmhlcml0cygmSlNDYWxsYmFja09i
amVjdDo6aW5mbykpOwotICAgIEpTQ2FsbGJhY2tPYmplY3QqIHRoaXNPYmogPSBzdGF0aWNfY2Fz
dDxKU0NhbGxiYWNrT2JqZWN0Kj4oc2xvdC5zbG90QmFzZSgpKTsKLQotICAgIGlmIChKU1ZhbHVl
KiBjYWNoZWRPck92ZXJyaWRlVmFsdWUgPSB0aGlzT2JqLT5nZXREaXJlY3QocHJvcGVydHlOYW1l
KSkKLSAgICAgICAgcmV0dXJuIGNhY2hlZE9yT3ZlcnJpZGVWYWx1ZTsKLQotICAgIGZvciAoSlND
bGFzc1JlZiBqc0NsYXNzID0gdGhpc09iai0+bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpz
Q2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNG
dW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25z
KSB7Ci0gICAgICAgICAgICBpZiAoU3RhdGljRnVuY3Rpb25FbnRyeSogZW50cnkgPSBzdGF0aWNG
dW5jdGlvbnMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAg
ICAgICAgIGlmIChKU09iamVjdENhbGxBc0Z1bmN0aW9uQ2FsbGJhY2sgY2FsbEFzRnVuY3Rpb24g
PSBlbnRyeS0+Y2FsbEFzRnVuY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPYmplY3Qq
IG8gPSBuZXcgSlNDYWxsYmFja0Z1bmN0aW9uKGV4ZWMsIGNhbGxBc0Z1bmN0aW9uLCBwcm9wZXJ0
eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB0aGlzT2JqLT5wdXREaXJlY3QocHJvcGVydHlO
YW1lLCBvLCBlbnRyeS0+YXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBv
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQot
ICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFJlZmVyZW5jZUVycm9yLCAiU3RhdGljIGZ1bmN0
aW9uIHByb3BlcnR5IGRlZmluZWQgd2l0aCBOVUxMIGNhbGxBc0Z1bmN0aW9uIGNhbGxiYWNrLiIp
OwotfQotCi1KU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWxsYmFja0dldHRlcihFeGVjU3Rh
dGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25z
dCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgQVNTRVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5o
ZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsKLSAgICBKU0NhbGxiYWNrT2JqZWN0KiB0
aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7
Ci0KLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpc09iaik7Ci0gICAgSlNTdHJp
bmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAo
KSk7Ci0KLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNPYmotPm1fY2xhc3M7IGpz
Q2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKLSAgICAgICAgaWYgKEpTT2Jq
ZWN0R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQcm9wZXJ0eSA9IGpzQ2xhc3MtPmdldFByb3BlcnR5
KSB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAg
ICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1ZSA9IGdldFByb3BlcnR5KHRvUmVmKGV4ZWMpLCB0
aGlzUmVmLCBwcm9wZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQot
ICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJoYXNQcm9wZXJ0eSBjYWxsYmFj
ayByZXR1cm5lZCB0cnVlIGZvciBhIHByb3BlcnR5IHRoYXQgZG9lc24ndCBleGlzdC4iKTsKLX0K
Ky8vIERlZmluZSB0aGUgdHdvIHR5cGVzIG9mIEpTQ2FsbGJhY2tPYmplY3RzIHdlIHN1cHBvcnQu
Cit0ZW1wbGF0ZSA8PiBjb25zdCBDbGFzc0luZm8gSlNDYWxsYmFja09iamVjdDxKU09iamVjdD46
OmluZm8gPSB7ICJDYWxsYmFja09iamVjdCIsIDAsIDAsIDAgfTsKK3RlbXBsYXRlIDw+IGNvbnN0
IENsYXNzSW5mbyBKU0NhbGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pjo6aW5mbyA9IHsgIkNh
bGxiYWNrR2xvYmFsT2JqZWN0IiwgMCwgMCwgMCB9OwogCiB9IC8vIG5hbWVzcGFjZSBLSlMKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tPYmplY3QuaAkocmV2aXNpb24gMjcwMDcpCisr
KyBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDYgKzEsNyBAQAogLy8gLSotIG1vZGU6IGMrKzsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotCiAv
KgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtp
dC5vcmc+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMzLDcgKzM0LDggQEAK
IAogbmFtZXNwYWNlIEtKUyB7CiAKLWNsYXNzIEpTQ2FsbGJhY2tPYmplY3QgOiBwdWJsaWMgSlNP
YmplY3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorY2xhc3MgSlNDYWxsYmFja09iamVjdCA6IHB1
YmxpYyBCYXNlCiB7CiBwdWJsaWM6CiAgICAgSlNDYWxsYmFja09iamVjdChFeGVjU3RhdGUqLCBK
U0NsYXNzUmVmLCBKU1ZhbHVlKiBwcm90b3R5cGUsIHZvaWQqIGRhdGEpOwpAQCAtOTIsNCArOTQs
NyBAQCBwcml2YXRlOgogCiB9IC8vIG5hbWVzcGFjZSBLSlMKIAorLy8gaW5jbHVkZSB0aGUgYWN0
dWFsIHRlbXBsYXRlIGNsYXNzIGltcGxlbWVudGF0aW9uCisjaW5jbHVkZSAiSlNDYWxsYmFja09i
amVjdEZ1bmN0aW9ucy5oIgorCiAjZW5kaWYgLy8gSlNDYWxsYmFja09iamVjdF9oCkluZGV4OiBK
YXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmgJKHJldmlz
aW9uIDI3MDA3KQkoZnJvbSBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdC5jcHA6
MjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDczIEBACisvLyAtKi0gbW9kZTogYysrOyBjLWJh
c2ljLW9mZnNldDogNCAtKi0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlIDx3dGYvUGxh
dGZvcm0uaD4KKyNpbmNsdWRlICJKU0NhbGxiYWNrT2JqZWN0LmgiCisKKyNpbmNsdWRlICJBUElD
YXN0LmgiCisjaW5jbHVkZSAiSlNDYWxsYmFja0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiSlNDbGFz
c1JlZi5oIgorI2luY2x1ZGUgIkpTT2JqZWN0UmVmLmgiCisjaW5jbHVkZSAiSlNTdHJpbmdSZWYu
aCIKKyNpbmNsdWRlICJQcm9wZXJ0eU5hbWVBcnJheS5oIgorI2luY2x1ZGUgImludGVybmFsLmgi
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgS0pTIHsKKworY29uc3QgQ2xh
c3NJbmZvIEpTQ2FsbGJhY2tPYmplY3Q6OmluZm8gPSB7ICJDYWxsYmFja09iamVjdCIsIDAsIDAs
IDAgfTsKKworSlNDYWxsYmFja09iamVjdDo6SlNDYWxsYmFja09iamVjdChFeGVjU3RhdGUqIGV4
ZWMsIEpTQ2xhc3NSZWYganNDbGFzcywgSlNWYWx1ZSogcHJvdG90eXBlLCB2b2lkKiBkYXRhKQor
ICAgIDogSlNPYmplY3QocHJvdG90eXBlKQorICAgICwgbV9jbGFzcygwKQorICAgICwgbV9pc0lu
aXRpYWxpemVkKGZhbHNlKQoreworICAgIGluaXQoZXhlYywganNDbGFzcywgZGF0YSk7Cit9CisK
K3ZvaWQgSlNDYWxsYmFja09iamVjdDo6aW5pdChFeGVjU3RhdGUqIGV4ZWMsIEpTQ2xhc3NSZWYg
anNDbGFzcywgdm9pZCogZGF0YSkKK3sKKyAgICBtX3ByaXZhdGVEYXRhID0gZGF0YTsKKyAgICBK
U0NsYXNzUmVmIG9sZENsYXNzID0gbV9jbGFzczsKKyAgICBtX2NsYXNzID0gSlNDbGFzc1JldGFp
bihqc0NsYXNzKTsKKyAgICBpZiAob2xkQ2xhc3MpCisgICAgICAgIEpTQ2xhc3NSZWxlYXNlKG9s
ZENsYXNzKTsKKworICAgIGlmICghZXhlYykKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9y
PEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrLCAxNj4gaW5pdFJvdXRpbmVzOworICAgIGRvIHsK
KyAgICAgICAgaWYgKEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrIGluaXRpYWxpemUgPSBqc0Ns
YXNzLT5pbml0aWFsaXplKQorICAgICAgICAgICAgaW5pdFJvdXRpbmVzLmFwcGVuZChpbml0aWFs
aXplKTsKKyAgICB9IHdoaWxlICgoanNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSk7Cisg
ICAgCisgICAgLy8gaW5pdGlhbGl6ZSBmcm9tIGJhc2UgdG8gZGVyaXZlZAorICAgIGZvciAoaW50
IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGluaXRSb3V0aW5lcy5zaXplKCkpIC0gMTsgaSA+PSAwOyBp
LS0pIHsKKyAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgICAg
ICBKU09iamVjdEluaXRpYWxpemVDYWxsYmFjayBpbml0aWFsaXplID0gaW5pdFJvdXRpbmVzW2ld
OworICAgICAgICBpbml0aWFsaXplKHRvUmVmKGV4ZWMpLCB0b1JlZih0aGlzKSk7CisgICAgfQor
ICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7Cit9CisKK0pTQ2FsbGJhY2tPYmplY3Q6On5KU0Nh
bGxiYWNrT2JqZWN0KCkKK3sKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7
CisgICAgCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBq
c0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCisgICAgICAgIGlmIChKU09iamVjdEZpbmFs
aXplQ2FsbGJhY2sgZmluYWxpemUgPSBqc0NsYXNzLT5maW5hbGl6ZSkgeworICAgICAgICAgICAg
ZmluYWxpemUodGhpc1JlZik7CisgICAgICAgIH0KKyAgICAKKyAgICBKU0NsYXNzUmVsZWFzZSht
X2NsYXNzKTsKK30KKwordm9pZCBKU0NhbGxiYWNrT2JqZWN0Ojppbml0aWFsaXplSWZOZWVkZWQo
RXhlY1N0YXRlKiBleGVjKQoreworICAgIGlmIChtX2lzSW5pdGlhbGl6ZWQpCisgICAgICAgIHJl
dHVybjsKKyAgICBpbml0KGV4ZWMsIG1fY2xhc3MsIG1fcHJpdmF0ZURhdGEpOworfQorCitVU3Ry
aW5nIEpTQ2FsbGJhY2tPYmplY3Q6OmNsYXNzTmFtZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2Ns
YXNzLT5jbGFzc05hbWUuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBtX2NsYXNzLT5jbGFzc05h
bWU7CisgICAgCisgICAgcmV0dXJuIEpTT2JqZWN0OjpjbGFzc05hbWUoKTsKK30KKworYm9vbCBK
U0NhbGxiYWNrT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRlKiBleGVjLCBjb25z
dCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICBK
U0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9
IHRvUmVmKHRoaXMpOworICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHBy
b3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOworCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xh
c3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsK
KyAgICAgICAgLy8gb3B0aW9uYWwgb3B0aW1pemF0aW9uIHRvIGJ5cGFzcyBnZXRQcm9wZXJ0eSBp
biBjYXNlcyB3aGVuIHdlIG9ubHkgbmVlZCB0byBrbm93IGlmIHRoZSBwcm9wZXJ0eSBleGlzdHMK
KyAgICAgICAgaWYgKEpTT2JqZWN0SGFzUHJvcGVydHlDYWxsYmFjayBoYXNQcm9wZXJ0eSA9IGpz
Q2xhc3MtPmhhc1Byb3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBk
cm9wQWxsTG9ja3M7CisgICAgICAgICAgICBpZiAoaGFzUHJvcGVydHkoY3R4LCB0aGlzUmVmLCBw
cm9wZXJ0eU5hbWVSZWYpKSB7CisgICAgICAgICAgICAgICAgc2xvdC5zZXRDdXN0b20odGhpcywg
Y2FsbGJhY2tHZXR0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAg
ICAgfQorICAgICAgICB9IGVsc2UgaWYgKEpTT2JqZWN0R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQ
cm9wZXJ0eSA9IGpzQ2xhc3MtPmdldFByb3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRy
b3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7CisgICAgICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1
ZSA9IGdldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB0b1JlZihleGVj
LT5leGNlcHRpb25TbG90KCkpKSkgeworICAgICAgICAgICAgICAgIC8vIGNhY2hlIHRoZSB2YWx1
ZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbXB1dGUgaXQgYWdhaW4KKyAgICAgICAgICAgICAgICAv
LyBGSVhNRTogVGhpcyB2aW9sYXRlcyB0aGUgUHJvcGVydHlTbG90IGRlc2lnbiBhIGxpdHRsZSBi
aXQuCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGVpdGhlciB1c2UgdGhpcyBvcHRpbWl6
YXRpb24gZXZlcnl3aGVyZSwgb3Igbm93aGVyZS4KKyAgICAgICAgICAgICAgICBzbG90LnNldEN1
c3RvbShyZWludGVycHJldF9jYXN0PEpTT2JqZWN0Kj4odG9KUyh2YWx1ZSkpLCBjYWNoZWRWYWx1
ZUdldHRlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUq
IHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgeworICAgICAgICAgICAgaWYg
KHN0YXRpY1ZhbHVlcy0+Y29udGFpbnMocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsK
KyAgICAgICAgICAgICAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBzdGF0aWNWYWx1ZUdldHRlcik7
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJs
ZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7CisgICAgICAg
ICAgICBpZiAoc3RhdGljRnVuY3Rpb25zLT5jb250YWlucyhwcm9wZXJ0eU5hbWUudXN0cmluZygp
LnJlcCgpKSkgeworICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIHN0YXRpY0Z1
bmN0aW9uR2V0dGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBKU09iamVjdDo6Z2V0T3duUHJvcGVy
dHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCk7Cit9CisKK2Jvb2wgSlNDYWxsYmFja09i
amVjdDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgcHJvcGVy
dHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgcmV0dXJuIGdldE93blByb3BlcnR5
U2xvdChleGVjLCBJZGVudGlmaWVyOjpmcm9tKHByb3BlcnR5TmFtZSksIHNsb3QpOworfQorCit2
b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OnB1dChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZp
ZXImIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSogdmFsdWUsIGludCBhdHRyKQoreworICAgIEpTQ29u
dGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9S
ZWYodGhpcyk7CisgICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVy
dHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7CisgICAgSlNWYWx1ZVJlZiB2YWx1ZVJlZiA9IHRvUmVm
KHZhbHVlKTsKKworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFz
czsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7CisgICAgICAgIGlmIChKU09iamVj
dFNldFByb3BlcnR5Q2FsbGJhY2sgc2V0UHJvcGVydHkgPSBqc0NsYXNzLT5zZXRQcm9wZXJ0eSkg
eworICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgICAg
ICAgICAgaWYgKHNldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB2YWx1
ZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgCisgICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNW
YWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFsdWVzKSB7CisgICAg
ICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdldChw
cm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRy
eS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoSlNPYmplY3RTZXRQcm9wZXJ0
eUNhbGxiYWNrIHNldFByb3BlcnR5ID0gZW50cnktPnNldFByb3BlcnR5KSB7CisgICAgICAgICAg
ICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHNldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB2
YWx1ZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCisgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJBdHRlbXB0IHRvIHNldCBhIHBy
b3BlcnR5IHRoYXQgaXMgbm90IHNldHRhYmxlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIAorICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFi
bGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9ucykgeworICAgICAg
ICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5ID0gc3RhdGljRnVuY3Rpb25zLT5n
ZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAo
ZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5KQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcHV0RGlyZWN0KHByb3BlcnR5
TmFtZSwgdmFsdWUsIGF0dHIpOyAvLyBwdXQgYXMgb3ZlcnJpZGUgcHJvcGVydHkKKyAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gSlNPYmplY3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsKK30K
Kwordm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBw
cm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKK3sKKyAgICByZXR1cm4gcHV0
KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSwgdmFsdWUsIGF0dHIpOworfQor
Citib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KEV4ZWNTdGF0ZSogZXhlYywg
Y29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lKQoreworICAgIEpTQ29udGV4dFJlZiBjdHgg
PSB0b1JlZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Cisg
ICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVzdHJp
bmcoKS5yZXAoKSk7CisgICAgCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAgaWYg
KEpTT2JqZWN0RGVsZXRlUHJvcGVydHlDYWxsYmFjayBkZWxldGVQcm9wZXJ0eSA9IGpzQ2xhc3Mt
PmRlbGV0ZVByb3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9w
QWxsTG9ja3M7CisgICAgICAgICAgICBpZiAoZGVsZXRlUHJvcGVydHkoY3R4LCB0aGlzUmVmLCBw
cm9wZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQorICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xh
c3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNWYWx1
ZXMpIHsKKyAgICAgICAgICAgIGlmIChTdGF0aWNWYWx1ZUVudHJ5KiBlbnRyeSA9IHN0YXRpY1Zh
bHVlcy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGVudHJ5LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRl
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
IChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25zID0g
anNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoU3RhdGljRnVuY3Rp
b25FbnRyeSogZW50cnkgPSBzdGF0aWNGdW5jdGlvbnMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmlu
ZygpLnJlcCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+YXR0cmlidXRlcyAmIGtK
U1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEpTT2JqZWN0OjpkZWxldGVQcm9wZXJ0eShleGVj
LCBwcm9wZXJ0eU5hbWUpOworfQorCitib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmRlbGV0ZVByb3Bl
cnR5KEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgcHJvcGVydHlOYW1lKQoreworICAgIHJldHVy
biBkZWxldGVQcm9wZXJ0eShleGVjLCBJZGVudGlmaWVyOjpmcm9tKHByb3BlcnR5TmFtZSkpOwor
fQorCitib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmltcGxlbWVudHNDb25zdHJ1Y3QoKSBjb25zdAor
eworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFz
cyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoanNDbGFzcy0+Y2FsbEFzQ29u
c3RydWN0b3IpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsK
K30KKworSlNPYmplY3QqIEpTQ2FsbGJhY2tPYmplY3Q6OmNvbnN0cnVjdChFeGVjU3RhdGUqIGV4
ZWMsIGNvbnN0IExpc3QmIGFyZ3MpCit7CisgICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1Jl
ZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7CisgICAgCisg
ICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0g
anNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAgaWYgKEpTT2JqZWN0Q2FsbEFzQ29uc3Ry
dWN0b3JDYWxsYmFjayBjYWxsQXNDb25zdHJ1Y3RvciA9IGpzQ2xhc3MtPmNhbGxBc0NvbnN0cnVj
dG9yKSB7CisgICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudCA9IHN0YXRpY19jYXN0PGludD4o
YXJncy5zaXplKCkpOworICAgICAgICAgICAgVmVjdG9yPEpTVmFsdWVSZWYsIDE2PiBhcmd1bWVu
dHMoYXJndW1lbnRDb3VudCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Vt
ZW50Q291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICBhcmd1bWVudHNbaV0gPSB0b1JlZihhcmdz
W2ldKTsKKyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAg
ICAgICAgICAgIHJldHVybiB0b0pTKGNhbGxBc0NvbnN0cnVjdG9yKGV4ZWNSZWYsIHRoaXNSZWYs
IGFyZ3VtZW50Q291bnQsIGFyZ3VtZW50cy5kYXRhKCksIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNs
b3QoKSkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBBU1NFUlQoMCk7IC8vIGltcGxl
bWVudHNDb25zdHJ1Y3Qgc2hvdWxkIHByZXZlbnQgdXMgZnJvbSByZWFjaGluZyBoZXJlCisgICAg
cmV0dXJuIDA7Cit9CisKK2Jvb2wgSlNDYWxsYmFja09iamVjdDo6aW1wbGVtZW50c0hhc0luc3Rh
bmNlKCkgY29uc3QKK3sKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpz
Q2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKKyAgICAgICAgaWYgKGpzQ2xh
c3MtPmhhc0luc3RhbmNlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK2Jvb2wgSlNDYWxsYmFja09iamVjdDo6aGFzSW5zdGFuY2UoRXhlY1N0YXRl
ICpleGVjLCBKU1ZhbHVlICp2YWx1ZSkKK3sKKyAgICBKU0NvbnRleHRSZWYgZXhlY1JlZiA9IHRv
UmVmKGV4ZWMpOworICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKKworICAg
IGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpz
Q2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoSlNPYmplY3RIYXNJbnN0YW5jZUNhbGxi
YWNrIGhhc0luc3RhbmNlID0ganNDbGFzcy0+aGFzSW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEpT
TG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIHJldHVybiBoYXNJ
bnN0YW5jZShleGVjUmVmLCB0aGlzUmVmLCB0b1JlZih2YWx1ZSksIHRvUmVmKGV4ZWMtPmV4Y2Vw
dGlvblNsb3QoKSkpOworICAgICAgICB9CisKKyAgICBBU1NFUlQoMCk7IC8vIGltcGxlbWVudHNI
YXNJbnN0YW5jZSBzaG91bGQgcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIGhlcmUKKyAgICByZXR1
cm4gMDsKK30KKworCitib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmltcGxlbWVudHNDYWxsKCkgY29u
c3QKK3sKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpz
Q2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKKyAgICAgICAgaWYgKGpzQ2xhc3MtPmNhbGxB
c0Z1bmN0aW9uKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgcmV0dXJuIGZh
bHNlOworfQorCitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWxsQXNGdW5jdGlvbihFeGVj
U3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0ICZhcmdzKQoreworICAg
IEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhp
c1JlZiA9IHRvUmVmKHRoaXMpOworICAgIEpTT2JqZWN0UmVmIHRoaXNPYmpSZWYgPSB0b1JlZih0
aGlzT2JqKTsKKworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFz
czsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7CisgICAgICAgIGlmIChKU09iamVj
dENhbGxBc0Z1bmN0aW9uQ2FsbGJhY2sgY2FsbEFzRnVuY3Rpb24gPSBqc0NsYXNzLT5jYWxsQXNG
dW5jdGlvbikgeworICAgICAgICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBzdGF0aWNfY2FzdDxp
bnQ+KGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIFZlY3RvcjxKU1ZhbHVlUmVmLCAxNj4gYXJn
dW1lbnRzKGFyZ3VtZW50Q291bnQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBh
cmd1bWVudENvdW50OyBpKyspCisgICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gdG9SZWYo
YXJnc1tpXSk7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7
CisgICAgICAgICAgICByZXR1cm4gdG9KUyhjYWxsQXNGdW5jdGlvbihleGVjUmVmLCB0aGlzUmVm
LCB0aGlzT2JqUmVmLCBhcmd1bWVudENvdW50LCBhcmd1bWVudHMuZGF0YSgpLCB0b1JlZihleGVj
LT5leGNlcHRpb25TbG90KCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoMCk7
IC8vIGltcGxlbWVudHNDYWxsIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgaGVyZQor
ICAgIHJldHVybiAwOworfQorCit2b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OmdldFByb3BlcnR5TmFt
ZXMoRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWVBcnJheSYgcHJvcGVydHlOYW1lcykKK3sK
KyAgICBKU0NvbnRleHRSZWYgZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOworICAgIEpTT2JqZWN0UmVm
IHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKKworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0g
bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7CisgICAg
ICAgIGlmIChKU09iamVjdEdldFByb3BlcnR5TmFtZXNDYWxsYmFjayBnZXRQcm9wZXJ0eU5hbWVz
ID0ganNDbGFzcy0+Z2V0UHJvcGVydHlOYW1lcykgeworICAgICAgICAgICAgSlNMb2NrOjpEcm9w
QWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgICAgICAgICAgZ2V0UHJvcGVydHlOYW1lcyhleGVj
UmVmLCB0aGlzUmVmLCB0b1JlZigmcHJvcGVydHlOYW1lcykpOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBq
c0NsYXNzLT5zdGF0aWNWYWx1ZXMpIHsKKyAgICAgICAgICAgIHR5cGVkZWYgT3BhcXVlSlNDbGFz
czo6U3RhdGljVmFsdWVzVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAg
ICAgaXRlcmF0b3IgZW5kID0gc3RhdGljVmFsdWVzLT5lbmQoKTsKKyAgICAgICAgICAgIGZvciAo
aXRlcmF0b3IgaXQgPSBzdGF0aWNWYWx1ZXMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewor
ICAgICAgICAgICAgICAgIFVTdHJpbmc6OlJlcCogbmFtZSA9IGl0LT5maXJzdC5nZXQoKTsKKyAg
ICAgICAgICAgICAgICBTdGF0aWNWYWx1ZUVudHJ5KiBlbnRyeSA9IGl0LT5zZWNvbmQ7CisgICAg
ICAgICAgICAgICAgaWYgKGVudHJ5LT5nZXRQcm9wZXJ0eSAmJiAhKGVudHJ5LT5hdHRyaWJ1dGVz
ICYga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RW51bSkpCisgICAgICAgICAgICAgICAgICAgIHBy
b3BlcnR5TmFtZXMuYWRkKElkZW50aWZpZXIobmFtZSkpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBz
dGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKKyAgICAgICAgICAg
IHR5cGVkZWYgT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGU6OmNvbnN0X2l0ZXJh
dG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gc3RhdGljRnVuY3Rpb25z
LT5lbmQoKTsKKyAgICAgICAgICAgIGZvciAoaXRlcmF0b3IgaXQgPSBzdGF0aWNGdW5jdGlvbnMt
PmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgICAgIFVTdHJpbmc6OlJl
cCogbmFtZSA9IGl0LT5maXJzdC5nZXQoKTsKKyAgICAgICAgICAgICAgICBTdGF0aWNGdW5jdGlv
bkVudHJ5KiBlbnRyeSA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKCEoZW50cnkt
PmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnRFbnVtKSkKKyAgICAgICAgICAg
ICAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoSWRlbnRpZmllcihuYW1lKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBKU09iamVjdDo6Z2V0UHJvcGVydHlOYW1lcyhl
eGVjLCBwcm9wZXJ0eU5hbWVzKTsKK30KKworZG91YmxlIEpTQ2FsbGJhY2tPYmplY3Q6OnRvTnVt
YmVyKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKK3sKKyAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9S
ZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOworCisgICAg
Zm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganND
bGFzcy0+cGFyZW50Q2xhc3MpCisgICAgICAgIGlmIChKU09iamVjdENvbnZlcnRUb1R5cGVDYWxs
YmFjayBjb252ZXJ0VG9UeXBlID0ganNDbGFzcy0+Y29udmVydFRvVHlwZSkgeworICAgICAgICAg
ICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgICAgICAgICAgaWYgKEpT
VmFsdWVSZWYgdmFsdWUgPSBjb252ZXJ0VG9UeXBlKGN0eCwgdGhpc1JlZiwga0pTVHlwZU51bWJl
ciwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IHRvSlModmFsdWUpLT5nZXROdW1iZXIoKTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIEpTT2Jq
ZWN0Ojp0b051bWJlcihleGVjKTsKK30KKworVVN0cmluZyBKU0NhbGxiYWNrT2JqZWN0Ojp0b1N0
cmluZyhFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0Cit7CisgICAgSlNDb250ZXh0UmVmIGN0eCA9IHRv
UmVmKGV4ZWMpOworICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKKworICAg
IGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpz
Q2xhc3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0VG9UeXBlQ2Fs
bGJhY2sgY29udmVydFRvVHlwZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsKKyAgICAgICAg
ICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIGlmIChK
U1ZhbHVlUmVmIHZhbHVlID0gY29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtKU1R5cGVTdHJp
bmcsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQorICAgICAgICAgICAgICAgIHJldHVy
biB0b0pTKHZhbHVlKS0+Z2V0U3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIHJldHVybiBKU09i
amVjdDo6dG9TdHJpbmcoZXhlYyk7Cit9CisKK3ZvaWQgSlNDYWxsYmFja09iamVjdDo6c2V0UHJp
dmF0ZSh2b2lkKiBkYXRhKQoreworICAgIG1fcHJpdmF0ZURhdGEgPSBkYXRhOworfQorCit2b2lk
KiBKU0NhbGxiYWNrT2JqZWN0OjpnZXRQcml2YXRlKCkKK3sKKyAgICByZXR1cm4gbV9wcml2YXRl
RGF0YTsKK30KKworYm9vbCBKU0NhbGxiYWNrT2JqZWN0Ojppbmhlcml0cyhKU0NsYXNzUmVmIGMp
IGNvbnN0Cit7CisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNz
OyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCisgICAgICAgIGlmIChqc0NsYXNzID09
IGMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
SlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2FjaGVkVmFsdWVHZXR0ZXIoRXhlY1N0YXRlKiwg
SlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQor
eworICAgIEpTVmFsdWUqIHYgPSBzbG90LnNsb3RCYXNlKCk7CisgICAgQVNTRVJUKHYpOworICAg
IHJldHVybiB2OworfQorCitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpzdGF0aWNWYWx1ZUdl
dHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVy
dHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgQVNTRVJUKHNsb3Quc2xv
dEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsKKyAgICBKU0NhbGxi
YWNrT2JqZWN0KiB0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Qu
c2xvdEJhc2UoKSk7CisKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpc09iaik7
CisgICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVz
dHJpbmcoKS5yZXAoKSk7CisKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNPYmot
Pm1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKKyAgICAg
ICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBq
c0NsYXNzLT5zdGF0aWNWYWx1ZXMpCisgICAgICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSog
ZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkK
KyAgICAgICAgICAgICAgICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eUNhbGxiYWNrIGdldFByb3Bl
cnR5ID0gZW50cnktPmdldFByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIEpTTG9jazo6
RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTVmFs
dWVSZWYgdmFsdWUgPSBnZXRQcm9wZXJ0eSh0b1JlZihleGVjKSwgdGhpc1JlZiwgcHJvcGVydHlO
YW1lUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0b0pTKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICByZXR1
cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwgIlN0YXRpYyB2YWx1ZSBwcm9wZXJ0
eSBkZWZpbmVkIHdpdGggTlVMTCBnZXRQcm9wZXJ0eSBjYWxsYmFjay4iKTsKK30KKworSlNWYWx1
ZSogSlNDYWxsYmFja09iamVjdDo6c3RhdGljRnVuY3Rpb25HZXR0ZXIoRXhlY1N0YXRlKiBleGVj
LCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVy
dHlTbG90JiBzbG90KQoreworICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCktPmluaGVyaXRzKCZK
U0NhbGxiYWNrT2JqZWN0OjppbmZvKSk7CisgICAgSlNDYWxsYmFja09iamVjdCogdGhpc09iaiA9
IHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNlKCkpOworCisgICAg
aWYgKEpTVmFsdWUqIGNhY2hlZE9yT3ZlcnJpZGVWYWx1ZSA9IHRoaXNPYmotPmdldERpcmVjdChw
cm9wZXJ0eU5hbWUpKQorICAgICAgICByZXR1cm4gY2FjaGVkT3JPdmVycmlkZVZhbHVlOworCisg
ICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNzOyBqc0NsYXNzOyBq
c0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xh
c3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0
aWNGdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChTdGF0aWNGdW5jdGlvbkVudHJ5KiBlbnRy
eSA9IHN0YXRpY0Z1bmN0aW9ucy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7
CisgICAgICAgICAgICAgICAgaWYgKEpTT2JqZWN0Q2FsbEFzRnVuY3Rpb25DYWxsYmFjayBjYWxs
QXNGdW5jdGlvbiA9IGVudHJ5LT5jYWxsQXNGdW5jdGlvbikgeworICAgICAgICAgICAgICAgICAg
ICBKU09iamVjdCogbyA9IG5ldyBKU0NhbGxiYWNrRnVuY3Rpb24oZXhlYywgY2FsbEFzRnVuY3Rp
b24sIHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNPYmotPnB1dERpcmVj
dChwcm9wZXJ0eU5hbWUsIG8sIGVudHJ5LT5hdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIG87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorCisgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJT
dGF0aWMgZnVuY3Rpb24gcHJvcGVydHkgZGVmaW5lZCB3aXRoIE5VTEwgY2FsbEFzRnVuY3Rpb24g
Y2FsbGJhY2suIik7Cit9CisKK0pTVmFsdWUqIEpTQ2FsbGJhY2tPYmplY3Q6OmNhbGxiYWNrR2V0
dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0
eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICBBU1NFUlQoc2xvdC5zbG90
QmFzZSgpLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDo6aW5mbykpOworICAgIEpTQ2FsbGJh
Y2tPYmplY3QqIHRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4oc2xvdC5z
bG90QmFzZSgpKTsKKworICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzT2JqKTsK
KyAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0
cmluZygpLnJlcCgpKTsKKworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gdGhpc09iai0+
bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAgICAg
ICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eUNhbGxiYWNrIGdldFByb3BlcnR5ID0ganNDbGFzcy0+
Z2V0UHJvcGVydHkpIHsKKyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxM
b2NrczsKKyAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gZ2V0UHJvcGVydHkodG9S
ZWYoZXhlYyksIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9u
U2xvdCgpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRvSlModmFsdWUpOworICAgICAgICB9
CisKKyAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwgImhhc1Byb3Bl
cnR5IGNhbGxiYWNrIHJldHVybmVkIHRydWUgZm9yIGEgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4
aXN0LiIpOworfQorCit9IC8vIG5hbWVzcGFjZSBLSlMKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQ
SS9KU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvQVBJL0pTQ2FsbGJhY2tPYmplY3RGdW5jdGlvbnMuaAkocmV2aXNpb24gMjcwMDcpCisrKyBK
YXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDYgKzEsNyBAQAogLy8gLSotIG1vZGU6IGMrKzsgYy1iYXNpYy1vZmZzZXQ6IDQg
LSotCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEVyaWMgU2VpZGVsIDxlcmlj
QHdlYmtpdC5vcmc+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI1LDEyICsy
NiwxMSBAQAogICovCiAKICNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KLSNpbmNsdWRlICJKU0Nh
bGxiYWNrT2JqZWN0LmgiCi0KICNpbmNsdWRlICJBUElDYXN0LmgiCiAjaW5jbHVkZSAiSlNDYWxs
YmFja0Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiSlNDbGFzc1JlZi5oIgogI2luY2x1ZGUgIkpTT2Jq
ZWN0UmVmLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJKU1N0cmlu
Z1JlZi5oIgogI2luY2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5LmgiCiAjaW5jbHVkZSAiaW50ZXJu
YWwuaCIKQEAgLTM4LDI3ICszOCwyNyBAQAogCiBuYW1lc3BhY2UgS0pTIHsKIAotY29uc3QgQ2xh
c3NJbmZvIEpTQ2FsbGJhY2tPYmplY3Q6OmluZm8gPSB7ICJDYWxsYmFja09iamVjdCIsIDAsIDAs
IDAgfTsKLQotSlNDYWxsYmFja09iamVjdDo6SlNDYWxsYmFja09iamVjdChFeGVjU3RhdGUqIGV4
ZWMsIEpTQ2xhc3NSZWYganNDbGFzcywgSlNWYWx1ZSogcHJvdG90eXBlLCB2b2lkKiBkYXRhKQot
ICAgIDogSlNPYmplY3QocHJvdG90eXBlKQordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitKU0NhbGxi
YWNrT2JqZWN0PEJhc2U+OjpKU0NhbGxiYWNrT2JqZWN0KEV4ZWNTdGF0ZSogZXhlYywgSlNDbGFz
c1JlZiBqc0NsYXNzLCBKU1ZhbHVlKiBwcm90b3R5cGUsIHZvaWQqIGRhdGEpCisgICAgOiBCYXNl
KHByb3RvdHlwZSkKICAgICAsIG1fY2xhc3MoMCkKICAgICAsIG1faXNJbml0aWFsaXplZChmYWxz
ZSkKIHsKICAgICBpbml0KGV4ZWMsIGpzQ2xhc3MsIGRhdGEpOwogfQogCi12b2lkIEpTQ2FsbGJh
Y2tPYmplY3Q6OmluaXQoRXhlY1N0YXRlKiBleGVjLCBKU0NsYXNzUmVmIGpzQ2xhc3MsIHZvaWQq
IGRhdGEpCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK3ZvaWQgSlNDYWxsYmFja09iamVjdDxCYXNl
Pjo6aW5pdChFeGVjU3RhdGUqIGV4ZWMsIEpTQ2xhc3NSZWYganNDbGFzcywgdm9pZCogZGF0YSkK
IHsKICAgICBtX3ByaXZhdGVEYXRhID0gZGF0YTsKICAgICBKU0NsYXNzUmVmIG9sZENsYXNzID0g
bV9jbGFzczsKICAgICBtX2NsYXNzID0gSlNDbGFzc1JldGFpbihqc0NsYXNzKTsKICAgICBpZiAo
b2xkQ2xhc3MpCiAgICAgICAgIEpTQ2xhc3NSZWxlYXNlKG9sZENsYXNzKTsKLQorICAgIAogICAg
IGlmICghZXhlYykKICAgICAgICAgcmV0dXJuOwotCisgICAgCiAgICAgVmVjdG9yPEpTT2JqZWN0
SW5pdGlhbGl6ZUNhbGxiYWNrLCAxNj4gaW5pdFJvdXRpbmVzOwogICAgIGRvIHsKICAgICAgICAg
aWYgKEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrIGluaXRpYWxpemUgPSBqc0NsYXNzLT5pbml0
aWFsaXplKQpAQCAtNzQsNyArNzQsOCBAQCB2b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OmluaXQoRXhl
Y1N0YXRlKiBlCiAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKIH0KIAotSlNDYWxsYmFja09i
amVjdDo6fkpTQ2FsbGJhY2tPYmplY3QoKQordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitKU0NhbGxi
YWNrT2JqZWN0PEJhc2U+Ojp+SlNDYWxsYmFja09iamVjdCgpCiB7CiAgICAgSlNPYmplY3RSZWYg
dGhpc1JlZiA9IHRvUmVmKHRoaXMpOwogICAgIApAQCAtODIsMTggKzgzLDIwIEBAIEpTQ2FsbGJh
Y2tPYmplY3Q6On5KU0NhbGxiYWNrT2JqZWN0KCkKICAgICAgICAgaWYgKEpTT2JqZWN0RmluYWxp
emVDYWxsYmFjayBmaW5hbGl6ZSA9IGpzQ2xhc3MtPmZpbmFsaXplKSB7CiAgICAgICAgICAgICBm
aW5hbGl6ZSh0aGlzUmVmKTsKICAgICAgICAgfQotICAgIAotICAgIEpTQ2xhc3NSZWxlYXNlKG1f
Y2xhc3MpOworICAgICAgICAgICAgCisgICAgICAgICAgICBKU0NsYXNzUmVsZWFzZShtX2NsYXNz
KTsKIH0KIAotdm9pZCBKU0NhbGxiYWNrT2JqZWN0Ojppbml0aWFsaXplSWZOZWVkZWQoRXhlY1N0
YXRlKiBleGVjKQordGVtcGxhdGUgPGNsYXNzIEJhc2U+Cit2b2lkIEpTQ2FsbGJhY2tPYmplY3Q8
QmFzZT46OmluaXRpYWxpemVJZk5lZWRlZChFeGVjU3RhdGUqIGV4ZWMpCiB7CiAgICAgaWYgKG1f
aXNJbml0aWFsaXplZCkKICAgICAgICAgcmV0dXJuOwogICAgIGluaXQoZXhlYywgbV9jbGFzcywg
bV9wcml2YXRlRGF0YSk7CiB9CiAKLVVTdHJpbmcgSlNDYWxsYmFja09iamVjdDo6Y2xhc3NOYW1l
KCkgY29uc3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorVVN0cmluZyBKU0NhbGxiYWNrT2JqZWN0
PEJhc2U+OjpjbGFzc05hbWUoKSBjb25zdAogewogICAgIGlmICghbV9jbGFzcy0+Y2xhc3NOYW1l
LmlzTnVsbCgpKQogICAgICAgICByZXR1cm4gbV9jbGFzcy0+Y2xhc3NOYW1lOwpAQCAtMTAxLDEy
ICsxMDQsMTMgQEAgVVN0cmluZyBKU0NhbGxiYWNrT2JqZWN0OjpjbGFzc05hbWUoKSBjbwogICAg
IHJldHVybiBKU09iamVjdDo6Y2xhc3NOYW1lKCk7CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVj
dDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYg
cHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4K
K2Jvb2wgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0
ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNs
b3QpCiB7CiAgICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwogICAgIEpTT2JqZWN0
UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKICAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVS
ZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKLQorICAgIAogICAgIGZv
ciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xh
c3MtPnBhcmVudENsYXNzKSB7CiAgICAgICAgIC8vIG9wdGlvbmFsIG9wdGltaXphdGlvbiB0byBi
eXBhc3MgZ2V0UHJvcGVydHkgaW4gY2FzZXMgd2hlbiB3ZSBvbmx5IG5lZWQgdG8ga25vdyBpZiB0
aGUgcHJvcGVydHkgZXhpc3RzCiAgICAgICAgIGlmIChKU09iamVjdEhhc1Byb3BlcnR5Q2FsbGJh
Y2sgaGFzUHJvcGVydHkgPSBqc0NsYXNzLT5oYXNQcm9wZXJ0eSkgewpAQCAtMTI1LDcgKzEyOSw3
IEBAIGJvb2wgSlNDYWxsYmFja09iamVjdDo6Z2V0T3duUHJvcGVydHlTbG8KICAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCisgICAgICAgIAog
ICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVl
cyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgewogICAgICAgICAgICAgaWYgKHN0YXRpY1ZhbHVl
cy0+Y29udGFpbnMocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKICAgICAgICAgICAg
ICAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBzdGF0aWNWYWx1ZUdldHRlcik7CkBAIC0xNDAsMjkg
KzE0NCwzMSBAQCBib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmdldE93blByb3BlcnR5U2xvCiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAgICByZXR1cm4gSlNPYmplY3Q6
OmdldE93blByb3BlcnR5U2xvdChleGVjLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwogfQogCi1ib29s
IEpTQ2FsbGJhY2tPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMsIHVu
c2lnbmVkIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQordGVtcGxhdGUgPGNsYXNz
IEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmdldE93blByb3BlcnR5U2xvdChF
eGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90
KQogewogICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgSWRlbnRpZmllcjo6ZnJv
bShwcm9wZXJ0eU5hbWUpLCBzbG90KTsKIH0KIAotdm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpwdXQo
RXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUq
IHZhbHVlLCBpbnQgYXR0cikKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9pZCBKU0NhbGxiYWNr
T2JqZWN0PEJhc2U+OjpwdXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9w
ZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKIHsKICAgICBKU0NvbnRleHRSZWYg
Y3R4ID0gdG9SZWYoZXhlYyk7CiAgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMp
OwogICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51
c3RyaW5nKCkucmVwKCkpOwogICAgIEpTVmFsdWVSZWYgdmFsdWVSZWYgPSB0b1JlZih2YWx1ZSk7
Ci0KKyAgICAKICAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7
IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgewogICAgICAgICBpZiAoSlNPYmplY3RT
ZXRQcm9wZXJ0eUNhbGxiYWNrIHNldFByb3BlcnR5ID0ganNDbGFzcy0+c2V0UHJvcGVydHkpIHsK
ICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKICAgICAgICAg
ICAgIGlmIChzZXRQcm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdmFsdWVS
ZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQogICAgICAgICAgICAgICAgIHJldHVy
bjsKICAgICAgICAgfQotICAgIAorICAgICAgICAKICAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6
OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNWYWx1ZXMp
IHsKICAgICAgICAgICAgIGlmIChTdGF0aWNWYWx1ZUVudHJ5KiBlbnRyeSA9IHN0YXRpY1ZhbHVl
cy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CiAgICAgICAgICAgICAgICAg
aWYgKGVudHJ5LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSkKQEAg
LTE4MCwyMSArMTg2LDIzIEBAIHZvaWQgSlNDYWxsYmFja09iamVjdDo6cHV0KEV4ZWNTdGF0ZSog
ZXgKICAgICAgICAgICAgIGlmIChTdGF0aWNGdW5jdGlvbkVudHJ5KiBlbnRyeSA9IHN0YXRpY0Z1
bmN0aW9ucy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CiAgICAgICAgICAg
ICAgICAgaWYgKGVudHJ5LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25s
eSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHB1dERpcmVj
dChwcm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsgLy8gcHV0IGFzIG92ZXJyaWRlIHByb3BlcnR5
CisgICAgICAgICAgICAgICAgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6cHV0RGlyZWN0KHByb3Bl
cnR5TmFtZSwgdmFsdWUsIGF0dHIpOyAvLyBwdXQgYXMgb3ZlcnJpZGUgcHJvcGVydHkKICAgICAg
ICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAg
ICAKICAgICByZXR1cm4gSlNPYmplY3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBh
dHRyKTsKIH0KIAotdm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVjLCB1
bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKK3RlbXBsYXRl
IDxjbGFzcyBCYXNlPgordm9pZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpwdXQoRXhlY1N0YXRl
KiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikK
IHsKICAgICByZXR1cm4gcHV0KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSwg
dmFsdWUsIGF0dHIpOwogfQogCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmRlbGV0ZVByb3BlcnR5
KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lKQordGVtcGxh
dGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmRlbGV0ZVByb3Bl
cnR5KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lKQogewog
ICAgIEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKICAgICBKU09iamVjdFJlZiB0aGlz
UmVmID0gdG9SZWYodGhpcyk7CkBAIC0yMDYsNyArMjE0LDcgQEAgYm9vbCBKU0NhbGxiYWNrT2Jq
ZWN0OjpkZWxldGVQcm9wZXJ0eShFeAogICAgICAgICAgICAgaWYgKGRlbGV0ZVByb3BlcnR5KGN0
eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkp
KSkKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotCisgICAgICAgIAog
ICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVl
cyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgewogICAgICAgICAgICAgaWYgKFN0YXRpY1ZhbHVl
RW50cnkqIGVudHJ5ID0gc3RhdGljVmFsdWVzLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5y
ZXAoKSkpIHsKICAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9w
ZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUpCkBAIC0yMjMsMjUgKzIzMSwyOCBAQCBib29sIEpTQ2Fs
bGJhY2tPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KEV4CiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
ICAgICB9Ci0KKyAgICAKICAgICByZXR1cm4gSlNPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KGV4ZWMs
IHByb3BlcnR5TmFtZSk7CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6ZGVsZXRlUHJvcGVy
dHkoRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUpCit0ZW1wbGF0ZSA8Y2xh
c3MgQmFzZT4KK2Jvb2wgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6ZGVsZXRlUHJvcGVydHkoRXhl
Y1N0YXRlKiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUpCiB7CiAgICAgcmV0dXJuIGRlbGV0
ZVByb3BlcnR5KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSk7CiB9CiAKLWJv
b2wgSlNDYWxsYmFja09iamVjdDo6aW1wbGVtZW50c0NvbnN0cnVjdCgpIGNvbnN0Cit0ZW1wbGF0
ZSA8Y2xhc3MgQmFzZT4KK2Jvb2wgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6aW1wbGVtZW50c0Nv
bnN0cnVjdCgpIGNvbnN0CiB7CiAgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCiAgICAgICAgIGlmIChq
c0NsYXNzLT5jYWxsQXNDb25zdHJ1Y3RvcikKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCisg
ICAgCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1KU09iamVjdCogSlNDYWxsYmFja09iamVjdDo6
Y29uc3RydWN0KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgTGlzdCYgYXJncykKK3RlbXBsYXRlIDxj
bGFzcyBCYXNlPgorSlNPYmplY3QqIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmNvbnN0cnVjdChF
eGVjU3RhdGUqIGV4ZWMsIGNvbnN0IExpc3QmIGFyZ3MpCiB7CiAgICAgSlNDb250ZXh0UmVmIGV4
ZWNSZWYgPSB0b1JlZihleGVjKTsKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhp
cyk7CkBAIC0yNjEsMzIgKzI3MiwzNSBAQCBKU09iamVjdCogSlNDYWxsYmFja09iamVjdDo6Y29u
c3RydWN0KEV4CiAgICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6aW1w
bGVtZW50c0hhc0luc3RhbmNlKCkgY29uc3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorYm9vbCBK
U0NhbGxiYWNrT2JqZWN0PEJhc2U+OjppbXBsZW1lbnRzSGFzSW5zdGFuY2UoKSBjb25zdAogewog
ICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9
IGpzQ2xhc3MtPnBhcmVudENsYXNzKQogICAgICAgICBpZiAoanNDbGFzcy0+aGFzSW5zdGFuY2Up
CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQorICAgIAogICAgIHJldHVybiBmYWxzZTsKIH0K
IAotYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjpoYXNJbnN0YW5jZShFeGVjU3RhdGUgKmV4ZWMsIEpT
VmFsdWUgKnZhbHVlKQordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmpl
Y3Q8QmFzZT46Omhhc0luc3RhbmNlKEV4ZWNTdGF0ZSAqZXhlYywgSlNWYWx1ZSAqdmFsdWUpCiB7
CiAgICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKICAgICBKU09iamVjdFJl
ZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KKyAgICAKICAgICBmb3IgKEpTQ2xhc3NSZWYganND
bGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykK
ICAgICAgICAgaWYgKEpTT2JqZWN0SGFzSW5zdGFuY2VDYWxsYmFjayBoYXNJbnN0YW5jZSA9IGpz
Q2xhc3MtPmhhc0luc3RhbmNlKSB7CiAgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBk
cm9wQWxsTG9ja3M7CiAgICAgICAgICAgICByZXR1cm4gaGFzSW5zdGFuY2UoZXhlY1JlZiwgdGhp
c1JlZiwgdG9SZWYodmFsdWUpLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKTsKICAgICAg
ICAgfQotCi0gICAgQVNTRVJUKDApOyAvLyBpbXBsZW1lbnRzSGFzSW5zdGFuY2Ugc2hvdWxkIHBy
ZXZlbnQgdXMgZnJvbSByZWFjaGluZyBoZXJlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFT
U0VSVCgwKTsgLy8gaW1wbGVtZW50c0hhc0luc3RhbmNlIHNob3VsZCBwcmV2ZW50IHVzIGZyb20g
cmVhY2hpbmcgaGVyZQogICAgIHJldHVybiAwOwogfQogCiAKLWJvb2wgSlNDYWxsYmFja09iamVj
dDo6aW1wbGVtZW50c0NhbGwoKSBjb25zdAordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpT
Q2FsbGJhY2tPYmplY3Q8QmFzZT46OmltcGxlbWVudHNDYWxsKCkgY29uc3QKIHsKICAgICBmb3Ig
KEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNz
LT5wYXJlbnRDbGFzcykKICAgICAgICAgaWYgKGpzQ2xhc3MtPmNhbGxBc0Z1bmN0aW9uKQpAQCAt
Mjk1LDEyICszMDksMTMgQEAgYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjppbXBsZW1lbnRzQ2FsbCgp
IAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2Fs
bEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlz
dCAmYXJncykKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorSlNWYWx1ZSogSlNDYWxsYmFja09iamVj
dDxCYXNlPjo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09i
aiwgY29uc3QgTGlzdCAmYXJncykKIHsKICAgICBKU0NvbnRleHRSZWYgZXhlY1JlZiA9IHRvUmVm
KGV4ZWMpOwogICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKICAgICBKU09i
amVjdFJlZiB0aGlzT2JqUmVmID0gdG9SZWYodGhpc09iaik7Ci0KKyAgICAKICAgICBmb3IgKEpT
Q2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5w
YXJlbnRDbGFzcykgewogICAgICAgICBpZiAoSlNPYmplY3RDYWxsQXNGdW5jdGlvbkNhbGxiYWNr
IGNhbGxBc0Z1bmN0aW9uID0ganNDbGFzcy0+Y2FsbEFzRnVuY3Rpb24pIHsKICAgICAgICAgICAg
IGludCBhcmd1bWVudENvdW50ID0gc3RhdGljX2Nhc3Q8aW50PihhcmdzLnNpemUoKSk7CkBAIC0z
MTEsMjIgKzMyNiwyMyBAQCBKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWxsQXNGdW5jdGlv
CiAgICAgICAgICAgICByZXR1cm4gdG9KUyhjYWxsQXNGdW5jdGlvbihleGVjUmVmLCB0aGlzUmVm
LCB0aGlzT2JqUmVmLCBhcmd1bWVudENvdW50LCBhcmd1bWVudHMuZGF0YSgpLCB0b1JlZihleGVj
LT5leGNlcHRpb25TbG90KCkpKSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAgICBBU1NF
UlQoMCk7IC8vIGltcGxlbWVudHNDYWxsIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcg
aGVyZQogICAgIHJldHVybiAwOwogfQogCi12b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OmdldFByb3Bl
cnR5TmFtZXMoRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWVBcnJheSYgcHJvcGVydHlOYW1l
cykKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9pZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+Ojpn
ZXRQcm9wZXJ0eU5hbWVzKEV4ZWNTdGF0ZSogZXhlYywgUHJvcGVydHlOYW1lQXJyYXkmIHByb3Bl
cnR5TmFtZXMpCiB7CiAgICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKICAg
ICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KKyAgICAKICAgICBmb3IgKEpT
Q2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5w
YXJlbnRDbGFzcykgewogICAgICAgICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eU5hbWVzQ2FsbGJh
Y2sgZ2V0UHJvcGVydHlOYW1lcyA9IGpzQ2xhc3MtPmdldFByb3BlcnR5TmFtZXMpIHsKICAgICAg
ICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKICAgICAgICAgICAgIGdl
dFByb3BlcnR5TmFtZXMoZXhlY1JlZiwgdGhpc1JlZiwgdG9SZWYoJnByb3BlcnR5TmFtZXMpKTsK
ICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGlj
VmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgewogICAg
ICAgICAgICAgdHlwZWRlZiBPcGFxdWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZTo6Y29uc3Rf
aXRlcmF0b3IgaXRlcmF0b3I7CiAgICAgICAgICAgICBpdGVyYXRvciBlbmQgPSBzdGF0aWNWYWx1
ZXMtPmVuZCgpOwpAQCAtMzM3LDcgKzM1Myw3IEBAIHZvaWQgSlNDYWxsYmFja09iamVjdDo6Z2V0
UHJvcGVydHlOYW1lcygKICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoSWRl
bnRpZmllcihuYW1lKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQorICAgICAgICAKICAg
ICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNGdW5j
dGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKICAgICAgICAgICAgIHR5cGVkZWYg
T3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJh
dG9yOwogICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gc3RhdGljRnVuY3Rpb25zLT5lbmQoKTsK
QEAgLTM0OSw3NCArMzY1LDgxIEBAIHZvaWQgSlNDYWxsYmFja09iamVjdDo6Z2V0UHJvcGVydHlO
YW1lcygKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIAogICAgIEpTT2Jq
ZWN0OjpnZXRQcm9wZXJ0eU5hbWVzKGV4ZWMsIHByb3BlcnR5TmFtZXMpOwogfQogCi1kb3VibGUg
SlNDYWxsYmFja09iamVjdDo6dG9OdW1iZXIoRXhlY1N0YXRlKiBleGVjKSBjb25zdAordGVtcGxh
dGUgPGNsYXNzIEJhc2U+Citkb3VibGUgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6dG9OdW1iZXIo
RXhlY1N0YXRlKiBleGVjKSBjb25zdAogewogICAgIEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihl
eGVjKTsKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0KKyAgICAKICAg
ICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBq
c0NsYXNzLT5wYXJlbnRDbGFzcykKICAgICAgICAgaWYgKEpTT2JqZWN0Q29udmVydFRvVHlwZUNh
bGxiYWNrIGNvbnZlcnRUb1R5cGUgPSBqc0NsYXNzLT5jb252ZXJ0VG9UeXBlKSB7CiAgICAgICAg
ICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7CiAgICAgICAgICAgICBpZiAo
SlNWYWx1ZVJlZiB2YWx1ZSA9IGNvbnZlcnRUb1R5cGUoY3R4LCB0aGlzUmVmLCBrSlNUeXBlTnVt
YmVyLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKICAgICAgICAgICAgICAgICByZXR1
cm4gdG9KUyh2YWx1ZSktPmdldE51bWJlcigpOwogICAgICAgICB9Ci0KLSAgICByZXR1cm4gSlNP
YmplY3Q6OnRvTnVtYmVyKGV4ZWMpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4g
SlNPYmplY3Q6OnRvTnVtYmVyKGV4ZWMpOwogfQogCi1VU3RyaW5nIEpTQ2FsbGJhY2tPYmplY3Q6
OnRvU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgor
VVN0cmluZyBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+Ojp0b1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMp
IGNvbnN0CiB7CiAgICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwogICAgIEpTT2Jq
ZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKLQorICAgIAogICAgIGZvciAoSlNDbGFzc1Jl
ZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENs
YXNzKQogICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0VG9UeXBlQ2FsbGJhY2sgY29udmVydFRv
VHlwZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsKICAgICAgICAgICAgIEpTTG9jazo6RHJv
cEFsbExvY2tzIGRyb3BBbGxMb2NrczsKICAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVl
ID0gY29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtKU1R5cGVTdHJpbmcsIHRvUmVmKGV4ZWMt
PmV4Y2VwdGlvblNsb3QoKSkpKQogICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKS0+
Z2V0U3RyaW5nKCk7CiAgICAgICAgIH0KLQotICAgIHJldHVybiBKU09iamVjdDo6dG9TdHJpbmco
ZXhlYyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBKU09iamVjdDo6dG9TdHJp
bmcoZXhlYyk7CiB9CiAKLXZvaWQgSlNDYWxsYmFja09iamVjdDo6c2V0UHJpdmF0ZSh2b2lkKiBk
YXRhKQordGVtcGxhdGUgPGNsYXNzIEJhc2U+Cit2b2lkIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46
OnNldFByaXZhdGUodm9pZCogZGF0YSkKIHsKICAgICBtX3ByaXZhdGVEYXRhID0gZGF0YTsKIH0K
IAotdm9pZCogSlNDYWxsYmFja09iamVjdDo6Z2V0UHJpdmF0ZSgpCit0ZW1wbGF0ZSA8Y2xhc3Mg
QmFzZT4KK3ZvaWQqIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmdldFByaXZhdGUoKQogewogICAg
IHJldHVybiBtX3ByaXZhdGVEYXRhOwogfQogCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmluaGVy
aXRzKEpTQ2xhc3NSZWYgYykgY29uc3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorYm9vbCBKU0Nh
bGxiYWNrT2JqZWN0PEJhc2U+Ojppbmhlcml0cyhKU0NsYXNzUmVmIGMpIGNvbnN0CiB7CiAgICAg
Zm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganND
bGFzcy0+cGFyZW50Q2xhc3MpCiAgICAgICAgIGlmIChqc0NsYXNzID09IGMpCiAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLQorICAgIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotSlNWYWx1ZSog
SlNDYWxsYmFja09iamVjdDo6Y2FjaGVkVmFsdWVHZXR0ZXIoRXhlY1N0YXRlKiwgSlNPYmplY3Qq
LCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQordGVtcGxhdGUg
PGNsYXNzIEJhc2U+CitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpjYWNoZWRWYWx1
ZUdldHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25zdCBQ
cm9wZXJ0eVNsb3QmIHNsb3QpCiB7CiAgICAgSlNWYWx1ZSogdiA9IHNsb3Quc2xvdEJhc2UoKTsK
ICAgICBBU1NFUlQodik7CiAgICAgcmV0dXJuIHY7CiB9CiAKLUpTVmFsdWUqIEpTQ2FsbGJhY2tP
YmplY3Q6OnN0YXRpY1ZhbHVlR2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBjb25z
dCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKK3Rl
bXBsYXRlIDxjbGFzcyBCYXNlPgorSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDxCYXNlPjo6c3Rh
dGljVmFsdWVHZXR0ZXIoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZp
ZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQogewogICAgIEFTU0VS
VChzbG90LnNsb3RCYXNlKCktPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSk7CiAg
ICAgSlNDYWxsYmFja09iamVjdCogdGhpc09iaiA9IHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmpl
Y3QqPihzbG90LnNsb3RCYXNlKCkpOwotCisgICAgCiAgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9
IHRvUmVmKHRoaXNPYmopOwogICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVm
KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOwotCisgICAgCiAgICAgZm9yIChKU0NsYXNz
UmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFz
cy0+cGFyZW50Q2xhc3MpCiAgICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNU
YWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFsdWVzKQogICAgICAgICAgICAg
aWYgKFN0YXRpY1ZhbHVlRW50cnkqIGVudHJ5ID0gc3RhdGljVmFsdWVzLT5nZXQocHJvcGVydHlO
YW1lLnVzdHJpbmcoKS5yZXAoKSkpCkBAIC00MjUsMTggKzQ0OCwxOSBAQCBKU1ZhbHVlKiBKU0Nh
bGxiYWNrT2JqZWN0OjpzdGF0aWNWYWx1ZUdlCiAgICAgICAgICAgICAgICAgICAgIGlmIChKU1Zh
bHVlUmVmIHZhbHVlID0gZ2V0UHJvcGVydHkodG9SZWYoZXhlYyksIHRoaXNSZWYsIHByb3BlcnR5
TmFtZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCiAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gdG9KUyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJTdGF0aWMgdmFsdWUgcHJvcGVy
dHkgZGVmaW5lZCB3aXRoIE5VTEwgZ2V0UHJvcGVydHkgY2FsbGJhY2suIik7CisgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBS
ZWZlcmVuY2VFcnJvciwgIlN0YXRpYyB2YWx1ZSBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggTlVMTCBn
ZXRQcm9wZXJ0eSBjYWxsYmFjay4iKTsKIH0KIAotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6
c3RhdGljRnVuY3Rpb25HZXR0ZXIoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIGNvbnN0IElk
ZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQordGVtcGxh
dGUgPGNsYXNzIEJhc2U+CitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpzdGF0aWNG
dW5jdGlvbkdldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmll
ciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7CiAgICAgQVNTRVJU
KHNsb3Quc2xvdEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsKICAg
ICBKU0NhbGxiYWNrT2JqZWN0KiB0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVj
dCo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0KKyAgICAKICAgICBpZiAoSlNWYWx1ZSogY2FjaGVkT3JP
dmVycmlkZVZhbHVlID0gdGhpc09iai0+Z2V0RGlyZWN0KHByb3BlcnR5TmFtZSkpCiAgICAgICAg
IHJldHVybiBjYWNoZWRPck92ZXJyaWRlVmFsdWU7Ci0KKyAgICAKICAgICBmb3IgKEpTQ2xhc3NS
ZWYganNDbGFzcyA9IHRoaXNPYmotPm1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNz
LT5wYXJlbnRDbGFzcykgewogICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rp
b25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9ucykgewog
ICAgICAgICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5ID0gc3RhdGljRnVuY3Rp
b25zLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKQEAgLTQ0OCwyNiArNDcy
LDI3IEBAIEpTVmFsdWUqIEpTQ2FsbGJhY2tPYmplY3Q6OnN0YXRpY0Z1bmN0aW8KICAgICAgICAg
ICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIAogICAgIHJldHVybiB0aHJvd0Vycm9yKGV4
ZWMsIFJlZmVyZW5jZUVycm9yLCAiU3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5IGRlZmluZWQgd2l0
aCBOVUxMIGNhbGxBc0Z1bmN0aW9uIGNhbGxiYWNrLiIpOwogfQogCi1KU1ZhbHVlKiBKU0NhbGxi
YWNrT2JqZWN0OjpjYWxsYmFja0dldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit0
ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK0pTVmFsdWUqIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmNh
bGxiYWNrR2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKIHsKICAgICBBU1NFUlQo
c2xvdC5zbG90QmFzZSgpLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDo6aW5mbykpOwogICAg
IEpTQ2FsbGJhY2tPYmplY3QqIHRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0
Kj4oc2xvdC5zbG90QmFzZSgpKTsKLQorICAgIAogICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0
b1JlZih0aGlzT2JqKTsKICAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihw
cm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKLQorICAgIAogICAgIGZvciAoSlNDbGFzc1Jl
ZiBqc0NsYXNzID0gdGhpc09iai0+bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3Mt
PnBhcmVudENsYXNzKQogICAgICAgICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eUNhbGxiYWNrIGdl
dFByb3BlcnR5ID0ganNDbGFzcy0+Z2V0UHJvcGVydHkpIHsKICAgICAgICAgICAgIEpTTG9jazo6
RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKICAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZh
bHVlID0gZ2V0UHJvcGVydHkodG9SZWYoZXhlYyksIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwg
dG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRv
SlModmFsdWUpOwogICAgICAgICB9Ci0KLSAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZl
cmVuY2VFcnJvciwgImhhc1Byb3BlcnR5IGNhbGxiYWNrIHJldHVybmVkIHRydWUgZm9yIGEgcHJv
cGVydHkgdGhhdCBkb2Vzbid0IGV4aXN0LiIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwgImhhc1Byb3BlcnR5IGNhbGxi
YWNrIHJldHVybmVkIHRydWUgZm9yIGEgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4aXN0LiIpOwog
fQogCiB9IC8vIG5hbWVzcGFjZSBLSlMKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU0NsYXNz
UmVmLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDbGFzc1JlZi5jcHAJ
KHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2xhc3NSZWYuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNTYsNyArMTU2LDcgQEAgSlNPYmplY3QqIE9wYXF1ZUpTQ2xhc3M6
OnByb3RvdHlwZShKU0NvbgogICAgICAgICAgICAgcGFyZW50UHJvdG90eXBlID0gcGFyZW50Q2xh
c3MtPnByb3RvdHlwZShjdHgpOyAvLyBjYW4gYmUgbnVsbAogICAgICAgICBpZiAoIXBhcmVudFBy
b3RvdHlwZSkKICAgICAgICAgICAgIHBhcmVudFByb3RvdHlwZSA9IGV4ZWMtPmR5bmFtaWNJbnRl
cnByZXRlcigpLT5idWlsdGluT2JqZWN0UHJvdG90eXBlKCk7Ci0gICAgICAgIGNhY2hlZFByb3Rv
dHlwZSA9IG5ldyBKU0NhbGxiYWNrT2JqZWN0KGV4ZWMsIHByb3RvdHlwZUNsYXNzLCBwYXJlbnRQ
cm90b3R5cGUsIHRoaXMpOyAvLyBzZXQgb3Vyc2VsZiBhcyB0aGUgb2JqZWN0J3MgcHJpdmF0ZSBk
YXRhLCBzbyBpdCBjYW4gY2xlYXIgb3VyIHJlZmVyZW5jZSBvbiBkZXN0cnVjdGlvbgorICAgICAg
ICBjYWNoZWRQcm90b3R5cGUgPSBuZXcgSlNDYWxsYmFja09iamVjdDxKU09iamVjdD4oZXhlYywg
cHJvdG90eXBlQ2xhc3MsIHBhcmVudFByb3RvdHlwZSwgdGhpcyk7IC8vIHNldCBvdXJzZWxmIGFz
IHRoZSBvYmplY3QncyBwcml2YXRlIGRhdGEsIHNvIGl0IGNhbiBjbGVhciBvdXIgcmVmZXJlbmNl
IG9uIGRlc3RydWN0aW9uCiAgICAgfQogICAgIHJldHVybiBjYWNoZWRQcm90b3R5cGU7CiB9Cklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDb250ZXh0UmVmLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9BUEkvSlNDb250ZXh0UmVmLmNwcAkocmV2aXNpb24gMjcwMDcpCisrKyBK
YXZhU2NyaXB0Q29yZS9BUEkvSlNDb250ZXh0UmVmLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjks
NiArMjksNyBAQAogI2luY2x1ZGUgIkpTQ29udGV4dFJlZi5oIgogCiAjaW5jbHVkZSAiSlNDYWxs
YmFja09iamVjdC5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAiY29t
cGxldGlvbi5oIgogI2luY2x1ZGUgImludGVycHJldGVyLmgiCiAjaW5jbHVkZSAib2JqZWN0Lmgi
CkBAIC0zOSwxNiArNDAsMTYgQEAgSlNHbG9iYWxDb250ZXh0UmVmIEpTR2xvYmFsQ29udGV4dENy
ZWF0ZQogewogICAgIEpTTG9jayBsb2NrOwogCi0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdDsK
KyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0OwogICAgIGlmIChnbG9iYWxPYmplY3RD
bGFzcykKICAgICAgICAgLy8gU3BlY2lmeSBqc051bGwoKSBhcyB0aGUgcHJvdG90eXBlLiAgSW50
ZXJwcmV0ZXIgd2lsbCBmaXggaXQgdXAgdG8gcG9pbnQgYXQgYnVpbHRpbk9iamVjdFByb3RvdHlw
ZSgpIGluIGl0cyBjb25zdHJ1Y3RvcgotICAgICAgICBnbG9iYWxPYmplY3QgPSBuZXcgSlNDYWxs
YmFja09iamVjdCgwLCBnbG9iYWxPYmplY3RDbGFzcywganNOdWxsKCksIDApOworICAgICAgICBn
bG9iYWxPYmplY3QgPSBuZXcgSlNDYWxsYmFja09iamVjdDxKU0dsb2JhbE9iamVjdD4oMCwgZ2xv
YmFsT2JqZWN0Q2xhc3MsIGpzTnVsbCgpLCAwKTsKICAgICBlbHNlCi0gICAgICAgIGdsb2JhbE9i
amVjdCA9IG5ldyBKU09iamVjdCgpOworICAgICAgICBnbG9iYWxPYmplY3QgPSBuZXcgSlNHbG9i
YWxPYmplY3QoKTsKIAogICAgIEludGVycHJldGVyKiBpbnRlcnByZXRlciA9IG5ldyBJbnRlcnBy
ZXRlcihnbG9iYWxPYmplY3QpOyAvLyBhZGRzIHRoZSBidWlsdC1pbiBvYmplY3QgcHJvdG90eXBl
IHRvIHRoZSBnbG9iYWwgb2JqZWN0CiAgICAgaWYgKGdsb2JhbE9iamVjdENsYXNzKQotICAgICAg
ICBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4oZ2xvYmFsT2JqZWN0KS0+aW5pdGlhbGl6
ZUlmTmVlZGVkKGludGVycHJldGVyLT5nbG9iYWxFeGVjKCkpOworICAgICAgICBzdGF0aWNfY2Fz
dDxKU0NhbGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KGdsb2JhbE9iamVjdCktPmluaXRp
YWxpemVJZk5lZWRlZChpbnRlcnByZXRlci0+Z2xvYmFsRXhlYygpKTsKICAgICBKU0dsb2JhbENv
bnRleHRSZWYgY3R4ID0gcmVpbnRlcnByZXRfY2FzdDxKU0dsb2JhbENvbnRleHRSZWY+KGludGVy
cHJldGVyLT5nbG9iYWxFeGVjKCkpOwogICAgIHJldHVybiBKU0dsb2JhbENvbnRleHRSZXRhaW4o
Y3R4KTsKIH0KSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU09iamVjdFJlZi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gSmF2YVNjcmlwdENvcmUvQVBJL0pTT2JqZWN0UmVmLmNwcAkocmV2aXNpb24gMjcw
MDcpCisrKyBKYXZhU2NyaXB0Q29yZS9BUEkvSlNPYmplY3RSZWYuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiSlNDYWxsYmFja0Z1bmN0aW9uLmgiCiAjaW5j
bHVkZSAiSlNDYWxsYmFja09iamVjdC5oIgogI2luY2x1ZGUgIkpTQ2xhc3NSZWYuaCIKKyNpbmNs
dWRlICJKU0dsb2JhbE9iamVjdC5oIgogCiAjaW5jbHVkZSAiaWRlbnRpZmllci5oIgogI2luY2x1
ZGUgImZ1bmN0aW9uLmgiCkBAIC03Nyw3ICs3OCw3IEBAIEpTT2JqZWN0UmVmIEpTT2JqZWN0TWFr
ZShKU0NvbnRleHRSZWYgY3QKICAgICBpZiAoIWpzUHJvdG90eXBlKQogICAgICAgICBqc1Byb3Rv
dHlwZSA9IGV4ZWMtPmxleGljYWxJbnRlcnByZXRlcigpLT5idWlsdGluT2JqZWN0UHJvdG90eXBl
KCk7CiAKLSAgICByZXR1cm4gdG9SZWYobmV3IEpTQ2FsbGJhY2tPYmplY3QoZXhlYywganNDbGFz
cywganNQcm90b3R5cGUsIGRhdGEpKTsKKyAgICByZXR1cm4gdG9SZWYobmV3IEpTQ2FsbGJhY2tP
YmplY3Q8SlNPYmplY3Q+KGV4ZWMsIGpzQ2xhc3MsIGpzUHJvdG90eXBlLCBkYXRhKSk7CiB9CiAK
IEpTT2JqZWN0UmVmIEpTT2JqZWN0TWFrZUZ1bmN0aW9uV2l0aENhbGxiYWNrKEpTQ29udGV4dFJl
ZiBjdHgsIEpTU3RyaW5nUmVmIG5hbWUsIEpTT2JqZWN0Q2FsbEFzRnVuY3Rpb25DYWxsYmFjayBj
YWxsQXNGdW5jdGlvbikKQEAgLTIzNSw4ICsyMzYsMTAgQEAgdm9pZCogSlNPYmplY3RHZXRQcml2
YXRlKEpTT2JqZWN0UmVmIG9iagogewogICAgIEpTT2JqZWN0KiBqc09iamVjdCA9IHRvSlMob2Jq
ZWN0KTsKICAgICAKLSAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0
OjppbmZvKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihq
c09iamVjdCktPmdldFByaXZhdGUoKTsKKyAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0Nh
bGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pjo6aW5mbykpCisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KGpzT2JqZWN0KS0+Z2V0
UHJpdmF0ZSgpOworICAgIGVsc2UgaWYgKGpzT2JqZWN0LT5pbmhlcml0cygmSlNDYWxsYmFja09i
amVjdDxKU09iamVjdD46OmluZm8pKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNDYWxs
YmFja09iamVjdDxKU09iamVjdD4qPihqc09iamVjdCktPmdldFByaXZhdGUoKTsKICAgICAKICAg
ICByZXR1cm4gMDsKIH0KQEAgLTI0NSw4ICsyNDgsMTEgQEAgYm9vbCBKU09iamVjdFNldFByaXZh
dGUoSlNPYmplY3RSZWYgb2JqZQogewogICAgIEpTT2JqZWN0KiBqc09iamVjdCA9IHRvSlMob2Jq
ZWN0KTsKICAgICAKLSAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0
OjppbmZvKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4oanNPYmpl
Y3QpLT5zZXRQcml2YXRlKGRhdGEpOworICAgIGlmIChqc09iamVjdC0+aW5oZXJpdHMoJkpTQ2Fs
bGJhY2tPYmplY3Q8SlNHbG9iYWxPYmplY3Q+OjppbmZvKSkgeworICAgICAgICBzdGF0aWNfY2Fz
dDxKU0NhbGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KGpzT2JqZWN0KS0+c2V0UHJpdmF0
ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChqc09iamVjdC0+
aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q8SlNPYmplY3Q+OjppbmZvKSkgeworICAgICAgICBz
dGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0PEpTT2JqZWN0Pio+KGpzT2JqZWN0KS0+c2V0UHJp
dmF0ZShkYXRhKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgICAgICAKSW5kZXg6
IEphdmFTY3JpcHRDb3JlL0FQSS9KU1ZhbHVlUmVmLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2Ny
aXB0Q29yZS9BUEkvSlNWYWx1ZVJlZi5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlw
dENvcmUvQVBJL0pTVmFsdWVSZWYuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBA
CiAjaW5jbHVkZSAiSlNWYWx1ZVJlZi5oIgogCiAjaW5jbHVkZSA8a2pzL0pTVHlwZS5oPgorI2lu
Y2x1ZGUgPGtqcy9KU0dsb2JhbE9iamVjdC5oPgogI2luY2x1ZGUgPGtqcy9pbnRlcm5hbC5oPgog
I2luY2x1ZGUgPGtqcy9vcGVyYXRpb25zLmg+CiAjaW5jbHVkZSA8a2pzL3Byb3RlY3QuaD4KQEAg
LTEwNCw5ICsxMDUsMTIgQEAgYm9vbCBKU1ZhbHVlSXNPYmplY3RPZkNsYXNzKEpTQ29udGV4dFJl
ZgogewogICAgIEpTVmFsdWUqIGpzVmFsdWUgPSB0b0pTKHZhbHVlKTsKICAgICAKLSAgICBpZiAo
SlNPYmplY3QqIG8gPSBqc1ZhbHVlLT5nZXRPYmplY3QoKSkKLSAgICAgICAgaWYgKG8tPmluaGVy
aXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4obyktPmluaGVyaXRzKGpzQ2xhc3MpOworICAgIGlmIChK
U09iamVjdCogbyA9IGpzVmFsdWUtPmdldE9iamVjdCgpKSB7CisgICAgICAgIGlmIChvLT5pbmhl
cml0cygmSlNDYWxsYmFja09iamVjdDxKU09iamVjdD46OmluZm8pKQorICAgICAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3Q8SlNPYmplY3Q+Kj4obyktPmluaGVyaXRz
KGpzQ2xhc3MpOworICAgICAgICBlbHNlIGlmIChvLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVj
dDxKU0dsb2JhbE9iamVjdD46OmluZm8pKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PEpTQ2FsbGJhY2tPYmplY3Q8SlNHbG9iYWxPYmplY3Q+Kj4obyktPmluaGVyaXRzKGpzQ2xhc3Mp
OworICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0ph
dmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2
aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0yMzEsNiArMjMxLDggQEAKIAkJOTNF
MjZDRjcwOEIyOUExQzAwRjg1MjI2IC8qIHBjcmVfZ2V0LmMgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5M0UyNkNGNjA4QjI5QTFDMDBGODUyMjYgLyogcGNy
ZV9nZXQuYyAqLzsgfTsKIAkJOTNGMEIzQUMwOUJCNERDMDAwNjhGQ0UzIC8qIFBhcnNlci5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTNGMEIzQUEwOUJC
NERDMDAwNjhGQ0UzIC8qIFBhcnNlci5oICovOyB9OwogCQk5NUMxOEQ0OTBDOTBFODI2MDBFNzJG
NzMgLyogSlNSZXRhaW5QdHIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDk1QzE4RDNFMEM5MEU3RUYwMEU3MkY3MyAvKiBKU1JldGFpblB0ci5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUE4RTg5NDMyMENE
MDYwMjQwMDM2NzE3OSAvKiBKU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEU4OTQzMTBDRDA2MDI0MDAzNjcx
NzkgLyogSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5oICovOyB9OworCQlBOEU4OTQzNDBDRDA2
MDNGMDAzNjcxNzkgLyogSlNHbG9iYWxPYmplY3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4RTg5NDMzMENEMDYwM0YwMDM2NzE3OSAvKiBKU0dsb2Jh
bE9iamVjdC5oICovOyB9OwogCQlCQ0Y2NTU1OTBBMjA0OTcxMDAzOEExOTQgLyogTWF0aEV4dHJh
cy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNGNjU1
M0IwQTIwNDhERTAwMzhBMTk0IC8qIE1hdGhFeHRyYXMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlEMjEyMDIyQjBBRDQzMTBEMDBFRDc5QjYgLyog
RGF0ZU1hdGguaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEQyMTIwMjI5MEFENDMxMEMwMEVENzlCNiAvKiBEYXRlTWF0aC5oICovOyB9OwogCQlFMTFENTE3
NjBCMkU3OThEMDA1NkMxODggLyogU3RyaW5nRXh0cmFzLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTFENTE3NTBCMkU3OThEMDA1NkMxODggLyogU3Ry
aW5nRXh0cmFzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKQEAgLTU4Niw2ICs1ODgsOCBAQAogCQk5M0YwQjNBQTA5QkI0REMwMDA2OEZDRTMgLyogUGFy
c2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBhcnNlci5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk5M0YxOTgxQTA4MjQ1QUFFMDAxRTlBQkMgLyoga2V5d29y
ZHMudGFibGUgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
aW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBrZXl3b3Jk
cy50YWJsZTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB9OwogCQk5NUMx
OEQzRTBDOTBFN0VGMDBFNzJGNzMgLyogSlNSZXRhaW5QdHIuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gSlNSZXRhaW5QdHIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJQThFODk0MzEwQ0QwNjAyNDAwMzY3MTc5IC8qIEpTQ2FsbGJhY2tPYmplY3RGdW5jdGlvbnMu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNDYWxsYmFja09iamVjdEZ1bmN0
aW9ucy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBOEU4OTQzMzBDRDA2MDNGMDAz
NjcxNzkgLyogSlNHbG9iYWxPYmplY3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNHbG9iYWxPYmplY3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNGNjU1
M0IwQTIwNDhERTAwMzhBMTk0IC8qIE1hdGhFeHRyYXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IE1hdGhFeHRyYXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
RDIxMjAyMjgwQUQ0MzEwQzAwRUQ3OUI2IC8qIERhdGVNYXRoLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBEYXRlTWF0aC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCUQyMTIwMjI5MEFENDMxMEMwMEVENzlCNiAvKiBEYXRlTWF0aC5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRGF0ZU1hdGguaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKQEAgLTc3MCw2ICs3NzQsNyBAQAogCQkJCTE0NDBGODhGMEE1MDhCMTAwMDA1RjA2
MSAvKiBKU0NhbGxiYWNrRnVuY3Rpb24uaCAqLywKIAkJCQkxNEFCREY1RTBBNDM3RkVGMDBFQ0NB
MDEgLyogSlNDYWxsYmFja09iamVjdC5jcHAgKi8sCiAJCQkJMTRBQkRGNUQwQTQzN0ZFRjAwRUND
QTAxIC8qIEpTQ2FsbGJhY2tPYmplY3QuaCAqLywKKwkJCQlBOEU4OTQzMTBDRDA2MDI0MDAzNjcx
NzkgLyogSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5oICovLAogCQkJCTE0NDBGQ0UyMEE1MUU0
NkIwMDA1RjA2MSAvKiBKU0NsYXNzUmVmLmNwcCAqLywKIAkJCQkxNDQwRkNFMTBBNTFFNDZCMDAw
NUYwNjEgLyogSlNDbGFzc1JlZi5oICovLAogCQkJCTE0QkQ1QTI5MEEzRTkxRjYwMEJBRjU5QyAv
KiBKU0NvbnRleHRSZWYuY3BwICovLApAQCAtNzc5LDggKzc4NCw4IEBACiAJCQkJOTVDMThEM0Uw
QzkwRTdFRjAwRTcyRjczIC8qIEpTUmV0YWluUHRyLmggKi8sCiAJCQkJMTQ4MkI3NEMwQTQzMDMy
ODAwNTE3Q0ZDIC8qIEpTU3RyaW5nUmVmLmNwcCAqLywKIAkJCQkxNDgyQjc0QjBBNDMwMzI4MDA1
MTdDRkMgLyogSlNTdHJpbmdSZWYuaCAqLywKLQkJCQkxNDZBQUIyQTBCNjZBODQ5MDBFNTVGMTYg
LyogSlNTdHJpbmdSZWZDRi5oICovLAogCQkJCTE0NkFBQjM3MEI2NkE5NDQwMEU1NUYxNiAvKiBK
U1N0cmluZ1JlZkNGLmNwcCAqLywKKwkJCQkxNDZBQUIyQTBCNjZBODQ5MDBFNTVGMTYgLyogSlNT
dHJpbmdSZWZDRi5oICovLAogCQkJCTE0QkQ1QTJCMEEzRTkxRjYwMEJBRjU5QyAvKiBKU1ZhbHVl
UmVmLmNwcCAqLywKIAkJCQkxNDgyQjZFQTBBNDMwMEIzMDA1MTdDRkMgLyogSlNWYWx1ZVJlZi5o
ICovLAogCQkJKTsKQEAgLTk0NSwyMyArOTUwLDE5IEBACiAJCTY1NDE3MjAwMDM5RTAxQkEwMDU4
QkZFQiAvKiBranMgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAot
CQkJCTY1QzdBMTcxMEE4RUFBQ0IwMEZBMzdFQSAvKiBKU1dyYXBwZXJPYmplY3QuY3BwICovLAot
CQkJCTY1RUE3MzYyMEJBRTM1RDEwMDFCQjU2MCAvKiBDb21tb25JZGVudGlmaWVycy5jcHAgKi8s
Ci0JCQkJNjVFQTczNjMwQkFFMzVEMTAwMUJCNTYwIC8qIENvbW1vbklkZW50aWZpZXJzLmggKi8s
Ci0JCQkJNjVDN0ExNzIwQThFQUFDQjAwRkEzN0VBIC8qIEpTV3JhcHBlck9iamVjdC5oICovLAot
CQkJCTY1NDAwQzBGMEE2OUJBRjIwMDUwOTg4NyAvKiBQcm9wZXJ0eU5hbWVBcnJheS5jcHAgKi8s
Ci0JCQkJNjU0MDBDMTAwQTY5QkFGMjAwNTA5ODg3IC8qIFByb3BlcnR5TmFtZUFycmF5LmggKi8s
Ci0JCQkJOTM4NzcyRTUwMzhCRkUxOTAwODYzNUNFIC8qIGFycmF5X2luc3RhbmNlLmggKi8sCi0J
CQkJOTNBREZDRTYwQ0NCRDdBQzAwRDMwQjA4IC8qIGFycmF5X2luc3RhbmNlLmNwcCAqLywKIAkJ
CQk2NTkxMjZCQzBCREQxNzI4MDAxOTIxRkIgLyogQWxsSW5PbmVGaWxlLmNwcCAqLywKKwkJCQk5
M0FERkNFNjBDQ0JEN0FDMDBEMzBCMDggLyogYXJyYXlfaW5zdGFuY2UuY3BwICovLAorCQkJCTkz
ODc3MkU1MDM4QkZFMTkwMDg2MzVDRSAvKiBhcnJheV9pbnN0YW5jZS5oICovLAogCQkJCUY2OTJB
ODREMDI1NTU5N0QwMUZGNjBGNyAvKiBhcnJheV9vYmplY3QuY3BwICovLAogCQkJCUY2OTJBODRF
MDI1NTU5N0QwMUZGNjBGNyAvKiBhcnJheV9vYmplY3QuaCAqLywKIAkJCQlGNjkyQTg1MDAyNTU1
OTdEMDFGRjYwRjcgLyogYm9vbF9vYmplY3QuY3BwICovLAogCQkJCTcwNEZEMzUzMDU2OTdFNkQw
MDNEQkVEOSAvKiBib29sX29iamVjdC5oICovLAogCQkJCUY2OTJBODUyMDI1NTU5N0QwMUZGNjBG
NyAvKiBjb2xsZWN0b3IuY3BwICovLAogCQkJCUY2OTJBODUzMDI1NTU5N0QwMUZGNjBGNyAvKiBj
b2xsZWN0b3IuaCAqLywKLQkJCQk1REJEMThBQTBDNTQwMTg3MDBDMTVFQUUgLyogQ29sbGVjdG9y
SGVhcEludHJvc3BlY3Rvci5oICovLAogCQkJCTVEQkQxOEE5MEM1NDAxODcwMEMxNUVBRSAvKiBD
b2xsZWN0b3JIZWFwSW50cm9zcGVjdG9yLmNwcCAqLywKKwkJCQk1REJEMThBQTBDNTQwMTg3MDBD
MTVFQUUgLyogQ29sbGVjdG9ySGVhcEludHJvc3BlY3Rvci5oICovLAorCQkJCTY1RUE3MzYyMEJB
RTM1RDEwMDFCQjU2MCAvKiBDb21tb25JZGVudGlmaWVycy5jcHAgKi8sCisJCQkJNjVFQTczNjMw
QkFFMzVEMTAwMUJCNTYwIC8qIENvbW1vbklkZW50aWZpZXJzLmggKi8sCiAJCQkJRjVCQjJCQzUw
MzBGNzcyMTAxRkNGRTFEIC8qIGNvbXBsZXRpb24uaCAqLywKIAkJCQlGNjhFQkI4QzAyNTVENEM2
MDFGRjYwRjcgLyogY29uZmlnLmggKi8sCiAJCQkJMTRGMTM3NTgwQTNBNzI3RTAwRjI2RjkwIC8q
IENvbnRleHQuY3BwICovLApAQCAtOTc3LDYgKzk3OCw4IEBACiAJCQkJNjUxRjY0MTMwMzlENUI1
RjAwNzgzOTVDIC8qIGR0b2EuaCAqLywKIAkJCQlGNjkyQTg1QTAyNTU1OTdEMDFGRjYwRjcgLyog
ZXJyb3Jfb2JqZWN0LmNwcCAqLywKIAkJCQlGNjkyQTg1QjAyNTU1OTdEMDFGRjYwRjcgLyogZXJy
b3Jfb2JqZWN0LmggKi8sCisJCQkJMTRCRDUzRjQwQTNFMTJEODAwQkFGNTlDIC8qIEV4ZWNTdGF0
ZS5jcHAgKi8sCisJCQkJMTRCRDUzRjMwQTNFMTJEODAwQkFGNTlDIC8qIEV4ZWNTdGF0ZS5oICov
LAogCQkJCTkzNjRCMjczMDQ1QjdENkMwMEE5Q0FDMSAvKiBmcGNvbnN0LmNwcCAqLywKIAkJCQlG
NjkyQTg1RTAyNTU1OTdEMDFGRjYwRjcgLyogZnVuY3Rpb24uY3BwICovLAogCQkJCUY2OTJBODVG
MDI1NTU5N0QwMUZGNjBGNyAvKiBmdW5jdGlvbi5oICovLApAQCAtOTkwLDExICs5OTMsMTQgQEAK
IAkJCQlGNjkyQTg2MzAyNTU1OTdEMDFGRjYwRjcgLyogaW50ZXJwcmV0ZXIuY3BwICovLAogCQkJ
CUY2OTJBODY0MDI1NTU5N0QwMUZGNjBGNyAvKiBpbnRlcnByZXRlci5oICovLAogCQkJCUY1QzI5
MEU2MDI4NEY5OEUwMTg2MzVDQSAvKiBKYXZhU2NyaXB0Q29yZVByZWZpeC5oICovLAorCQkJCUE4
RTg5NDMzMENEMDYwM0YwMDM2NzE3OSAvKiBKU0dsb2JhbE9iamVjdC5oICovLAogCQkJCTE0NzYw
ODYzMDk5QzYzMzgwMDQzNzEyOCAvKiBKU0ltbWVkaWF0ZS5jcHAgKi8sCiAJCQkJMTQ4M0I1ODkw
OTlCQzE5NTAwMTZFNEYwIC8qIEpTSW1tZWRpYXRlLmggKi8sCiAJCQkJNjVFQTRDOTkwOTJBRjlF
MjAwOTNEODAwIC8qIEpTTG9jay5jcHAgKi8sCiAJCQkJNjVFQTRDOUEwOTJBRjlFMjAwOTNEODAw
IC8qIEpTTG9jay5oICovLAogCQkJCTE0QUJCNDU0MDk5QzJBMEYwMEUyQTI0RiAvKiBKU1R5cGUu
aCAqLywKKwkJCQk2NUM3QTE3MTBBOEVBQUNCMDBGQTM3RUEgLyogSlNXcmFwcGVyT2JqZWN0LmNw
cCAqLywKKwkJCQk2NUM3QTE3MjBBOEVBQUNCMDBGQTM3RUEgLyogSlNXcmFwcGVyT2JqZWN0Lmgg
Ki8sCiAJCQkJOTNGMTk4MUEwODI0NUFBRTAwMUU5QUJDIC8qIGtleXdvcmRzLnRhYmxlICovLAog
CQkJCUY2OTJBODY1MDI1NTU5N0QwMUZGNjBGNyAvKiBsZXhlci5jcHAgKi8sCiAJCQkJRjY5MkE4
NjYwMjU1NTk3RDAxRkY2MEY3IC8qIGxleGVyLmggKi8sCkBAIC0xMDIxLDExICsxMDI3LDE0IEBA
CiAJCQkJRjY5MkE4N0EwMjU1NTk3RDAxRkY2MEY3IC8qIHByb3BlcnR5X21hcC5oICovLAogCQkJ
CTY1NjIxRTZCMDg5RTg1OTcwMDc2MEYzNSAvKiBwcm9wZXJ0eV9zbG90LmNwcCAqLywKIAkJCQk2
NTYyMUU2QzA4OUU4NTk3MDA3NjBGMzUgLyogcHJvcGVydHlfc2xvdC5oICovLAorCQkJCTY1NDAw
QzBGMEE2OUJBRjIwMDUwOTg4NyAvKiBQcm9wZXJ0eU5hbWVBcnJheS5jcHAgKi8sCisJCQkJNjU0
MDBDMTAwQTY5QkFGMjAwNTA5ODg3IC8qIFByb3BlcnR5TmFtZUFycmF5LmggKi8sCiAJCQkJNjVD
MDJGQkIwNjM3NDYyQTAwM0U3RUU2IC8qIHByb3RlY3QuaCAqLywKIAkJCQlGNjkyQTg3RDAyNTU1
OTdEMDFGRjYwRjcgLyogcmVnZXhwLmNwcCAqLywKIAkJCQlGNjkyQTg3RTAyNTU1OTdEMDFGRjYw
RjcgLyogcmVnZXhwLmggKi8sCiAJCQkJRjY5MkE4N0IwMjU1NTk3RDAxRkY2MEY3IC8qIHJlZ2V4
cF9vYmplY3QuY3BwICovLAogCQkJCUY2OTJBODdDMDI1NTU5N0QwMUZGNjBGNyAvKiByZWdleHBf
b2JqZWN0LmggKi8sCisJCQkJMTRCRDUzNEEwQTNFMEFFQTAwQkFGNTlDIC8qIFNhdmVkQnVpbHRp
bnMuaCAqLywKIAkJCQk5Mzc0RDNBODAzOEQ5RDc0MDA4NjM1Q0UgLyogc2NvcGVfY2hhaW4uY3Bw
ICovLAogCQkJCTkzNzREM0E3MDM4RDlENzQwMDg2MzVDRSAvKiBzY29wZV9jaGFpbi5oICovLAog
CQkJCUY2OTJBODdGMDI1NTU5N0QwMUZGNjBGNyAvKiBzdHJpbmdfb2JqZWN0LmNwcCAqLywKQEAg
LTEwMzUsOSArMTA0NCw2IEBACiAJCQkJRjY5MkE4ODYwMjU1NTk3RDAxRkY2MEY3IC8qIHVzdHJp
bmcuaCAqLywKIAkJCQlGNjkyQTg4NzAyNTU1OTdEMDFGRjYwRjcgLyogdmFsdWUuY3BwICovLAog
CQkJCTE0QUJCMzZFMDk5QzA3NjQwMEUyQTI0RiAvKiB2YWx1ZS5oICovLAotCQkJCTE0QkQ1MzRB
MEEzRTBBRUEwMEJBRjU5QyAvKiBTYXZlZEJ1aWx0aW5zLmggKi8sCi0JCQkJMTRCRDUzRjMwQTNF
MTJEODAwQkFGNTlDIC8qIEV4ZWNTdGF0ZS5oICovLAotCQkJCTE0QkQ1M0Y0MEEzRTEyRDgwMEJB
RjU5QyAvKiBFeGVjU3RhdGUuY3BwICovLAogCQkJKTsKIAkJCXBhdGggPSBranM7CiAJCQlzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOwpAQCAtMTI1Niw2ICsxMjYyLDggQEAKIAkJCQk5MzhDNEY2QTBD
QTA2QkM3MDBEOTMxMEEgLyogQVNDSUlDVHlwZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTM4QzRG
NkMwQ0EwNkJDRTAwRDkzMTBBIC8qIERpc2FsbG93Q1R5cGUuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTUxODYxMTFFMENDODI0OTAwMDgxNDEyQiAvKiBEZXF1ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJ
QThFODk0MzIwQ0QwNjAyNDAwMzY3MTc5IC8qIEpTQ2FsbGJhY2tPYmplY3RGdW5jdGlvbnMuaCBp
biBIZWFkZXJzICovLAorCQkJCUE4RTg5NDM0MENEMDYwM0YwMDM2NzE3OSAvKiBKU0dsb2JhbE9i
amVjdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0
cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xMzcxLDcgKzEzNzksNiBAQAogCQkwODY3RDY5MEZF
ODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CiAJCQlpc2EgPSBQQlhQcm9q
ZWN0OwogCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDE0OUMyNzcxMDg5MDJBRkUwMDhBOUVG
QyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIkphdmFTY3JpcHRD
b3JlIiAqLzsKLQkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDIuNCI7CiAJCQloYXNT
Y2FubmVkRm9yRW5jb2RpbmdzID0gMTsKIAkJCW1haW5Hcm91cCA9IDA4NjdENjkxRkU4NDAyOEZD
MDJBQUMwNyAvKiBKYXZhU2NyaXB0Q29yZSAqLzsKIAkJCXByb2R1Y3RSZWZHcm91cCA9IDAzNDc2
OERGRkYzOEE1MDQxMURCOUM4QiAvKiBQcm9kdWN0cyAqLzsKSW5kZXg6IEphdmFTY3JpcHRDb3Jl
L2JpbmRpbmdzL2MvY191dGlsaXR5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9i
aW5kaW5ncy9jL2NfdXRpbGl0eS5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENv
cmUvYmluZGluZ3MvYy9jX3V0aWxpdHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw3ICszMSw4
IEBACiAjaW5jbHVkZSAiY191dGlsaXR5LmgiCiAKICNpbmNsdWRlICJOUF9qc29iamVjdC5oIgot
I2luY2x1ZGUgImNfaW5zdGFuY2UuaCIgCisjaW5jbHVkZSAiY19pbnN0YW5jZS5oIgorI2luY2x1
ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKICNpbmNs
dWRlICJucHJ1bnRpbWVfcHJpdi5oIgogI2luY2x1ZGUgInJ1bnRpbWVfb2JqZWN0LmgiCkBAIC0x
MzAsOSArMTMxLDggQEAgdm9pZCBjb252ZXJ0VmFsdWVUb05QVmFyaWFudChFeGVjU3RhdGUgKgog
ICAgICAgICAgICAgUm9vdE9iamVjdCogb3JpZ2luUm9vdE9iamVjdCA9IGZpbmRSb290T2JqZWN0
KG9yaWdpbkludGVycHJldGVyKTsKIAogICAgICAgICAgICAgSW50ZXJwcmV0ZXIqIGludGVycHJl
dGVyID0gMDsKLSAgICAgICAgICAgIGlmIChvcmlnaW5JbnRlcnByZXRlci0+aXNHbG9iYWxPYmpl
Y3QodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBvcmlnaW5JbnRlcnBy
ZXRlci0+aW50ZXJwcmV0ZXJGb3JHbG9iYWxPYmplY3QodmFsdWUpOwotICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKG9iamVjdC0+aXNHbG9iYWxPYmplY3QoKSkKKyAgICAgICAgICAgICAg
ICBpbnRlcnByZXRlciA9IHN0YXRpY19jYXN0PEpTR2xvYmFsT2JqZWN0Kj4ob2JqZWN0KS0+aW50
ZXJwcmV0ZXIoKTsKIAogICAgICAgICAgICAgaWYgKCFpbnRlcnByZXRlcikKICAgICAgICAgICAg
ICAgICBpbnRlcnByZXRlciA9IG9yaWdpbkludGVycHJldGVyOwpJbmRleDogSmF2YVNjcmlwdENv
cmUvYmluZGluZ3Mvam5pL2puaV9qc29iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUvYmluZGluZ3Mvam5pL2puaV9qc29iamVjdC5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysg
SmF2YVNjcmlwdENvcmUvYmluZGluZ3Mvam5pL2puaV9qc29iamVjdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJqbmlfanNvYmplY3QuaCIKICNpbmNsdWRl
ICJqbmlfcnVudGltZS5oIgogI2luY2x1ZGUgImpuaV91dGlsaXR5LmgiCisjaW5jbHVkZSAiSlNH
bG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJsaXN0LmgiCiAjaW5jbHVkZSAicnVudGltZV9vYmpl
Y3QuaCIKICNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2Jp
bmRpbmdzL29iamMvb2JqY191dGlsaXR5Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L2JpbmRpbmdzL29iamMvb2JqY191dGlsaXR5Lm1tCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFT
Y3JpcHRDb3JlL2JpbmRpbmdzL29iamMvb2JqY191dGlsaXR5Lm1tCSh3b3JraW5nIGNvcHkpCkBA
IC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAib2JqY191dGlsaXR5LmgiCiAKICNpbmNsdWRlICJv
YmpjX2luc3RhbmNlLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJy
dW50aW1lX2FycmF5LmgiCiAjaW5jbHVkZSAicnVudGltZV9vYmplY3QuaCIKICNpbmNsdWRlICJX
ZWJTY3JpcHRPYmplY3QuaCIKQEAgLTE0MCw4ICsxNDEsOCBAQCBPYmpjVmFsdWUgY29udmVydFZh
bHVlVG9PYmpjVmFsdWUoRXhlY1N0CiAgICAgICAgICAgICBSb290T2JqZWN0KiBvcmlnaW5Sb290
T2JqZWN0ID0gZmluZFJvb3RPYmplY3Qob3JpZ2luSW50ZXJwcmV0ZXIpOwogCiAgICAgICAgICAg
ICBJbnRlcnByZXRlciAqaW50ZXJwcmV0ZXIgPSAwOwotICAgICAgICAgICAgaWYgKG9yaWdpbklu
dGVycHJldGVyLT5pc0dsb2JhbE9iamVjdCh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgaW50ZXJw
cmV0ZXIgPSBvcmlnaW5JbnRlcnByZXRlci0+aW50ZXJwcmV0ZXJGb3JHbG9iYWxPYmplY3QodmFs
dWUpOworICAgICAgICAgICAgaWYgKHZhbHVlLT5pc09iamVjdCgpICYmIHN0YXRpY19jYXN0PEpT
T2JqZWN0Kj4odmFsdWUpLT5pc0dsb2JhbE9iamVjdCgpKQorICAgICAgICAgICAgICAgIGludGVy
cHJldGVyID0gc3RhdGljX2Nhc3Q8SlNHbG9iYWxPYmplY3QqPih2YWx1ZSktPmludGVycHJldGVy
KCk7CiAKICAgICAgICAgICAgIGlmICghaW50ZXJwcmV0ZXIpCiAgICAgICAgICAgICAgICAgaW50
ZXJwcmV0ZXIgPSBvcmlnaW5JbnRlcnByZXRlcjsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9D
b250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvQ29udGV4dC5jcHAJ
KHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL0NvbnRleHQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgS0pTIHsKIAogLy8gRUNNQSAx
MC4yCi1Db250ZXh0OjpDb250ZXh0KEpTT2JqZWN0KiBnbG9iLCBJbnRlcnByZXRlciogaW50ZXJw
cmV0ZXIsIEpTT2JqZWN0KiB0aGlzViwgCitDb250ZXh0OjpDb250ZXh0KEpTR2xvYmFsT2JqZWN0
KiBnbG9iLCBJbnRlcnByZXRlciogaW50ZXJwcmV0ZXIsIEpTT2JqZWN0KiB0aGlzViwgCiAgICAg
ICAgICAgICAgICAgIEZ1bmN0aW9uQm9keU5vZGUqIGN1cnJlbnRCb2R5LCBDb2RlVHlwZSB0eXBl
LCBDb250ZXh0KiBjYWxsaW5nQ29uLCAKICAgICAgICAgICAgICAgICAgRnVuY3Rpb25JbXAqIGZ1
bmMsIGNvbnN0IExpc3QqIGFyZ3MpCiAgICAgOiBtX2ludGVycHJldGVyKGludGVycHJldGVyKQpJ
bmRleDogSmF2YVNjcmlwdENvcmUva2pzL0V4ZWNTdGF0ZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUva2pzL0V4ZWNTdGF0ZS5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNj
cmlwdENvcmUva2pzL0V4ZWNTdGF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDE1ICszMCwx
NCBAQCBuYW1lc3BhY2UgS0pTIHsKIAogSW50ZXJwcmV0ZXIqIEV4ZWNTdGF0ZTo6bGV4aWNhbElu
dGVycHJldGVyKCkgY29uc3QKIHsKLSAgaWYgKCFtX2NvbnRleHQpCi0gICAgcmV0dXJuIGR5bmFt
aWNJbnRlcnByZXRlcigpOwotCi0gIEludGVycHJldGVyKiByZXN1bHQgPSBJbnRlcnByZXRlcjo6
aW50ZXJwcmV0ZXJXaXRoR2xvYmFsT2JqZWN0KG1fY29udGV4dC0+c2NvcGVDaGFpbigpLmJvdHRv
bSgpKTsKKyAgICBpZiAoIW1fY29udGV4dCkKKyAgICAgICAgcmV0dXJuIGR5bmFtaWNJbnRlcnBy
ZXRlcigpOworICAgIAorICAgIEpTT2JqZWN0KiBvYmplY3QgPSBtX2NvbnRleHQtPnNjb3BlQ2hh
aW4oKS5ib3R0b20oKTsKKyAgICBpZiAob2JqZWN0ICYmIG9iamVjdC0+aXNHbG9iYWxPYmplY3Qo
KSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTR2xvYmFsT2JqZWN0Kj4ob2JqZWN0KS0+
aW50ZXJwcmV0ZXIoKTsKIAotICBpZiAoIXJlc3VsdCkKICAgICByZXR1cm4gZHluYW1pY0ludGVy
cHJldGVyKCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKIH0KIAogfSAvLyBuYW1lc3BhY2UgS0pTCklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvSlNHbG9iYWxPYmplY3QuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9ranMvSlNHbG9iYWxPYmplY3QuaAkocmV2aXNpb24gMCkKKysrIEphdmFT
Y3JpcHRDb3JlL2tqcy9KU0dsb2JhbE9iamVjdC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQz
IEBACisvLyAtKi0gYy1iYXNpYy1vZmZzZXQ6IDQgLSotCisvKgorICogIENvcHlyaWdodCAoQykg
MjAwNyBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRl
ZiBLSlNfR2xvYmFsT2JqZWN0X2gKKyNkZWZpbmUgS0pTX0dsb2JhbE9iamVjdF9oCisKKyNpbmNs
dWRlICJvYmplY3QuaCIKKworbmFtZXNwYWNlIEtKUyB7CisgICAgY2xhc3MgSW50ZXJwcmV0ZXI7
CisgICAgY2xhc3MgSlNHbG9iYWxPYmplY3QgOiBwdWJsaWMgSlNPYmplY3QgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgSlNHbG9iYWxPYmplY3QoKSB7IH0KKyAgICAgICAgSlNHbG9iYWxPYmplY3Qo
SlNWYWx1ZSogcHJvdG8pIDogSlNPYmplY3QocHJvdG8pIHsgfQorICAgICAgICAKKyAgICAgICAg
dmlydHVhbCBib29sIGlzR2xvYmFsT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAg
ICAgICAKKyAgICAgICAgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyKCkgY29uc3QgeyByZXR1cm4g
bV9pbnRlcnByZXRlcjsgfQorICAgICAgICB2b2lkIHNldEludGVycHJldGVyKEludGVycHJldGVy
KiBpKSB7IG1faW50ZXJwcmV0ZXIgPSBpOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgSW50ZXJw
cmV0ZXIqIG1faW50ZXJwcmV0ZXI7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIEtKUworCisjZW5k
aWYgLy8gS0pTX0dsb2JhbE9iamVjdF9oCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvYXJyYXlf
aW5zdGFuY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9hcnJheV9pbnN0
YW5jZS5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2FycmF5X2lu
c3RhbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDkxLDcgKzQ5MSw3IEBAIHN0cnVjdCBDb21w
YXJlV2l0aENvbXBhcmVGdW5jdGlvbkFyZ3VtZW4KICAgICBFeGVjU3RhdGUgKmV4ZWM7CiAgICAg
SlNPYmplY3QgKmNvbXBhcmVGdW5jdGlvbjsKICAgICBMaXN0IGFyZ3VtZW50czsKLSAgICBKU09i
amVjdCAqZ2xvYmFsT2JqZWN0OworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Q7CiB9
OwogCiBzdGF0aWMgQ29tcGFyZVdpdGhDb21wYXJlRnVuY3Rpb25Bcmd1bWVudHMqIGNvbXBhcmVX
aXRoQ29tcGFyZUZ1bmN0aW9uQXJndW1lbnRzID0gMDsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tq
cy9jb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2NvbnRleHQuaAko
cmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvY29udGV4dC5oCSh3b3JraW5n
IGNvcHkpCkBAIC01MCw3ICs1MCw3IEBAIG5hbWVzcGFjZSBLSlMgIHsKICAgICovCiAgIGNsYXNz
IENvbnRleHQgewogICBwdWJsaWM6Ci0gICAgQ29udGV4dChKU09iamVjdCogZ2xvYmFsLCBJbnRl
cnByZXRlciosIEpTT2JqZWN0KiB0aGlzViwKKyAgICBDb250ZXh0KEpTR2xvYmFsT2JqZWN0Kiwg
SW50ZXJwcmV0ZXIqLCBKU09iamVjdCogdGhpc1YsCiAgICAgICAgICAgICBGdW5jdGlvbkJvZHlO
b2RlKiBjdXJyZW50Qm9keSwgQ29kZVR5cGUgdHlwZSA9IEdsb2JhbENvZGUsCiAgICAgICAgICAg
ICBDb250ZXh0KiBjYWxsaW5nQ29udGV4dCA9IDAsIEZ1bmN0aW9uSW1wKiBmdW5jdGlvbiA9IDAs
IGNvbnN0IExpc3QqIGFyZ3MgPSAwKTsKICAgICB+Q29udGV4dCgpOwpJbmRleDogSmF2YVNjcmlw
dENvcmUva2pzL2Z1bmN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMv
ZnVuY3Rpb24uY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9mdW5j
dGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJkdG9h
LmgiCiAjaW5jbHVkZSAiZnVuY3Rpb25fb2JqZWN0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIK
KyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgogI2luY2x1ZGUgImxleGVyLmgiCiAjaW5jbHVk
ZSAibm9kZXMuaCIKICNpbmNsdWRlICJvcGVyYXRpb25zLmgiCkBAIC02NSw3ICs2Niw3IEBAIHZv
aWQgRnVuY3Rpb25JbXA6Om1hcmsoKQogCiBKU1ZhbHVlKiBGdW5jdGlvbkltcDo6Y2FsbEFzRnVu
Y3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCYgYXJn
cykKIHsKLSAgSlNPYmplY3QqIGdsb2JhbE9iaiA9IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigp
LT5nbG9iYWxPYmplY3QoKTsKKyAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iaiA9IGV4ZWMtPmR5
bmFtaWNJbnRlcnByZXRlcigpLT5nbG9iYWxPYmplY3QoKTsKIAogICAvLyBlbnRlciBhIG5ldyBl
eGVjdXRpb24gY29udGV4dAogICBDb250ZXh0IGN0eChnbG9iYWxPYmosIGV4ZWMtPmR5bmFtaWNJ
bnRlcnByZXRlcigpLCB0aGlzT2JqLCBib2R5LmdldCgpLApAQCAtNzU0LDEwICs3NTUsMTAgQEAg
SlNWYWx1ZSogR2xvYmFsRnVuY0ltcDo6Y2FsbEFzRnVuY3Rpb24oRQogICAgICAgICBpZiAoIXBy
b2dOb2RlKQogICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9yLCBl
cnJNc2csIGVyckxpbmUsIHNpZCwgTlVMTCk7CiAKLSAgICAgICAgYm9vbCBzd2l0Y2hHbG9iYWwg
PSB0aGlzT2JqICYmIGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5pc0dsb2JhbE9iamVjdCh0
aGlzT2JqKSAmJiB0aGlzT2JqICE9IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpLT5nbG9iYWxP
YmplY3QoKTsKKyAgICAgICAgYm9vbCBzd2l0Y2hHbG9iYWwgPSB0aGlzT2JqICYmIHRoaXNPYmog
IT0gZXhlYy0+ZHluYW1pY0ludGVycHJldGVyKCktPmdsb2JhbE9iamVjdCgpOwogICAgICAgICAg
IAogICAgICAgICAvLyBlbnRlciBhIG5ldyBleGVjdXRpb24gY29udGV4dAotICAgICAgICBJbnRl
cnByZXRlciogaW50ZXJwcmV0ZXIgPSBzd2l0Y2hHbG9iYWwgPyBleGVjLT5keW5hbWljSW50ZXJw
cmV0ZXIoKS0+aW50ZXJwcmV0ZXJGb3JHbG9iYWxPYmplY3QodGhpc09iaikgOiBleGVjLT5keW5h
bWljSW50ZXJwcmV0ZXIoKTsKKyAgICAgICAgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyID0gc3dp
dGNoR2xvYmFsID8gc3RhdGljX2Nhc3Q8SlNHbG9iYWxPYmplY3QqPih0aGlzT2JqKS0+aW50ZXJw
cmV0ZXIoKSA6IGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigpOwogICAgICAgICBKU09iamVjdCog
dGhpc1ZhbCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oZXhlYy0+Y29udGV4dCgpLT50aGlzVmFs
dWUoKSk7CiAgICAgICAgIENvbnRleHQgY3R4KGludGVycHJldGVyLT5nbG9iYWxPYmplY3QoKSwK
ICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIsCkluZGV4OiBKYXZhU2NyaXB0Q29y
ZS9ranMvaW50ZXJwcmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9p
bnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2lu
dGVycHJldGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzksOCArNzksOCBAQCBzdGF0aWMgaW5s
aW5lIEludGVycHJldGVyTWFwICZpbnRlcnByZXRlCiAgICAgc3RhdGljIEludGVycHJldGVyTWFw
KiBtYXAgPSBuZXcgSW50ZXJwcmV0ZXJNYXA7CiAgICAgcmV0dXJuKiBtYXA7CiB9Ci0gICAgCi1J
bnRlcnByZXRlcjo6SW50ZXJwcmV0ZXIoSlNPYmplY3QqIGdsb2JhbE9iamVjdCkKKworSW50ZXJw
cmV0ZXI6OkludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QpCiAgICAgOiBt
X2dsb2JhbEV4ZWModGhpcywgMCkKICAgICAsIG1fZ2xvYmFsT2JqZWN0KGdsb2JhbE9iamVjdCkK
IHsKQEAgLTg5LDcgKzg5LDcgQEAgSW50ZXJwcmV0ZXI6OkludGVycHJldGVyKEpTT2JqZWN0KiBn
bG9iYQogCiBJbnRlcnByZXRlcjo6SW50ZXJwcmV0ZXIoKQogICAgIDogbV9nbG9iYWxFeGVjKHRo
aXMsIDApCi0gICAgLCBtX2dsb2JhbE9iamVjdChuZXcgSlNPYmplY3QoKSkKKyAgICAsIG1fZ2xv
YmFsT2JqZWN0KG5ldyBKU0dsb2JhbE9iamVjdCgpKQogewogICAgIGluaXQoKTsKIH0KQEAgLTEx
OCw3ICsxMTgsNiBAQCB2b2lkIEludGVycHJldGVyOjppbml0KCkKICAgICAgICAgLy8gVGhpcyBp
cyB0aGUgZmlyc3QgaW50ZXJwcmV0ZXIKICAgICAgICAgc19ob29rID0gbmV4dCA9IHByZXYgPSB0
aGlzOwogICAgIH0KLSAgICBpbnRlcnByZXRlck1hcCgpLnNldChtX2dsb2JhbE9iamVjdCwgdGhp
cyk7CiAKICAgICBpbml0R2xvYmFsT2JqZWN0KCk7CiB9CkBAIC0xMzcsMTkgKzEzNiwyMCBAQCBJ
bnRlcnByZXRlcjo6fkludGVycHJldGVyKCkKICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3Qg
aW50ZXJwcmV0ZXIKICAgICAgICAgc19ob29rID0gMDsKICAgICB9Ci0gICAgaW50ZXJwcmV0ZXJN
YXAoKS5yZW1vdmUobV9nbG9iYWxPYmplY3QpOwogfQogCi1KU09iamVjdCogSW50ZXJwcmV0ZXI6
Omdsb2JhbE9iamVjdCgpIGNvbnN0CitKU0dsb2JhbE9iamVjdCogSW50ZXJwcmV0ZXI6Omdsb2Jh
bE9iamVjdCgpIGNvbnN0CiB7Ci0gIHJldHVybiBtX2dsb2JhbE9iamVjdDsKKyAgICByZXR1cm4g
bV9nbG9iYWxPYmplY3Q7CiB9CiAKIHZvaWQgSW50ZXJwcmV0ZXI6OmluaXRHbG9iYWxPYmplY3Qo
KQogeworICAgIG1fZ2xvYmFsT2JqZWN0LT5zZXRJbnRlcnByZXRlcih0aGlzKTsKKwogICAgIC8v
IENsZWFyIGJlZm9yZSBpbml0aXRhbGl6aW5nLCB0byBhdm9pZCBtYXJraW5nIHVuaW5pdGlhbGl6
ZWQgKGRhbmdlcm91cykgb3IgCiAgICAgLy8gc3RhbGUgKHdhc3RlZnVsKSBwb2ludGVycyBkdXJp
bmcgaW5pdGlhbGl6YXRpb24uCi0KKyAgICAKICAgICAvLyBQcm90b3R5cGVzCiAgICAgbV9GdW5j
dGlvblByb3RvdHlwZSA9IDA7CiAgICAgbV9PYmplY3RQcm90b3R5cGUgPSAwOwpAQCAtMzQ3LDcg
KzM0Nyw3IEBAIENvbXBsZXRpb24gSW50ZXJwcmV0ZXI6OmV2YWx1YXRlKGNvbnN0IFUKICAgICAK
ICAgICBtX3JlY3Vyc2lvbisrOwogICAgIAotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmogPSBtX2ds
b2JhbE9iamVjdDsKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqID0gbV9nbG9iYWxPYmpl
Y3Q7CiAgICAgSlNPYmplY3QqIHRoaXNPYmogPSBnbG9iYWxPYmo7CiAgICAgCiAgICAgLy8gInRo
aXMiIG11c3QgYmUgYW4gb2JqZWN0Li4uIHVzZSBzYW1lIHJ1bGVzIGFzIEZ1bmN0aW9uLnByb3Rv
dHlwZS5hcHBseSgpCkBAIC02MTAsMTEgKzYxMCw2IEBAIHZvaWQgSW50ZXJwcmV0ZXI6Om1hcmso
KQogICAgICAgICBtX1VyaUVycm9yUHJvdG90eXBlLT5tYXJrKCk7CiB9CiAKLUludGVycHJldGVy
KiBJbnRlcnByZXRlcjo6aW50ZXJwcmV0ZXJXaXRoR2xvYmFsT2JqZWN0KEpTT2JqZWN0KiBnbG9i
YWxPYmplY3QpCi17Ci0gICAgcmV0dXJuIGludGVycHJldGVyTWFwKCkuZ2V0KGdsb2JhbE9iamVj
dCk7Ci19Ci0KICNpZmRlZiBLSlNfREVCVUdfTUVNCiAjaW5jbHVkZSAibGV4ZXIuaCIKIHZvaWQg
SW50ZXJwcmV0ZXI6OmZpbmFsQ2hlY2soKQpJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL2ludGVy
cHJldGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2ludGVycHJldGVyLmgJ
KHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2ludGVycHJldGVyLmgJKHdv
cmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAgbmFtZXNwYWNlIEtKUyB7CiAgIGNsYXNzIEV2
YWxFcnJvclByb3RvdHlwZTsKICAgY2xhc3MgRnVuY3Rpb25PYmplY3RJbXA7CiAgIGNsYXNzIEZ1
bmN0aW9uUHJvdG90eXBlOworICBjbGFzcyBKU0dsb2JhbE9iamVjdDsKICAgY2xhc3MgTmF0aXZl
RXJyb3JJbXA7CiAgIGNsYXNzIE5hdGl2ZUVycm9yUHJvdG90eXBlOwogICBjbGFzcyBOdW1iZXJP
YmplY3RJbXA7CkBAIC05NCw3ICs5NSw3IEBAIG5hbWVzcGFjZSBLSlMgewogICAgICAqCiAgICAg
ICogQHBhcmFtIGdsb2JhbCBUaGUgb2JqZWN0IHRvIHVzZSBhcyB0aGUgZ2xvYmFsIG9iamVjdCBm
b3IgdGhpcyBpbnRlcnByZXRlcgogICAgICAqLwotICAgIEludGVycHJldGVyKEpTT2JqZWN0KiBn
bG9iYWxPYmplY3QpOworICAgIEludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0Kik7CiAgICAgLyoq
CiAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnRlcnByZXRlci4gQSBnbG9iYWwgb2JqZWN0IHdpbGwg
YmUgY3JlYXRlZCBhbmQKICAgICAgKiBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFuZGFyZCBnbG9i
YWwgcHJvcGVydGllcy4KQEAgLTExMSw3ICsxMTIsNyBAQCBuYW1lc3BhY2UgS0pTIHsKICAgICAg
KiBSZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBpcyB1c2VkIGFzIHRoZSBnbG9iYWwgb2JqZWN0IGR1
cmluZyBhbGwgc2NyaXB0CiAgICAgICogZXhlY3V0aW9uIHBlcmZvcm1lZCBieSB0aGlzIGludGVy
cHJldGVyCiAgICAgICovCi0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCgpIGNvbnN0OworICAg
IEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QoKSBjb25zdDsKIAogICAgIC8qKgogICAgICAq
IFJldHVybnMgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8g
ZXhlY3V0ZQpAQCAtMzAwLDI0ICszMDEsNiBAQCBuYW1lc3BhY2UgS0pTIHsKIAogICAgIHZvaWQg
c2F2ZUJ1aWx0aW5zIChTYXZlZEJ1aWx0aW5zJikgY29uc3Q7CiAgICAgdm9pZCByZXN0b3JlQnVp
bHRpbnMgKGNvbnN0IFNhdmVkQnVpbHRpbnMmKTsKLQotICAgIC8qKgotICAgICAqIERldGVybWlu
ZSBpZiB0aGUgdmFsdWUgaXMgYSBnbG9iYWwgb2JqZWN0IChmb3IgYW55IGludGVycHJldGVyKS4g
IFRoaXMgbWF5Ci0gICAgICogYmUgZGlmZmljdWx0IHRvIGRldGVybWluZSBmb3IgbXVsdGlwbGUg
dXNlcyBvZiBKU0MgaW4gYSBwcm9jZXNzIHRoYXQgYXJlCi0gICAgICogbG9naWNhbGx5IGluZGVw
ZW5kZW50IG9mIGVhY2ggb3RoZXIuICBJbiB0aGUgY2FzZSBvZiBXZWJDb3JlLCB0aGlzIG1ldGhv
ZAotICAgICAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyB0aGUgV2luZG93
IG9iamVjdCBzbyB3ZSBjYW4gcGVyZm9ybQotICAgICAqIHNlY3VyaXR5IGNoZWNrcy4KLSAgICAg
Ki8KLSAgICB2aXJ0dWFsIGJvb2wgaXNHbG9iYWxPYmplY3QoSlNWYWx1ZSopIHsgcmV0dXJuIGZh
bHNlOyB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIEZpbmQgdGhlIGludGVycHJldGVyIGZvciBh
IHBhcnRpY3VsYXIgZ2xvYmFsIG9iamVjdC4gIFRoaXMgc2hvdWxkIHJlYWxseQotICAgICAqIGJl
IGEgc3RhdGljIG1ldGhvZCwgYnV0IHdlIGNhbid0IGRvIHRoYXQgaXMgQysrLiAgQWdhaW4sIGFz
IHdpdGggaXNHbG9iYWxPYmplY3QoKQotICAgICAqIGltcGxlbWVudGF0aW9uIHJlYWxseSBuZWVk
IHRvIGtub3cgYWJvdXQgYWxsIGluc3RhbmNlcyBvZiBJbnRlcnByZXRlcgotICAgICAqIGNyZWF0
ZWQgaW4gYW4gYXBwbGljYXRpb24gdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGlzIG1ldGhvZC4g
IFRoZSBvbmx5Ci0gICAgICogb3ZlcnJpZGUgb2YgdGhpcyBtZXRob2QgaXMgY3VycmVudGx5IGlu
IFdlYkNvcmUuCi0gICAgICovCi0gICAgdmlydHVhbCBJbnRlcnByZXRlciogaW50ZXJwcmV0ZXJG
b3JHbG9iYWxPYmplY3QoY29uc3QgSlNWYWx1ZSopIHsgcmV0dXJuIDA7IH0KICAgICAKICAgICAv
KioKICAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGl0IGlzICdzYWZlJyB0byBleGVjdXRlIGNvZGUg
aW4gdGhlIHRhcmdldCBpbnRlcnByZXRlciBmcm9tIGFuCkBAIC0zMzcsOSArMzIwLDcgQEAgbmFt
ZXNwYWNlIEtKUyB7CiAgICAgCiAgICAgdm9pZCBzZXRDb250ZXh0KENvbnRleHQqIGMpIHsgbV9j
b250ZXh0ID0gYzsgfQogICAgIENvbnRleHQqIGNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2Nv
bnRleHQ7IH0KLSAgICAKLSAgICBzdGF0aWMgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyV2l0aEds
b2JhbE9iamVjdChKU09iamVjdCopOwotICAgIAorICAgICAgICAKICAgICB2b2lkIHNldFRpbWVv
dXRUaW1lKHVuc2lnbmVkIHRpbWVvdXRUaW1lKSB7IG1fdGltZW91dFRpbWUgPSB0aW1lb3V0VGlt
ZTsgfQogCiAgICAgdm9pZCBzdGFydFRpbWVvdXRDaGVjaygpOwpAQCAtMzg4LDcgKzM2OSw3IEBA
IHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV90aWNrQ291bnQ7CiAgICAgdW5zaWduZWQgbV90aWNr
c1VudGlsTmV4dFRpbWVvdXRDaGVjazsKIAotICAgIEpTT2JqZWN0KiBtX2dsb2JhbE9iamVjdDsK
KyAgICBKU0dsb2JhbE9iamVjdCogbV9nbG9iYWxPYmplY3Q7CiAKICAgICBPYmplY3RPYmplY3RJ
bXAqIG1fT2JqZWN0OwogICAgIEZ1bmN0aW9uT2JqZWN0SW1wKiBtX0Z1bmN0aW9uOwpJbmRleDog
SmF2YVNjcmlwdENvcmUva2pzL2xvb2t1cC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L2tqcy9sb29rdXAuaAkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvbG9v
a3VwLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDEyICsxOSwxMyBAQAogICoKICAqLwogCi0jaWZu
ZGVmIF9LSlNMT09LVVBfSF8KLSNkZWZpbmUgX0tKU0xPT0tVUF9IXworI2lmbmRlZiBLSlNfbG9v
a3VwX2gKKyNkZWZpbmUgS0pTX2xvb2t1cF9oCiAKICNpbmNsdWRlICJjb250ZXh0LmgiCiAjaW5j
bHVkZSAiaWRlbnRpZmllci5oIgogI2luY2x1ZGUgImludGVycHJldGVyLmgiCisjaW5jbHVkZSAi
SlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJvYmplY3QuaCIKICNpbmNsdWRlIDxzdGRpby5o
PgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CkBAIC0yNjksNyArMjcwLDcgQEAgbmFtZXNw
YWNlIEtKUyB7CiAgIHRlbXBsYXRlIDxjbGFzcyBDbGFzc0N0b3I+CiAgIGlubGluZSBKU09iamVj
dCogY2FjaGVHbG9iYWxPYmplY3QoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBw
cm9wZXJ0eU5hbWUpCiAgIHsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gc3RhdGljX2Nh
c3Q8SlNPYmplY3QqPihleGVjLT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCkp
OworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsSW50ZXJw
cmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCk7CiAgICAgSlNWYWx1ZSogb2JqID0gZ2xvYmFsT2JqZWN0
LT5nZXREaXJlY3QocHJvcGVydHlOYW1lKTsKICAgICBpZiAob2JqKSB7CiAgICAgICBBU1NFUlQo
b2JqLT5pc09iamVjdCgpKTsKQEAgLTM1MSw0ICszNTIsNCBAQCBuYW1lc3BhY2UgS0pTIHsKICAg
ICBpbnQgaWQ7IFwKICAgfTsKIAotI2VuZGlmCisjZW5kaWYgLy8gS0pTX2xvb2t1cF9oCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS9ranMvb2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUva2pzL29iamVjdC5oCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9v
YmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtNDU3LDYgKzQ1Nyw3IEBAIG5hbWVzcGFjZSBLSlMg
ewogICAgIHZvaWQgcmVzdG9yZVByb3BlcnRpZXMoY29uc3QgU2F2ZWRQcm9wZXJ0aWVzICZwKSB7
IF9wcm9wLnJlc3RvcmUocCk7IH0KIAogICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2YXRpb24oKSB7
IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0dsb2JhbE9iamVjdCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CiAgIHByb3RlY3RlZDoKICAgICBQcm9wZXJ0eU1hcCBfcHJvcDsK
ICAgcHJpdmF0ZToKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy90ZXN0a2pzLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvdGVzdGtqcy5jcHAJKHJldmlzaW9uIDI3MDA3KQor
KysgSmF2YVNjcmlwdENvcmUva2pzL3Rlc3RranMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2
ICsyNiw3IEBACiAjaW5jbHVkZSAiSlNMb2NrLmgiCiAjaW5jbHVkZSAiUGFyc2VyLmgiCiAjaW5j
bHVkZSAiY29sbGVjdG9yLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRl
ICJvYmplY3QuaCIKICNpbmNsdWRlICJwcm90ZWN0LmgiCiAjaW5jbHVkZSA8bWF0aC5oPgpAQCAt
MTEwLDcgKzExMSw3IEBAIGxvbmcgU3RvcFdhdGNoOjpnZXRFbGFwc2VkTVMoKQogI2VuZGlmCiB9
CiAKLWNsYXNzIEdsb2JhbEltcCA6IHB1YmxpYyBKU09iamVjdCB7CitjbGFzcyBHbG9iYWxJbXAg
OiBwdWJsaWMgSlNHbG9iYWxPYmplY3QgewogcHVibGljOgogICB2aXJ0dWFsIFVTdHJpbmcgY2xh
c3NOYW1lKCkgY29uc3QgeyByZXR1cm4gImdsb2JhbCI7IH0KIH07CkluZGV4OiBXZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjcwMDcpCisrKyBXZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAt
MTM2MTMsNyArMTM2MTMsNiBAQAogCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVj
dCBvYmplY3QgKi8gPSB7CiAJCQlpc2EgPSBQQlhQcm9qZWN0OwogCQkJYnVpbGRDb25maWd1cmF0
aW9uTGlzdCA9IDE0OUMyODQzMDg5MDJCMTEwMDhBOUVGQyAvKiBCdWlsZCBjb25maWd1cmF0aW9u
IGxpc3QgZm9yIFBCWFByb2plY3QgIldlYkNvcmUiICovOwotCQkJY29tcGF0aWJpbGl0eVZlcnNp
b24gPSAiWGNvZGUgMi40IjsKIAkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOwogCQkJa25v
d25SZWdpb25zID0gKAogCQkJCUVuZ2xpc2gsCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL2tq
c19iaW5kaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5k
aW5nLmNwcAkocmV2aXNpb24gMjcwMDcpCisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5k
aW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTMwLDcgKzEzMCw3IEBAIHN0YXRpYyBOb2RlUGVy
RG9jTWFwJiBkb21Ob2Rlc1BlckRvY3VtZW4KICAgICByZXR1cm4gc3RhdGljRE9NTm9kZXNQZXJE
b2N1bWVudDsKIH0KIAotU2NyaXB0SW50ZXJwcmV0ZXI6OlNjcmlwdEludGVycHJldGVyKEpTT2Jq
ZWN0KiBnbG9iYWwsIEZyYW1lKiBmcmFtZSkKK1NjcmlwdEludGVycHJldGVyOjpTY3JpcHRJbnRl
cnByZXRlcihKU0dsb2JhbE9iamVjdCogZ2xvYmFsLCBGcmFtZSogZnJhbWUpCiAgICAgOiBJbnRl
cnByZXRlcihnbG9iYWwpCiAgICAgLCBtX2ZyYW1lKGZyYW1lKQogICAgICwgbV9jdXJyZW50RXZl
bnQoMCkKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvanMva2pzX2JpbmRpbmcuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5kaW5nLmgJKHJldmlzaW9uIDI3MDA3KQor
KysgV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfYmluZGluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC01
MCw3ICs1MCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIG5hbWVzcGFjZSBLSlMgewogCiAgICAg
LyoqCi0gICAgICogQmFzZSBjbGFzcyBmb3IgYWxsIG9iamVjdHMgaW4gdGhpcyBiaW5kaW5nLgor
ICAgICAqIEJhc2UgY2xhc3MgZm9yIGFsbCBvYmplY3RzIGluIHRoaXMgYmluZGluZyBFWENFUFQg
V2luZG93CiAgICAgICovCiAgICAgY2xhc3MgRE9NT2JqZWN0IDogcHVibGljIEpTT2JqZWN0IHsK
ICAgICBwcm90ZWN0ZWQ6CkBAIC03Miw3ICs3Miw3IEBAIG5hbWVzcGFjZSBLSlMgewogICAgICAq
LwogICAgIGNsYXNzIFNjcmlwdEludGVycHJldGVyIDogcHVibGljIEludGVycHJldGVyIHsKICAg
ICBwdWJsaWM6Ci0gICAgICAgIFNjcmlwdEludGVycHJldGVyKEpTT2JqZWN0KiBnbG9iYWwsIFdl
YkNvcmU6OkZyYW1lKik7CisgICAgICAgIFNjcmlwdEludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0
KiwgV2ViQ29yZTo6RnJhbWUqKTsKIAogICAgICAgICBzdGF0aWMgRE9NT2JqZWN0KiBnZXRET01P
YmplY3Qodm9pZCogb2JqZWN0SGFuZGxlKTsKICAgICAgICAgc3RhdGljIHZvaWQgcHV0RE9NT2Jq
ZWN0KHZvaWQqIG9iamVjdEhhbmRsZSwgRE9NT2JqZWN0Kik7CkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL2pzL2tqc19wcm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9r
anNfcHJveHkuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIFdlYkNvcmUvYmluZGluZ3MvanMva2pz
X3Byb3h5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTUxLDcgKzE1MSw3IEBAIHZvaWQgS0pTUHJv
eHk6OmluaXRTY3JpcHRJZk5lZWRlZCgpCiAKICAgLy8gQnVpbGQgdGhlIGdsb2JhbCBvYmplY3Qg
LSB3aGljaCBpcyBhIFdpbmRvdyBpbnN0YW5jZQogICBKU0xvY2sgbG9jazsKLSAgSlNPYmplY3Qq
IGdsb2JhbE9iamVjdCA9IG5ldyBKU0RPTVdpbmRvdyhtX2ZyYW1lLT5kb21XaW5kb3coKSk7Cisg
IEpTRE9NV2luZG93KiBnbG9iYWxPYmplY3QgPSBuZXcgSlNET01XaW5kb3cobV9mcmFtZS0+ZG9t
V2luZG93KCkpOwogCiAgIC8vIENyZWF0ZSBhIEtKUyBpbnRlcnByZXRlciBmb3IgdGhpcyBmcmFt
ZQogICBtX3NjcmlwdCA9IG5ldyBTY3JpcHRJbnRlcnByZXRlcihnbG9iYWxPYmplY3QsIG1fZnJh
bWUpOwpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc193aW5kb3cuY3BwCShyZXZpc2lvbiAyNzAwNykK
KysrIFdlYkNvcmUvYmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIxNCw2ICsyMTQsOSBAQCBXaW5kb3c6OldpbmRvdyhET01XaW5kb3cqIHdpbmRvdykKICAgOiBt
X2ltcGwod2luZG93KQogICAsIGQobmV3IFdpbmRvd1ByaXZhdGUpCiB7CisgICAgLy8gV2luZG93
IGRlc3RydWN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZSBiZWNhdXNlIG9mCisgICAgLy8gdGhlIG5v
bi10aHJlYWQtc2FmZSBXZWJDb3JlIHN0cnVjdHVyZXMgaXQgcmVmZXJlbmNlcy4KKyAgICBDb2xs
ZWN0b3I6OmNvbGxlY3RPbk1haW5UaHJlYWRPbmx5KHRoaXMpOwogfQogCiBXaW5kb3c6On5XaW5k
b3coKQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmgJKHJldmlzaW9uIDI3MDA3KQorKysg
V2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmgJKHdvcmtpbmcgY29weSkKQEAgLTY1LDcg
KzY1LDggQEAgbmFtZXNwYWNlIEtKUyB7CiAKICAgY2xhc3MgV2luZG93UHJpdmF0ZTsKIAotICBj
bGFzcyBXaW5kb3cgOiBwdWJsaWMgRE9NT2JqZWN0IHsKKyAgLy8gVGhpcyBpcyB0aGUgb25seSBX
ZWJDb3JlIEpTIGJpbmRpbmcgd2hpY2ggZG9lcyBub3QgaW5oZXJpdCBmcm9tIERPTU5vZGUKKyAg
Y2xhc3MgV2luZG93IDogcHVibGljIEpTR2xvYmFsT2JqZWN0IHsKICAgICBmcmllbmQgY2xhc3Mg
TG9jYXRpb247CiAgICAgZnJpZW5kIGNsYXNzIFdpbmRvd0Z1bmM7CiAgICAgZnJpZW5kIGNsYXNz
IFNjaGVkdWxlZEFjdGlvbjsKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mvb2JqYy9XZWJTY3JpcHRP
YmplY3QubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9vYmpjL1dlYlNjcmlwdE9i
amVjdC5tbQkocmV2aXNpb24gMjcwMDcpCisrKyBXZWJDb3JlL2JpbmRpbmdzL29iamMvV2ViU2Ny
aXB0T2JqZWN0Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW1wb3J0IDxK
YXZhU2NyaXB0Q29yZS9vYmpjX2luc3RhbmNlLmg+CiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9y
dW50aW1lX29iamVjdC5oPgogI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvQVBJQ2FzdC5oPgorI2lt
cG9ydCA8SmF2YVNjcmlwdENvcmUvSlNHbG9iYWxPYmplY3QuaD4KIAogdXNpbmcgbmFtZXNwYWNl
IEtKUzsKIHVzaW5nIG5hbWVzcGFjZSBLSlM6OkJpbmRpbmdzOwpAQCAtMTE1LDcgKzExNiw3IEBA
IHN0YXRpYyB2b2lkIF9kaWRFeGVjdXRlKFdlYlNjcmlwdE9iamVjdCAKICAgICBFeGVjU3RhdGUq
IGV4ZWMgPSByb290LT5pbnRlcnByZXRlcigpLT5nbG9iYWxFeGVjKCk7CiAgICAgS0pTRGlkRXhl
Y3V0ZUZ1bmN0aW9uUHRyIGZ1bmMgPSBJbnN0YW5jZTo6ZGlkRXhlY3V0ZUZ1bmN0aW9uKCk7CiAg
ICAgaWYgKGZ1bmMpCi0gICAgICAgIGZ1bmMoZXhlYywgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihy
b290LT5pbnRlcnByZXRlcigpLT5nbG9iYWxPYmplY3QoKSkpOworICAgICAgICBmdW5jKGV4ZWMs
IHJvb3QtPmludGVycHJldGVyKCktPmdsb2JhbE9iamVjdCgpKTsKIH0KIAogLSAodm9pZClfc2V0
SW1wOihKU09iamVjdCopaW1wIG9yaWdpblJvb3RPYmplY3Q6KFBhc3NSZWZQdHI8Um9vdE9iamVj
dD4pb3JpZ2luUm9vdE9iamVjdCByb290T2JqZWN0OihQYXNzUmVmUHRyPFJvb3RPYmplY3Q+KXJv
b3RPYmplY3QKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL21hYy9XZWJDb3JlU2NyaXB0RGVidWdnZXIu
bW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2UvbWFjL1dlYkNvcmVTY3JpcHREZWJ1Z2dl
ci5tbQkocmV2aXNpb24gMjcwMDcpCisrKyBXZWJDb3JlL2JyaWRnZS9tYWMvV2ViQ29yZVNjcmlw
dERlYnVnZ2VyLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW1wb3J0ICJX
ZWJTY3JpcHRPYmplY3RQcml2YXRlLmgiCiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9jb250ZXh0
Lmg+CiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9kZWJ1Z2dlci5oPgorI2ltcG9ydCA8SmF2YVNj
cmlwdENvcmUvSlNHbG9iYWxPYmplY3QuaD4KIAogdXNpbmcgbmFtZXNwYWNlIEtKUzsKIHVzaW5n
IG5hbWVzcGFjZSBXZWJDb3JlOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>16853</attachid>
            <date>2007-10-24 22:45:25 -0700</date>
            <delta_ts>2007-10-24 23:19:41 -0700</delta_ts>
            <desc>full patch, 0.5% speedup on SunSpider</desc>
            <filename>globalobj.patch</filename>
            <type>text/plain</type>
            <size>96212</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3MDIwKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsODggQEAKKzIwMDctMTAtMjQgIEVyaWMgU2Vp
ZGVsICA8ZXJpY0B3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorICAgICAgICAKKyAgICAgICAgQWRkIGEgSlNHbG9iYWxPYmplY3QgY2xhc3MgYW5kIHJl
bW92ZSB0aGUgSW50ZXJwcmV0ZXJNYXAKKyAgICAgICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTU2ODEKKyAgICAgICAgCisgICAgICAgIFRoaXMgcmVxdWlyZWQgbWFr
aW5nIEpTQ2FsbGJhY2tPYmplY3QgYSB0ZW1wbGF0ZSBjbGFzcyB0byBhbGxvdyBmb3IKKyAgICAg
ICAgSlNHbG9iYWxPYmplY3RzIHdpdGggSlNDYWxsYmFja09iamVjdCBmdW5jdGlvbmFsaXR5Lgor
ICAgICAgICAKKyAgICAgICAgU3VuU3BpZGVyIGNsYWltcyB0aGlzIHdhcyBhIDAuNSUgc3BlZWR1
cC4KKworICAgICAgICAqIEFQSS9KU0NhbGxiYWNrT2JqZWN0LmNwcDoKKyAgICAgICAgKEtKUzo6
KToKKyAgICAgICAgKiBBUEkvSlNDYWxsYmFja09iamVjdC5oOgorICAgICAgICAqIEFQSS9KU0Nh
bGxiYWNrT2JqZWN0RnVuY3Rpb25zLmg6IENvcGllZCBmcm9tIEFQSS9KU0NhbGxiYWNrT2JqZWN0
LmNwcC4KKyAgICAgICAgKEtKUzo6OjpKU0NhbGxiYWNrT2JqZWN0KToKKyAgICAgICAgKEtKUzo6
Ojppbml0KToKKyAgICAgICAgKEtKUzo6Ojp+SlNDYWxsYmFja09iamVjdCk6CisgICAgICAgIChL
SlM6Ojo6aW5pdGlhbGl6ZUlmTmVlZGVkKToKKyAgICAgICAgKEtKUzo6OjpjbGFzc05hbWUpOgor
ICAgICAgICAoS0pTOjo6OmdldE93blByb3BlcnR5U2xvdCk6CisgICAgICAgIChLSlM6Ojo6cHV0
KToKKyAgICAgICAgKEtKUzo6OjpkZWxldGVQcm9wZXJ0eSk6CisgICAgICAgIChLSlM6Ojo6aW1w
bGVtZW50c0NvbnN0cnVjdCk6CisgICAgICAgIChLSlM6Ojo6Y29uc3RydWN0KToKKyAgICAgICAg
KEtKUzo6OjppbXBsZW1lbnRzSGFzSW5zdGFuY2UpOgorICAgICAgICAoS0pTOjo6Omhhc0luc3Rh
bmNlKToKKyAgICAgICAgKEtKUzo6OjppbXBsZW1lbnRzQ2FsbCk6CisgICAgICAgIChLSlM6Ojo6
Y2FsbEFzRnVuY3Rpb24pOgorICAgICAgICAoS0pTOjo6OmdldFByb3BlcnR5TmFtZXMpOgorICAg
ICAgICAoS0pTOjo6OnRvTnVtYmVyKToKKyAgICAgICAgKEtKUzo6Ojp0b1N0cmluZyk6CisgICAg
ICAgIChLSlM6Ojo6c2V0UHJpdmF0ZSk6CisgICAgICAgIChLSlM6Ojo6Z2V0UHJpdmF0ZSk6Cisg
ICAgICAgIChLSlM6Ojo6aW5oZXJpdHMpOgorICAgICAgICAoS0pTOjo6OmNhY2hlZFZhbHVlR2V0
dGVyKToKKyAgICAgICAgKEtKUzo6OjpzdGF0aWNWYWx1ZUdldHRlcik6CisgICAgICAgIChLSlM6
Ojo6c3RhdGljRnVuY3Rpb25HZXR0ZXIpOgorICAgICAgICAoS0pTOjo6OmNhbGxiYWNrR2V0dGVy
KToKKyAgICAgICAgKiBBUEkvSlNDbGFzc1JlZi5jcHA6CisgICAgICAgIChPcGFxdWVKU0NsYXNz
Ojpwcm90b3R5cGUpOgorICAgICAgICAqIEFQSS9KU0NvbnRleHRSZWYuY3BwOgorICAgICAgICAo
SlNHbG9iYWxDb250ZXh0Q3JlYXRlKToKKyAgICAgICAgKiBBUEkvSlNPYmplY3RSZWYuY3BwOgor
ICAgICAgICAoSlNPYmplY3RNYWtlKToKKyAgICAgICAgKEpTT2JqZWN0R2V0UHJpdmF0ZSk6Cisg
ICAgICAgIChKU09iamVjdFNldFByaXZhdGUpOgorICAgICAgICAqIEFQSS9KU1ZhbHVlUmVmLmNw
cDoKKyAgICAgICAgKEpTVmFsdWVJc09iamVjdE9mQ2xhc3MpOgorICAgICAgICAqIEphdmFTY3Jp
cHRDb3JlLmV4cDoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qOgorICAgICAgICAqIGJpbmRpbmdzL2MvY191dGlsaXR5LmNwcDoKKyAgICAgICAgKEtK
Uzo6QmluZGluZ3M6OmNvbnZlcnRWYWx1ZVRvTlBWYXJpYW50KToKKyAgICAgICAgKiBiaW5kaW5n
cy9qbmkvam5pX2pzb2JqZWN0LmNwcDoKKyAgICAgICAgKiBiaW5kaW5ncy9vYmpjL29iamNfdXRp
bGl0eS5tbToKKyAgICAgICAgKEtKUzo6QmluZGluZ3M6OmNvbnZlcnRWYWx1ZVRvT2JqY1ZhbHVl
KToKKyAgICAgICAgKiBranMvQ29udGV4dC5jcHA6CisgICAgICAgIChLSlM6OkNvbnRleHQ6OkNv
bnRleHQpOgorICAgICAgICAqIGtqcy9FeGVjU3RhdGUuY3BwOgorICAgICAgICAoS0pTOjpFeGVj
U3RhdGU6OmxleGljYWxJbnRlcnByZXRlcik6CisgICAgICAgICoga2pzL0pTR2xvYmFsT2JqZWN0
Lmg6IEFkZGVkLgorICAgICAgICAoS0pTOjpKU0dsb2JhbE9iamVjdDo6SlNHbG9iYWxPYmplY3Qp
OgorICAgICAgICAoS0pTOjpKU0dsb2JhbE9iamVjdDo6aXNHbG9iYWxPYmplY3QpOgorICAgICAg
ICAoS0pTOjpKU0dsb2JhbE9iamVjdDo6aW50ZXJwcmV0ZXIpOgorICAgICAgICAoS0pTOjpKU0ds
b2JhbE9iamVjdDo6c2V0SW50ZXJwcmV0ZXIpOgorICAgICAgICAqIGtqcy9hcnJheV9pbnN0YW5j
ZS5jcHA6CisgICAgICAgICoga2pzL2NvbnRleHQuaDoKKyAgICAgICAgKiBranMvZnVuY3Rpb24u
Y3BwOgorICAgICAgICAoS0pTOjpGdW5jdGlvbkltcDo6Y2FsbEFzRnVuY3Rpb24pOgorICAgICAg
ICAoS0pTOjpHbG9iYWxGdW5jSW1wOjpjYWxsQXNGdW5jdGlvbik6CisgICAgICAgICoga2pzL2lu
dGVycHJldGVyLmNwcDoKKyAgICAgICAgKEtKUzo6SW50ZXJwcmV0ZXI6OkludGVycHJldGVyKToK
KyAgICAgICAgKEtKUzo6SW50ZXJwcmV0ZXI6OmluaXQpOgorICAgICAgICAoS0pTOjpJbnRlcnBy
ZXRlcjo6fkludGVycHJldGVyKToKKyAgICAgICAgKEtKUzo6SW50ZXJwcmV0ZXI6Omdsb2JhbE9i
amVjdCk6CisgICAgICAgIChLSlM6OkludGVycHJldGVyOjppbml0R2xvYmFsT2JqZWN0KToKKyAg
ICAgICAgKEtKUzo6SW50ZXJwcmV0ZXI6OmV2YWx1YXRlKToKKyAgICAgICAgKiBranMvaW50ZXJw
cmV0ZXIuaDoKKyAgICAgICAgKiBranMvbG9va3VwLmg6CisgICAgICAgIChLSlM6OmNhY2hlR2xv
YmFsT2JqZWN0KToKKyAgICAgICAgKiBranMvb2JqZWN0Lmg6CisgICAgICAgIChLSlM6OkpTT2Jq
ZWN0Ojppc0dsb2JhbE9iamVjdCk6CisgICAgICAgICoga2pzL3Rlc3RranMuY3BwOgorCiAyMDA3
LTEwLTI0ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBCdWlsZCBm
aXggZm9yIEd0aywgbm8gcmV2aWV3LgpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENv
cmUuZXhwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAko
cmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAJKHdv
cmtpbmcgY29weSkKQEAgLTEyMiw5ICsxMjIsOSBAQCBfX1pOM0tKUzExSW50ZXJwcmV0ZXI0bWFy
a0V2CiBfX1pOM0tKUzExSW50ZXJwcmV0ZXI2c19ob29rRQogX19aTjNLSlMxMUludGVycHJldGVy
OGV2YWx1YXRlRVJLTlNfN1VTdHJpbmdFaVBLTlNfNVVDaGFyRWlQTlNfN0pTVmFsdWVFCiBfX1pO
M0tKUzExSW50ZXJwcmV0ZXI4ZXZhbHVhdGVFUktOU183VVN0cmluZ0VpUzNfUE5TXzdKU1ZhbHVl
RQotX19aTjNLSlMxMUludGVycHJldGVyQzFFUE5TXzhKU09iamVjdEUKK19fWk4zS0pTMTFJbnRl
cnByZXRlckMxRVBOU18xNEpTR2xvYmFsT2JqZWN0RQorX19aTjNLSlMxMUludGVycHJldGVyQzJF
UE5TXzE0SlNHbG9iYWxPYmplY3RFCiBfX1pOM0tKUzExSW50ZXJwcmV0ZXJDMUV2Ci1fX1pOM0tK
UzExSW50ZXJwcmV0ZXJDMkVQTlNfOEpTT2JqZWN0RQogX19aTjNLSlMxMUludGVycHJldGVyRDFF
dgogX19aTjNLSlMxMUludGVycHJldGVyRDJFdgogX19aTjNLSlMxMUpTSW1tZWRpYXRlNHR5cGVF
UEtOU183SlNWYWx1ZUUKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdC5j
cHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tPYmpl
Y3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLy8gLSotIG1vZGU6IGMrKzsg
Yy1iYXNpYy1vZmZzZXQ6IDQgLSotCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENv
bXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3
IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtpdC5vcmc+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTI0LDQ1MCArMjUsMTIgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAogICovCiAKLSNpbmNs
dWRlIDx3dGYvUGxhdGZvcm0uaD4KICNpbmNsdWRlICJKU0NhbGxiYWNrT2JqZWN0LmgiCiAKLSNp
bmNsdWRlICJBUElDYXN0LmgiCi0jaW5jbHVkZSAiSlNDYWxsYmFja0Z1bmN0aW9uLmgiCi0jaW5j
bHVkZSAiSlNDbGFzc1JlZi5oIgotI2luY2x1ZGUgIkpTT2JqZWN0UmVmLmgiCi0jaW5jbHVkZSAi
SlNTdHJpbmdSZWYuaCIKLSNpbmNsdWRlICJQcm9wZXJ0eU5hbWVBcnJheS5oIgotI2luY2x1ZGUg
ImludGVybmFsLmgiCi0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotCiBuYW1lc3BhY2UgS0pTIHsK
IAotY29uc3QgQ2xhc3NJbmZvIEpTQ2FsbGJhY2tPYmplY3Q6OmluZm8gPSB7ICJDYWxsYmFja09i
amVjdCIsIDAsIDAsIDAgfTsKLQotSlNDYWxsYmFja09iamVjdDo6SlNDYWxsYmFja09iamVjdChF
eGVjU3RhdGUqIGV4ZWMsIEpTQ2xhc3NSZWYganNDbGFzcywgSlNWYWx1ZSogcHJvdG90eXBlLCB2
b2lkKiBkYXRhKQotICAgIDogSlNPYmplY3QocHJvdG90eXBlKQotICAgICwgbV9jbGFzcygwKQot
ICAgICwgbV9pc0luaXRpYWxpemVkKGZhbHNlKQotewotICAgIGluaXQoZXhlYywganNDbGFzcywg
ZGF0YSk7Ci19Ci0KLXZvaWQgSlNDYWxsYmFja09iamVjdDo6aW5pdChFeGVjU3RhdGUqIGV4ZWMs
IEpTQ2xhc3NSZWYganNDbGFzcywgdm9pZCogZGF0YSkKLXsKLSAgICBtX3ByaXZhdGVEYXRhID0g
ZGF0YTsKLSAgICBKU0NsYXNzUmVmIG9sZENsYXNzID0gbV9jbGFzczsKLSAgICBtX2NsYXNzID0g
SlNDbGFzc1JldGFpbihqc0NsYXNzKTsKLSAgICBpZiAob2xkQ2xhc3MpCi0gICAgICAgIEpTQ2xh
c3NSZWxlYXNlKG9sZENsYXNzKTsKLQotICAgIGlmICghZXhlYykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgVmVjdG9yPEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrLCAxNj4gaW5pdFJvdXRpbmVz
OwotICAgIGRvIHsKLSAgICAgICAgaWYgKEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrIGluaXRp
YWxpemUgPSBqc0NsYXNzLT5pbml0aWFsaXplKQotICAgICAgICAgICAgaW5pdFJvdXRpbmVzLmFw
cGVuZChpbml0aWFsaXplKTsKLSAgICB9IHdoaWxlICgoanNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVu
dENsYXNzKSk7Ci0gICAgCi0gICAgLy8gaW5pdGlhbGl6ZSBmcm9tIGJhc2UgdG8gZGVyaXZlZAot
ICAgIGZvciAoaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGluaXRSb3V0aW5lcy5zaXplKCkpIC0g
MTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExv
Y2tzOwotICAgICAgICBKU09iamVjdEluaXRpYWxpemVDYWxsYmFjayBpbml0aWFsaXplID0gaW5p
dFJvdXRpbmVzW2ldOwotICAgICAgICBpbml0aWFsaXplKHRvUmVmKGV4ZWMpLCB0b1JlZih0aGlz
KSk7Ci0gICAgfQotICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLUpTQ2FsbGJhY2tP
YmplY3Q6On5KU0NhbGxiYWNrT2JqZWN0KCkKLXsKLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0g
dG9SZWYodGhpcyk7Ci0gICAgCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChK
U09iamVjdEZpbmFsaXplQ2FsbGJhY2sgZmluYWxpemUgPSBqc0NsYXNzLT5maW5hbGl6ZSkgewot
ICAgICAgICAgICAgZmluYWxpemUodGhpc1JlZik7Ci0gICAgICAgIH0KLSAgICAKLSAgICBKU0Ns
YXNzUmVsZWFzZShtX2NsYXNzKTsKLX0KLQotdm9pZCBKU0NhbGxiYWNrT2JqZWN0Ojppbml0aWFs
aXplSWZOZWVkZWQoRXhlY1N0YXRlKiBleGVjKQotewotICAgIGlmIChtX2lzSW5pdGlhbGl6ZWQp
Ci0gICAgICAgIHJldHVybjsKLSAgICBpbml0KGV4ZWMsIG1fY2xhc3MsIG1fcHJpdmF0ZURhdGEp
OwotfQotCi1VU3RyaW5nIEpTQ2FsbGJhY2tPYmplY3Q6OmNsYXNzTmFtZSgpIGNvbnN0Ci17Ci0g
ICAgaWYgKCFtX2NsYXNzLT5jbGFzc05hbWUuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBtX2Ns
YXNzLT5jbGFzc05hbWU7Ci0gICAgCi0gICAgcmV0dXJuIEpTT2JqZWN0OjpjbGFzc05hbWUoKTsK
LX0KLQotYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRl
KiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xv
dCkKLXsKLSAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7Ci0gICAgSlNPYmplY3RS
ZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJl
ZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOwotCi0gICAgZm9yIChKU0Ns
YXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFy
ZW50Q2xhc3MpIHsKLSAgICAgICAgLy8gb3B0aW9uYWwgb3B0aW1pemF0aW9uIHRvIGJ5cGFzcyBn
ZXRQcm9wZXJ0eSBpbiBjYXNlcyB3aGVuIHdlIG9ubHkgbmVlZCB0byBrbm93IGlmIHRoZSBwcm9w
ZXJ0eSBleGlzdHMKLSAgICAgICAgaWYgKEpTT2JqZWN0SGFzUHJvcGVydHlDYWxsYmFjayBoYXNQ
cm9wZXJ0eSA9IGpzQ2xhc3MtPmhhc1Byb3BlcnR5KSB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRy
b3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICBpZiAoaGFzUHJvcGVydHkoY3R4
LCB0aGlzUmVmLCBwcm9wZXJ0eU5hbWVSZWYpKSB7Ci0gICAgICAgICAgICAgICAgc2xvdC5zZXRD
dXN0b20odGhpcywgY2FsbGJhY2tHZXR0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKEpTT2JqZWN0R2V0UHJvcGVydHlD
YWxsYmFjayBnZXRQcm9wZXJ0eSA9IGpzQ2xhc3MtPmdldFByb3BlcnR5KSB7Ci0gICAgICAgICAg
ICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICBpZiAoSlNW
YWx1ZVJlZiB2YWx1ZSA9IGdldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVm
LCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkgewotICAgICAgICAgICAgICAgIC8vIGNh
Y2hlIHRoZSB2YWx1ZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbXB1dGUgaXQgYWdhaW4KLSAgICAg
ICAgICAgICAgICAvLyBGSVhNRTogVGhpcyB2aW9sYXRlcyB0aGUgUHJvcGVydHlTbG90IGRlc2ln
biBhIGxpdHRsZSBiaXQuCi0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGVpdGhlciB1c2Ug
dGhpcyBvcHRpbWl6YXRpb24gZXZlcnl3aGVyZSwgb3Igbm93aGVyZS4KLSAgICAgICAgICAgICAg
ICBzbG90LnNldEN1c3RvbShyZWludGVycHJldF9jYXN0PEpTT2JqZWN0Kj4odG9KUyh2YWx1ZSkp
LCBjYWNoZWRWYWx1ZUdldHRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGlj
VmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgewotICAg
ICAgICAgICAgaWYgKHN0YXRpY1ZhbHVlcy0+Y29udGFpbnMocHJvcGVydHlOYW1lLnVzdHJpbmco
KS5yZXAoKSkpIHsKLSAgICAgICAgICAgICAgICBzbG90LnNldEN1c3RvbSh0aGlzLCBzdGF0aWNW
YWx1ZUdldHRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNG
dW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25z
KSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGljRnVuY3Rpb25zLT5jb250YWlucyhwcm9wZXJ0eU5h
bWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRo
aXMsIHN0YXRpY0Z1bmN0aW9uR2V0dGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBKU09iamVjdDo6
Z2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwgc2xvdCk7Ci19Ci0KLWJvb2wg
SlNDYWxsYmFja09iamVjdDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgdW5z
aWduZWQgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgcmV0dXJuIGdl
dE93blByb3BlcnR5U2xvdChleGVjLCBJZGVudGlmaWVyOjpmcm9tKHByb3BlcnR5TmFtZSksIHNs
b3QpOwotfQotCi12b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OnB1dChFeGVjU3RhdGUqIGV4ZWMsIGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSogdmFsdWUsIGludCBhdHRyKQot
ewotICAgIEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKLSAgICBKU09iamVjdFJlZiB0
aGlzUmVmID0gdG9SZWYodGhpcyk7Ci0gICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0g
dG9SZWYocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7Ci0gICAgSlNWYWx1ZVJlZiB2YWx1
ZVJlZiA9IHRvUmVmKHZhbHVlKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9j
bGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAg
IGlmIChKU09iamVjdFNldFByb3BlcnR5Q2FsbGJhY2sgc2V0UHJvcGVydHkgPSBqc0NsYXNzLT5z
ZXRQcm9wZXJ0eSkgewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExv
Y2tzOwotICAgICAgICAgICAgaWYgKHNldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVydHlO
YW1lUmVmLCB2YWx1ZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGlmIChPcGFxdWVKU0Ns
YXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFs
dWVzKSB7Ci0gICAgICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNW
YWx1ZXMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAgICAg
ICAgIGlmIChlbnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkp
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAoSlNPYmpl
Y3RTZXRQcm9wZXJ0eUNhbGxiYWNrIHNldFByb3BlcnR5ID0gZW50cnktPnNldFByb3BlcnR5KSB7
Ci0gICAgICAgICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKHNldFByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJvcGVy
dHlOYW1lUmVmLCB2YWx1ZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICAgICAgICAgIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJBdHRlbXB0
IHRvIHNldCBhIHByb3BlcnR5IHRoYXQgaXMgbm90IHNldHRhYmxlLiIpOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGlj
RnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9u
cykgewotICAgICAgICAgICAgaWYgKFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5ID0gc3RhdGlj
RnVuY3Rpb25zLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRP
bmx5KQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgcHV0RGly
ZWN0KHByb3BlcnR5TmFtZSwgdmFsdWUsIGF0dHIpOyAvLyBwdXQgYXMgb3ZlcnJpZGUgcHJvcGVy
dHkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICByZXR1cm4gSlNPYmplY3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVl
LCBhdHRyKTsKLX0KLQotdm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVj
LCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKLXsKLSAg
ICByZXR1cm4gcHV0KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSwgdmFsdWUs
IGF0dHIpOwotfQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KEV4ZWNT
dGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lKQotewotICAgIEpTQ29u
dGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9S
ZWYodGhpcyk7Ci0gICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVy
dHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7Ci0gICAgCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xh
c3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsK
LSAgICAgICAgaWYgKEpTT2JqZWN0RGVsZXRlUHJvcGVydHlDYWxsYmFjayBkZWxldGVQcm9wZXJ0
eSA9IGpzQ2xhc3MtPmRlbGV0ZVByb3BlcnR5KSB7Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BB
bGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICBpZiAoZGVsZXRlUHJvcGVydHkoY3R4
LCB0aGlzUmVmLCBwcm9wZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkp
KQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNz
LT5zdGF0aWNWYWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChTdGF0aWNWYWx1ZUVudHJ5KiBlbnRy
eSA9IHN0YXRpY1ZhbHVlcy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1
dGVEb250RGVsZXRlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAg
Ci0gICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJsZSogc3RhdGlj
RnVuY3Rpb25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7Ci0gICAgICAgICAgICBpZiAo
U3RhdGljRnVuY3Rpb25FbnRyeSogZW50cnkgPSBzdGF0aWNGdW5jdGlvbnMtPmdldChwcm9wZXJ0
eU5hbWUudXN0cmluZygpLnJlcCgpKSkgewotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+YXR0
cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEpTT2JqZWN0OjpkZWxldGVQ
cm9wZXJ0eShleGVjLCBwcm9wZXJ0eU5hbWUpOwotfQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6
OmRlbGV0ZVByb3BlcnR5KEV4ZWNTdGF0ZSogZXhlYywgdW5zaWduZWQgcHJvcGVydHlOYW1lKQot
ewotICAgIHJldHVybiBkZWxldGVQcm9wZXJ0eShleGVjLCBJZGVudGlmaWVyOjpmcm9tKHByb3Bl
cnR5TmFtZSkpOwotfQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmltcGxlbWVudHNDb25zdHJ1
Y3QoKSBjb25zdAotewotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganND
bGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoanNDbGFz
cy0+Y2FsbEFzQ29uc3RydWN0b3IpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotSlNPYmplY3QqIEpTQ2FsbGJhY2tPYmplY3Q6OmNvbnN0cnVjdChF
eGVjU3RhdGUqIGV4ZWMsIGNvbnN0IExpc3QmIGFyZ3MpCi17Ci0gICAgSlNDb250ZXh0UmVmIGV4
ZWNSZWYgPSB0b1JlZihleGVjKTsKLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhp
cyk7Ci0gICAgCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNz
OyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKLSAgICAgICAgaWYgKEpTT2JqZWN0
Q2FsbEFzQ29uc3RydWN0b3JDYWxsYmFjayBjYWxsQXNDb25zdHJ1Y3RvciA9IGpzQ2xhc3MtPmNh
bGxBc0NvbnN0cnVjdG9yKSB7Ci0gICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudCA9IHN0YXRp
Y19jYXN0PGludD4oYXJncy5zaXplKCkpOwotICAgICAgICAgICAgVmVjdG9yPEpTVmFsdWVSZWYs
IDE2PiBhcmd1bWVudHMoYXJndW1lbnRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IGFyZ3VtZW50Q291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICBhcmd1bWVudHNbaV0g
PSB0b1JlZihhcmdzW2ldKTsKLSAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BB
bGxMb2NrczsKLSAgICAgICAgICAgIHJldHVybiB0b0pTKGNhbGxBc0NvbnN0cnVjdG9yKGV4ZWNS
ZWYsIHRoaXNSZWYsIGFyZ3VtZW50Q291bnQsIGFyZ3VtZW50cy5kYXRhKCksIHRvUmVmKGV4ZWMt
PmV4Y2VwdGlvblNsb3QoKSkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBBU1NFUlQo
MCk7IC8vIGltcGxlbWVudHNDb25zdHJ1Y3Qgc2hvdWxkIHByZXZlbnQgdXMgZnJvbSByZWFjaGlu
ZyBoZXJlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgSlNDYWxsYmFja09iamVjdDo6aW1wbGVt
ZW50c0hhc0luc3RhbmNlKCkgY29uc3QKLXsKLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9
IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKLSAgICAg
ICAgaWYgKGpzQ2xhc3MtPmhhc0luc3RhbmNlKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSlNDYWxsYmFja09iamVjdDo6aGFzSW5zdGFu
Y2UoRXhlY1N0YXRlICpleGVjLCBKU1ZhbHVlICp2YWx1ZSkKLXsKLSAgICBKU0NvbnRleHRSZWYg
ZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0
aGlzKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsg
anNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoSlNPYmplY3RIYXNJ
bnN0YW5jZUNhbGxiYWNrIGhhc0luc3RhbmNlID0ganNDbGFzcy0+aGFzSW5zdGFuY2UpIHsKLSAg
ICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAg
IHJldHVybiBoYXNJbnN0YW5jZShleGVjUmVmLCB0aGlzUmVmLCB0b1JlZih2YWx1ZSksIHRvUmVm
KGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpOwotICAgICAgICB9Ci0KLSAgICBBU1NFUlQoMCk7IC8v
IGltcGxlbWVudHNIYXNJbnN0YW5jZSBzaG91bGQgcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIGhl
cmUKLSAgICByZXR1cm4gMDsKLX0KLQotCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmltcGxlbWVu
dHNDYWxsKCkgY29uc3QKLXsKLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7
IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKLSAgICAgICAgaWYgKGpz
Q2xhc3MtPmNhbGxBc0Z1bmN0aW9uKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1KU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWxsQXNG
dW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqLCBjb25zdCBMaXN0ICZh
cmdzKQotewotICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7Ci0gICAgSlNP
YmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNPYmpS
ZWYgPSB0b1JlZih0aGlzT2JqKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9j
bGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKSB7Ci0gICAgICAg
IGlmIChKU09iamVjdENhbGxBc0Z1bmN0aW9uQ2FsbGJhY2sgY2FsbEFzRnVuY3Rpb24gPSBqc0Ns
YXNzLT5jYWxsQXNGdW5jdGlvbikgewotICAgICAgICAgICAgaW50IGFyZ3VtZW50Q291bnQgPSBz
dGF0aWNfY2FzdDxpbnQ+KGFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIFZlY3RvcjxKU1ZhbHVl
UmVmLCAxNj4gYXJndW1lbnRzKGFyZ3VtZW50Q291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBhcmd1bWVudENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgYXJndW1lbnRz
W2ldID0gdG9SZWYoYXJnc1tpXSk7Ci0gICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBk
cm9wQWxsTG9ja3M7Ci0gICAgICAgICAgICByZXR1cm4gdG9KUyhjYWxsQXNGdW5jdGlvbihleGVj
UmVmLCB0aGlzUmVmLCB0aGlzT2JqUmVmLCBhcmd1bWVudENvdW50LCBhcmd1bWVudHMuZGF0YSgp
LCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBBU1NFUlQoMCk7IC8vIGltcGxlbWVudHNDYWxsIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVh
Y2hpbmcgaGVyZQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEpTQ2FsbGJhY2tPYmplY3Q6Omdl
dFByb3BlcnR5TmFtZXMoRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWVBcnJheSYgcHJvcGVy
dHlOYW1lcykKLXsKLSAgICBKU0NvbnRleHRSZWYgZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOwotICAg
IEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKLQotICAgIGZvciAoSlNDbGFzc1Jl
ZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENs
YXNzKSB7Ci0gICAgICAgIGlmIChKU09iamVjdEdldFByb3BlcnR5TmFtZXNDYWxsYmFjayBnZXRQ
cm9wZXJ0eU5hbWVzID0ganNDbGFzcy0+Z2V0UHJvcGVydHlOYW1lcykgewotICAgICAgICAgICAg
SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAgICAgICAgICAgZ2V0UHJvcGVy
dHlOYW1lcyhleGVjUmVmLCB0aGlzUmVmLCB0b1JlZigmcHJvcGVydHlOYW1lcykpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0
aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNWYWx1ZXMpIHsKLSAgICAgICAgICAgIHR5cGVkZWYg
T3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9y
OwotICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gc3RhdGljVmFsdWVzLT5lbmQoKTsKLSAgICAg
ICAgICAgIGZvciAoaXRlcmF0b3IgaXQgPSBzdGF0aWNWYWx1ZXMtPmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgewotICAgICAgICAgICAgICAgIFVTdHJpbmc6OlJlcCogbmFtZSA9IGl0LT5maXJz
dC5nZXQoKTsKLSAgICAgICAgICAgICAgICBTdGF0aWNWYWx1ZUVudHJ5KiBlbnRyeSA9IGl0LT5z
ZWNvbmQ7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5nZXRQcm9wZXJ0eSAmJiAhKGVudHJ5
LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RW51bSkpCi0gICAgICAgICAg
ICAgICAgICAgIHByb3BlcnR5TmFtZXMuYWRkKElkZW50aWZpZXIobmFtZSkpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0
aW9uc1RhYmxlKiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsK
LSAgICAgICAgICAgIHR5cGVkZWYgT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGU6
OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOwotICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gc3Rh
dGljRnVuY3Rpb25zLT5lbmQoKTsKLSAgICAgICAgICAgIGZvciAoaXRlcmF0b3IgaXQgPSBzdGF0
aWNGdW5jdGlvbnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAg
IFVTdHJpbmc6OlJlcCogbmFtZSA9IGl0LT5maXJzdC5nZXQoKTsKLSAgICAgICAgICAgICAgICBT
dGF0aWNGdW5jdGlvbkVudHJ5KiBlbnRyeSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAg
aWYgKCEoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnRFbnVtKSkK
LSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoSWRlbnRpZmllcihuYW1lKSk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBKU09iamVjdDo6Z2V0UHJv
cGVydHlOYW1lcyhleGVjLCBwcm9wZXJ0eU5hbWVzKTsKLX0KLQotZG91YmxlIEpTQ2FsbGJhY2tP
YmplY3Q6OnRvTnVtYmVyKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKLXsKLSAgICBKU0NvbnRleHRS
ZWYgY3R4ID0gdG9SZWYoZXhlYyk7Ci0gICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRo
aXMpOwotCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBq
c0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlmIChKU09iamVjdENvbnZl
cnRUb1R5cGVDYWxsYmFjayBjb252ZXJ0VG9UeXBlID0ganNDbGFzcy0+Y29udmVydFRvVHlwZSkg
ewotICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAgICAg
ICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBjb252ZXJ0VG9UeXBlKGN0eCwgdGhpc1JlZiwg
a0pTVHlwZU51bWJlciwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIHRvSlModmFsdWUpLT5nZXROdW1iZXIoKTsKLSAgICAgICAgfQotCi0gICAg
cmV0dXJuIEpTT2JqZWN0Ojp0b051bWJlcihleGVjKTsKLX0KLQotVVN0cmluZyBKU0NhbGxiYWNr
T2JqZWN0Ojp0b1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0Ci17Ci0gICAgSlNDb250ZXh0
UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0
aGlzKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsg
anNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQotICAgICAgICBpZiAoSlNPYmplY3RDb252
ZXJ0VG9UeXBlQ2FsbGJhY2sgY29udmVydFRvVHlwZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUp
IHsKLSAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAg
ICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gY29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYs
IGtKU1R5cGVTdHJpbmcsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQotICAgICAgICAg
ICAgICAgIHJldHVybiB0b0pTKHZhbHVlKS0+Z2V0U3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAg
IHJldHVybiBKU09iamVjdDo6dG9TdHJpbmcoZXhlYyk7Ci19Ci0KLXZvaWQgSlNDYWxsYmFja09i
amVjdDo6c2V0UHJpdmF0ZSh2b2lkKiBkYXRhKQotewotICAgIG1fcHJpdmF0ZURhdGEgPSBkYXRh
OwotfQotCi12b2lkKiBKU0NhbGxiYWNrT2JqZWN0OjpnZXRQcml2YXRlKCkKLXsKLSAgICByZXR1
cm4gbV9wcml2YXRlRGF0YTsKLX0KLQotYm9vbCBKU0NhbGxiYWNrT2JqZWN0Ojppbmhlcml0cyhK
U0NsYXNzUmVmIGMpIGNvbnN0Ci17Ci0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2Ns
YXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCi0gICAgICAgIGlm
IChqc0NsYXNzID09IGMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2FjaGVkVmFsdWVHZXR0ZXIo
RXhlY1N0YXRlKiwgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiwgY29uc3QgUHJvcGVydHlT
bG90JiBzbG90KQotewotICAgIEpTVmFsdWUqIHYgPSBzbG90LnNsb3RCYXNlKCk7Ci0gICAgQVNT
RVJUKHYpOwotICAgIHJldHVybiB2OwotfQotCi1KU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0Ojpz
dGF0aWNWYWx1ZUdldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRp
ZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCi17Ci0gICAgQVNT
RVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsK
LSAgICBKU0NhbGxiYWNrT2JqZWN0KiB0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09i
amVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0KLSAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9S
ZWYodGhpc09iaik7Ci0gICAgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJv
cGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7Ci0KLSAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFz
cyA9IHRoaXNPYmotPm1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRD
bGFzcykKLSAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0
aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNWYWx1ZXMpCi0gICAgICAgICAgICBpZiAoU3RhdGlj
VmFsdWVFbnRyeSogZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmlu
ZygpLnJlcCgpKSkKLSAgICAgICAgICAgICAgICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eUNhbGxi
YWNrIGdldFByb3BlcnR5ID0gZW50cnktPmdldFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAg
ICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBnZXRQcm9wZXJ0eSh0b1JlZihleGVjKSwgdGhpc1Jl
ZiwgcHJvcGVydHlOYW1lUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9
Ci0KLSAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwgIlN0YXRpYyB2
YWx1ZSBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggTlVMTCBnZXRQcm9wZXJ0eSBjYWxsYmFjay4iKTsK
LX0KLQotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6c3RhdGljRnVuY3Rpb25HZXR0ZXIoRXhl
Y1N0YXRlKiBleGVjLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwg
Y29uc3QgUHJvcGVydHlTbG90JiBzbG90KQotewotICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCkt
PmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0OjppbmZvKSk7Ci0gICAgSlNDYWxsYmFja09iamVj
dCogdGhpc09iaiA9IHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNl
KCkpOwotCi0gICAgaWYgKEpTVmFsdWUqIGNhY2hlZE9yT3ZlcnJpZGVWYWx1ZSA9IHRoaXNPYmot
PmdldERpcmVjdChwcm9wZXJ0eU5hbWUpKQotICAgICAgICByZXR1cm4gY2FjaGVkT3JPdmVycmlk
ZVZhbHVlOwotCi0gICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKLSAgICAgICAgaWYg
KE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNGdW5jdGlvbnMgPSBq
c0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChTdGF0aWNGdW5jdGlv
bkVudHJ5KiBlbnRyeSA9IHN0YXRpY0Z1bmN0aW9ucy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5n
KCkucmVwKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEpTT2JqZWN0Q2FsbEFzRnVuY3Rpb25D
YWxsYmFjayBjYWxsQXNGdW5jdGlvbiA9IGVudHJ5LT5jYWxsQXNGdW5jdGlvbikgewotICAgICAg
ICAgICAgICAgICAgICBKU09iamVjdCogbyA9IG5ldyBKU0NhbGxiYWNrRnVuY3Rpb24oZXhlYywg
Y2FsbEFzRnVuY3Rpb24sIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNP
YmotPnB1dERpcmVjdChwcm9wZXJ0eU5hbWUsIG8sIGVudHJ5LT5hdHRyaWJ1dGVzKTsKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgUmVmZXJl
bmNlRXJyb3IsICJTdGF0aWMgZnVuY3Rpb24gcHJvcGVydHkgZGVmaW5lZCB3aXRoIE5VTEwgY2Fs
bEFzRnVuY3Rpb24gY2FsbGJhY2suIik7Ci19Ci0KLUpTVmFsdWUqIEpTQ2FsbGJhY2tPYmplY3Q6
OmNhbGxiYWNrR2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBjb25zdCBJZGVudGlm
aWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKLXsKLSAgICBBU1NF
UlQoc2xvdC5zbG90QmFzZSgpLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDo6aW5mbykpOwot
ICAgIEpTQ2FsbGJhY2tPYmplY3QqIHRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2Jq
ZWN0Kj4oc2xvdC5zbG90QmFzZSgpKTsKLQotICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1Jl
Zih0aGlzT2JqKTsKLSAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9w
ZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKLQotICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNz
ID0gdGhpc09iai0+bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENs
YXNzKQotICAgICAgICBpZiAoSlNPYmplY3RHZXRQcm9wZXJ0eUNhbGxiYWNrIGdldFByb3BlcnR5
ID0ganNDbGFzcy0+Z2V0UHJvcGVydHkpIHsKLSAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExv
Y2tzIGRyb3BBbGxMb2NrczsKLSAgICAgICAgICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gZ2V0
UHJvcGVydHkodG9SZWYoZXhlYyksIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYoZXhl
Yy0+ZXhjZXB0aW9uU2xvdCgpKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRvSlModmFsdWUp
OwotICAgICAgICB9Ci0KLSAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJv
ciwgImhhc1Byb3BlcnR5IGNhbGxiYWNrIHJldHVybmVkIHRydWUgZm9yIGEgcHJvcGVydHkgdGhh
dCBkb2Vzbid0IGV4aXN0LiIpOwotfQorLy8gRGVmaW5lIHRoZSB0d28gdHlwZXMgb2YgSlNDYWxs
YmFja09iamVjdHMgd2Ugc3VwcG9ydC4KK3RlbXBsYXRlIDw+IGNvbnN0IENsYXNzSW5mbyBKU0Nh
bGxiYWNrT2JqZWN0PEpTT2JqZWN0Pjo6aW5mbyA9IHsgIkNhbGxiYWNrT2JqZWN0IiwgMCwgMCwg
MCB9OwordGVtcGxhdGUgPD4gY29uc3QgQ2xhc3NJbmZvIEpTQ2FsbGJhY2tPYmplY3Q8SlNHbG9i
YWxPYmplY3Q+OjppbmZvID0geyAiQ2FsbGJhY2tHbG9iYWxPYmplY3QiLCAwLCAwLCAwIH07CiAK
IH0gLy8gbmFtZXNwYWNlIEtKUwpJbmRleDogSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tP
YmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVj
dC5oCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2Jq
ZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvLyAtKi0gbW9kZTogYysrOyBj
LWJhc2ljLW9mZnNldDogNCAtKi0KIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
RXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwpAQCAtMzMsNyArMzQsOCBAQAogCiBuYW1lc3BhY2UgS0pTIHsKIAotY2xhc3MgSlNDYWxs
YmFja09iamVjdCA6IHB1YmxpYyBKU09iamVjdAordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitjbGFz
cyBKU0NhbGxiYWNrT2JqZWN0IDogcHVibGljIEJhc2UKIHsKIHB1YmxpYzoKICAgICBKU0NhbGxi
YWNrT2JqZWN0KEV4ZWNTdGF0ZSosIEpTQ2xhc3NSZWYsIEpTVmFsdWUqIHByb3RvdHlwZSwgdm9p
ZCogZGF0YSk7CkBAIC05Miw0ICs5NCw3IEBAIHByaXZhdGU6CiAKIH0gLy8gbmFtZXNwYWNlIEtK
UwogCisvLyBpbmNsdWRlIHRoZSBhY3R1YWwgdGVtcGxhdGUgY2xhc3MgaW1wbGVtZW50YXRpb24K
KyNpbmNsdWRlICJKU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmgiCisKICNlbmRpZiAvLyBKU0Nh
bGxiYWNrT2JqZWN0X2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0
RnVuY3Rpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tP
YmplY3RGdW5jdGlvbnMuaAkocmV2aXNpb24gMjcwMDcpCShmcm9tIEphdmFTY3JpcHRDb3JlL0FQ
SS9KU0NhbGxiYWNrT2JqZWN0LmNwcDoyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL0FQSS9KU0Nh
bGxiYWNrT2JqZWN0RnVuY3Rpb25zLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NzMgQEAK
Ky8vIC0qLSBtb2RlOiBjKys7IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLQorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVS
LCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgPHd0Zi9QbGF0Zm9ybS5oPgorI2luY2x1ZGUgIkpTQ2FsbGJhY2tPYmpl
Y3QuaCIKKworI2luY2x1ZGUgIkFQSUNhc3QuaCIKKyNpbmNsdWRlICJKU0NhbGxiYWNrRnVuY3Rp
b24uaCIKKyNpbmNsdWRlICJKU0NsYXNzUmVmLmgiCisjaW5jbHVkZSAiSlNPYmplY3RSZWYuaCIK
KyNpbmNsdWRlICJKU1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5Lmgi
CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVz
cGFjZSBLSlMgeworCitjb25zdCBDbGFzc0luZm8gSlNDYWxsYmFja09iamVjdDo6aW5mbyA9IHsg
IkNhbGxiYWNrT2JqZWN0IiwgMCwgMCwgMCB9OworCitKU0NhbGxiYWNrT2JqZWN0OjpKU0NhbGxi
YWNrT2JqZWN0KEV4ZWNTdGF0ZSogZXhlYywgSlNDbGFzc1JlZiBqc0NsYXNzLCBKU1ZhbHVlKiBw
cm90b3R5cGUsIHZvaWQqIGRhdGEpCisgICAgOiBKU09iamVjdChwcm90b3R5cGUpCisgICAgLCBt
X2NsYXNzKDApCisgICAgLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCit7CisgICAgaW5pdChleGVj
LCBqc0NsYXNzLCBkYXRhKTsKK30KKwordm9pZCBKU0NhbGxiYWNrT2JqZWN0Ojppbml0KEV4ZWNT
dGF0ZSogZXhlYywgSlNDbGFzc1JlZiBqc0NsYXNzLCB2b2lkKiBkYXRhKQoreworICAgIG1fcHJp
dmF0ZURhdGEgPSBkYXRhOworICAgIEpTQ2xhc3NSZWYgb2xkQ2xhc3MgPSBtX2NsYXNzOworICAg
IG1fY2xhc3MgPSBKU0NsYXNzUmV0YWluKGpzQ2xhc3MpOworICAgIGlmIChvbGRDbGFzcykKKyAg
ICAgICAgSlNDbGFzc1JlbGVhc2Uob2xkQ2xhc3MpOworCisgICAgaWYgKCFleGVjKQorICAgICAg
ICByZXR1cm47CisKKyAgICBWZWN0b3I8SlNPYmplY3RJbml0aWFsaXplQ2FsbGJhY2ssIDE2PiBp
bml0Um91dGluZXM7CisgICAgZG8geworICAgICAgICBpZiAoSlNPYmplY3RJbml0aWFsaXplQ2Fs
bGJhY2sgaW5pdGlhbGl6ZSA9IGpzQ2xhc3MtPmluaXRpYWxpemUpCisgICAgICAgICAgICBpbml0
Um91dGluZXMuYXBwZW5kKGluaXRpYWxpemUpOworICAgIH0gd2hpbGUgKChqc0NsYXNzID0ganND
bGFzcy0+cGFyZW50Q2xhc3MpKTsKKyAgICAKKyAgICAvLyBpbml0aWFsaXplIGZyb20gYmFzZSB0
byBkZXJpdmVkCisgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oaW5pdFJvdXRpbmVz
LnNpemUoKSkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2Nr
cyBkcm9wQWxsTG9ja3M7CisgICAgICAgIEpTT2JqZWN0SW5pdGlhbGl6ZUNhbGxiYWNrIGluaXRp
YWxpemUgPSBpbml0Um91dGluZXNbaV07CisgICAgICAgIGluaXRpYWxpemUodG9SZWYoZXhlYyks
IHRvUmVmKHRoaXMpKTsKKyAgICB9CisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30KKwor
SlNDYWxsYmFja09iamVjdDo6fkpTQ2FsbGJhY2tPYmplY3QoKQoreworICAgIEpTT2JqZWN0UmVm
IHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKKyAgICAKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFz
cyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKKyAg
ICAgICAgaWYgKEpTT2JqZWN0RmluYWxpemVDYWxsYmFjayBmaW5hbGl6ZSA9IGpzQ2xhc3MtPmZp
bmFsaXplKSB7CisgICAgICAgICAgICBmaW5hbGl6ZSh0aGlzUmVmKTsKKyAgICAgICAgfQorICAg
IAorICAgIEpTQ2xhc3NSZWxlYXNlKG1fY2xhc3MpOworfQorCit2b2lkIEpTQ2FsbGJhY2tPYmpl
Y3Q6OmluaXRpYWxpemVJZk5lZWRlZChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgaWYgKG1faXNJ
bml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGluaXQoZXhlYywgbV9jbGFzcywgbV9w
cml2YXRlRGF0YSk7Cit9CisKK1VTdHJpbmcgSlNDYWxsYmFja09iamVjdDo6Y2xhc3NOYW1lKCkg
Y29uc3QKK3sKKyAgICBpZiAoIW1fY2xhc3MtPmNsYXNzTmFtZS5pc051bGwoKSkKKyAgICAgICAg
cmV0dXJuIG1fY2xhc3MtPmNsYXNzTmFtZTsKKyAgICAKKyAgICByZXR1cm4gSlNPYmplY3Q6OmNs
YXNzTmFtZSgpOworfQorCitib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmdldE93blByb3BlcnR5U2xv
dChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVy
dHlTbG90JiBzbG90KQoreworICAgIEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKKyAg
ICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7CisgICAgSlNTdHJpbmdSZWYgcHJv
cGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7CisKKyAg
ICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBq
c0NsYXNzLT5wYXJlbnRDbGFzcykgeworICAgICAgICAvLyBvcHRpb25hbCBvcHRpbWl6YXRpb24g
dG8gYnlwYXNzIGdldFByb3BlcnR5IGluIGNhc2VzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGtub3cg
aWYgdGhlIHByb3BlcnR5IGV4aXN0cworICAgICAgICBpZiAoSlNPYmplY3RIYXNQcm9wZXJ0eUNh
bGxiYWNrIGhhc1Byb3BlcnR5ID0ganNDbGFzcy0+aGFzUHJvcGVydHkpIHsKKyAgICAgICAgICAg
IEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIGlmIChoYXNQ
cm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZikpIHsKKyAgICAgICAgICAgICAg
ICBzbG90LnNldEN1c3RvbSh0aGlzLCBjYWxsYmFja0dldHRlcik7CisgICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSlNPYmplY3RH
ZXRQcm9wZXJ0eUNhbGxiYWNrIGdldFByb3BlcnR5ID0ganNDbGFzcy0+Z2V0UHJvcGVydHkpIHsK
KyAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAg
ICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gZ2V0UHJvcGVydHkoY3R4LCB0aGlzUmVmLCBwcm9w
ZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKSB7CisgICAgICAgICAg
ICAgICAgLy8gY2FjaGUgdGhlIHZhbHVlIHNvIHdlIGRvbid0IGhhdmUgdG8gY29tcHV0ZSBpdCBh
Z2FpbgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHZpb2xhdGVzIHRoZSBQcm9wZXJ0
eVNsb3QgZGVzaWduIGEgbGl0dGxlIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQg
ZWl0aGVyIHVzZSB0aGlzIG9wdGltaXphdGlvbiBldmVyeXdoZXJlLCBvciBub3doZXJlLgorICAg
ICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHJlaW50ZXJwcmV0X2Nhc3Q8SlNPYmplY3QqPih0
b0pTKHZhbHVlKSksIGNhY2hlZFZhbHVlR2V0dGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChPcGFxdWVKU0Ns
YXNzOjpTdGF0aWNWYWx1ZXNUYWJsZSogc3RhdGljVmFsdWVzID0ganNDbGFzcy0+c3RhdGljVmFs
dWVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdGljVmFsdWVzLT5jb250YWlucyhwcm9wZXJ0eU5h
bWUudXN0cmluZygpLnJlcCgpKSkgeworICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRo
aXMsIHN0YXRpY1ZhbHVlR2V0dGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xh
c3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0
aWNGdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChzdGF0aWNGdW5jdGlvbnMtPmNvbnRhaW5z
KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CisgICAgICAgICAgICAgICAgc2xvdC5z
ZXRDdXN0b20odGhpcywgc3RhdGljRnVuY3Rpb25HZXR0ZXIpOworICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IEpTT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KTsK
K30KKworYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRl
KiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAg
ICByZXR1cm4gZ2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVy
dHlOYW1lKSwgc2xvdCk7Cit9CisKK3ZvaWQgSlNDYWxsYmFja09iamVjdDo6cHV0KEV4ZWNTdGF0
ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBKU1ZhbHVlKiB2YWx1ZSwg
aW50IGF0dHIpCit7CisgICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOworICAgIEpT
T2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKKyAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0
eU5hbWVSZWYgPSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKKyAgICBKU1Zh
bHVlUmVmIHZhbHVlUmVmID0gdG9SZWYodmFsdWUpOworCisgICAgZm9yIChKU0NsYXNzUmVmIGpz
Q2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3Mp
IHsKKyAgICAgICAgaWYgKEpTT2JqZWN0U2V0UHJvcGVydHlDYWxsYmFjayBzZXRQcm9wZXJ0eSA9
IGpzQ2xhc3MtPnNldFByb3BlcnR5KSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2Nr
cyBkcm9wQWxsTG9ja3M7CisgICAgICAgICAgICBpZiAoc2V0UHJvcGVydHkoY3R4LCB0aGlzUmVm
LCBwcm9wZXJ0eU5hbWVSZWYsIHZhbHVlUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkp
KSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYg
KE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNz
LT5zdGF0aWNWYWx1ZXMpIHsKKyAgICAgICAgICAgIGlmIChTdGF0aWNWYWx1ZUVudHJ5KiBlbnRy
eSA9IHN0YXRpY1ZhbHVlcy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1
dGVSZWFkT25seSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAg
IGlmIChKU09iamVjdFNldFByb3BlcnR5Q2FsbGJhY2sgc2V0UHJvcGVydHkgPSBlbnRyeS0+c2V0
UHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJv
cEFsbExvY2tzOworICAgICAgICAgICAgICAgICAgICBpZiAoc2V0UHJvcGVydHkoY3R4LCB0aGlz
UmVmLCBwcm9wZXJ0eU5hbWVSZWYsIHZhbHVlUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90
KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJv
ciwgIkF0dGVtcHQgdG8gc2V0IGEgcHJvcGVydHkgdGhhdCBpcyBub3Qgc2V0dGFibGUuIik7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChPcGFxdWVKU0Ns
YXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJsZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3Rh
dGljRnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoU3RhdGljRnVuY3Rpb25FbnRyeSogZW50
cnkgPSBzdGF0aWNGdW5jdGlvbnMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkg
eworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0
cmlidXRlUmVhZE9ubHkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
ICAgICBwdXREaXJlY3QocHJvcGVydHlOYW1lLCB2YWx1ZSwgYXR0cik7IC8vIHB1dCBhcyBvdmVy
cmlkZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBKU09iamVjdDo6cHV0KGV4ZWMsIHByb3BlcnR5
TmFtZSwgdmFsdWUsIGF0dHIpOworfQorCit2b2lkIEpTQ2FsbGJhY2tPYmplY3Q6OnB1dChFeGVj
U3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSogdmFsdWUsIGludCBh
dHRyKQoreworICAgIHJldHVybiBwdXQoZXhlYywgSWRlbnRpZmllcjo6ZnJvbShwcm9wZXJ0eU5h
bWUpLCB2YWx1ZSwgYXR0cik7Cit9CisKK2Jvb2wgSlNDYWxsYmFja09iamVjdDo6ZGVsZXRlUHJv
cGVydHkoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUpCit7
CisgICAgSlNDb250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOworICAgIEpTT2JqZWN0UmVmIHRo
aXNSZWYgPSB0b1JlZih0aGlzKTsKKyAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0
b1JlZihwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKKyAgICAKKyAgICBmb3IgKEpTQ2xh
c3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJl
bnRDbGFzcykgeworICAgICAgICBpZiAoSlNPYmplY3REZWxldGVQcm9wZXJ0eUNhbGxiYWNrIGRl
bGV0ZVByb3BlcnR5ID0ganNDbGFzcy0+ZGVsZXRlUHJvcGVydHkpIHsKKyAgICAgICAgICAgIEpT
TG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIGlmIChkZWxldGVQ
cm9wZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdG9SZWYoZXhlYy0+ZXhjZXB0
aW9uU2xvdCgpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVl
cyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgeworICAgICAgICAgICAgaWYgKFN0YXRpY1ZhbHVl
RW50cnkqIGVudHJ5ID0gc3RhdGljVmFsdWVzLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5y
ZXAoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9w
ZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1Rh
YmxlKiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNzLT5zdGF0aWNGdW5jdGlvbnMpIHsKKyAgICAg
ICAgICAgIGlmIChTdGF0aWNGdW5jdGlvbkVudHJ5KiBlbnRyeSA9IHN0YXRpY0Z1bmN0aW9ucy0+
Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CisgICAgICAgICAgICAgICAgaWYg
KGVudHJ5LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gSlNPYmpl
Y3Q6OmRlbGV0ZVByb3BlcnR5KGV4ZWMsIHByb3BlcnR5TmFtZSk7Cit9CisKK2Jvb2wgSlNDYWxs
YmFja09iamVjdDo6ZGVsZXRlUHJvcGVydHkoRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBwcm9w
ZXJ0eU5hbWUpCit7CisgICAgcmV0dXJuIGRlbGV0ZVByb3BlcnR5KGV4ZWMsIElkZW50aWZpZXI6
OmZyb20ocHJvcGVydHlOYW1lKSk7Cit9CisKK2Jvb2wgSlNDYWxsYmFja09iamVjdDo6aW1wbGVt
ZW50c0NvbnN0cnVjdCgpIGNvbnN0Cit7CisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBt
X2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCisgICAgICAg
IGlmIChqc0NsYXNzLT5jYWxsQXNDb25zdHJ1Y3RvcikKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitKU09iamVjdCogSlNDYWxsYmFja09iamVjdDo6
Y29uc3RydWN0KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgTGlzdCYgYXJncykKK3sKKyAgICBKU0Nv
bnRleHRSZWYgZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOworICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYg
PSB0b1JlZih0aGlzKTsKKyAgICAKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xh
c3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgeworICAgICAgICBp
ZiAoSlNPYmplY3RDYWxsQXNDb25zdHJ1Y3RvckNhbGxiYWNrIGNhbGxBc0NvbnN0cnVjdG9yID0g
anNDbGFzcy0+Y2FsbEFzQ29uc3RydWN0b3IpIHsKKyAgICAgICAgICAgIGludCBhcmd1bWVudENv
dW50ID0gc3RhdGljX2Nhc3Q8aW50PihhcmdzLnNpemUoKSk7CisgICAgICAgICAgICBWZWN0b3I8
SlNWYWx1ZVJlZiwgMTY+IGFyZ3VtZW50cyhhcmd1bWVudENvdW50KTsKKyAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGFy
Z3VtZW50c1tpXSA9IHRvUmVmKGFyZ3NbaV0pOworICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxs
TG9ja3MgZHJvcEFsbExvY2tzOworICAgICAgICAgICAgcmV0dXJuIHRvSlMoY2FsbEFzQ29uc3Ry
dWN0b3IoZXhlY1JlZiwgdGhpc1JlZiwgYXJndW1lbnRDb3VudCwgYXJndW1lbnRzLmRhdGEoKSwg
dG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpOworICAgICAgICB9CisgICAgfQorICAgIAor
ICAgIEFTU0VSVCgwKTsgLy8gaW1wbGVtZW50c0NvbnN0cnVjdCBzaG91bGQgcHJldmVudCB1cyBm
cm9tIHJlYWNoaW5nIGhlcmUKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBKU0NhbGxiYWNrT2Jq
ZWN0OjppbXBsZW1lbnRzSGFzSW5zdGFuY2UoKSBjb25zdAoreworICAgIGZvciAoSlNDbGFzc1Jl
ZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENs
YXNzKQorICAgICAgICBpZiAoanNDbGFzcy0+aGFzSW5zdGFuY2UpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBKU0NhbGxiYWNrT2JqZWN0
OjpoYXNJbnN0YW5jZShFeGVjU3RhdGUgKmV4ZWMsIEpTVmFsdWUgKnZhbHVlKQoreworICAgIEpT
Q29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhpc1Jl
ZiA9IHRvUmVmKHRoaXMpOworCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCisgICAgICAgIGlmIChK
U09iamVjdEhhc0luc3RhbmNlQ2FsbGJhY2sgaGFzSW5zdGFuY2UgPSBqc0NsYXNzLT5oYXNJbnN0
YW5jZSkgeworICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwor
ICAgICAgICAgICAgcmV0dXJuIGhhc0luc3RhbmNlKGV4ZWNSZWYsIHRoaXNSZWYsIHRvUmVmKHZh
bHVlKSwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSk7CisgICAgICAgIH0KKworICAgIEFT
U0VSVCgwKTsgLy8gaW1wbGVtZW50c0hhc0luc3RhbmNlIHNob3VsZCBwcmV2ZW50IHVzIGZyb20g
cmVhY2hpbmcgaGVyZQorICAgIHJldHVybiAwOworfQorCisKK2Jvb2wgSlNDYWxsYmFja09iamVj
dDo6aW1wbGVtZW50c0NhbGwoKSBjb25zdAoreworICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNz
ID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQorICAg
ICAgICBpZiAoanNDbGFzcy0+Y2FsbEFzRnVuY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0pTVmFsdWUqIEpTQ2FsbGJhY2tPYmpl
Y3Q6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNv
bnN0IExpc3QgJmFyZ3MpCit7CisgICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVj
KTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7CisgICAgSlNPYmplY3RS
ZWYgdGhpc09ialJlZiA9IHRvUmVmKHRoaXNPYmopOworCisgICAgZm9yIChKU0NsYXNzUmVmIGpz
Q2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3Mp
IHsKKyAgICAgICAgaWYgKEpTT2JqZWN0Q2FsbEFzRnVuY3Rpb25DYWxsYmFjayBjYWxsQXNGdW5j
dGlvbiA9IGpzQ2xhc3MtPmNhbGxBc0Z1bmN0aW9uKSB7CisgICAgICAgICAgICBpbnQgYXJndW1l
bnRDb3VudCA9IHN0YXRpY19jYXN0PGludD4oYXJncy5zaXplKCkpOworICAgICAgICAgICAgVmVj
dG9yPEpTVmFsdWVSZWYsIDE2PiBhcmd1bWVudHMoYXJndW1lbnRDb3VudCk7CisgICAgICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Q291bnQ7IGkrKykKKyAgICAgICAgICAgICAg
ICBhcmd1bWVudHNbaV0gPSB0b1JlZihhcmdzW2ldKTsKKyAgICAgICAgICAgIEpTTG9jazo6RHJv
cEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgIHJldHVybiB0b0pTKGNhbGxBc0Z1
bmN0aW9uKGV4ZWNSZWYsIHRoaXNSZWYsIHRoaXNPYmpSZWYsIGFyZ3VtZW50Q291bnQsIGFyZ3Vt
ZW50cy5kYXRhKCksIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIEFTU0VSVCgwKTsgLy8gaW1wbGVtZW50c0NhbGwgc2hvdWxkIHByZXZlbnQg
dXMgZnJvbSByZWFjaGluZyBoZXJlCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgSlNDYWxsYmFj
a09iamVjdDo6Z2V0UHJvcGVydHlOYW1lcyhFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZUFy
cmF5JiBwcm9wZXJ0eU5hbWVzKQoreworICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9SZWYo
ZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOworCisgICAgZm9y
IChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFz
cy0+cGFyZW50Q2xhc3MpIHsKKyAgICAgICAgaWYgKEpTT2JqZWN0R2V0UHJvcGVydHlOYW1lc0Nh
bGxiYWNrIGdldFByb3BlcnR5TmFtZXMgPSBqc0NsYXNzLT5nZXRQcm9wZXJ0eU5hbWVzKSB7Cisg
ICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7CisgICAgICAgICAg
ICBnZXRQcm9wZXJ0eU5hbWVzKGV4ZWNSZWYsIHRoaXNSZWYsIHRvUmVmKCZwcm9wZXJ0eU5hbWVz
KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVz
VGFibGUqIHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykgeworICAgICAgICAg
ICAgdHlwZWRlZiBPcGFxdWVKU0NsYXNzOjpTdGF0aWNWYWx1ZXNUYWJsZTo6Y29uc3RfaXRlcmF0
b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBpdGVyYXRvciBlbmQgPSBzdGF0aWNWYWx1ZXMtPmVu
ZCgpOworICAgICAgICAgICAgZm9yIChpdGVyYXRvciBpdCA9IHN0YXRpY1ZhbHVlcy0+YmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICAgICAgVVN0cmluZzo6UmVwKiBuYW1l
ID0gaXQtPmZpcnN0LmdldCgpOworICAgICAgICAgICAgICAgIFN0YXRpY1ZhbHVlRW50cnkqIGVu
dHJ5ID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmdldFByb3BlcnR5
ICYmICEoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnRFbnVtKSkK
KyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoSWRlbnRpZmllcihuYW1lKSk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6
U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1
bmN0aW9ucykgeworICAgICAgICAgICAgdHlwZWRlZiBPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5j
dGlvbnNUYWJsZTo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBpdGVyYXRv
ciBlbmQgPSBzdGF0aWNGdW5jdGlvbnMtPmVuZCgpOworICAgICAgICAgICAgZm9yIChpdGVyYXRv
ciBpdCA9IHN0YXRpY0Z1bmN0aW9ucy0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAg
ICAgICAgICAgICAgVVN0cmluZzo6UmVwKiBuYW1lID0gaXQtPmZpcnN0LmdldCgpOworICAgICAg
ICAgICAgICAgIFN0YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5ID0gaXQtPnNlY29uZDsKKyAgICAg
ICAgICAgICAgICBpZiAoIShlbnRyeS0+YXR0cmlidXRlcyAmIGtKU1Byb3BlcnR5QXR0cmlidXRl
RG9udEVudW0pKQorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVzLmFkZChJZGVudGlm
aWVyKG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEpTT2Jq
ZWN0OjpnZXRQcm9wZXJ0eU5hbWVzKGV4ZWMsIHByb3BlcnR5TmFtZXMpOworfQorCitkb3VibGUg
SlNDYWxsYmFja09iamVjdDo6dG9OdW1iZXIoRXhlY1N0YXRlKiBleGVjKSBjb25zdAoreworICAg
IEpTQ29udGV4dFJlZiBjdHggPSB0b1JlZihleGVjKTsKKyAgICBKU09iamVjdFJlZiB0aGlzUmVm
ID0gdG9SZWYodGhpcyk7CisKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7
IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKKyAgICAgICAgaWYgKEpT
T2JqZWN0Q29udmVydFRvVHlwZUNhbGxiYWNrIGNvbnZlcnRUb1R5cGUgPSBqc0NsYXNzLT5jb252
ZXJ0VG9UeXBlKSB7CisgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9j
a3M7CisgICAgICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1ZSA9IGNvbnZlcnRUb1R5cGUoY3R4
LCB0aGlzUmVmLCBrSlNUeXBlTnVtYmVyLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gdG9KUyh2YWx1ZSktPmdldE51bWJlcigpOworICAgICAg
ICB9CisKKyAgICByZXR1cm4gSlNPYmplY3Q6OnRvTnVtYmVyKGV4ZWMpOworfQorCitVU3RyaW5n
IEpTQ2FsbGJhY2tPYmplY3Q6OnRvU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKK3sKKyAg
ICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgdGhpc1Jl
ZiA9IHRvUmVmKHRoaXMpOworCisgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNz
OyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCisgICAgICAgIGlmIChK
U09iamVjdENvbnZlcnRUb1R5cGVDYWxsYmFjayBjb252ZXJ0VG9UeXBlID0ganNDbGFzcy0+Y29u
dmVydFRvVHlwZSkgeworICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExv
Y2tzOworICAgICAgICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBjb252ZXJ0VG9UeXBlKGN0
eCwgdGhpc1JlZiwga0pTVHlwZVN0cmluZywgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvSlModmFsdWUpLT5nZXRTdHJpbmcoKTsKKyAgICAg
ICAgfQorCisgICAgcmV0dXJuIEpTT2JqZWN0Ojp0b1N0cmluZyhleGVjKTsKK30KKwordm9pZCBK
U0NhbGxiYWNrT2JqZWN0OjpzZXRQcml2YXRlKHZvaWQqIGRhdGEpCit7CisgICAgbV9wcml2YXRl
RGF0YSA9IGRhdGE7Cit9CisKK3ZvaWQqIEpTQ2FsbGJhY2tPYmplY3Q6OmdldFByaXZhdGUoKQor
eworICAgIHJldHVybiBtX3ByaXZhdGVEYXRhOworfQorCitib29sIEpTQ2FsbGJhY2tPYmplY3Q6
OmluaGVyaXRzKEpTQ2xhc3NSZWYgYykgY29uc3QKK3sKKyAgICBmb3IgKEpTQ2xhc3NSZWYganND
bGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykK
KyAgICAgICAgaWYgKGpzQ2xhc3MgPT0gYykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWNoZWRW
YWx1ZUdldHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBjb25z
dCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgSlNWYWx1ZSogdiA9IHNsb3Quc2xvdEJhc2Uo
KTsKKyAgICBBU1NFUlQodik7CisgICAgcmV0dXJuIHY7Cit9CisKK0pTVmFsdWUqIEpTQ2FsbGJh
Y2tPYmplY3Q6OnN0YXRpY1ZhbHVlR2V0dGVyKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBj
b25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkK
K3sKKyAgICBBU1NFUlQoc2xvdC5zbG90QmFzZSgpLT5pbmhlcml0cygmSlNDYWxsYmFja09iamVj
dDo6aW5mbykpOworICAgIEpTQ2FsbGJhY2tPYmplY3QqIHRoaXNPYmogPSBzdGF0aWNfY2FzdDxK
U0NhbGxiYWNrT2JqZWN0Kj4oc2xvdC5zbG90QmFzZSgpKTsKKworICAgIEpTT2JqZWN0UmVmIHRo
aXNSZWYgPSB0b1JlZih0aGlzT2JqKTsKKyAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYg
PSB0b1JlZihwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKKworICAgIGZvciAoSlNDbGFz
c1JlZiBqc0NsYXNzID0gdGhpc09iai0+bV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xh
c3MtPnBhcmVudENsYXNzKQorICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVz
VGFibGUqIHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0YXRpY1ZhbHVlcykKKyAgICAgICAgICAg
IGlmIChTdGF0aWNWYWx1ZUVudHJ5KiBlbnRyeSA9IHN0YXRpY1ZhbHVlcy0+Z2V0KHByb3BlcnR5
TmFtZS51c3RyaW5nKCkucmVwKCkpKQorICAgICAgICAgICAgICAgIGlmIChKU09iamVjdEdldFBy
b3BlcnR5Q2FsbGJhY2sgZ2V0UHJvcGVydHkgPSBlbnRyeS0+Z2V0UHJvcGVydHkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgICAg
ICAgICAgICAgICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1ZSA9IGdldFByb3BlcnR5KHRvUmVmKGV4
ZWMpLCB0aGlzUmVmLCBwcm9wZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3Qo
KSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvSlModmFsdWUpOworICAgICAg
ICAgICAgICAgIH0KKworICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFJlZmVyZW5jZUVycm9y
LCAiU3RhdGljIHZhbHVlIHByb3BlcnR5IGRlZmluZWQgd2l0aCBOVUxMIGdldFByb3BlcnR5IGNh
bGxiYWNrLiIpOworfQorCitKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpzdGF0aWNGdW5jdGlv
bkdldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJv
cGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgQVNTRVJUKHNsb3Qu
c2xvdEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsKKyAgICBKU0Nh
bGxiYWNrT2JqZWN0KiB0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNs
b3Quc2xvdEJhc2UoKSk7CisKKyAgICBpZiAoSlNWYWx1ZSogY2FjaGVkT3JPdmVycmlkZVZhbHVl
ID0gdGhpc09iai0+Z2V0RGlyZWN0KHByb3BlcnR5TmFtZSkpCisgICAgICAgIHJldHVybiBjYWNo
ZWRPck92ZXJyaWRlVmFsdWU7CisKKyAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNP
YmotPm1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykgewor
ICAgICAgICBpZiAoT3BhcXVlSlNDbGFzczo6U3RhdGljRnVuY3Rpb25zVGFibGUqIHN0YXRpY0Z1
bmN0aW9ucyA9IGpzQ2xhc3MtPnN0YXRpY0Z1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKFN0
YXRpY0Z1bmN0aW9uRW50cnkqIGVudHJ5ID0gc3RhdGljRnVuY3Rpb25zLT5nZXQocHJvcGVydHlO
YW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoSlNPYmplY3RDYWxs
QXNGdW5jdGlvbkNhbGxiYWNrIGNhbGxBc0Z1bmN0aW9uID0gZW50cnktPmNhbGxBc0Z1bmN0aW9u
KSB7CisgICAgICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBvID0gbmV3IEpTQ2FsbGJhY2tGdW5j
dGlvbihleGVjLCBjYWxsQXNGdW5jdGlvbiwgcHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAg
ICAgICAgdGhpc09iai0+cHV0RGlyZWN0KHByb3BlcnR5TmFtZSwgbywgZW50cnktPmF0dHJpYnV0
ZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGhyb3dFcnJvcihl
eGVjLCBSZWZlcmVuY2VFcnJvciwgIlN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eSBkZWZpbmVkIHdp
dGggTlVMTCBjYWxsQXNGdW5jdGlvbiBjYWxsYmFjay4iKTsKK30KKworSlNWYWx1ZSogSlNDYWxs
YmFja09iamVjdDo6Y2FsbGJhY2tHZXR0ZXIoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQor
eworICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCktPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0
OjppbmZvKSk7CisgICAgSlNDYWxsYmFja09iamVjdCogdGhpc09iaiA9IHN0YXRpY19jYXN0PEpT
Q2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNlKCkpOworCisgICAgSlNPYmplY3RSZWYgdGhp
c1JlZiA9IHRvUmVmKHRoaXNPYmopOworICAgIEpTU3RyaW5nUmVmIHByb3BlcnR5TmFtZVJlZiA9
IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpOworCisgICAgZm9yIChKU0NsYXNz
UmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNzID0ganNDbGFz
cy0+cGFyZW50Q2xhc3MpCisgICAgICAgIGlmIChKU09iamVjdEdldFByb3BlcnR5Q2FsbGJhY2sg
Z2V0UHJvcGVydHkgPSBqc0NsYXNzLT5nZXRQcm9wZXJ0eSkgeworICAgICAgICAgICAgSlNMb2Nr
OjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgICAgICAgICAgaWYgKEpTVmFsdWVSZWYg
dmFsdWUgPSBnZXRQcm9wZXJ0eSh0b1JlZihleGVjKSwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVm
LCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
dG9KUyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFJl
ZmVyZW5jZUVycm9yLCAiaGFzUHJvcGVydHkgY2FsbGJhY2sgcmV0dXJuZWQgdHJ1ZSBmb3IgYSBw
cm9wZXJ0eSB0aGF0IGRvZXNuJ3QgZXhpc3QuIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIEtKUwpJ
bmRleDogSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2FsbGJhY2tPYmplY3RGdW5jdGlvbnMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5o
CShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL0FQSS9KU0NhbGxiYWNrT2JqZWN0
RnVuY3Rpb25zLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvLyAtKi0gbW9kZTog
YysrOyBjLWJhc2ljLW9mZnNldDogNCAtKi0KIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBw
bGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDcgRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtMjUsMTIgKzI2LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPHd0Zi9QbGF0
Zm9ybS5oPgotI2luY2x1ZGUgIkpTQ2FsbGJhY2tPYmplY3QuaCIKLQogI2luY2x1ZGUgIkFQSUNh
c3QuaCIKICNpbmNsdWRlICJKU0NhbGxiYWNrRnVuY3Rpb24uaCIKICNpbmNsdWRlICJKU0NsYXNz
UmVmLmgiCiAjaW5jbHVkZSAiSlNPYmplY3RSZWYuaCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVj
dC5oIgogI2luY2x1ZGUgIkpTU3RyaW5nUmVmLmgiCiAjaW5jbHVkZSAiUHJvcGVydHlOYW1lQXJy
YXkuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMzgsMjcgKzM4LDI3IEBACiAKIG5hbWVz
cGFjZSBLSlMgewogCi1jb25zdCBDbGFzc0luZm8gSlNDYWxsYmFja09iamVjdDo6aW5mbyA9IHsg
IkNhbGxiYWNrT2JqZWN0IiwgMCwgMCwgMCB9OwotCi1KU0NhbGxiYWNrT2JqZWN0OjpKU0NhbGxi
YWNrT2JqZWN0KEV4ZWNTdGF0ZSogZXhlYywgSlNDbGFzc1JlZiBqc0NsYXNzLCBKU1ZhbHVlKiBw
cm90b3R5cGUsIHZvaWQqIGRhdGEpCi0gICAgOiBKU09iamVjdChwcm90b3R5cGUpCit0ZW1wbGF0
ZSA8Y2xhc3MgQmFzZT4KK0pTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OkpTQ2FsbGJhY2tPYmplY3Qo
RXhlY1N0YXRlKiBleGVjLCBKU0NsYXNzUmVmIGpzQ2xhc3MsIEpTVmFsdWUqIHByb3RvdHlwZSwg
dm9pZCogZGF0YSkKKyAgICA6IEJhc2UocHJvdG90eXBlKQogICAgICwgbV9jbGFzcygwKQogICAg
ICwgbV9pc0luaXRpYWxpemVkKGZhbHNlKQogewogICAgIGluaXQoZXhlYywganNDbGFzcywgZGF0
YSk7CiB9CiAKLXZvaWQgSlNDYWxsYmFja09iamVjdDo6aW5pdChFeGVjU3RhdGUqIGV4ZWMsIEpT
Q2xhc3NSZWYganNDbGFzcywgdm9pZCogZGF0YSkKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9p
ZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+Ojppbml0KEV4ZWNTdGF0ZSogZXhlYywgSlNDbGFzc1Jl
ZiBqc0NsYXNzLCB2b2lkKiBkYXRhKQogewogICAgIG1fcHJpdmF0ZURhdGEgPSBkYXRhOwogICAg
IEpTQ2xhc3NSZWYgb2xkQ2xhc3MgPSBtX2NsYXNzOwogICAgIG1fY2xhc3MgPSBKU0NsYXNzUmV0
YWluKGpzQ2xhc3MpOwogICAgIGlmIChvbGRDbGFzcykKICAgICAgICAgSlNDbGFzc1JlbGVhc2Uo
b2xkQ2xhc3MpOwotCisgICAgCiAgICAgaWYgKCFleGVjKQogICAgICAgICByZXR1cm47Ci0KKyAg
ICAKICAgICBWZWN0b3I8SlNPYmplY3RJbml0aWFsaXplQ2FsbGJhY2ssIDE2PiBpbml0Um91dGlu
ZXM7CiAgICAgZG8gewogICAgICAgICBpZiAoSlNPYmplY3RJbml0aWFsaXplQ2FsbGJhY2sgaW5p
dGlhbGl6ZSA9IGpzQ2xhc3MtPmluaXRpYWxpemUpCkBAIC03NCw3ICs3NCw4IEBAIHZvaWQgSlND
YWxsYmFja09iamVjdDo6aW5pdChFeGVjU3RhdGUqIGUKICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0
cnVlOwogfQogCi1KU0NhbGxiYWNrT2JqZWN0Ojp+SlNDYWxsYmFja09iamVjdCgpCit0ZW1wbGF0
ZSA8Y2xhc3MgQmFzZT4KK0pTQ2FsbGJhY2tPYmplY3Q8QmFzZT46On5KU0NhbGxiYWNrT2JqZWN0
KCkKIHsKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7CiAgICAgCkBAIC04
MiwxOCArODMsMjAgQEAgSlNDYWxsYmFja09iamVjdDo6fkpTQ2FsbGJhY2tPYmplY3QoKQogICAg
ICAgICBpZiAoSlNPYmplY3RGaW5hbGl6ZUNhbGxiYWNrIGZpbmFsaXplID0ganNDbGFzcy0+Zmlu
YWxpemUpIHsKICAgICAgICAgICAgIGZpbmFsaXplKHRoaXNSZWYpOwogICAgICAgICB9Ci0gICAg
CisgICAgICAgICAgICAKICAgICBKU0NsYXNzUmVsZWFzZShtX2NsYXNzKTsKIH0KIAotdm9pZCBK
U0NhbGxiYWNrT2JqZWN0Ojppbml0aWFsaXplSWZOZWVkZWQoRXhlY1N0YXRlKiBleGVjKQordGVt
cGxhdGUgPGNsYXNzIEJhc2U+Cit2b2lkIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmluaXRpYWxp
emVJZk5lZWRlZChFeGVjU3RhdGUqIGV4ZWMpCiB7CiAgICAgaWYgKG1faXNJbml0aWFsaXplZCkK
ICAgICAgICAgcmV0dXJuOwogICAgIGluaXQoZXhlYywgbV9jbGFzcywgbV9wcml2YXRlRGF0YSk7
CiB9CiAKLVVTdHJpbmcgSlNDYWxsYmFja09iamVjdDo6Y2xhc3NOYW1lKCkgY29uc3QKK3RlbXBs
YXRlIDxjbGFzcyBCYXNlPgorVVN0cmluZyBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpjbGFzc05h
bWUoKSBjb25zdAogewogICAgIGlmICghbV9jbGFzcy0+Y2xhc3NOYW1lLmlzTnVsbCgpKQogICAg
ICAgICByZXR1cm4gbV9jbGFzcy0+Y2xhc3NOYW1lOwpAQCAtMTAxLDEyICsxMDQsMTMgQEAgVVN0
cmluZyBKU0NhbGxiYWNrT2JqZWN0OjpjbGFzc05hbWUoKSBjbwogICAgIHJldHVybiBKU09iamVj
dDo6Y2xhc3NOYW1lKCk7CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6Z2V0T3duUHJvcGVy
dHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBQ
cm9wZXJ0eVNsb3QmIHNsb3QpCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK2Jvb2wgSlNDYWxsYmFj
a09iamVjdDxCYXNlPjo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSogZXhlYywgY29uc3Qg
SWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7CiAgICAgSlND
b250ZXh0UmVmIGN0eCA9IHRvUmVmKGV4ZWMpOwogICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0
b1JlZih0aGlzKTsKICAgICBKU1N0cmluZ1JlZiBwcm9wZXJ0eU5hbWVSZWYgPSB0b1JlZihwcm9w
ZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKTsKLQorICAgIAogICAgIGZvciAoSlNDbGFzc1JlZiBq
c0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNz
KSB7CiAgICAgICAgIC8vIG9wdGlvbmFsIG9wdGltaXphdGlvbiB0byBieXBhc3MgZ2V0UHJvcGVy
dHkgaW4gY2FzZXMgd2hlbiB3ZSBvbmx5IG5lZWQgdG8ga25vdyBpZiB0aGUgcHJvcGVydHkgZXhp
c3RzCiAgICAgICAgIGlmIChKU09iamVjdEhhc1Byb3BlcnR5Q2FsbGJhY2sgaGFzUHJvcGVydHkg
PSBqc0NsYXNzLT5oYXNQcm9wZXJ0eSkgewpAQCAtMTI1LDcgKzEyOSw3IEBAIGJvb2wgSlNDYWxs
YmFja09iamVjdDo6Z2V0T3duUHJvcGVydHlTbG8KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAoT3Bh
cXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0
YXRpY1ZhbHVlcykgewogICAgICAgICAgICAgaWYgKHN0YXRpY1ZhbHVlcy0+Y29udGFpbnMocHJv
cGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKICAgICAgICAgICAgICAgICBzbG90LnNldEN1
c3RvbSh0aGlzLCBzdGF0aWNWYWx1ZUdldHRlcik7CkBAIC0xNDAsMjkgKzE0NCwzMSBAQCBib29s
IEpTQ2FsbGJhY2tPYmplY3Q6OmdldE93blByb3BlcnR5U2xvCiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KICAgICB9Ci0KKyAgICAKICAgICByZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5
U2xvdChleGVjLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwogfQogCi1ib29sIEpTQ2FsbGJhY2tPYmpl
Y3Q6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHByb3BlcnR5
TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpT
Q2FsbGJhY2tPYmplY3Q8QmFzZT46OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMs
IHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQogewogICAgIHJldHVy
biBnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgSWRlbnRpZmllcjo6ZnJvbShwcm9wZXJ0eU5hbWUp
LCBzbG90KTsKIH0KIAotdm9pZCBKU0NhbGxiYWNrT2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0
cikKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9pZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+Ojpw
dXQoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIEpTVmFs
dWUqIHZhbHVlLCBpbnQgYXR0cikKIHsKICAgICBKU0NvbnRleHRSZWYgY3R4ID0gdG9SZWYoZXhl
Yyk7CiAgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwogICAgIEpTU3RyaW5n
UmVmIHByb3BlcnR5TmFtZVJlZiA9IHRvUmVmKHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkp
OwogICAgIEpTVmFsdWVSZWYgdmFsdWVSZWYgPSB0b1JlZih2YWx1ZSk7Ci0KKyAgICAKICAgICBm
b3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0Ns
YXNzLT5wYXJlbnRDbGFzcykgewogICAgICAgICBpZiAoSlNPYmplY3RTZXRQcm9wZXJ0eUNhbGxi
YWNrIHNldFByb3BlcnR5ID0ganNDbGFzcy0+c2V0UHJvcGVydHkpIHsKICAgICAgICAgICAgIEpT
TG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKICAgICAgICAgICAgIGlmIChzZXRQcm9w
ZXJ0eShjdHgsIHRoaXNSZWYsIHByb3BlcnR5TmFtZVJlZiwgdmFsdWVSZWYsIHRvUmVmKGV4ZWMt
PmV4Y2VwdGlvblNsb3QoKSkpKQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQot
ICAgIAorICAgICAgICAKICAgICAgICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1Rh
YmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNWYWx1ZXMpIHsKICAgICAgICAgICAg
IGlmIChTdGF0aWNWYWx1ZUVudHJ5KiBlbnRyeSA9IHN0YXRpY1ZhbHVlcy0+Z2V0KHByb3BlcnR5
TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5hdHRy
aWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSkKQEAgLTE4MCwyMSArMTg2LDIz
IEBAIHZvaWQgSlNDYWxsYmFja09iamVjdDo6cHV0KEV4ZWNTdGF0ZSogZXgKICAgICAgICAgICAg
IGlmIChTdGF0aWNGdW5jdGlvbkVudHJ5KiBlbnRyeSA9IHN0YXRpY0Z1bmN0aW9ucy0+Z2V0KHBy
b3BlcnR5TmFtZS51c3RyaW5nKCkucmVwKCkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVudHJ5
LT5hdHRyaWJ1dGVzICYga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSkKICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIHB1dERpcmVjdChwcm9wZXJ0eU5hbWUs
IHZhbHVlLCBhdHRyKTsgLy8gcHV0IGFzIG92ZXJyaWRlIHByb3BlcnR5CisgICAgICAgICAgICAg
ICAgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6cHV0RGlyZWN0KHByb3BlcnR5TmFtZSwgdmFsdWUs
IGF0dHIpOyAvLyBwdXQgYXMgb3ZlcnJpZGUgcHJvcGVydHkKICAgICAgICAgICAgICAgICByZXR1
cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAgICByZXR1cm4g
SlNPYmplY3Q6OnB1dChleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBhdHRyKTsKIH0KIAotdm9p
ZCBKU0NhbGxiYWNrT2JqZWN0OjpwdXQoRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0
eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgor
dm9pZCBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpwdXQoRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25l
ZCBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUqIHZhbHVlLCBpbnQgYXR0cikKIHsKICAgICByZXR1cm4g
cHV0KGV4ZWMsIElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSwgdmFsdWUsIGF0dHIpOwog
fQogCi1ib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KEV4ZWNTdGF0ZSogZXhl
YywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lKQordGVtcGxhdGUgPGNsYXNzIEJhc2U+
Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmRlbGV0ZVByb3BlcnR5KEV4ZWNTdGF0ZSog
ZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lKQogewogICAgIEpTQ29udGV4dFJl
ZiBjdHggPSB0b1JlZihleGVjKTsKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhp
cyk7CkBAIC0yMDYsNyArMjE0LDcgQEAgYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjpkZWxldGVQcm9w
ZXJ0eShFeAogICAgICAgICAgICAgaWYgKGRlbGV0ZVByb3BlcnR5KGN0eCwgdGhpc1JlZiwgcHJv
cGVydHlOYW1lUmVmLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKSkKICAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBpZiAoT3Bh
cXVlSlNDbGFzczo6U3RhdGljVmFsdWVzVGFibGUqIHN0YXRpY1ZhbHVlcyA9IGpzQ2xhc3MtPnN0
YXRpY1ZhbHVlcykgewogICAgICAgICAgICAgaWYgKFN0YXRpY1ZhbHVlRW50cnkqIGVudHJ5ID0g
c3RhdGljVmFsdWVzLT5nZXQocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSkpIHsKICAgICAg
ICAgICAgICAgICBpZiAoZW50cnktPmF0dHJpYnV0ZXMgJiBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURv
bnREZWxldGUpCkBAIC0yMjMsMjUgKzIzMSwyOCBAQCBib29sIEpTQ2FsbGJhY2tPYmplY3Q6OmRl
bGV0ZVByb3BlcnR5KEV4CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICAK
ICAgICByZXR1cm4gSlNPYmplY3Q6OmRlbGV0ZVByb3BlcnR5KGV4ZWMsIHByb3BlcnR5TmFtZSk7
CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6ZGVsZXRlUHJvcGVydHkoRXhlY1N0YXRlKiBl
eGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUpCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK2Jvb2wg
SlNDYWxsYmFja09iamVjdDxCYXNlPjo6ZGVsZXRlUHJvcGVydHkoRXhlY1N0YXRlKiBleGVjLCB1
bnNpZ25lZCBwcm9wZXJ0eU5hbWUpCiB7CiAgICAgcmV0dXJuIGRlbGV0ZVByb3BlcnR5KGV4ZWMs
IElkZW50aWZpZXI6OmZyb20ocHJvcGVydHlOYW1lKSk7CiB9CiAKLWJvb2wgSlNDYWxsYmFja09i
amVjdDo6aW1wbGVtZW50c0NvbnN0cnVjdCgpIGNvbnN0Cit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4K
K2Jvb2wgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6aW1wbGVtZW50c0NvbnN0cnVjdCgpIGNvbnN0
CiB7CiAgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0Ns
YXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCiAgICAgICAgIGlmIChqc0NsYXNzLT5jYWxsQXND
b25zdHJ1Y3RvcikKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCisgICAgCiAgICAgcmV0dXJu
IGZhbHNlOwogfQogCi1KU09iamVjdCogSlNDYWxsYmFja09iamVjdDo6Y29uc3RydWN0KEV4ZWNT
dGF0ZSogZXhlYywgY29uc3QgTGlzdCYgYXJncykKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorSlNP
YmplY3QqIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmNvbnN0cnVjdChFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IExpc3QmIGFyZ3MpCiB7CiAgICAgSlNDb250ZXh0UmVmIGV4ZWNSZWYgPSB0b1JlZihl
eGVjKTsKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpcyk7CkBAIC0yNjEsMzIg
KzI3MiwzNSBAQCBKU09iamVjdCogSlNDYWxsYmFja09iamVjdDo6Y29uc3RydWN0KEV4CiAgICAg
cmV0dXJuIDA7CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6aW1wbGVtZW50c0hhc0luc3Rh
bmNlKCkgY29uc3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorYm9vbCBKU0NhbGxiYWNrT2JqZWN0
PEJhc2U+OjppbXBsZW1lbnRzSGFzSW5zdGFuY2UoKSBjb25zdAogewogICAgIGZvciAoSlNDbGFz
c1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganNDbGFzcyA9IGpzQ2xhc3MtPnBhcmVu
dENsYXNzKQogICAgICAgICBpZiAoanNDbGFzcy0+aGFzSW5zdGFuY2UpCiAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQorICAgIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBKU0NhbGxi
YWNrT2JqZWN0OjpoYXNJbnN0YW5jZShFeGVjU3RhdGUgKmV4ZWMsIEpTVmFsdWUgKnZhbHVlKQor
dGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46Omhhc0lu
c3RhbmNlKEV4ZWNTdGF0ZSAqZXhlYywgSlNWYWx1ZSAqdmFsdWUpCiB7CiAgICAgSlNDb250ZXh0
UmVmIGV4ZWNSZWYgPSB0b1JlZihleGVjKTsKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9S
ZWYodGhpcyk7Ci0KKyAgICAKICAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IG1fY2xhc3M7
IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKICAgICAgICAgaWYgKEpT
T2JqZWN0SGFzSW5zdGFuY2VDYWxsYmFjayBoYXNJbnN0YW5jZSA9IGpzQ2xhc3MtPmhhc0luc3Rh
bmNlKSB7CiAgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7CiAg
ICAgICAgICAgICByZXR1cm4gaGFzSW5zdGFuY2UoZXhlY1JlZiwgdGhpc1JlZiwgdG9SZWYodmFs
dWUpLCB0b1JlZihleGVjLT5leGNlcHRpb25TbG90KCkpKTsKICAgICAgICAgfQotCi0gICAgQVNT
RVJUKDApOyAvLyBpbXBsZW1lbnRzSGFzSW5zdGFuY2Ugc2hvdWxkIHByZXZlbnQgdXMgZnJvbSBy
ZWFjaGluZyBoZXJlCisgICAgICAgICAgICAKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8g
aW1wbGVtZW50c0hhc0luc3RhbmNlIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgaGVy
ZQogICAgIHJldHVybiAwOwogfQogCiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6aW1wbGVtZW50
c0NhbGwoKSBjb25zdAordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmpl
Y3Q8QmFzZT46OmltcGxlbWVudHNDYWxsKCkgY29uc3QKIHsKICAgICBmb3IgKEpTQ2xhc3NSZWYg
anNDbGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFz
cykKICAgICAgICAgaWYgKGpzQ2xhc3MtPmNhbGxBc0Z1bmN0aW9uKQpAQCAtMjk1LDEyICszMDks
MTMgQEAgYm9vbCBKU0NhbGxiYWNrT2JqZWN0OjppbXBsZW1lbnRzQ2FsbCgpIAogICAgIHJldHVy
biBmYWxzZTsKIH0KIAotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2FsbEFzRnVuY3Rpb24o
RXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlzdCAmYXJncykKK3Rl
bXBsYXRlIDxjbGFzcyBCYXNlPgorSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDxCYXNlPjo6Y2Fs
bEFzRnVuY3Rpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iaiwgY29uc3QgTGlz
dCAmYXJncykKIHsKICAgICBKU0NvbnRleHRSZWYgZXhlY1JlZiA9IHRvUmVmKGV4ZWMpOwogICAg
IEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKICAgICBKU09iamVjdFJlZiB0aGlz
T2JqUmVmID0gdG9SZWYodGhpc09iaik7Ci0KKyAgICAKICAgICBmb3IgKEpTQ2xhc3NSZWYganND
bGFzcyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykg
ewogICAgICAgICBpZiAoSlNPYmplY3RDYWxsQXNGdW5jdGlvbkNhbGxiYWNrIGNhbGxBc0Z1bmN0
aW9uID0ganNDbGFzcy0+Y2FsbEFzRnVuY3Rpb24pIHsKICAgICAgICAgICAgIGludCBhcmd1bWVu
dENvdW50ID0gc3RhdGljX2Nhc3Q8aW50PihhcmdzLnNpemUoKSk7CkBAIC0zMTEsMjIgKzMyNiwy
MyBAQCBKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWxsQXNGdW5jdGlvCiAgICAgICAgICAg
ICByZXR1cm4gdG9KUyhjYWxsQXNGdW5jdGlvbihleGVjUmVmLCB0aGlzUmVmLCB0aGlzT2JqUmVm
LCBhcmd1bWVudENvdW50LCBhcmd1bWVudHMuZGF0YSgpLCB0b1JlZihleGVjLT5leGNlcHRpb25T
bG90KCkpKSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBBU1NFUlQoMCk7IC8vIGltcGxlbWVu
dHNDYWxsIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgaGVyZQorICAgIAorICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBpbXBsZW1lbnRzQ2FsbCBzaG91bGQgcHJldmVudCB1cyBm
cm9tIHJlYWNoaW5nIGhlcmUKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBKU0NhbGxiYWNrT2Jq
ZWN0OjpnZXRQcm9wZXJ0eU5hbWVzKEV4ZWNTdGF0ZSogZXhlYywgUHJvcGVydHlOYW1lQXJyYXkm
IHByb3BlcnR5TmFtZXMpCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK3ZvaWQgSlNDYWxsYmFja09i
amVjdDxCYXNlPjo6Z2V0UHJvcGVydHlOYW1lcyhFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFt
ZUFycmF5JiBwcm9wZXJ0eU5hbWVzKQogewogICAgIEpTQ29udGV4dFJlZiBleGVjUmVmID0gdG9S
ZWYoZXhlYyk7CiAgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMpOwotCisgICAg
CiAgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNzOyBqc0NsYXNz
ID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKICAgICAgICAgaWYgKEpTT2JqZWN0R2V0UHJvcGVy
dHlOYW1lc0NhbGxiYWNrIGdldFByb3BlcnR5TmFtZXMgPSBqc0NsYXNzLT5nZXRQcm9wZXJ0eU5h
bWVzKSB7CiAgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7CiAg
ICAgICAgICAgICBnZXRQcm9wZXJ0eU5hbWVzKGV4ZWNSZWYsIHRoaXNSZWYsIHRvUmVmKCZwcm9w
ZXJ0eU5hbWVzKSk7CiAgICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgaWYgKE9wYXF1ZUpT
Q2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBqc0NsYXNzLT5zdGF0aWNW
YWx1ZXMpIHsKICAgICAgICAgICAgIHR5cGVkZWYgT3BhcXVlSlNDbGFzczo6U3RhdGljVmFsdWVz
VGFibGU6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOwogICAgICAgICAgICAgaXRlcmF0b3IgZW5k
ID0gc3RhdGljVmFsdWVzLT5lbmQoKTsKQEAgLTMzNyw3ICszNTMsNyBAQCB2b2lkIEpTQ2FsbGJh
Y2tPYmplY3Q6OmdldFByb3BlcnR5TmFtZXMoCiAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5
TmFtZXMuYWRkKElkZW50aWZpZXIobmFtZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0K
KyAgICAgICAgCiAgICAgICAgIGlmIChPcGFxdWVKU0NsYXNzOjpTdGF0aWNGdW5jdGlvbnNUYWJs
ZSogc3RhdGljRnVuY3Rpb25zID0ganNDbGFzcy0+c3RhdGljRnVuY3Rpb25zKSB7CiAgICAgICAg
ICAgICB0eXBlZGVmIE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlOjpjb25zdF9p
dGVyYXRvciBpdGVyYXRvcjsKICAgICAgICAgICAgIGl0ZXJhdG9yIGVuZCA9IHN0YXRpY0Z1bmN0
aW9ucy0+ZW5kKCk7CkBAIC0zNDksNzQgKzM2NSw4MSBAQCB2b2lkIEpTQ2FsbGJhY2tPYmplY3Q6
OmdldFByb3BlcnR5TmFtZXMoCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAg
ICAKICAgICBKU09iamVjdDo6Z2V0UHJvcGVydHlOYW1lcyhleGVjLCBwcm9wZXJ0eU5hbWVzKTsK
IH0KIAotZG91YmxlIEpTQ2FsbGJhY2tPYmplY3Q6OnRvTnVtYmVyKEV4ZWNTdGF0ZSogZXhlYykg
Y29uc3QKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorZG91YmxlIEpTQ2FsbGJhY2tPYmplY3Q8QmFz
ZT46OnRvTnVtYmVyKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKIHsKICAgICBKU0NvbnRleHRSZWYg
Y3R4ID0gdG9SZWYoZXhlYyk7CiAgICAgSlNPYmplY3RSZWYgdGhpc1JlZiA9IHRvUmVmKHRoaXMp
OwotCisgICAgCiAgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSBtX2NsYXNzOyBqc0NsYXNz
OyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpCiAgICAgICAgIGlmIChKU09iamVjdENv
bnZlcnRUb1R5cGVDYWxsYmFjayBjb252ZXJ0VG9UeXBlID0ganNDbGFzcy0+Y29udmVydFRvVHlw
ZSkgewogICAgICAgICAgICAgSlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwogICAg
ICAgICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBjb252ZXJ0VG9UeXBlKGN0eCwgdGhpc1Jl
Ziwga0pTVHlwZU51bWJlciwgdG9SZWYoZXhlYy0+ZXhjZXB0aW9uU2xvdCgpKSkpCiAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRvSlModmFsdWUpLT5nZXROdW1iZXIoKTsKICAgICAgICAgfQotCisg
ICAgICAgICAgICAKICAgICByZXR1cm4gSlNPYmplY3Q6OnRvTnVtYmVyKGV4ZWMpOwogfQogCi1V
U3RyaW5nIEpTQ2FsbGJhY2tPYmplY3Q6OnRvU3RyaW5nKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QK
K3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorVVN0cmluZyBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+Ojp0
b1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0CiB7CiAgICAgSlNDb250ZXh0UmVmIGN0eCA9
IHRvUmVmKGV4ZWMpOwogICAgIEpTT2JqZWN0UmVmIHRoaXNSZWYgPSB0b1JlZih0aGlzKTsKLQor
ICAgIAogICAgIGZvciAoSlNDbGFzc1JlZiBqc0NsYXNzID0gbV9jbGFzczsganNDbGFzczsganND
bGFzcyA9IGpzQ2xhc3MtPnBhcmVudENsYXNzKQogICAgICAgICBpZiAoSlNPYmplY3RDb252ZXJ0
VG9UeXBlQ2FsbGJhY2sgY29udmVydFRvVHlwZSA9IGpzQ2xhc3MtPmNvbnZlcnRUb1R5cGUpIHsK
ICAgICAgICAgICAgIEpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKICAgICAgICAg
ICAgIGlmIChKU1ZhbHVlUmVmIHZhbHVlID0gY29udmVydFRvVHlwZShjdHgsIHRoaXNSZWYsIGtK
U1R5cGVTdHJpbmcsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQogICAgICAgICAgICAg
ICAgIHJldHVybiB0b0pTKHZhbHVlKS0+Z2V0U3RyaW5nKCk7CiAgICAgICAgIH0KLQorICAgICAg
ICAgICAgCiAgICAgcmV0dXJuIEpTT2JqZWN0Ojp0b1N0cmluZyhleGVjKTsKIH0KIAotdm9pZCBK
U0NhbGxiYWNrT2JqZWN0OjpzZXRQcml2YXRlKHZvaWQqIGRhdGEpCit0ZW1wbGF0ZSA8Y2xhc3Mg
QmFzZT4KK3ZvaWQgSlNDYWxsYmFja09iamVjdDxCYXNlPjo6c2V0UHJpdmF0ZSh2b2lkKiBkYXRh
KQogewogICAgIG1fcHJpdmF0ZURhdGEgPSBkYXRhOwogfQogCi12b2lkKiBKU0NhbGxiYWNrT2Jq
ZWN0OjpnZXRQcml2YXRlKCkKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgordm9pZCogSlNDYWxsYmFj
a09iamVjdDxCYXNlPjo6Z2V0UHJpdmF0ZSgpCiB7CiAgICAgcmV0dXJuIG1fcHJpdmF0ZURhdGE7
CiB9CiAKLWJvb2wgSlNDYWxsYmFja09iamVjdDo6aW5oZXJpdHMoSlNDbGFzc1JlZiBjKSBjb25z
dAordGVtcGxhdGUgPGNsYXNzIEJhc2U+Citib29sIEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46Omlu
aGVyaXRzKEpTQ2xhc3NSZWYgYykgY29uc3QKIHsKICAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFz
cyA9IG1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKICAg
ICAgICAgaWYgKGpzQ2xhc3MgPT0gYykKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCisgICAg
CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1KU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0OjpjYWNo
ZWRWYWx1ZUdldHRlcihFeGVjU3RhdGUqLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImLCBj
b25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZT4KK0pTVmFsdWUq
IEpTQ2FsbGJhY2tPYmplY3Q8QmFzZT46OmNhY2hlZFZhbHVlR2V0dGVyKEV4ZWNTdGF0ZSosIEpT
T2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKIHsK
ICAgICBKU1ZhbHVlKiB2ID0gc2xvdC5zbG90QmFzZSgpOwogICAgIEFTU0VSVCh2KTsKICAgICBy
ZXR1cm4gdjsKIH0KIAotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6c3RhdGljVmFsdWVHZXR0
ZXIoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5
TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitK
U1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0PEJhc2U+OjpzdGF0aWNWYWx1ZUdldHRlcihFeGVjU3Rh
dGUqIGV4ZWMsIEpTT2JqZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25z
dCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7CiAgICAgQVNTRVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5o
ZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q6OmluZm8pKTsKICAgICBKU0NhbGxiYWNrT2JqZWN0KiB0
aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7
Ci0KKyAgICAKICAgICBKU09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpc09iaik7CiAgICAg
SlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVzdHJpbmco
KS5yZXAoKSk7Ci0KKyAgICAKICAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNPYmot
Pm1fY2xhc3M7IGpzQ2xhc3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKICAgICAg
ICAgaWYgKE9wYXF1ZUpTQ2xhc3M6OlN0YXRpY1ZhbHVlc1RhYmxlKiBzdGF0aWNWYWx1ZXMgPSBq
c0NsYXNzLT5zdGF0aWNWYWx1ZXMpCiAgICAgICAgICAgICBpZiAoU3RhdGljVmFsdWVFbnRyeSog
ZW50cnkgPSBzdGF0aWNWYWx1ZXMtPmdldChwcm9wZXJ0eU5hbWUudXN0cmluZygpLnJlcCgpKSkK
QEAgLTQyNSwxOCArNDQ4LDE5IEBAIEpTVmFsdWUqIEpTQ2FsbGJhY2tPYmplY3Q6OnN0YXRpY1Zh
bHVlR2UKICAgICAgICAgICAgICAgICAgICAgaWYgKEpTVmFsdWVSZWYgdmFsdWUgPSBnZXRQcm9w
ZXJ0eSh0b1JlZihleGVjKSwgdGhpc1JlZiwgcHJvcGVydHlOYW1lUmVmLCB0b1JlZihleGVjLT5l
eGNlcHRpb25TbG90KCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0pTKHZh
bHVlKTsKICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICAgICAgCiAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgUmVmZXJlbmNlRXJyb3IsICJTdGF0aWMgdmFsdWUgcHJvcGVy
dHkgZGVmaW5lZCB3aXRoIE5VTEwgZ2V0UHJvcGVydHkgY2FsbGJhY2suIik7CiB9CiAKLUpTVmFs
dWUqIEpTQ2FsbGJhY2tPYmplY3Q6OnN0YXRpY0Z1bmN0aW9uR2V0dGVyKEV4ZWNTdGF0ZSogZXhl
YywgSlNPYmplY3QqLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3Bl
cnR5U2xvdCYgc2xvdCkKK3RlbXBsYXRlIDxjbGFzcyBCYXNlPgorSlNWYWx1ZSogSlNDYWxsYmFj
a09iamVjdDxCYXNlPjo6c3RhdGljRnVuY3Rpb25HZXR0ZXIoRXhlY1N0YXRlKiBleGVjLCBKU09i
amVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90
JiBzbG90KQogewogICAgIEFTU0VSVChzbG90LnNsb3RCYXNlKCktPmluaGVyaXRzKCZKU0NhbGxi
YWNrT2JqZWN0OjppbmZvKSk7CiAgICAgSlNDYWxsYmFja09iamVjdCogdGhpc09iaiA9IHN0YXRp
Y19jYXN0PEpTQ2FsbGJhY2tPYmplY3QqPihzbG90LnNsb3RCYXNlKCkpOwotCisgICAgCiAgICAg
aWYgKEpTVmFsdWUqIGNhY2hlZE9yT3ZlcnJpZGVWYWx1ZSA9IHRoaXNPYmotPmdldERpcmVjdChw
cm9wZXJ0eU5hbWUpKQogICAgICAgICByZXR1cm4gY2FjaGVkT3JPdmVycmlkZVZhbHVlOwotCisg
ICAgCiAgICAgZm9yIChKU0NsYXNzUmVmIGpzQ2xhc3MgPSB0aGlzT2JqLT5tX2NsYXNzOyBqc0Ns
YXNzOyBqc0NsYXNzID0ganNDbGFzcy0+cGFyZW50Q2xhc3MpIHsKICAgICAgICAgaWYgKE9wYXF1
ZUpTQ2xhc3M6OlN0YXRpY0Z1bmN0aW9uc1RhYmxlKiBzdGF0aWNGdW5jdGlvbnMgPSBqc0NsYXNz
LT5zdGF0aWNGdW5jdGlvbnMpIHsKICAgICAgICAgICAgIGlmIChTdGF0aWNGdW5jdGlvbkVudHJ5
KiBlbnRyeSA9IHN0YXRpY0Z1bmN0aW9ucy0+Z2V0KHByb3BlcnR5TmFtZS51c3RyaW5nKCkucmVw
KCkpKSB7CkBAIC00NDgsMjUgKzQ3MiwyNiBAQCBKU1ZhbHVlKiBKU0NhbGxiYWNrT2JqZWN0Ojpz
dGF0aWNGdW5jdGlvCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAg
ICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwgIlN0YXRpYyBmdW5jdGlv
biBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggTlVMTCBjYWxsQXNGdW5jdGlvbiBjYWxsYmFjay4iKTsK
IH0KIAotSlNWYWx1ZSogSlNDYWxsYmFja09iamVjdDo6Y2FsbGJhY2tHZXR0ZXIoRXhlY1N0YXRl
KiBleGVjLCBKU09iamVjdCosIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3Qg
UHJvcGVydHlTbG90JiBzbG90KQordGVtcGxhdGUgPGNsYXNzIEJhc2U+CitKU1ZhbHVlKiBKU0Nh
bGxiYWNrT2JqZWN0PEJhc2U+OjpjYWxsYmFja0dldHRlcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2Jq
ZWN0KiwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3Qm
IHNsb3QpCiB7CiAgICAgQVNTRVJUKHNsb3Quc2xvdEJhc2UoKS0+aW5oZXJpdHMoJkpTQ2FsbGJh
Y2tPYmplY3Q6OmluZm8pKTsKICAgICBKU0NhbGxiYWNrT2JqZWN0KiB0aGlzT2JqID0gc3RhdGlj
X2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0KKyAgICAKICAgICBK
U09iamVjdFJlZiB0aGlzUmVmID0gdG9SZWYodGhpc09iaik7CiAgICAgSlNTdHJpbmdSZWYgcHJv
cGVydHlOYW1lUmVmID0gdG9SZWYocHJvcGVydHlOYW1lLnVzdHJpbmcoKS5yZXAoKSk7Ci0KKyAg
ICAKICAgICBmb3IgKEpTQ2xhc3NSZWYganNDbGFzcyA9IHRoaXNPYmotPm1fY2xhc3M7IGpzQ2xh
c3M7IGpzQ2xhc3MgPSBqc0NsYXNzLT5wYXJlbnRDbGFzcykKICAgICAgICAgaWYgKEpTT2JqZWN0
R2V0UHJvcGVydHlDYWxsYmFjayBnZXRQcm9wZXJ0eSA9IGpzQ2xhc3MtPmdldFByb3BlcnR5KSB7
CiAgICAgICAgICAgICBKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7CiAgICAgICAg
ICAgICBpZiAoSlNWYWx1ZVJlZiB2YWx1ZSA9IGdldFByb3BlcnR5KHRvUmVmKGV4ZWMpLCB0aGlz
UmVmLCBwcm9wZXJ0eU5hbWVSZWYsIHRvUmVmKGV4ZWMtPmV4Y2VwdGlvblNsb3QoKSkpKQogICAg
ICAgICAgICAgICAgIHJldHVybiB0b0pTKHZhbHVlKTsKICAgICAgICAgfQotCisgICAgICAgICAg
ICAKICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBSZWZlcmVuY2VFcnJvciwgImhhc1Byb3Bl
cnR5IGNhbGxiYWNrIHJldHVybmVkIHRydWUgZm9yIGEgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4
aXN0LiIpOwogfQogCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9BUEkvSlNDbGFzc1JlZi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvQVBJL0pTQ2xhc3NSZWYuY3BwCShyZXZpc2lvbiAy
NzAwNykKKysrIEphdmFTY3JpcHRDb3JlL0FQSS9KU0NsYXNzUmVmLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTU2LDcgKzE1Niw3IEBAIEpTT2JqZWN0KiBPcGFxdWVKU0NsYXNzOjpwcm90b3R5cGUo
SlNDb24KICAgICAgICAgICAgIHBhcmVudFByb3RvdHlwZSA9IHBhcmVudENsYXNzLT5wcm90b3R5
cGUoY3R4KTsgLy8gY2FuIGJlIG51bGwKICAgICAgICAgaWYgKCFwYXJlbnRQcm90b3R5cGUpCiAg
ICAgICAgICAgICBwYXJlbnRQcm90b3R5cGUgPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+
YnVpbHRpbk9iamVjdFByb3RvdHlwZSgpOwotICAgICAgICBjYWNoZWRQcm90b3R5cGUgPSBuZXcg
SlNDYWxsYmFja09iamVjdChleGVjLCBwcm90b3R5cGVDbGFzcywgcGFyZW50UHJvdG90eXBlLCB0
aGlzKTsgLy8gc2V0IG91cnNlbGYgYXMgdGhlIG9iamVjdCdzIHByaXZhdGUgZGF0YSwgc28gaXQg
Y2FuIGNsZWFyIG91ciByZWZlcmVuY2Ugb24gZGVzdHJ1Y3Rpb24KKyAgICAgICAgY2FjaGVkUHJv
dG90eXBlID0gbmV3IEpTQ2FsbGJhY2tPYmplY3Q8SlNPYmplY3Q+KGV4ZWMsIHByb3RvdHlwZUNs
YXNzLCBwYXJlbnRQcm90b3R5cGUsIHRoaXMpOyAvLyBzZXQgb3Vyc2VsZiBhcyB0aGUgb2JqZWN0
J3MgcHJpdmF0ZSBkYXRhLCBzbyBpdCBjYW4gY2xlYXIgb3VyIHJlZmVyZW5jZSBvbiBkZXN0cnVj
dGlvbgogICAgIH0KICAgICByZXR1cm4gY2FjaGVkUHJvdG90eXBlOwogfQpJbmRleDogSmF2YVNj
cmlwdENvcmUvQVBJL0pTQ29udGV4dFJlZi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUvQVBJL0pTQ29udGV4dFJlZi5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENv
cmUvQVBJL0pTQ29udGV4dFJlZi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAK
ICNpbmNsdWRlICJKU0NvbnRleHRSZWYuaCIKIAogI2luY2x1ZGUgIkpTQ2FsbGJhY2tPYmplY3Qu
aCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgogI2luY2x1ZGUgImNvbXBsZXRpb24uaCIK
ICNpbmNsdWRlICJpbnRlcnByZXRlci5oIgogI2luY2x1ZGUgIm9iamVjdC5oIgpAQCAtMzksMTYg
KzQwLDE2IEBAIEpTR2xvYmFsQ29udGV4dFJlZiBKU0dsb2JhbENvbnRleHRDcmVhdGUKIHsKICAg
ICBKU0xvY2sgbG9jazsKIAotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3Q7CisgICAgSlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdDsKICAgICBpZiAoZ2xvYmFsT2JqZWN0Q2xhc3MpCiAgICAg
ICAgIC8vIFNwZWNpZnkganNOdWxsKCkgYXMgdGhlIHByb3RvdHlwZS4gIEludGVycHJldGVyIHdp
bGwgZml4IGl0IHVwIHRvIHBvaW50IGF0IGJ1aWx0aW5PYmplY3RQcm90b3R5cGUoKSBpbiBpdHMg
Y29uc3RydWN0b3IKLSAgICAgICAgZ2xvYmFsT2JqZWN0ID0gbmV3IEpTQ2FsbGJhY2tPYmplY3Qo
MCwgZ2xvYmFsT2JqZWN0Q2xhc3MsIGpzTnVsbCgpLCAwKTsKKyAgICAgICAgZ2xvYmFsT2JqZWN0
ID0gbmV3IEpTQ2FsbGJhY2tPYmplY3Q8SlNHbG9iYWxPYmplY3Q+KDAsIGdsb2JhbE9iamVjdENs
YXNzLCBqc051bGwoKSwgMCk7CiAgICAgZWxzZQotICAgICAgICBnbG9iYWxPYmplY3QgPSBuZXcg
SlNPYmplY3QoKTsKKyAgICAgICAgZ2xvYmFsT2JqZWN0ID0gbmV3IEpTR2xvYmFsT2JqZWN0KCk7
CiAKICAgICBJbnRlcnByZXRlciogaW50ZXJwcmV0ZXIgPSBuZXcgSW50ZXJwcmV0ZXIoZ2xvYmFs
T2JqZWN0KTsgLy8gYWRkcyB0aGUgYnVpbHQtaW4gb2JqZWN0IHByb3RvdHlwZSB0byB0aGUgZ2xv
YmFsIG9iamVjdAogICAgIGlmIChnbG9iYWxPYmplY3RDbGFzcykKLSAgICAgICAgc3RhdGljX2Nh
c3Q8SlNDYWxsYmFja09iamVjdCo+KGdsb2JhbE9iamVjdCktPmluaXRpYWxpemVJZk5lZWRlZChp
bnRlcnByZXRlci0+Z2xvYmFsRXhlYygpKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SlNDYWxsYmFj
a09iamVjdDxKU0dsb2JhbE9iamVjdD4qPihnbG9iYWxPYmplY3QpLT5pbml0aWFsaXplSWZOZWVk
ZWQoaW50ZXJwcmV0ZXItPmdsb2JhbEV4ZWMoKSk7CiAgICAgSlNHbG9iYWxDb250ZXh0UmVmIGN0
eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SlNHbG9iYWxDb250ZXh0UmVmPihpbnRlcnByZXRlci0+Z2xv
YmFsRXhlYygpKTsKICAgICByZXR1cm4gSlNHbG9iYWxDb250ZXh0UmV0YWluKGN0eCk7CiB9Cklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9BUEkvSlNPYmplY3RSZWYuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEph
dmFTY3JpcHRDb3JlL0FQSS9KU09iamVjdFJlZi5jcHAJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2
YVNjcmlwdENvcmUvQVBJL0pTT2JqZWN0UmVmLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiAr
MzIsNyBAQAogI2luY2x1ZGUgIkpTQ2FsbGJhY2tGdW5jdGlvbi5oIgogI2luY2x1ZGUgIkpTQ2Fs
bGJhY2tPYmplY3QuaCIKICNpbmNsdWRlICJKU0NsYXNzUmVmLmgiCisjaW5jbHVkZSAiSlNHbG9i
YWxPYmplY3QuaCIKIAogI2luY2x1ZGUgImlkZW50aWZpZXIuaCIKICNpbmNsdWRlICJmdW5jdGlv
bi5oIgpAQCAtNzcsNyArNzgsNyBAQCBKU09iamVjdFJlZiBKU09iamVjdE1ha2UoSlNDb250ZXh0
UmVmIGN0CiAgICAgaWYgKCFqc1Byb3RvdHlwZSkKICAgICAgICAganNQcm90b3R5cGUgPSBleGVj
LT5sZXhpY2FsSW50ZXJwcmV0ZXIoKS0+YnVpbHRpbk9iamVjdFByb3RvdHlwZSgpOwogCi0gICAg
cmV0dXJuIHRvUmVmKG5ldyBKU0NhbGxiYWNrT2JqZWN0KGV4ZWMsIGpzQ2xhc3MsIGpzUHJvdG90
eXBlLCBkYXRhKSk7CisgICAgcmV0dXJuIHRvUmVmKG5ldyBKU0NhbGxiYWNrT2JqZWN0PEpTT2Jq
ZWN0PihleGVjLCBqc0NsYXNzLCBqc1Byb3RvdHlwZSwgZGF0YSkpOwogfQogCiBKU09iamVjdFJl
ZiBKU09iamVjdE1ha2VGdW5jdGlvbldpdGhDYWxsYmFjayhKU0NvbnRleHRSZWYgY3R4LCBKU1N0
cmluZ1JlZiBuYW1lLCBKU09iamVjdENhbGxBc0Z1bmN0aW9uQ2FsbGJhY2sgY2FsbEFzRnVuY3Rp
b24pCkBAIC0yMzUsOCArMjM2LDEwIEBAIHZvaWQqIEpTT2JqZWN0R2V0UHJpdmF0ZShKU09iamVj
dFJlZiBvYmoKIHsKICAgICBKU09iamVjdCoganNPYmplY3QgPSB0b0pTKG9iamVjdCk7CiAgICAg
Ci0gICAgaWYgKGpzT2JqZWN0LT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDo6aW5mbykpCi0g
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0Kj4oanNPYmplY3QpLT5n
ZXRQcml2YXRlKCk7CisgICAgaWYgKGpzT2JqZWN0LT5pbmhlcml0cygmSlNDYWxsYmFja09iamVj
dDxKU0dsb2JhbE9iamVjdD46OmluZm8pKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlND
YWxsYmFja09iamVjdDxKU0dsb2JhbE9iamVjdD4qPihqc09iamVjdCktPmdldFByaXZhdGUoKTsK
KyAgICBlbHNlIGlmIChqc09iamVjdC0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmplY3Q8SlNPYmpl
Y3Q+OjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTQ2FsbGJhY2tPYmplY3Q8
SlNPYmplY3Q+Kj4oanNPYmplY3QpLT5nZXRQcml2YXRlKCk7CiAgICAgCiAgICAgcmV0dXJuIDA7
CiB9CkBAIC0yNDUsOCArMjQ4LDExIEBAIGJvb2wgSlNPYmplY3RTZXRQcml2YXRlKEpTT2JqZWN0
UmVmIG9iamUKIHsKICAgICBKU09iamVjdCoganNPYmplY3QgPSB0b0pTKG9iamVjdCk7CiAgICAg
Ci0gICAgaWYgKGpzT2JqZWN0LT5pbmhlcml0cygmSlNDYWxsYmFja09iamVjdDo6aW5mbykpIHsK
LSAgICAgICAgc3RhdGljX2Nhc3Q8SlNDYWxsYmFja09iamVjdCo+KGpzT2JqZWN0KS0+c2V0UHJp
dmF0ZShkYXRhKTsKKyAgICBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZKU0NhbGxiYWNrT2JqZWN0
PEpTR2xvYmFsT2JqZWN0Pjo6aW5mbykpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SlNDYWxsYmFj
a09iamVjdDxKU0dsb2JhbE9iamVjdD4qPihqc09iamVjdCktPnNldFByaXZhdGUoZGF0YSk7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoanNPYmplY3QtPmluaGVyaXRzKCZK
U0NhbGxiYWNrT2JqZWN0PEpTT2JqZWN0Pjo6aW5mbykpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8
SlNDYWxsYmFja09iamVjdDxKU09iamVjdD4qPihqc09iamVjdCktPnNldFByaXZhdGUoZGF0YSk7
CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAgICAgCkluZGV4OiBKYXZhU2NyaXB0
Q29yZS9BUEkvSlNWYWx1ZVJlZi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvQVBJ
L0pTVmFsdWVSZWYuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL0FQSS9K
U1ZhbHVlUmVmLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUg
IkpTVmFsdWVSZWYuaCIKIAogI2luY2x1ZGUgPGtqcy9KU1R5cGUuaD4KKyNpbmNsdWRlIDxranMv
SlNHbG9iYWxPYmplY3QuaD4KICNpbmNsdWRlIDxranMvaW50ZXJuYWwuaD4KICNpbmNsdWRlIDxr
anMvb3BlcmF0aW9ucy5oPgogI2luY2x1ZGUgPGtqcy9wcm90ZWN0Lmg+CkBAIC0xMDQsOSArMTA1
LDEyIEBAIGJvb2wgSlNWYWx1ZUlzT2JqZWN0T2ZDbGFzcyhKU0NvbnRleHRSZWYKIHsKICAgICBK
U1ZhbHVlKiBqc1ZhbHVlID0gdG9KUyh2YWx1ZSk7CiAgICAgCi0gICAgaWYgKEpTT2JqZWN0KiBv
ID0ganNWYWx1ZS0+Z2V0T2JqZWN0KCkpCi0gICAgICAgIGlmIChvLT5pbmhlcml0cygmSlNDYWxs
YmFja09iamVjdDo6aW5mbykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNDYWxs
YmFja09iamVjdCo+KG8pLT5pbmhlcml0cyhqc0NsYXNzKTsKKyAgICBpZiAoSlNPYmplY3QqIG8g
PSBqc1ZhbHVlLT5nZXRPYmplY3QoKSkgeworICAgICAgICBpZiAoby0+aW5oZXJpdHMoJkpTQ2Fs
bGJhY2tPYmplY3Q8SlNHbG9iYWxPYmplY3Q+OjppbmZvKSkKKyAgICAgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxKU0NhbGxiYWNrT2JqZWN0PEpTR2xvYmFsT2JqZWN0Pio+KG8pLT5pbmhlcml0
cyhqc0NsYXNzKTsKKyAgICAgICAgZWxzZSBpZiAoby0+aW5oZXJpdHMoJkpTQ2FsbGJhY2tPYmpl
Y3Q8SlNPYmplY3Q+OjppbmZvKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU0Nh
bGxiYWNrT2JqZWN0PEpTT2JqZWN0Pio+KG8pLT5pbmhlcml0cyhqc0NsYXNzKTsKKyAgICB9CiAg
ICAgcmV0dXJuIGZhbHNlOwogfQogCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDI3MDA3
KQorKysgSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjMxLDYgKzIzMSw4IEBACiAJCTkzRTI2Q0Y3MDhCMjlB
MUMwMEY4NTIyNiAvKiBwY3JlX2dldC5jIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gOTNFMjZDRjYwOEIyOUExQzAwRjg1MjI2IC8qIHBjcmVfZ2V0LmMgKi87
IH07CiAJCTkzRjBCM0FDMDlCQjREQzAwMDY4RkNFMyAvKiBQYXJzZXIuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDkzRjBCM0FBMDlCQjREQzAwMDY4RkNF
MyAvKiBQYXJzZXIuaCAqLzsgfTsKIAkJOTVDMThENDkwQzkwRTgyNjAwRTcyRjczIC8qIEpTUmV0
YWluUHRyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5
NUMxOEQzRTBDOTBFN0VGMDBFNzJGNzMgLyogSlNSZXRhaW5QdHIuaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OworCQlBOEU4OTQzMjBDRDA2MDI0MDAzNjcx
NzkgLyogSlNDYWxsYmFja09iamVjdEZ1bmN0aW9ucy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThFODk0MzEwQ0QwNjAyNDAwMzY3MTc5IC8qIEpTQ2Fs
bGJhY2tPYmplY3RGdW5jdGlvbnMuaCAqLzsgfTsKKwkJQThFODk0MzQwQ0QwNjAzRjAwMzY3MTc5
IC8qIEpTR2xvYmFsT2JqZWN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBBOEU4OTQzMzBDRDA2MDNGMDAzNjcxNzkgLyogSlNHbG9iYWxPYmplY3QuaCAq
LzsgfTsKIAkJQkNGNjU1NTkwQTIwNDk3MTAwMzhBMTk0IC8qIE1hdGhFeHRyYXMuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRjY1NTNCMEEyMDQ4REUw
MDM4QTE5NCAvKiBNYXRoRXh0cmFzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJp
dmF0ZSwgKTsgfTsgfTsKIAkJRDIxMjAyMkIwQUQ0MzEwRDAwRUQ3OUI2IC8qIERhdGVNYXRoLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEMjEyMDIyOTBB
RDQzMTBDMDBFRDc5QjYgLyogRGF0ZU1hdGguaCAqLzsgfTsKIAkJRTExRDUxNzYwQjJFNzk4RDAw
NTZDMTg4IC8qIFN0cmluZ0V4dHJhcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRTExRDUxNzUwQjJFNzk4RDAwNTZDMTg4IC8qIFN0cmluZ0V4dHJhcy5o
ICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC01ODYs
NiArNTg4LDggQEAKIAkJOTNGMEIzQUEwOUJCNERDMDAwNjhGQ0UzIC8qIFBhcnNlci5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJOTNGMTk4MUEwODI0NUFBRTAwMUU5QUJDIC8qIGtleXdvcmRzLnRhYmxlICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRo
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0ga2V5d29yZHMudGFibGU7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgfTsKIAkJOTVDMThEM0UwQzkwRTdF
RjAwRTcyRjczIC8qIEpTUmV0YWluUHRyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IEpTUmV0YWluUHRyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4RTg5NDMx
MENEMDYwMjQwMDM2NzE3OSAvKiBKU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTQ2FsbGJhY2tPYmplY3RGdW5jdGlvbnMuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThFODk0MzMwQ0QwNjAzRjAwMzY3MTc5IC8qIEpT
R2xvYmFsT2JqZWN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTR2xvYmFs
T2JqZWN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRjY1NTNCMEEyMDQ4REUw
MDM4QTE5NCAvKiBNYXRoRXh0cmFzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBNYXRoRXh0cmFzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUQyMTIwMjI4MEFE
NDMxMEMwMEVENzlCNiAvKiBEYXRlTWF0aC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gRGF0ZU1hdGguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlE
MjEyMDIyOTBBRDQzMTBDMDBFRDc5QjYgLyogRGF0ZU1hdGguaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IERhdGVNYXRoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBA
IC03NzAsNiArNzc0LDcgQEAKIAkJCQkxNDQwRjg4RjBBNTA4QjEwMDAwNUYwNjEgLyogSlNDYWxs
YmFja0Z1bmN0aW9uLmggKi8sCiAJCQkJMTRBQkRGNUUwQTQzN0ZFRjAwRUNDQTAxIC8qIEpTQ2Fs
bGJhY2tPYmplY3QuY3BwICovLAogCQkJCTE0QUJERjVEMEE0MzdGRUYwMEVDQ0EwMSAvKiBKU0Nh
bGxiYWNrT2JqZWN0LmggKi8sCisJCQkJQThFODk0MzEwQ0QwNjAyNDAwMzY3MTc5IC8qIEpTQ2Fs
bGJhY2tPYmplY3RGdW5jdGlvbnMuaCAqLywKIAkJCQkxNDQwRkNFMjBBNTFFNDZCMDAwNUYwNjEg
LyogSlNDbGFzc1JlZi5jcHAgKi8sCiAJCQkJMTQ0MEZDRTEwQTUxRTQ2QjAwMDVGMDYxIC8qIEpT
Q2xhc3NSZWYuaCAqLywKIAkJCQkxNEJENUEyOTBBM0U5MUY2MDBCQUY1OUMgLyogSlNDb250ZXh0
UmVmLmNwcCAqLywKQEAgLTc3OSw4ICs3ODQsOCBAQAogCQkJCTk1QzE4RDNFMEM5MEU3RUYwMEU3
MkY3MyAvKiBKU1JldGFpblB0ci5oICovLAogCQkJCTE0ODJCNzRDMEE0MzAzMjgwMDUxN0NGQyAv
KiBKU1N0cmluZ1JlZi5jcHAgKi8sCiAJCQkJMTQ4MkI3NEIwQTQzMDMyODAwNTE3Q0ZDIC8qIEpT
U3RyaW5nUmVmLmggKi8sCi0JCQkJMTQ2QUFCMkEwQjY2QTg0OTAwRTU1RjE2IC8qIEpTU3RyaW5n
UmVmQ0YuaCAqLywKIAkJCQkxNDZBQUIzNzBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZD
Ri5jcHAgKi8sCisJCQkJMTQ2QUFCMkEwQjY2QTg0OTAwRTU1RjE2IC8qIEpTU3RyaW5nUmVmQ0Yu
aCAqLywKIAkJCQkxNEJENUEyQjBBM0U5MUY2MDBCQUY1OUMgLyogSlNWYWx1ZVJlZi5jcHAgKi8s
CiAJCQkJMTQ4MkI2RUEwQTQzMDBCMzAwNTE3Q0ZDIC8qIEpTVmFsdWVSZWYuaCAqLywKIAkJCSk7
CkBAIC05NDUsMjMgKzk1MCwxOSBAQAogCQk2NTQxNzIwMDAzOUUwMUJBMDA1OEJGRUIgLyoga2pz
ICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKLQkJCQk2NUM3QTE3
MTBBOEVBQUNCMDBGQTM3RUEgLyogSlNXcmFwcGVyT2JqZWN0LmNwcCAqLywKLQkJCQk2NUVBNzM2
MjBCQUUzNUQxMDAxQkI1NjAgLyogQ29tbW9uSWRlbnRpZmllcnMuY3BwICovLAotCQkJCTY1RUE3
MzYzMEJBRTM1RDEwMDFCQjU2MCAvKiBDb21tb25JZGVudGlmaWVycy5oICovLAotCQkJCTY1QzdB
MTcyMEE4RUFBQ0IwMEZBMzdFQSAvKiBKU1dyYXBwZXJPYmplY3QuaCAqLywKLQkJCQk2NTQwMEMw
RjBBNjlCQUYyMDA1MDk4ODcgLyogUHJvcGVydHlOYW1lQXJyYXkuY3BwICovLAotCQkJCTY1NDAw
QzEwMEE2OUJBRjIwMDUwOTg4NyAvKiBQcm9wZXJ0eU5hbWVBcnJheS5oICovLAotCQkJCTkzODc3
MkU1MDM4QkZFMTkwMDg2MzVDRSAvKiBhcnJheV9pbnN0YW5jZS5oICovLAotCQkJCTkzQURGQ0U2
MENDQkQ3QUMwMEQzMEIwOCAvKiBhcnJheV9pbnN0YW5jZS5jcHAgKi8sCiAJCQkJNjU5MTI2QkMw
QkREMTcyODAwMTkyMUZCIC8qIEFsbEluT25lRmlsZS5jcHAgKi8sCisJCQkJOTNBREZDRTYwQ0NC
RDdBQzAwRDMwQjA4IC8qIGFycmF5X2luc3RhbmNlLmNwcCAqLywKKwkJCQk5Mzg3NzJFNTAzOEJG
RTE5MDA4NjM1Q0UgLyogYXJyYXlfaW5zdGFuY2UuaCAqLywKIAkJCQlGNjkyQTg0RDAyNTU1OTdE
MDFGRjYwRjcgLyogYXJyYXlfb2JqZWN0LmNwcCAqLywKIAkJCQlGNjkyQTg0RTAyNTU1OTdEMDFG
RjYwRjcgLyogYXJyYXlfb2JqZWN0LmggKi8sCiAJCQkJRjY5MkE4NTAwMjU1NTk3RDAxRkY2MEY3
IC8qIGJvb2xfb2JqZWN0LmNwcCAqLywKIAkJCQk3MDRGRDM1MzA1Njk3RTZEMDAzREJFRDkgLyog
Ym9vbF9vYmplY3QuaCAqLywKIAkJCQlGNjkyQTg1MjAyNTU1OTdEMDFGRjYwRjcgLyogY29sbGVj
dG9yLmNwcCAqLywKIAkJCQlGNjkyQTg1MzAyNTU1OTdEMDFGRjYwRjcgLyogY29sbGVjdG9yLmgg
Ki8sCi0JCQkJNURCRDE4QUEwQzU0MDE4NzAwQzE1RUFFIC8qIENvbGxlY3RvckhlYXBJbnRyb3Nw
ZWN0b3IuaCAqLywKIAkJCQk1REJEMThBOTBDNTQwMTg3MDBDMTVFQUUgLyogQ29sbGVjdG9ySGVh
cEludHJvc3BlY3Rvci5jcHAgKi8sCisJCQkJNURCRDE4QUEwQzU0MDE4NzAwQzE1RUFFIC8qIENv
bGxlY3RvckhlYXBJbnRyb3NwZWN0b3IuaCAqLywKKwkJCQk2NUVBNzM2MjBCQUUzNUQxMDAxQkI1
NjAgLyogQ29tbW9uSWRlbnRpZmllcnMuY3BwICovLAorCQkJCTY1RUE3MzYzMEJBRTM1RDEwMDFC
QjU2MCAvKiBDb21tb25JZGVudGlmaWVycy5oICovLAogCQkJCUY1QkIyQkM1MDMwRjc3MjEwMUZD
RkUxRCAvKiBjb21wbGV0aW9uLmggKi8sCiAJCQkJRjY4RUJCOEMwMjU1RDRDNjAxRkY2MEY3IC8q
IGNvbmZpZy5oICovLAogCQkJCTE0RjEzNzU4MEEzQTcyN0UwMEYyNkY5MCAvKiBDb250ZXh0LmNw
cCAqLywKQEAgLTk3Nyw2ICs5NzgsOCBAQAogCQkJCTY1MUY2NDEzMDM5RDVCNUYwMDc4Mzk1QyAv
KiBkdG9hLmggKi8sCiAJCQkJRjY5MkE4NUEwMjU1NTk3RDAxRkY2MEY3IC8qIGVycm9yX29iamVj
dC5jcHAgKi8sCiAJCQkJRjY5MkE4NUIwMjU1NTk3RDAxRkY2MEY3IC8qIGVycm9yX29iamVjdC5o
ICovLAorCQkJCTE0QkQ1M0Y0MEEzRTEyRDgwMEJBRjU5QyAvKiBFeGVjU3RhdGUuY3BwICovLAor
CQkJCTE0QkQ1M0YzMEEzRTEyRDgwMEJBRjU5QyAvKiBFeGVjU3RhdGUuaCAqLywKIAkJCQk5MzY0
QjI3MzA0NUI3RDZDMDBBOUNBQzEgLyogZnBjb25zdC5jcHAgKi8sCiAJCQkJRjY5MkE4NUUwMjU1
NTk3RDAxRkY2MEY3IC8qIGZ1bmN0aW9uLmNwcCAqLywKIAkJCQlGNjkyQTg1RjAyNTU1OTdEMDFG
RjYwRjcgLyogZnVuY3Rpb24uaCAqLywKQEAgLTk5MCwxMSArOTkzLDE0IEBACiAJCQkJRjY5MkE4
NjMwMjU1NTk3RDAxRkY2MEY3IC8qIGludGVycHJldGVyLmNwcCAqLywKIAkJCQlGNjkyQTg2NDAy
NTU1OTdEMDFGRjYwRjcgLyogaW50ZXJwcmV0ZXIuaCAqLywKIAkJCQlGNUMyOTBFNjAyODRGOThF
MDE4NjM1Q0EgLyogSmF2YVNjcmlwdENvcmVQcmVmaXguaCAqLywKKwkJCQlBOEU4OTQzMzBDRDA2
MDNGMDAzNjcxNzkgLyogSlNHbG9iYWxPYmplY3QuaCAqLywKIAkJCQkxNDc2MDg2MzA5OUM2MzM4
MDA0MzcxMjggLyogSlNJbW1lZGlhdGUuY3BwICovLAogCQkJCTE0ODNCNTg5MDk5QkMxOTUwMDE2
RTRGMCAvKiBKU0ltbWVkaWF0ZS5oICovLAogCQkJCTY1RUE0Qzk5MDkyQUY5RTIwMDkzRDgwMCAv
KiBKU0xvY2suY3BwICovLAogCQkJCTY1RUE0QzlBMDkyQUY5RTIwMDkzRDgwMCAvKiBKU0xvY2su
aCAqLywKIAkJCQkxNEFCQjQ1NDA5OUMyQTBGMDBFMkEyNEYgLyogSlNUeXBlLmggKi8sCisJCQkJ
NjVDN0ExNzEwQThFQUFDQjAwRkEzN0VBIC8qIEpTV3JhcHBlck9iamVjdC5jcHAgKi8sCisJCQkJ
NjVDN0ExNzIwQThFQUFDQjAwRkEzN0VBIC8qIEpTV3JhcHBlck9iamVjdC5oICovLAogCQkJCTkz
RjE5ODFBMDgyNDVBQUUwMDFFOUFCQyAvKiBrZXl3b3Jkcy50YWJsZSAqLywKIAkJCQlGNjkyQTg2
NTAyNTU1OTdEMDFGRjYwRjcgLyogbGV4ZXIuY3BwICovLAogCQkJCUY2OTJBODY2MDI1NTU5N0Qw
MUZGNjBGNyAvKiBsZXhlci5oICovLApAQCAtMTAyMSwxMSArMTAyNywxNCBAQAogCQkJCUY2OTJB
ODdBMDI1NTU5N0QwMUZGNjBGNyAvKiBwcm9wZXJ0eV9tYXAuaCAqLywKIAkJCQk2NTYyMUU2QjA4
OUU4NTk3MDA3NjBGMzUgLyogcHJvcGVydHlfc2xvdC5jcHAgKi8sCiAJCQkJNjU2MjFFNkMwODlF
ODU5NzAwNzYwRjM1IC8qIHByb3BlcnR5X3Nsb3QuaCAqLywKKwkJCQk2NTQwMEMwRjBBNjlCQUYy
MDA1MDk4ODcgLyogUHJvcGVydHlOYW1lQXJyYXkuY3BwICovLAorCQkJCTY1NDAwQzEwMEE2OUJB
RjIwMDUwOTg4NyAvKiBQcm9wZXJ0eU5hbWVBcnJheS5oICovLAogCQkJCTY1QzAyRkJCMDYzNzQ2
MkEwMDNFN0VFNiAvKiBwcm90ZWN0LmggKi8sCiAJCQkJRjY5MkE4N0QwMjU1NTk3RDAxRkY2MEY3
IC8qIHJlZ2V4cC5jcHAgKi8sCiAJCQkJRjY5MkE4N0UwMjU1NTk3RDAxRkY2MEY3IC8qIHJlZ2V4
cC5oICovLAogCQkJCUY2OTJBODdCMDI1NTU5N0QwMUZGNjBGNyAvKiByZWdleHBfb2JqZWN0LmNw
cCAqLywKIAkJCQlGNjkyQTg3QzAyNTU1OTdEMDFGRjYwRjcgLyogcmVnZXhwX29iamVjdC5oICov
LAorCQkJCTE0QkQ1MzRBMEEzRTBBRUEwMEJBRjU5QyAvKiBTYXZlZEJ1aWx0aW5zLmggKi8sCiAJ
CQkJOTM3NEQzQTgwMzhEOUQ3NDAwODYzNUNFIC8qIHNjb3BlX2NoYWluLmNwcCAqLywKIAkJCQk5
Mzc0RDNBNzAzOEQ5RDc0MDA4NjM1Q0UgLyogc2NvcGVfY2hhaW4uaCAqLywKIAkJCQlGNjkyQTg3
RjAyNTU1OTdEMDFGRjYwRjcgLyogc3RyaW5nX29iamVjdC5jcHAgKi8sCkBAIC0xMDM1LDkgKzEw
NDQsNiBAQAogCQkJCUY2OTJBODg2MDI1NTU5N0QwMUZGNjBGNyAvKiB1c3RyaW5nLmggKi8sCiAJ
CQkJRjY5MkE4ODcwMjU1NTk3RDAxRkY2MEY3IC8qIHZhbHVlLmNwcCAqLywKIAkJCQkxNEFCQjM2
RTA5OUMwNzY0MDBFMkEyNEYgLyogdmFsdWUuaCAqLywKLQkJCQkxNEJENTM0QTBBM0UwQUVBMDBC
QUY1OUMgLyogU2F2ZWRCdWlsdGlucy5oICovLAotCQkJCTE0QkQ1M0YzMEEzRTEyRDgwMEJBRjU5
QyAvKiBFeGVjU3RhdGUuaCAqLywKLQkJCQkxNEJENTNGNDBBM0UxMkQ4MDBCQUY1OUMgLyogRXhl
Y1N0YXRlLmNwcCAqLywKIAkJCSk7CiAJCQlwYXRoID0ga2pzOwogCQkJc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsKQEAgLTEyNTYsNiArMTI2Miw4IEBACiAJCQkJOTM4QzRGNkEwQ0EwNkJDNzAwRDkz
MTBBIC8qIEFTQ0lJQ1R5cGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzOEM0RjZDMENBMDZCQ0Uw
MEQ5MzEwQSAvKiBEaXNhbGxvd0NUeXBlLmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTg2MTExRTBD
QzgyNDkwMDA4MTQxMkIgLyogRGVxdWUuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4RTg5NDMyMENE
MDYwMjQwMDM2NzE3OSAvKiBKU0NhbGxiYWNrT2JqZWN0RnVuY3Rpb25zLmggaW4gSGVhZGVycyAq
LywKKwkJCQlBOEU4OTQzNDBDRDA2MDNGMDAzNjcxNzkgLyogSlNHbG9iYWxPYmplY3QuaCBpbiBI
ZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Npbmcg
PSAwOwogCQl9OwpAQCAtMTM3MSw3ICsxMzc5LDYgQEAKIAkJMDg2N0Q2OTBGRTg0MDI4RkMwMkFB
QzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0gewogCQkJaXNhID0gUEJYUHJvamVjdDsKIAkJCWJ1
aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxNDlDMjc3MTA4OTAyQUZFMDA4QTlFRkMgLyogQnVpbGQg
Y29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhQcm9qZWN0ICJKYXZhU2NyaXB0Q29yZSIgKi87Ci0J
CQljb21wYXRpYmlsaXR5VmVyc2lvbiA9ICJYY29kZSAyLjQiOwogCQkJaGFzU2Nhbm5lZEZvckVu
Y29kaW5ncyA9IDE7CiAJCQltYWluR3JvdXAgPSAwODY3RDY5MUZFODQwMjhGQzAyQUFDMDcgLyog
SmF2YVNjcmlwdENvcmUgKi87CiAJCQlwcm9kdWN0UmVmR3JvdXAgPSAwMzQ3NjhERkZGMzhBNTA0
MTFEQjlDOEIgLyogUHJvZHVjdHMgKi87CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9iaW5kaW5ncy9j
L2NfdXRpbGl0eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvYmluZGluZ3MvYy9j
X3V0aWxpdHkuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2JpbmRpbmdz
L2MvY191dGlsaXR5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNyArMzEsOCBAQAogI2luY2x1
ZGUgImNfdXRpbGl0eS5oIgogCiAjaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKLSNpbmNsdWRlICJj
X2luc3RhbmNlLmgiIAorI2luY2x1ZGUgImNfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJKU0dsb2Jh
bE9iamVjdC5oIgogI2luY2x1ZGUgIm5wcnVudGltZV9pbXBsLmgiCiAjaW5jbHVkZSAibnBydW50
aW1lX3ByaXYuaCIKICNpbmNsdWRlICJydW50aW1lX29iamVjdC5oIgpAQCAtMTMwLDkgKzEzMSw4
IEBAIHZvaWQgY29udmVydFZhbHVlVG9OUFZhcmlhbnQoRXhlY1N0YXRlICoKICAgICAgICAgICAg
IFJvb3RPYmplY3QqIG9yaWdpblJvb3RPYmplY3QgPSBmaW5kUm9vdE9iamVjdChvcmlnaW5JbnRl
cnByZXRlcik7CiAKICAgICAgICAgICAgIEludGVycHJldGVyKiBpbnRlcnByZXRlciA9IDA7Ci0g
ICAgICAgICAgICBpZiAob3JpZ2luSW50ZXJwcmV0ZXItPmlzR2xvYmFsT2JqZWN0KHZhbHVlKSkg
ewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gb3JpZ2luSW50ZXJwcmV0ZXItPmludGVy
cHJldGVyRm9yR2xvYmFsT2JqZWN0KHZhbHVlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmIChvYmplY3QtPmlzR2xvYmFsT2JqZWN0KCkpCisgICAgICAgICAgICAgICAgaW50ZXJwcmV0
ZXIgPSBzdGF0aWNfY2FzdDxKU0dsb2JhbE9iamVjdCo+KG9iamVjdCktPmludGVycHJldGVyKCk7
CiAKICAgICAgICAgICAgIGlmICghaW50ZXJwcmV0ZXIpCiAgICAgICAgICAgICAgICAgaW50ZXJw
cmV0ZXIgPSBvcmlnaW5JbnRlcnByZXRlcjsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2JpbmRpbmdz
L2puaS9qbmlfanNvYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2JpbmRp
bmdzL2puaS9qbmlfanNvYmplY3QuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRD
b3JlL2JpbmRpbmdzL2puaS9qbmlfanNvYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2
ICszMCw3IEBACiAjaW5jbHVkZSAiam5pX2pzb2JqZWN0LmgiCiAjaW5jbHVkZSAiam5pX3J1bnRp
bWUuaCIKICNpbmNsdWRlICJqbmlfdXRpbGl0eS5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0
LmgiCiAjaW5jbHVkZSAibGlzdC5oIgogI2luY2x1ZGUgInJ1bnRpbWVfb2JqZWN0LmgiCiAjaW5j
bHVkZSAicnVudGltZV9yb290LmgiCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9iaW5kaW5ncy9vYmpj
L29iamNfdXRpbGl0eS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9iaW5kaW5ncy9v
YmpjL29iamNfdXRpbGl0eS5tbQkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9i
aW5kaW5ncy9vYmpjL29iamNfdXRpbGl0eS5tbQkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcs
NyBAQAogI2luY2x1ZGUgIm9iamNfdXRpbGl0eS5oIgogCiAjaW5jbHVkZSAib2JqY19pbnN0YW5j
ZS5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAicnVudGltZV9hcnJh
eS5oIgogI2luY2x1ZGUgInJ1bnRpbWVfb2JqZWN0LmgiCiAjaW5jbHVkZSAiV2ViU2NyaXB0T2Jq
ZWN0LmgiCkBAIC0xNDAsOCArMTQxLDggQEAgT2JqY1ZhbHVlIGNvbnZlcnRWYWx1ZVRvT2JqY1Zh
bHVlKEV4ZWNTdAogICAgICAgICAgICAgUm9vdE9iamVjdCogb3JpZ2luUm9vdE9iamVjdCA9IGZp
bmRSb290T2JqZWN0KG9yaWdpbkludGVycHJldGVyKTsKIAogICAgICAgICAgICAgSW50ZXJwcmV0
ZXIgKmludGVycHJldGVyID0gMDsKLSAgICAgICAgICAgIGlmIChvcmlnaW5JbnRlcnByZXRlci0+
aXNHbG9iYWxPYmplY3QodmFsdWUpKQotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gb3Jp
Z2luSW50ZXJwcmV0ZXItPmludGVycHJldGVyRm9yR2xvYmFsT2JqZWN0KHZhbHVlKTsKKyAgICAg
ICAgICAgIGlmICh2YWx1ZS0+aXNPYmplY3QoKSAmJiBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHZh
bHVlKS0+aXNHbG9iYWxPYmplY3QoKSkKKyAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IHN0
YXRpY19jYXN0PEpTR2xvYmFsT2JqZWN0Kj4odmFsdWUpLT5pbnRlcnByZXRlcigpOwogCiAgICAg
ICAgICAgICBpZiAoIWludGVycHJldGVyKQogICAgICAgICAgICAgICAgIGludGVycHJldGVyID0g
b3JpZ2luSW50ZXJwcmV0ZXI7CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvQ29udGV4dC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL0NvbnRleHQuY3BwCShyZXZpc2lvbiAy
NzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9Db250ZXh0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIEtKUyB7CiAKIC8vIEVDTUEgMTAuMgotQ29udGV4
dDo6Q29udGV4dChKU09iamVjdCogZ2xvYiwgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyLCBKU09i
amVjdCogdGhpc1YsIAorQ29udGV4dDo6Q29udGV4dChKU0dsb2JhbE9iamVjdCogZ2xvYiwgSW50
ZXJwcmV0ZXIqIGludGVycHJldGVyLCBKU09iamVjdCogdGhpc1YsIAogICAgICAgICAgICAgICAg
ICBGdW5jdGlvbkJvZHlOb2RlKiBjdXJyZW50Qm9keSwgQ29kZVR5cGUgdHlwZSwgQ29udGV4dCog
Y2FsbGluZ0NvbiwgCiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uSW1wKiBmdW5jLCBjb25zdCBM
aXN0KiBhcmdzKQogICAgIDogbV9pbnRlcnByZXRlcihpbnRlcnByZXRlcikKSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL2tqcy9FeGVjU3RhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L2tqcy9FeGVjU3RhdGUuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tq
cy9FeGVjU3RhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCwxNSArMzAsMTQgQEAgbmFtZXNw
YWNlIEtKUyB7CiAKIEludGVycHJldGVyKiBFeGVjU3RhdGU6OmxleGljYWxJbnRlcnByZXRlcigp
IGNvbnN0CiB7Ci0gIGlmICghbV9jb250ZXh0KQotICAgIHJldHVybiBkeW5hbWljSW50ZXJwcmV0
ZXIoKTsKLQotICBJbnRlcnByZXRlciogcmVzdWx0ID0gSW50ZXJwcmV0ZXI6OmludGVycHJldGVy
V2l0aEdsb2JhbE9iamVjdChtX2NvbnRleHQtPnNjb3BlQ2hhaW4oKS5ib3R0b20oKSk7CisgICAg
aWYgKCFtX2NvbnRleHQpCisgICAgICAgIHJldHVybiBkeW5hbWljSW50ZXJwcmV0ZXIoKTsKKyAg
ICAKKyAgICBKU09iamVjdCogb2JqZWN0ID0gbV9jb250ZXh0LT5zY29wZUNoYWluKCkuYm90dG9t
KCk7CisgICAgaWYgKG9iamVjdCAmJiBvYmplY3QtPmlzR2xvYmFsT2JqZWN0KCkpCisgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxKU0dsb2JhbE9iamVjdCo+KG9iamVjdCktPmludGVycHJldGVy
KCk7CiAKLSAgaWYgKCFyZXN1bHQpCiAgICAgcmV0dXJuIGR5bmFtaWNJbnRlcnByZXRlcigpOwot
Ci0gIHJldHVybiByZXN1bHQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIEtKUwpJbmRleDogSmF2YVNj
cmlwdENvcmUva2pzL0pTR2xvYmFsT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENv
cmUva2pzL0pTR2xvYmFsT2JqZWN0LmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0Q29yZS9r
anMvSlNHbG9iYWxPYmplY3QuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0MyBAQAorLy8gLSot
IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLQorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgRXJpYyBT
ZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAg
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgS0pTX0dsb2Jh
bE9iamVjdF9oCisjZGVmaW5lIEtKU19HbG9iYWxPYmplY3RfaAorCisjaW5jbHVkZSAib2JqZWN0
LmgiCisKK25hbWVzcGFjZSBLSlMgeworICAgIGNsYXNzIEludGVycHJldGVyOworICAgIGNsYXNz
IEpTR2xvYmFsT2JqZWN0IDogcHVibGljIEpTT2JqZWN0IHsKKyAgICBwdWJsaWM6CisgICAgICAg
IEpTR2xvYmFsT2JqZWN0KCkgeyB9CisgICAgICAgIEpTR2xvYmFsT2JqZWN0KEpTVmFsdWUqIHBy
b3RvKSA6IEpTT2JqZWN0KHByb3RvKSB7IH0KKyAgICAgICAgCisgICAgICAgIHZpcnR1YWwgYm9v
bCBpc0dsb2JhbE9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgCisgICAg
ICAgIEludGVycHJldGVyKiBpbnRlcnByZXRlcigpIGNvbnN0IHsgcmV0dXJuIG1faW50ZXJwcmV0
ZXI7IH0KKyAgICAgICAgdm9pZCBzZXRJbnRlcnByZXRlcihJbnRlcnByZXRlciogaSkgeyBtX2lu
dGVycHJldGVyID0gaTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIEludGVycHJldGVyKiBtX2lu
dGVycHJldGVyOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSBLSlMKKworI2VuZGlmIC8vIEtKU19H
bG9iYWxPYmplY3RfaApJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL2FycmF5X2luc3RhbmNlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvYXJyYXlfaW5zdGFuY2UuY3BwCShy
ZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9hcnJheV9pbnN0YW5jZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQ5MSw3ICs0OTEsNyBAQCBzdHJ1Y3QgQ29tcGFyZVdpdGhDb21w
YXJlRnVuY3Rpb25Bcmd1bWVuCiAgICAgRXhlY1N0YXRlICpleGVjOwogICAgIEpTT2JqZWN0ICpj
b21wYXJlRnVuY3Rpb247CiAgICAgTGlzdCBhcmd1bWVudHM7Ci0gICAgSlNPYmplY3QgKmdsb2Jh
bE9iamVjdDsKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0OwogfTsKIAogc3RhdGlj
IENvbXBhcmVXaXRoQ29tcGFyZUZ1bmN0aW9uQXJndW1lbnRzKiBjb21wYXJlV2l0aENvbXBhcmVG
dW5jdGlvbkFyZ3VtZW50cyA9IDA7CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvY29udGV4dC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9jb250ZXh0LmgJKHJldmlzaW9uIDI3
MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAt
NTAsNyArNTAsNyBAQCBuYW1lc3BhY2UgS0pTICB7CiAgICAqLwogICBjbGFzcyBDb250ZXh0IHsK
ICAgcHVibGljOgotICAgIENvbnRleHQoSlNPYmplY3QqIGdsb2JhbCwgSW50ZXJwcmV0ZXIqLCBK
U09iamVjdCogdGhpc1YsCisgICAgQ29udGV4dChKU0dsb2JhbE9iamVjdCosIEludGVycHJldGVy
KiwgSlNPYmplY3QqIHRoaXNWLAogICAgICAgICAgICAgRnVuY3Rpb25Cb2R5Tm9kZSogY3VycmVu
dEJvZHksIENvZGVUeXBlIHR5cGUgPSBHbG9iYWxDb2RlLAogICAgICAgICAgICAgQ29udGV4dCog
Y2FsbGluZ0NvbnRleHQgPSAwLCBGdW5jdGlvbkltcCogZnVuY3Rpb24gPSAwLCBjb25zdCBMaXN0
KiBhcmdzID0gMCk7CiAgICAgfkNvbnRleHQoKTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9m
dW5jdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2Z1bmN0aW9uLmNw
cAkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvZnVuY3Rpb24uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiZHRvYS5oIgogI2luY2x1
ZGUgImZ1bmN0aW9uX29iamVjdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAi
SlNHbG9iYWxPYmplY3QuaCIKICNpbmNsdWRlICJsZXhlci5oIgogI2luY2x1ZGUgIm5vZGVzLmgi
CiAjaW5jbHVkZSAib3BlcmF0aW9ucy5oIgpAQCAtNjUsNyArNjYsNyBAQCB2b2lkIEZ1bmN0aW9u
SW1wOjptYXJrKCkKIAogSlNWYWx1ZSogRnVuY3Rpb25JbXA6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNT
dGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmosIGNvbnN0IExpc3QmIGFyZ3MpCiB7Ci0gIEpT
T2JqZWN0KiBnbG9iYWxPYmogPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2Jq
ZWN0KCk7CisgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmogPSBleGVjLT5keW5hbWljSW50ZXJw
cmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCk7CiAKICAgLy8gZW50ZXIgYSBuZXcgZXhlY3V0aW9uIGNv
bnRleHQKICAgQ29udGV4dCBjdHgoZ2xvYmFsT2JqLCBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIo
KSwgdGhpc09iaiwgYm9keS5nZXQoKSwKQEAgLTc1NCwxMCArNzU1LDEwIEBAIEpTVmFsdWUqIEds
b2JhbEZ1bmNJbXA6OmNhbGxBc0Z1bmN0aW9uKEUKICAgICAgICAgaWYgKCFwcm9nTm9kZSkKICAg
ICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBTeW50YXhFcnJvciwgZXJyTXNnLCBlcnJM
aW5lLCBzaWQsIE5VTEwpOwogCi0gICAgICAgIGJvb2wgc3dpdGNoR2xvYmFsID0gdGhpc09iaiAm
JiBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+aXNHbG9iYWxPYmplY3QodGhpc09iaikgJiYg
dGhpc09iaiAhPSBleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKS0+Z2xvYmFsT2JqZWN0KCk7Cisg
ICAgICAgIGJvb2wgc3dpdGNoR2xvYmFsID0gdGhpc09iaiAmJiB0aGlzT2JqICE9IGV4ZWMtPmR5
bmFtaWNJbnRlcnByZXRlcigpLT5nbG9iYWxPYmplY3QoKTsKICAgICAgICAgICAKICAgICAgICAg
Ly8gZW50ZXIgYSBuZXcgZXhlY3V0aW9uIGNvbnRleHQKLSAgICAgICAgSW50ZXJwcmV0ZXIqIGlu
dGVycHJldGVyID0gc3dpdGNoR2xvYmFsID8gZXhlYy0+ZHluYW1pY0ludGVycHJldGVyKCktPmlu
dGVycHJldGVyRm9yR2xvYmFsT2JqZWN0KHRoaXNPYmopIDogZXhlYy0+ZHluYW1pY0ludGVycHJl
dGVyKCk7CisgICAgICAgIEludGVycHJldGVyKiBpbnRlcnByZXRlciA9IHN3aXRjaEdsb2JhbCA/
IHN0YXRpY19jYXN0PEpTR2xvYmFsT2JqZWN0Kj4odGhpc09iaiktPmludGVycHJldGVyKCkgOiBl
eGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKTsKICAgICAgICAgSlNPYmplY3QqIHRoaXNWYWwgPSBz
dGF0aWNfY2FzdDxKU09iamVjdCo+KGV4ZWMtPmNvbnRleHQoKS0+dGhpc1ZhbHVlKCkpOwogICAg
ICAgICBDb250ZXh0IGN0eChpbnRlcnByZXRlci0+Z2xvYmFsT2JqZWN0KCksCiAgICAgICAgICAg
ICAgICAgICAgICAgIGludGVycHJldGVyLApJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL2ludGVy
cHJldGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvaW50ZXJwcmV0ZXIu
Y3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9pbnRlcnByZXRlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTc5LDggKzc5LDggQEAgc3RhdGljIGlubGluZSBJbnRlcnBy
ZXRlck1hcCAmaW50ZXJwcmV0ZQogICAgIHN0YXRpYyBJbnRlcnByZXRlck1hcCogbWFwID0gbmV3
IEludGVycHJldGVyTWFwOwogICAgIHJldHVybiogbWFwOwogfQotICAgIAotSW50ZXJwcmV0ZXI6
OkludGVycHJldGVyKEpTT2JqZWN0KiBnbG9iYWxPYmplY3QpCisKK0ludGVycHJldGVyOjpJbnRl
cnByZXRlcihKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQogICAgIDogbV9nbG9iYWxFeGVj
KHRoaXMsIDApCiAgICAgLCBtX2dsb2JhbE9iamVjdChnbG9iYWxPYmplY3QpCiB7CkBAIC04OSw3
ICs4OSw3IEBAIEludGVycHJldGVyOjpJbnRlcnByZXRlcihKU09iamVjdCogZ2xvYmEKIAogSW50
ZXJwcmV0ZXI6OkludGVycHJldGVyKCkKICAgICA6IG1fZ2xvYmFsRXhlYyh0aGlzLCAwKQotICAg
ICwgbV9nbG9iYWxPYmplY3QobmV3IEpTT2JqZWN0KCkpCisgICAgLCBtX2dsb2JhbE9iamVjdChu
ZXcgSlNHbG9iYWxPYmplY3QoKSkKIHsKICAgICBpbml0KCk7CiB9CkBAIC0xMTgsNyArMTE4LDYg
QEAgdm9pZCBJbnRlcnByZXRlcjo6aW5pdCgpCiAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0
IGludGVycHJldGVyCiAgICAgICAgIHNfaG9vayA9IG5leHQgPSBwcmV2ID0gdGhpczsKICAgICB9
Ci0gICAgaW50ZXJwcmV0ZXJNYXAoKS5zZXQobV9nbG9iYWxPYmplY3QsIHRoaXMpOwogCiAgICAg
aW5pdEdsb2JhbE9iamVjdCgpOwogfQpAQCAtMTM3LDE5ICsxMzYsMjAgQEAgSW50ZXJwcmV0ZXI6
On5JbnRlcnByZXRlcigpCiAgICAgICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IGludGVycHJldGVy
CiAgICAgICAgIHNfaG9vayA9IDA7CiAgICAgfQotICAgIGludGVycHJldGVyTWFwKCkucmVtb3Zl
KG1fZ2xvYmFsT2JqZWN0KTsKIH0KIAotSlNPYmplY3QqIEludGVycHJldGVyOjpnbG9iYWxPYmpl
Y3QoKSBjb25zdAorSlNHbG9iYWxPYmplY3QqIEludGVycHJldGVyOjpnbG9iYWxPYmplY3QoKSBj
b25zdAogewotICByZXR1cm4gbV9nbG9iYWxPYmplY3Q7CisgICAgcmV0dXJuIG1fZ2xvYmFsT2Jq
ZWN0OwogfQogCiB2b2lkIEludGVycHJldGVyOjppbml0R2xvYmFsT2JqZWN0KCkKIHsKKyAgICBt
X2dsb2JhbE9iamVjdC0+c2V0SW50ZXJwcmV0ZXIodGhpcyk7CisKICAgICAvLyBDbGVhciBiZWZv
cmUgaW5pdGl0YWxpemluZywgdG8gYXZvaWQgbWFya2luZyB1bmluaXRpYWxpemVkIChkYW5nZXJv
dXMpIG9yIAogICAgIC8vIHN0YWxlICh3YXN0ZWZ1bCkgcG9pbnRlcnMgZHVyaW5nIGluaXRpYWxp
emF0aW9uLgotCisgICAgCiAgICAgLy8gUHJvdG90eXBlcwogICAgIG1fRnVuY3Rpb25Qcm90b3R5
cGUgPSAwOwogICAgIG1fT2JqZWN0UHJvdG90eXBlID0gMDsKQEAgLTM0Nyw3ICszNDcsNyBAQCBD
b21wbGV0aW9uIEludGVycHJldGVyOjpldmFsdWF0ZShjb25zdCBVCiAgICAgCiAgICAgbV9yZWN1
cnNpb24rKzsKICAgICAKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqID0gbV9nbG9iYWxPYmplY3Q7
CisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iaiA9IG1fZ2xvYmFsT2JqZWN0OwogICAgIEpT
T2JqZWN0KiB0aGlzT2JqID0gZ2xvYmFsT2JqOwogICAgIAogICAgIC8vICJ0aGlzIiBtdXN0IGJl
IGFuIG9iamVjdC4uLiB1c2Ugc2FtZSBydWxlcyBhcyBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHko
KQpAQCAtNjEwLDExICs2MTAsNiBAQCB2b2lkIEludGVycHJldGVyOjptYXJrKCkKICAgICAgICAg
bV9VcmlFcnJvclByb3RvdHlwZS0+bWFyaygpOwogfQogCi1JbnRlcnByZXRlciogSW50ZXJwcmV0
ZXI6OmludGVycHJldGVyV2l0aEdsb2JhbE9iamVjdChKU09iamVjdCogZ2xvYmFsT2JqZWN0KQot
ewotICAgIHJldHVybiBpbnRlcnByZXRlck1hcCgpLmdldChnbG9iYWxPYmplY3QpOwotfQotCiAj
aWZkZWYgS0pTX0RFQlVHX01FTQogI2luY2x1ZGUgImxleGVyLmgiCiB2b2lkIEludGVycHJldGVy
OjpmaW5hbENoZWNrKCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9pbnRlcnByZXRlci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9pbnRlcnByZXRlci5oCShyZXZpc2lvbiAy
NzAwNykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9pbnRlcnByZXRlci5oCSh3b3JraW5nIGNvcHkp
CkBAIC00NSw2ICs0NSw3IEBAIG5hbWVzcGFjZSBLSlMgewogICBjbGFzcyBFdmFsRXJyb3JQcm90
b3R5cGU7CiAgIGNsYXNzIEZ1bmN0aW9uT2JqZWN0SW1wOwogICBjbGFzcyBGdW5jdGlvblByb3Rv
dHlwZTsKKyAgY2xhc3MgSlNHbG9iYWxPYmplY3Q7CiAgIGNsYXNzIE5hdGl2ZUVycm9ySW1wOwog
ICBjbGFzcyBOYXRpdmVFcnJvclByb3RvdHlwZTsKICAgY2xhc3MgTnVtYmVyT2JqZWN0SW1wOwpA
QCAtOTQsNyArOTUsNyBAQCBuYW1lc3BhY2UgS0pTIHsKICAgICAgKgogICAgICAqIEBwYXJhbSBn
bG9iYWwgVGhlIG9iamVjdCB0byB1c2UgYXMgdGhlIGdsb2JhbCBvYmplY3QgZm9yIHRoaXMgaW50
ZXJwcmV0ZXIKICAgICAgKi8KLSAgICBJbnRlcnByZXRlcihKU09iamVjdCogZ2xvYmFsT2JqZWN0
KTsKKyAgICBJbnRlcnByZXRlcihKU0dsb2JhbE9iamVjdCopOwogICAgIC8qKgogICAgICAqIENy
ZWF0ZXMgYSBuZXcgaW50ZXJwcmV0ZXIuIEEgZ2xvYmFsIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQg
YW5kCiAgICAgICogaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhbmRhcmQgZ2xvYmFsIHByb3BlcnRp
ZXMuCkBAIC0xMTEsNyArMTEyLDcgQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgICogUmV0dXJucyB0
aGUgb2JqZWN0IHRoYXQgaXMgdXNlZCBhcyB0aGUgZ2xvYmFsIG9iamVjdCBkdXJpbmcgYWxsIHNj
cmlwdAogICAgICAqIGV4ZWN1dGlvbiBwZXJmb3JtZWQgYnkgdGhpcyBpbnRlcnByZXRlcgogICAg
ICAqLwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QoKSBjb25zdDsKKyAgICBKU0dsb2JhbE9i
amVjdCogZ2xvYmFsT2JqZWN0KCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRo
ZSBleGVjdXRpb24gc3RhdGUgb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUKQEAg
LTMwMCwyNCArMzAxLDYgQEAgbmFtZXNwYWNlIEtKUyB7CiAKICAgICB2b2lkIHNhdmVCdWlsdGlu
cyAoU2F2ZWRCdWlsdGlucyYpIGNvbnN0OwogICAgIHZvaWQgcmVzdG9yZUJ1aWx0aW5zIChjb25z
dCBTYXZlZEJ1aWx0aW5zJik7Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHZh
bHVlIGlzIGEgZ2xvYmFsIG9iamVjdCAoZm9yIGFueSBpbnRlcnByZXRlcikuICBUaGlzIG1heQot
ICAgICAqIGJlIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgZm9yIG11bHRpcGxlIHVzZXMgb2YgSlND
IGluIGEgcHJvY2VzcyB0aGF0IGFyZQotICAgICAqIGxvZ2ljYWxseSBpbmRlcGVuZGVudCBvZiBl
YWNoIG90aGVyLiAgSW4gdGhlIGNhc2Ugb2YgV2ViQ29yZSwgdGhpcyBtZXRob2QKLSAgICAgKiBp
cyB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgdGhlIFdpbmRvdyBvYmplY3Qgc28g
d2UgY2FuIHBlcmZvcm0KLSAgICAgKiBzZWN1cml0eSBjaGVja3MuCi0gICAgICovCi0gICAgdmly
dHVhbCBib29sIGlzR2xvYmFsT2JqZWN0KEpTVmFsdWUqKSB7IHJldHVybiBmYWxzZTsgfQotICAg
IAotICAgIC8qKiAKLSAgICAgKiBGaW5kIHRoZSBpbnRlcnByZXRlciBmb3IgYSBwYXJ0aWN1bGFy
IGdsb2JhbCBvYmplY3QuICBUaGlzIHNob3VsZCByZWFsbHkKLSAgICAgKiBiZSBhIHN0YXRpYyBt
ZXRob2QsIGJ1dCB3ZSBjYW4ndCBkbyB0aGF0IGlzIEMrKy4gIEFnYWluLCBhcyB3aXRoIGlzR2xv
YmFsT2JqZWN0KCkKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiByZWFsbHkgbmVlZCB0byBrbm93IGFi
b3V0IGFsbCBpbnN0YW5jZXMgb2YgSW50ZXJwcmV0ZXIKLSAgICAgKiBjcmVhdGVkIGluIGFuIGFw
cGxpY2F0aW9uIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcyBtZXRob2QuICBUaGUgb25seQot
ICAgICAqIG92ZXJyaWRlIG9mIHRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseSBpbiBXZWJDb3JlLgot
ICAgICAqLwotICAgIHZpcnR1YWwgSW50ZXJwcmV0ZXIqIGludGVycHJldGVyRm9yR2xvYmFsT2Jq
ZWN0KGNvbnN0IEpTVmFsdWUqKSB7IHJldHVybiAwOyB9CiAgICAgCiAgICAgLyoqCiAgICAgICog
RGV0ZXJtaW5lIGlmIHRoZSBpdCBpcyAnc2FmZScgdG8gZXhlY3V0ZSBjb2RlIGluIHRoZSB0YXJn
ZXQgaW50ZXJwcmV0ZXIgZnJvbSBhbgpAQCAtMzM3LDkgKzMyMCw3IEBAIG5hbWVzcGFjZSBLSlMg
ewogICAgIAogICAgIHZvaWQgc2V0Q29udGV4dChDb250ZXh0KiBjKSB7IG1fY29udGV4dCA9IGM7
IH0KICAgICBDb250ZXh0KiBjb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZXh0OyB9Ci0g
ICAgCi0gICAgc3RhdGljIEludGVycHJldGVyKiBpbnRlcnByZXRlcldpdGhHbG9iYWxPYmplY3Qo
SlNPYmplY3QqKTsKLSAgICAKKyAgICAgICAgCiAgICAgdm9pZCBzZXRUaW1lb3V0VGltZSh1bnNp
Z25lZCB0aW1lb3V0VGltZSkgeyBtX3RpbWVvdXRUaW1lID0gdGltZW91dFRpbWU7IH0KIAogICAg
IHZvaWQgc3RhcnRUaW1lb3V0Q2hlY2soKTsKQEAgLTM4OCw3ICszNjksNyBAQCBwcml2YXRlOgog
ICAgIHVuc2lnbmVkIG1fdGlja0NvdW50OwogICAgIHVuc2lnbmVkIG1fdGlja3NVbnRpbE5leHRU
aW1lb3V0Q2hlY2s7CiAKLSAgICBKU09iamVjdCogbV9nbG9iYWxPYmplY3Q7CisgICAgSlNHbG9i
YWxPYmplY3QqIG1fZ2xvYmFsT2JqZWN0OwogCiAgICAgT2JqZWN0T2JqZWN0SW1wKiBtX09iamVj
dDsKICAgICBGdW5jdGlvbk9iamVjdEltcCogbV9GdW5jdGlvbjsKSW5kZXg6IEphdmFTY3JpcHRD
b3JlL2tqcy9sb29rdXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvbG9va3Vw
LmgJKHJldmlzaW9uIDI3MDA3KQorKysgSmF2YVNjcmlwdENvcmUva2pzL2xvb2t1cC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xOSwxMiArMTksMTMgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBfS0pTTE9P
S1VQX0hfCi0jZGVmaW5lIF9LSlNMT09LVVBfSF8KKyNpZm5kZWYgS0pTX2xvb2t1cF9oCisjZGVm
aW5lIEtKU19sb29rdXBfaAogCiAjaW5jbHVkZSAiY29udGV4dC5oIgogI2luY2x1ZGUgImlkZW50
aWZpZXIuaCIKICNpbmNsdWRlICJpbnRlcnByZXRlci5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2Jq
ZWN0LmgiCiAjaW5jbHVkZSAib2JqZWN0LmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRl
IDx3dGYvQXNzZXJ0aW9ucy5oPgpAQCAtMjY5LDcgKzI3MCw3IEBAIG5hbWVzcGFjZSBLSlMgewog
ICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xhc3NDdG9yPgogICBpbmxpbmUgSlNPYmplY3QqIGNhY2hlR2xv
YmFsT2JqZWN0KEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1l
KQogICB7Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IHN0YXRpY19jYXN0PEpTT2JqZWN0
Kj4oZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmdsb2JhbE9iamVjdCgpKTsKKyAgICBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmds
b2JhbE9iamVjdCgpOwogICAgIEpTVmFsdWUqIG9iaiA9IGdsb2JhbE9iamVjdC0+Z2V0RGlyZWN0
KHByb3BlcnR5TmFtZSk7CiAgICAgaWYgKG9iaikgewogICAgICAgQVNTRVJUKG9iai0+aXNPYmpl
Y3QoKSk7CkBAIC0zNTEsNCArMzUyLDQgQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgaW50IGlkOyBc
CiAgIH07CiAKLSNlbmRpZgorI2VuZGlmIC8vIEtKU19sb29rdXBfaApJbmRleDogSmF2YVNjcmlw
dENvcmUva2pzL29iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9vYmpl
Y3QuaAkocmV2aXNpb24gMjcwMDcpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvb2JqZWN0LmgJKHdv
cmtpbmcgY29weSkKQEAgLTQ1Nyw2ICs0NTcsNyBAQCBuYW1lc3BhY2UgS0pTIHsKICAgICB2b2lk
IHJlc3RvcmVQcm9wZXJ0aWVzKGNvbnN0IFNhdmVkUHJvcGVydGllcyAmcCkgeyBfcHJvcC5yZXN0
b3JlKHApOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNBY3RpdmF0aW9uKCkgeyByZXR1cm4gZmFs
c2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNHbG9iYWxPYmplY3QoKSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQogICBwcm90ZWN0ZWQ6CiAgICAgUHJvcGVydHlNYXAgX3Byb3A7CiAgIHByaXZhdGU6
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvdGVzdGtqcy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUva2pzL3Rlc3RranMuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIEphdmFTY3Jp
cHRDb3JlL2tqcy90ZXN0a2pzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNiArMjYsNyBAQAog
I2luY2x1ZGUgIkpTTG9jay5oIgogI2luY2x1ZGUgIlBhcnNlci5oIgogI2luY2x1ZGUgImNvbGxl
Y3Rvci5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAib2JqZWN0Lmgi
CiAjaW5jbHVkZSAicHJvdGVjdC5oIgogI2luY2x1ZGUgPG1hdGguaD4KQEAgLTExMCw3ICsxMTEs
NyBAQCBsb25nIFN0b3BXYXRjaDo6Z2V0RWxhcHNlZE1TKCkKICNlbmRpZgogfQogCi1jbGFzcyBH
bG9iYWxJbXAgOiBwdWJsaWMgSlNPYmplY3QgeworY2xhc3MgR2xvYmFsSW1wIDogcHVibGljIEpT
R2xvYmFsT2JqZWN0IHsKIHB1YmxpYzoKICAgdmlydHVhbCBVU3RyaW5nIGNsYXNzTmFtZSgpIGNv
bnN0IHsgcmV0dXJuICJnbG9iYWwiOyB9CiB9OwpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3MDIwKQorKysgV2ViQ29y
ZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyNSBAQAorMjAwNy0xMC0yNCAg
RXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBNYWtlIFdpbmRvdyBzdWJjbGFzcyBmcm9t
IEpTR2xvYmFsT2JqZWN0IChmb3IgYSAuNSUgd2luIGluIFN1bnNwaWRlcikKKyAgICAgICAgaHR0
cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2ODEKKworICAgICAgICBObyB0
ZXN0IGNhc2VzIG5lY2Vzc2FyeSwgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzLgorCisgICAgICAgICog
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGJpbmRpbmdzL2pz
L2tqc19iaW5kaW5nLmNwcDoKKyAgICAgICAgKEtKUzo6U2NyaXB0SW50ZXJwcmV0ZXI6OlNjcmlw
dEludGVycHJldGVyKToKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9ranNfYmluZGluZy5oOgorICAg
ICAgICAqIGJpbmRpbmdzL2pzL2tqc19wcm94eS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpLSlNQ
cm94eTo6aW5pdFNjcmlwdElmTmVlZGVkKToKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9ranNfd2lu
ZG93LmNwcDoKKyAgICAgICAgKEtKUzo6V2luZG93OjpXaW5kb3cpOgorICAgICAgICAqIGJpbmRp
bmdzL2pzL2tqc193aW5kb3cuaDoKKyAgICAgICAgKiBiaW5kaW5ncy9vYmpjL1dlYlNjcmlwdE9i
amVjdC5tbToKKyAgICAgICAgKF9kaWRFeGVjdXRlKToKKyAgICAgICAgKiBicmlkZ2UvbWFjL1dl
YkNvcmVTY3JpcHREZWJ1Z2dlci5tbToKKwogMjAwNy0xMC0yNCAgQWRhbSBSb2JlbiAgPGFyb2Jl
bkBhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIGZvbnQgZGF0YWJhc2UgaW5pdGlhbGl6YXRpb24g
Y29kZSB0byBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkocmV2aXNpb24gMjcwMDcpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTM2MTMsNyArMTM2MTMsNiBAQAogCQkw
ODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CiAJCQlpc2Eg
PSBQQlhQcm9qZWN0OwogCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDE0OUMyODQzMDg5MDJC
MTEwMDhBOUVGQyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIldl
YkNvcmUiICovOwotCQkJY29tcGF0aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMi40IjsKIAkJCWhh
c1NjYW5uZWRGb3JFbmNvZGluZ3MgPSAxOwogCQkJa25vd25SZWdpb25zID0gKAogCQkJCUVuZ2xp
c2gsCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5kaW5nLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5kaW5nLmNwcAkocmV2aXNpb24gMjcwMDcp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19iaW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTMwLDcgKzEzMCw3IEBAIHN0YXRpYyBOb2RlUGVyRG9jTWFwJiBkb21Ob2Rlc1BlckRvY3Vt
ZW4KICAgICByZXR1cm4gc3RhdGljRE9NTm9kZXNQZXJEb2N1bWVudDsKIH0KIAotU2NyaXB0SW50
ZXJwcmV0ZXI6OlNjcmlwdEludGVycHJldGVyKEpTT2JqZWN0KiBnbG9iYWwsIEZyYW1lKiBmcmFt
ZSkKK1NjcmlwdEludGVycHJldGVyOjpTY3JpcHRJbnRlcnByZXRlcihKU0dsb2JhbE9iamVjdCog
Z2xvYmFsLCBGcmFtZSogZnJhbWUpCiAgICAgOiBJbnRlcnByZXRlcihnbG9iYWwpCiAgICAgLCBt
X2ZyYW1lKGZyYW1lKQogICAgICwgbV9jdXJyZW50RXZlbnQoMCkKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvanMva2pzX2JpbmRpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pz
L2tqc19iaW5kaW5nLmgJKHJldmlzaW9uIDI3MDA3KQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9r
anNfYmluZGluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC01MCw3ICs1MCw3IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIG5hbWVzcGFjZSBLSlMgewogCiAgICAgLyoqCi0gICAgICogQmFzZSBjbGFzcyBm
b3IgYWxsIG9iamVjdHMgaW4gdGhpcyBiaW5kaW5nLgorICAgICAqIEJhc2UgY2xhc3MgZm9yIGFs
bCBvYmplY3RzIGluIHRoaXMgYmluZGluZyBFWENFUFQgV2luZG93CiAgICAgICovCiAgICAgY2xh
c3MgRE9NT2JqZWN0IDogcHVibGljIEpTT2JqZWN0IHsKICAgICBwcm90ZWN0ZWQ6CkBAIC03Miw3
ICs3Miw3IEBAIG5hbWVzcGFjZSBLSlMgewogICAgICAqLwogICAgIGNsYXNzIFNjcmlwdEludGVy
cHJldGVyIDogcHVibGljIEludGVycHJldGVyIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFNjcmlw
dEludGVycHJldGVyKEpTT2JqZWN0KiBnbG9iYWwsIFdlYkNvcmU6OkZyYW1lKik7CisgICAgICAg
IFNjcmlwdEludGVycHJldGVyKEpTR2xvYmFsT2JqZWN0KiwgV2ViQ29yZTo6RnJhbWUqKTsKIAog
ICAgICAgICBzdGF0aWMgRE9NT2JqZWN0KiBnZXRET01PYmplY3Qodm9pZCogb2JqZWN0SGFuZGxl
KTsKICAgICAgICAgc3RhdGljIHZvaWQgcHV0RE9NT2JqZWN0KHZvaWQqIG9iamVjdEhhbmRsZSwg
RE9NT2JqZWN0Kik7CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc19wcm94eS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfcHJveHkuY3BwCShyZXZpc2lvbiAy
NzAwNykKKysrIFdlYkNvcmUvYmluZGluZ3MvanMva2pzX3Byb3h5LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTUxLDcgKzE1MSw3IEBAIHZvaWQgS0pTUHJveHk6OmluaXRTY3JpcHRJZk5lZWRlZCgp
CiAKICAgLy8gQnVpbGQgdGhlIGdsb2JhbCBvYmplY3QgLSB3aGljaCBpcyBhIFdpbmRvdyBpbnN0
YW5jZQogICBKU0xvY2sgbG9jazsKLSAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IG5ldyBKU0RP
TVdpbmRvdyhtX2ZyYW1lLT5kb21XaW5kb3coKSk7CisgIEpTRE9NV2luZG93KiBnbG9iYWxPYmpl
Y3QgPSBuZXcgSlNET01XaW5kb3cobV9mcmFtZS0+ZG9tV2luZG93KCkpOwogCiAgIC8vIENyZWF0
ZSBhIEtKUyBpbnRlcnByZXRlciBmb3IgdGhpcyBmcmFtZQogICBtX3NjcmlwdCA9IG5ldyBTY3Jp
cHRJbnRlcnByZXRlcihnbG9iYWxPYmplY3QsIG1fZnJhbWUpOwpJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy9qcy9ranNfd2luZG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pz
L2tqc193aW5kb3cuY3BwCShyZXZpc2lvbiAyNzAwNykKKysrIFdlYkNvcmUvYmluZGluZ3MvanMv
a2pzX3dpbmRvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxNCw2ICsyMTQsOSBAQCBXaW5kb3c6
OldpbmRvdyhET01XaW5kb3cqIHdpbmRvdykKICAgOiBtX2ltcGwod2luZG93KQogICAsIGQobmV3
IFdpbmRvd1ByaXZhdGUpCiB7CisgICAgLy8gV2luZG93IGRlc3RydWN0aW9uIGlzIG5vdCB0aHJl
YWQtc2FmZSBiZWNhdXNlIG9mCisgICAgLy8gdGhlIG5vbi10aHJlYWQtc2FmZSBXZWJDb3JlIHN0
cnVjdHVyZXMgaXQgcmVmZXJlbmNlcy4KKyAgICBDb2xsZWN0b3I6OmNvbGxlY3RPbk1haW5UaHJl
YWRPbmx5KHRoaXMpOwogfQogCiBXaW5kb3c6On5XaW5kb3coKQpJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy9qcy9ranNfd2luZG93LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy9qcy9r
anNfd2luZG93LmgJKHJldmlzaW9uIDI3MDA3KQorKysgV2ViQ29yZS9iaW5kaW5ncy9qcy9ranNf
d2luZG93LmgJKHdvcmtpbmcgY29weSkKQEAgLTY1LDcgKzY1LDggQEAgbmFtZXNwYWNlIEtKUyB7
CiAKICAgY2xhc3MgV2luZG93UHJpdmF0ZTsKIAotICBjbGFzcyBXaW5kb3cgOiBwdWJsaWMgRE9N
T2JqZWN0IHsKKyAgLy8gVGhpcyBpcyB0aGUgb25seSBXZWJDb3JlIEpTIGJpbmRpbmcgd2hpY2gg
ZG9lcyBub3QgaW5oZXJpdCBmcm9tIERPTU5vZGUKKyAgY2xhc3MgV2luZG93IDogcHVibGljIEpT
R2xvYmFsT2JqZWN0IHsKICAgICBmcmllbmQgY2xhc3MgTG9jYXRpb247CiAgICAgZnJpZW5kIGNs
YXNzIFdpbmRvd0Z1bmM7CiAgICAgZnJpZW5kIGNsYXNzIFNjaGVkdWxlZEFjdGlvbjsKSW5kZXg6
IFdlYkNvcmUvYmluZGluZ3Mvb2JqYy9XZWJTY3JpcHRPYmplY3QubW0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9iaW5kaW5ncy9vYmpjL1dlYlNjcmlwdE9iamVjdC5tbQkocmV2aXNpb24gMjcwMDcp
CisrKyBXZWJDb3JlL2JpbmRpbmdzL29iamMvV2ViU2NyaXB0T2JqZWN0Lm1tCSh3b3JraW5nIGNv
cHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9vYmpjX2luc3Rh
bmNlLmg+CiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9ydW50aW1lX29iamVjdC5oPgogI2ltcG9y
dCA8SmF2YVNjcmlwdENvcmUvQVBJQ2FzdC5oPgorI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvSlNH
bG9iYWxPYmplY3QuaD4KIAogdXNpbmcgbmFtZXNwYWNlIEtKUzsKIHVzaW5nIG5hbWVzcGFjZSBL
SlM6OkJpbmRpbmdzOwpAQCAtMTE1LDcgKzExNiw3IEBAIHN0YXRpYyB2b2lkIF9kaWRFeGVjdXRl
KFdlYlNjcmlwdE9iamVjdCAKICAgICBFeGVjU3RhdGUqIGV4ZWMgPSByb290LT5pbnRlcnByZXRl
cigpLT5nbG9iYWxFeGVjKCk7CiAgICAgS0pTRGlkRXhlY3V0ZUZ1bmN0aW9uUHRyIGZ1bmMgPSBJ
bnN0YW5jZTo6ZGlkRXhlY3V0ZUZ1bmN0aW9uKCk7CiAgICAgaWYgKGZ1bmMpCi0gICAgICAgIGZ1
bmMoZXhlYywgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihyb290LT5pbnRlcnByZXRlcigpLT5nbG9i
YWxPYmplY3QoKSkpOworICAgICAgICBmdW5jKGV4ZWMsIHJvb3QtPmludGVycHJldGVyKCktPmds
b2JhbE9iamVjdCgpKTsKIH0KIAogLSAodm9pZClfc2V0SW1wOihKU09iamVjdCopaW1wIG9yaWdp
blJvb3RPYmplY3Q6KFBhc3NSZWZQdHI8Um9vdE9iamVjdD4pb3JpZ2luUm9vdE9iamVjdCByb290
T2JqZWN0OihQYXNzUmVmUHRyPFJvb3RPYmplY3Q+KXJvb3RPYmplY3QKSW5kZXg6IFdlYkNvcmUv
YnJpZGdlL21hYy9XZWJDb3JlU2NyaXB0RGVidWdnZXIubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9icmlkZ2UvbWFjL1dlYkNvcmVTY3JpcHREZWJ1Z2dlci5tbQkocmV2aXNpb24gMjcwMDcpCisr
KyBXZWJDb3JlL2JyaWRnZS9tYWMvV2ViQ29yZVNjcmlwdERlYnVnZ2VyLm1tCSh3b3JraW5nIGNv
cHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW1wb3J0ICJXZWJTY3JpcHRPYmplY3RQcml2YXRlLmgi
CiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9jb250ZXh0Lmg+CiAjaW1wb3J0IDxKYXZhU2NyaXB0
Q29yZS9kZWJ1Z2dlci5oPgorI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvSlNHbG9iYWxPYmplY3Qu
aD4KIAogdXNpbmcgbmFtZXNwYWNlIEtKUzsKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwo=
</data>
<flag name="review"
          id="7133"
          type_id="1"
          status="+"
          setter="mjs"
    />
          </attachment>
      

    </bug>

</bugzilla>