<?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>18471</bug_id>
          
          <creation_ts>2008-04-13 21:58:25 -0700</creation_ts>
          <short_desc>Fix WebDownload.cpp compile problems for cairo/curl build</short_desc>
          <delta_ts>2009-08-11 22:47:50 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>23092</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>17730</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Zucker">zucker</reporter>
          <assigned_to name="Brent Fulgham">bfulgham</assigned_to>
          <cc>ahya365</cc>
    
    <cc>bfulgham</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>77463</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Zucker">zucker</who>
    <bug_when>2008-04-13 21:58:25 -0700</bug_when>
    <thetext>This patch replaces WebDownload.cpp with WebDownloadCFNet.cpp and WebDownloadCurl.cpp.  WebDownloadCFNet.cpp is unchanged.  WebDownloadCurl.cpp removes some function implementations and replaces them with stubs.  WebKit.vcproj is also modified to include/exclude the appropriate files from the appropriate build configurations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77464</commentid>
    <comment_count>1</comment_count>
      <attachid>20518</attachid>
    <who name="Daniel Zucker">zucker</who>
    <bug_when>2008-04-13 21:59:08 -0700</bug_when>
    <thetext>Created attachment 20518
divide WebDownload.cpp into WebDownloadCurl.cpp and WebDownloadCFNet.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>77567</commentid>
    <comment_count>2</comment_count>
      <attachid>20518</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-04-14 08:11:23 -0700</bug_when>
    <thetext>Comment on attachment 20518
divide WebDownload.cpp into WebDownloadCurl.cpp and WebDownloadCFNet.cpp

It looks like this patch has a mixture of spaces and tabs in it. Please only use 4 spaces for indentation.

I think we&apos;d ultimately be better served by moving the concept of a &quot;download&quot; to WebCore and having the platform differences reside at that level. Having two whole implementations of WebDownload doesn&apos;t feel like the right solution to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139252</commentid>
    <comment_count>3</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-08-11 22:47:50 -0700</bug_when>
    <thetext>This work (or a facsimile of this) is now part of WebKit.  Marking this as a duplicate and closing.

*** This bug has been marked as a duplicate of bug 23092 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>20518</attachid>
            <date>2008-04-13 21:59:08 -0700</date>
            <delta_ts>2008-04-14 08:11:23 -0700</delta_ts>
            <desc>divide WebDownload.cpp into WebDownloadCurl.cpp and WebDownloadCFNet.cpp</desc>
            <filename>webdownload.patch</filename>
            <type>text/plain</type>
            <size>121017</size>
            <attacher name="Daniel Zucker">zucker</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC93aW4vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vQ2hh
bmdlTG9nCShyZXZpc2lvbiAzMTg1NSkKKysrIFdlYktpdC93aW4vQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMjQgQEAKKzIwMDgtMDQtMTMgIERhbmllbCBadWNrZXIgIDx6dWNr
ZXJAd2FrZTMuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFNwbGl0IFdlYkRvd25sb2FkLmNwcCBpbnRvIFdlYkRvd25sb2FkQ0ZOZXQuY3BwIGFu
ZCBXZWJEb3dubG9hZEN1cmwuY3BwIGluIG9yZGVyIHRvIGZpeCBidWlsZCBlcnJvcnMgaW4gQ2Fp
cm8vQ3VybCBidWlsZC4gIFN0dWIgb3V0IHNvbWUgZnVuY3Rpb25zIGluIFdlYkRvd25sb2FkQ3Vy
bC5jcHAuCisKKyAgICAgICAgKiBXZWJEb3dubG9hZC5jcHA6IFJlbW92ZWQuCisgICAgICAgICog
V2ViRG93bmxvYWRDRk5ldC5jcHA6IENvcGllZCBmcm9tIFdlYktpdC93aW4vV2ViRG93bmxvYWQu
Y3BwLgorICAgICAgICAqIFdlYkRvd25sb2FkQ3VybC5jcHA6IENvcGllZCBmcm9tIFdlYktpdC93
aW4vV2ViRG93bmxvYWQuY3BwLgorICAgICAgICAoV2ViRG93bmxvYWQ6OmluaXQpOgorICAgICAg
ICAoV2ViRG93bmxvYWQ6OmluaXRXaXRoUmVxdWVzdCk6CisgICAgICAgIChXZWJEb3dubG9hZDo6
aW5pdFRvUmVzdW1lV2l0aEJ1bmRsZSk6CisgICAgICAgIChXZWJEb3dubG9hZDo6Y29udGludWVX
aXRob3V0Q3JlZGVudGlhbEZvckF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKToKKyAgICAgICAgKFdl
YkRvd25sb2FkOjp1c2VDcmVkZW50aWFsKToKKyAgICAgICAgKFdlYkRvd25sb2FkOjp3aWxsU2Vu
ZFJlcXVlc3QpOgorICAgICAgICAoV2ViRG93bmxvYWQ6OmRpZFJlY2VpdmVBdXRoZW50aWNhdGlv
bkNoYWxsZW5nZSk6CisgICAgICAgIChXZWJEb3dubG9hZDo6ZGlkUmVjZWl2ZVJlc3BvbnNlKToK
KyAgICAgICAgKFdlYkRvd25sb2FkOjp3aWxsUmVzdW1lV2l0aFJlc3BvbnNlKToKKyAgICAgICAg
KFdlYkRvd25sb2FkOjpkaWRGYWlsKToKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL1dlYktpdC52
Y3Byb2o6CisKIDIwMDgtMDQtMTIgIE1hdHQgTGlsZWsgIDx3ZWJraXRAbWF0dGxpbGVrLmNvbT4K
IAogICAgICAgICBOb3QgcmV2aWV3ZWQsIGJ1aWxkIGZpeC4KSW5kZXg6IFdlYktpdC93aW4vV2Vi
RG93bmxvYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViRG93bmxvYWQuY3BwCShy
ZXZpc2lvbiAzMTgxNCkKKysrIFdlYktpdC93aW4vV2ViRG93bmxvYWQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDc5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNp
bmNsdWRlICJXZWJLaXRETEwuaCIKLSNpbmNsdWRlICJXZWJEb3dubG9hZC5oIgotCi0jaW5jbHVk
ZSAiQ1N0cmluZy5oIgotI2luY2x1ZGUgIkRlZmF1bHREb3dubG9hZERlbGVnYXRlLmgiCi0jaW5j
bHVkZSAiTWFyc2hhbGxpbmdIZWxwZXJzLmgiCi0jaW5jbHVkZSAiV2ViRXJyb3IuaCIKLSNpbmNs
dWRlICJXZWJLaXQuaCIKLSNpbmNsdWRlICJXZWJLaXRMb2dnaW5nLmgiCi0jaW5jbHVkZSAiV2Vi
TXV0YWJsZVVSTFJlcXVlc3QuaCIKLSNpbmNsdWRlICJXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZS5oIgotI2luY2x1ZGUgIldlYlVSTENyZWRlbnRpYWwuaCIKLSNpbmNsdWRlICJXZWJVUkxS
ZXNwb25zZS5oIgotCi0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lu
Y2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jcHJhZ21hIHdhcm5pbmcocHVzaCwgMCkKLSNpbmNsdWRl
IDxXZWJDb3JlL0F1dGhlbnRpY2F0aW9uQ0YuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0JTdHJpbmcu
aD4KLSNpbmNsdWRlIDxXZWJDb3JlL05vdEltcGxlbWVudGVkLmg+Ci0jaW5jbHVkZSA8V2ViQ29y
ZS9SZXNvdXJjZUVycm9yLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9SZXNvdXJjZUhhbmRsZS5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvUmVzb3VyY2VSZXF1ZXN0Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9S
ZXNvdXJjZVJlc3BvbnNlLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TeXN0ZW1UaW1lLmg+Ci0jcHJh
Z21hIHdhcm5pbmcocG9wKQotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotLy8gQ0ZVUkxE
b3dubG9hZCBDYWxsYmFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIHZvaWQgZGlkU3RhcnRDYWxsYmFjayhD
RlVSTERvd25sb2FkUmVmIGRvd25sb2FkLCBjb25zdCB2b2lkICpjbGllbnRJbmZvKTsKLXN0YXRp
YyBDRlVSTFJlcXVlc3RSZWYgd2lsbFNlbmRSZXF1ZXN0Q2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJl
ZiBkb3dubG9hZCwgQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QsIENGVVJMUmVzcG9uc2VSZWYgcmVk
aXJlY3Rpb25SZXNwb25zZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7Ci1zdGF0aWMgdm9pZCBk
aWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2VDYWxsYmFjayhDRlVSTERvd25sb2FkUmVm
IGRvd25sb2FkLCBDRlVSTEF1dGhDaGFsbGVuZ2VSZWYgY2hhbGxlbmdlLCBjb25zdCB2b2lkICpj
bGllbnRJbmZvKTsKLXN0YXRpYyB2b2lkIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxiYWNrKENGVVJM
RG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVzcG9uc2VSZWYgcmVzcG9uc2UsIGNvbnN0IHZv
aWQgKmNsaWVudEluZm8pOwotc3RhdGljIHZvaWQgd2lsbFJlc3VtZVdpdGhSZXNwb25zZUNhbGxi
YWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVzcG9uc2VSZWYgcmVzcG9uc2Us
IFVJbnQ2NCBzdGFydGluZ0J5dGUsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOwotc3RhdGljIHZv
aWQgZGlkUmVjZWl2ZURhdGFDYWxsYmFjayhDRlVSTERvd25sb2FkUmVmIGRvd25sb2FkLCBDRklu
ZGV4IGxlbmd0aCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7Ci1zdGF0aWMgQm9vbGVhbiBzaG91
bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQs
IENGU3RyaW5nUmVmIGVuY29kaW5nVHlwZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7Ci1zdGF0
aWMgdm9pZCBkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2so
Q0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZTdHJpbmdSZWYgb2JqZWN0TmFtZSwgY29uc3Qg
dm9pZCAqY2xpZW50SW5mbyk7Ci1zdGF0aWMgdm9pZCBkaWRDcmVhdGVEZXN0aW5hdGlvbkNhbGxi
YWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVmIHBhdGgsIGNvbnN0IHZvaWQg
KmNsaWVudEluZm8pOwotc3RhdGljIHZvaWQgZGlkRmluaXNoQ2FsbGJhY2soQ0ZVUkxEb3dubG9h
ZFJlZiBkb3dubG9hZCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7Ci1zdGF0aWMgdm9pZCBkaWRG
YWlsQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZFcnJvclJlZiBlcnJvciwg
Y29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7Ci0KLS8vIERvd25sb2FkIEJ1bmRsZSBmaWxlIHV0aWxp
dGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi1zdGF0aWMgY29uc3QgU3RyaW5nIEJ1bmRsZUV4dGVuc2lvbigiLmRvd25s
b2FkIik7Ci1zdGF0aWMgVUludDMyIEJ1bmRsZU1hZ2ljTnVtYmVyID0gMHhERUNBRjRFQTsKLQot
c3RhdGljIENGRGF0YVJlZiBleHRyYWN0UmVzdW1lRGF0YUZyb21CdW5kbGUoY29uc3QgU3RyaW5n
JiBidW5kbGVQYXRoKTsKLXN0YXRpYyBIUkVTVUxUIGFwcGVuZFJlc3VtZURhdGFUb0J1bmRsZShD
RkRhdGFSZWYgcmVzdW1lRGF0YSwgY29uc3QgU3RyaW5nJiBidW5kbGVQYXRoKTsKLQotLy8gV2Vi
RG93bmxvYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1XZWJEb3dubG9hZDo6V2ViRG93bmxvYWQoKQotICAgIDogbV9y
ZWZDb3VudCgwKQotewotICAgIGdDbGFzc0NvdW50Kys7Ci19Ci0KLXZvaWQgV2ViRG93bmxvYWQ6
OmluaXQoUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSwgY29uc3QgUmVzb3VyY2VSZXF1ZXN0JiByZXF1
ZXN0LCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgSVdlYkRvd25sb2FkRGVsZWdh
dGUqIGRlbGVnYXRlKQotewotICAgIG1fZGVsZWdhdGUgPSBkZWxlZ2F0ZSA/IGRlbGVnYXRlIDog
RGVmYXVsdERvd25sb2FkRGVsZWdhdGU6OnNoYXJlZEluc3RhbmNlKCk7Ci0gICAgQ0ZVUkxDb25u
ZWN0aW9uUmVmIGNvbm5lY3Rpb24gPSBoYW5kbGUtPmNvbm5lY3Rpb24oKTsKLSAgICBpZiAoIWNv
bm5lY3Rpb24pIHsKLSAgICAgICAgTE9HX0VSUk9SKCJXZWJEb3dubG9hZDo6V2ViRG93bmxvYWQo
UmVzb3VyY2VIYW5kbGUqLC4uLikgY2FsbGVkIHdpdGggYW4gaW5hY3RpdmUgUmVzb3VyY2VIYW5k
bGUiKTsgICAgCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDRlVSTERvd25sb2FkQ2xp
ZW50IGNsaWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2Vu
ZFJlcXVlc3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJh
Y2ssIAotICAgICAgICBkaWRSZWNlaXZlUmVzcG9uc2VDYWxsYmFjaywgd2lsbFJlc3VtZVdpdGhS
ZXNwb25zZUNhbGxiYWNrLCBkaWRSZWNlaXZlRGF0YUNhbGxiYWNrLCBzaG91bGREZWNvZGVEYXRh
T2ZNSU1FVHlwZUNhbGxiYWNrLAotICAgICAgICBkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0
ZWRPYmplY3ROYW1lQ2FsbGJhY2ssIGRpZENyZWF0ZURlc3RpbmF0aW9uQ2FsbGJhY2ssIGRpZEZp
bmlzaENhbGxiYWNrLCBkaWRGYWlsQ2FsbGJhY2t9OwotCi0gICAgbV9yZXF1ZXN0LmFkb3B0UmVm
KFdlYk11dGFibGVVUkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShyZXF1ZXN0KSk7Ci0gICAgbV9k
b3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGVBbmRTdGFydFdpdGhMb2FkaW5nQ29u
bmVjdGlvbigwLCBjb25uZWN0aW9uLCByZXF1ZXN0LmNmVVJMUmVxdWVzdCgpLCByZXNwb25zZS5j
ZlVSTFJlc3BvbnNlKCksICZjbGllbnQpKTsKLQotICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBD
RlVSTERvd25sb2FkQ3JlYXRlQW5kU3RhcnRXaXRoTG9hZGluZ0Nvbm5lY3Rpb24oKSB0byBmYWls
IGlmIHRoZSBwYXNzZWQgaW4gQ0ZVUkxDb25uZWN0aW9uIGlzIG5vdCBpbiBhICJkb3dubG9hZGFi
bGUgc3RhdGUiCi0gICAgLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5ldmVyIGhpdCB0aGF0IGNhc2UK
LSAgICBpZiAoIW1fZG93bmxvYWQpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgICAgIExPR19FUlJPUigiV2ViRG93bmxvYWQgLSBGYWlsZWQgdG8gY3JlYXRlIFdlYkRvd25s
b2FkIGZyb20gZXhpc3RpbmcgY29ubmVjdGlvbiAoJXMpIiwgcmVxdWVzdC51cmwoKS5zdHJpbmco
KS51dGY4KCkuZGF0YSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgTE9HKERvd25sb2FkLCAiV2Vi
RG93bmxvYWQgLSBDcmVhdGVkIFdlYkRvd25sb2FkICVwIGZyb20gZXhpc3RpbmcgY29ubmVjdGlv
biAoJXMpIiwgdGhpcywgcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKLQot
ICAgIC8vIFRoZSBDRlVSTERvd25sb2FkIGVpdGhlciBzdGFydHMgc3VjY2Vzc2Z1bGx5IGFuZCBy
ZXRhaW5zIHRoZSBDRlVSTENvbm5lY3Rpb24sIAotICAgIC8vIG9yIGl0IGZhaWxzIHRvIGNyZWF0
aW5nIGFuZCB3ZSBoYXZlIGEgbm93LXVzZWxlc3MgY29ubmVjdGlvbiB3aXRoIGEgZGFuZ2xpbmcg
cmVmLiAKLSAgICAvLyBFaXRoZXIgd2F5LCB3ZSBuZWVkIHRvIHJlbGVhc2UgdGhlIGNvbm5lY3Rp
b24gdG8gYmFsYW5jZSBvdXQgcmVmIGNvdW50cwotICAgIGhhbmRsZS0+cmVsZWFzZUNvbm5lY3Rp
b25Gb3JEb3dubG9hZCgpOwotICAgIENGUmVsZWFzZShjb25uZWN0aW9uKTsKLX0KLQotdm9pZCBX
ZWJEb3dubG9hZDo6aW5pdChjb25zdCBLVVJMJiB1cmwsIElXZWJEb3dubG9hZERlbGVnYXRlKiBk
ZWxlZ2F0ZSkKLXsKLSAgICBtX2RlbGVnYXRlID0gZGVsZWdhdGUgPyBkZWxlZ2F0ZSA6IERlZmF1
bHREb3dubG9hZERlbGVnYXRlOjpzaGFyZWRJbnN0YW5jZSgpOwotICAgIExPR19FUlJPUigiRGVs
ZWdhdGUgaXMgJXAiLCBtX2RlbGVnYXRlLmdldCgpKTsKLQotICAgIFJlc291cmNlUmVxdWVzdCBy
ZXF1ZXN0KHVybCk7Ci0gICAgQ0ZVUkxSZXF1ZXN0UmVmIGNmUmVxdWVzdCA9IHJlcXVlc3QuY2ZV
UkxSZXF1ZXN0KCk7Ci0KLSAgICBDRlVSTERvd25sb2FkQ2xpZW50IGNsaWVudCA9IHswLCB0aGlz
LCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2VuZFJlcXVlc3RDYWxsYmFjaywgZGlk
UmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ssIAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxiYWNrLCB3aWxsUmVzdW1l
V2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2FsbGJhY2ssIHNob3VsZERlY29k
ZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWVDYWxsYmFjaywgZGlk
Q3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNoQ2FsbGJhY2ssIGRpZEZhaWxDYWxs
YmFja307Ci0gICAgbV9yZXF1ZXN0LmFkb3B0UmVmKFdlYk11dGFibGVVUkxSZXF1ZXN0OjpjcmVh
dGVJbnN0YW5jZShyZXF1ZXN0KSk7Ci0gICAgbV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxv
YWRDcmVhdGUoMCwgY2ZSZXF1ZXN0LCAmY2xpZW50KSk7Ci0KLSAgICBDRlVSTERvd25sb2FkU2No
ZWR1bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsKLSAgICBDRlVS
TERvd25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQuZ2V0KCksIFJl
c291cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7Ci0K
LSAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIEluaXRpYWxpemVkIGRvd25sb2FkIG9m
IHVybCAlcyBpbiBXZWJEb3dubG9hZCAlcCIsIHVybC5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLCB0
aGlzKTsKLX0KLQotV2ViRG93bmxvYWQ6On5XZWJEb3dubG9hZCgpCi17Ci0gICAgTE9HKERvd25s
b2FkLCAiV2ViRG93bmxvYWQgLSBEZXN0cm95aW5nIGRvd25sb2FkICglcCkiLCB0aGlzKTsKLSAg
ICBjYW5jZWwoKTsKLSAgICBnQ2xhc3NDb3VudC0tOwotfQotCi1XZWJEb3dubG9hZCogV2ViRG93
bmxvYWQ6OmNyZWF0ZUluc3RhbmNlKCkKLXsKLSAgICBXZWJEb3dubG9hZCogaW5zdGFuY2UgPSBu
ZXcgV2ViRG93bmxvYWQoKTsKLSAgICBpbnN0YW5jZS0+QWRkUmVmKCk7Ci0gICAgcmV0dXJuIGlu
c3RhbmNlOwotfQotCi1XZWJEb3dubG9hZCogV2ViRG93bmxvYWQ6OmNyZWF0ZUluc3RhbmNlKFJl
c291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29u
c3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIElXZWJEb3dubG9hZERlbGVnYXRlKiBkZWxl
Z2F0ZSkKLXsKLSAgICBXZWJEb3dubG9hZCogaW5zdGFuY2UgPSBuZXcgV2ViRG93bmxvYWQoKTsK
LSAgICBpbnN0YW5jZS0+QWRkUmVmKCk7Ci0gICAgaW5zdGFuY2UtPmluaXQoaGFuZGxlLCByZXF1
ZXN0LCByZXNwb25zZSwgZGVsZWdhdGUpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLX0KLQotV2Vi
RG93bmxvYWQqIFdlYkRvd25sb2FkOjpjcmVhdGVJbnN0YW5jZShjb25zdCBLVVJMJiB1cmwsIElX
ZWJEb3dubG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKLXsKLSAgICBXZWJEb3dubG9hZCogaW5zdGFu
Y2UgPSBuZXcgV2ViRG93bmxvYWQoKTsKLSAgICBpbnN0YW5jZS0+QWRkUmVmKCk7Ci0gICAgaW5z
dGFuY2UtPmluaXQodXJsLCBkZWxlZ2F0ZSk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotfQotCi0v
LyBJVW5rbm93biAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93
bmxvYWQ6OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqZWN0KQotewot
ICAgICpwcHZPYmplY3QgPSAwOwotICAgIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJSURfSVVua25v
d24pKQotICAgICAgICAqcHB2T2JqZWN0ID0gc3RhdGljX2Nhc3Q8SVdlYkRvd25sb2FkKj4odGhp
cyk7Ci0gICAgZWxzZSBpZiAoSXNFcXVhbEdVSUQocmlpZCwgSUlEX0lXZWJEb3dubG9hZCkpCi0g
ICAgICAgICpwcHZPYmplY3QgPSBzdGF0aWNfY2FzdDxJV2ViRG93bmxvYWQqPih0aGlzKTsKLSAg
ICBlbHNlIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJSURfSVdlYlVSTEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlU2VuZGVyKSkKLSAgICAgICAgKnBwdk9iamVjdCA9IHN0YXRpY19jYXN0PElXZWJVUkxB
dXRoZW50aWNhdGlvbkNoYWxsZW5nZVNlbmRlcio+KHRoaXMpOwotICAgIGVsc2UgaWYgKElzRXF1
YWxHVUlEKHJpaWQsIENMU0lEX1dlYkRvd25sb2FkKSkKLSAgICAgICAgKnBwdk9iamVjdCA9IHN0
YXRpY19jYXN0PFdlYkRvd25sb2FkKj4odGhpcyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4g
RV9OT0lOVEVSRkFDRTsKLQotICAgIEFkZFJlZigpOwotICAgIHJldHVybiBTX09LOwotfQotCi1V
TE9ORyBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6QWRkUmVmKHZvaWQpCi17Ci0gICAg
cmV0dXJuICsrbV9yZWZDb3VudDsKLX0KLQotVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93
bmxvYWQ6OlJlbGVhc2Uodm9pZCkKLXsKLSAgICBVTE9ORyBuZXdSZWYgPSAtLW1fcmVmQ291bnQ7
Ci0gICAgaWYgKCFuZXdSZWYpCi0gICAgICAgIGRlbGV0ZSh0aGlzKTsKLQotICAgIHJldHVybiBu
ZXdSZWY7Ci19Ci0KLS8vIElXZWJEb3dubG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhSRVNVTFQgU1RETUVU
SE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmluaXRXaXRoUmVxdWVzdCgKLSAgICAgICAgLyogW2lu
XSAqLyBJV2ViVVJMUmVxdWVzdCogcmVxdWVzdCwgCi0gICAgICAgIC8qIFtpbl0gKi8gSVdlYkRv
d25sb2FkRGVsZWdhdGUqIGRlbGVnYXRlKQotewotICAgIENPTVB0cjxXZWJNdXRhYmxlVVJMUmVx
dWVzdD4gd2ViUmVxdWVzdDsKLSAgICBpZiAoIXJlcXVlc3QgfHwgRkFJTEVEKHJlcXVlc3QtPlF1
ZXJ5SW50ZXJmYWNlKCZ3ZWJSZXF1ZXN0KSkpIHsKLSAgICAgICAgTE9HKERvd25sb2FkLCAiV2Vi
RG93bmxvYWQgLSBpbml0V2l0aFJlcXVlc3QgZmFpbGVkIC0gbm90IGEgV2ViTXV0YWJsZVVSTFJl
cXVlc3QiKTsgICAgCi0gICAgICAgIHJldHVybiBFX0ZBSUw7Ci0gICAgfQotCi0gICAgaWYgKCFk
ZWxlZ2F0ZSkKLSAgICAgICAgcmV0dXJuIEVfRkFJTDsKLSAgICBtX2RlbGVnYXRlID0gZGVsZWdh
dGU7Ci0gICAgTE9HKERvd25sb2FkLCAiRGVsZWdhdGUgaXMgJXAiLCBtX2RlbGVnYXRlLmdldCgp
KTsKLQotICAgIFJldGFpblB0cjxDRlVSTFJlcXVlc3RSZWY+IGNmUmVxdWVzdCA9IHdlYlJlcXVl
c3QtPnJlc291cmNlUmVxdWVzdCgpLmNmVVJMUmVxdWVzdCgpOwotCi0gICAgQ0ZVUkxEb3dubG9h
ZENsaWVudCBjbGllbnQgPSB7MCwgdGhpcywgMCwgMCwgMCwgZGlkU3RhcnRDYWxsYmFjaywgd2ls
bFNlbmRSZXF1ZXN0Q2FsbGJhY2ssIGRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZUNh
bGxiYWNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRSZWNlaXZlUmVz
cG9uc2VDYWxsYmFjaywgd2lsbFJlc3VtZVdpdGhSZXNwb25zZUNhbGxiYWNrLCBkaWRSZWNlaXZl
RGF0YUNhbGxiYWNrLCBzaG91bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNrLCAKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0
ZWRPYmplY3ROYW1lQ2FsbGJhY2ssIGRpZENyZWF0ZURlc3RpbmF0aW9uQ2FsbGJhY2ssIGRpZEZp
bmlzaENhbGxiYWNrLCBkaWRGYWlsQ2FsbGJhY2t9OwotICAgIG1fcmVxdWVzdC5hZG9wdFJlZihX
ZWJNdXRhYmxlVVJMUmVxdWVzdDo6Y3JlYXRlSW5zdGFuY2Uod2ViUmVxdWVzdC5nZXQoKSkpOwot
ICAgIG1fZG93bmxvYWQuYWRvcHRDRihDRlVSTERvd25sb2FkQ3JlYXRlKDAsIGNmUmVxdWVzdC5n
ZXQoKSwgJmNsaWVudCkpOwotCi0gICAgLy8gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkb3dubG9h
ZCBmYWlsZWQgdG8gY3JlYXRlLCAKLSAgICAvLyB3ZSBoYXZlIHBhcnRpY3VsYXIgY2xlYW51cCB0
byBkbwotICAgIGlmICghbV9kb3dubG9hZCkgewotICAgICAgICBtX3JlcXVlc3QgPSAwOyAgICAK
LSAgICAgICAgcmV0dXJuIEVfRkFJTDsKLSAgICB9Ci0KLSAgICBDRlVSTERvd25sb2FkU2NoZWR1
bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsKLSAgICBDRlVSTERv
d25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQuZ2V0KCksIFJlc291
cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7Ci0KLSAg
ICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIGluaXRXaXRoUmVxdWVzdCBjb21wbGV0ZSwg
c3RhcnRlZCBkb3dubG9hZCBvZiB1cmwgJXMiLCB3ZWJSZXF1ZXN0LT5yZXNvdXJjZVJlcXVlc3Qo
KS51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKLSAgICByZXR1cm4gU19PSzsKLX0KLQot
SFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6aW5pdFRvUmVzdW1lV2l0aEJ1
bmRsZSgKLSAgICAgICAgLyogW2luXSAqLyBCU1RSIGJ1bmRsZVBhdGgsIAotICAgICAgICAvKiBb
aW5dICovIElXZWJEb3dubG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKLXsKLSAgICBMT0coRG93bmxv
YWQsICJBdHRlbXB0aW5nIHJlc3VtZSBvZiBkb3dubG9hZCBidW5kbGUgJXMiLCBTdHJpbmcoYnVu
ZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgpKS5hc2NpaSgpLmRhdGEoKSk7Ci0KLSAg
ICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiByZXN1bWVEYXRhKEFkb3B0Q0YsIGV4dHJhY3RSZXN1bWVE
YXRhRnJvbUJ1bmRsZShTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgp
KSkpOwotICAgIAotICAgIGlmICghcmVzdW1lRGF0YSkKLSAgICAgICAgcmV0dXJuIEVfRkFJTDsK
LQotICAgIGlmICghZGVsZWdhdGUpCi0gICAgICAgIHJldHVybiBFX0ZBSUw7Ci0gICAgbV9kZWxl
Z2F0ZSA9IGRlbGVnYXRlOwotICAgIExPRyhEb3dubG9hZCwgIkRlbGVnYXRlIGlzICVwIiwgbV9k
ZWxlZ2F0ZS5nZXQoKSk7Ci0KLSAgICBDRlVSTERvd25sb2FkQ2xpZW50IGNsaWVudCA9IHswLCB0
aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2VuZFJlcXVlc3RDYWxsYmFjaywg
ZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ssIAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxiYWNrLCB3aWxsUmVz
dW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2FsbGJhY2ssIHNob3VsZERl
Y29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWVDYWxsYmFjaywg
ZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNoQ2FsbGJhY2ssIGRpZEZhaWxD
YWxsYmFja307Ci0gICAgCi0gICAgUmV0YWluUHRyPENGVVJMUmVmPiBwYXRoVVJMKEFkb3B0Q0Ys
IE1hcnNoYWxsaW5nSGVscGVyczo6UGF0aFN0cmluZ1RvRmlsZUNGVVJMUmVmKFN0cmluZyhidW5k
bGVQYXRoLCBTeXNTdHJpbmdMZW4oYnVuZGxlUGF0aCkpKSk7Ci0gICAgQVNTRVJUKHBhdGhVUkwp
OwotCi0gICAgbV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGVXaXRoUmVzdW1l
RGF0YSgwLCByZXN1bWVEYXRhLmdldCgpLCBwYXRoVVJMLmdldCgpLCAmY2xpZW50KSk7Ci0KLSAg
ICBpZiAoIW1fZG93bmxvYWQpIHsKLSAgICAgICAgTE9HKERvd25sb2FkLCAiRmFpbGVkIHRvIGNy
ZWF0ZSBDRlVSTERvd25sb2FkUmVmIGZvciByZXN1bWUiKTsgICAgCi0gICAgICAgIHJldHVybiBF
X0ZBSUw7Ci0gICAgfQotICAgIAotICAgIG1fYnVuZGxlUGF0aCA9IFN0cmluZyhidW5kbGVQYXRo
LCBTeXNTdHJpbmdMZW4oYnVuZGxlUGF0aCkpOwotICAgIC8vIEF0dGVtcHQgdG8gcmVtb3ZlIHRo
ZSAiLmRvd25sb2FkIiBleHRlbnNpb24gZnJvbSB0aGUgYnVuZGxlIGZvciB0aGUgZmluYWwgZmls
ZSBkZXN0aW5hdGlvbgotICAgIC8vIEZhaWxpbmcgdGhhdCwgd2UgY2xlYXIgbV9kZXN0aW5hdGlv
biBhbmQgd2lsbCBhc2sgdGhlIGRlbGVnYXRlIGxhdGVyIG9uY2UgdGhlIGRvd25sb2FkIHN0YXJ0
cwotICAgIGlmIChtX2J1bmRsZVBhdGguZW5kc1dpdGgoQnVuZGxlRXh0ZW5zaW9uLCBmYWxzZSkp
IHsKLSAgICAgICAgbV9kZXN0aW5hdGlvbiA9IG1fYnVuZGxlUGF0aC5jb3B5KCk7Ci0gICAgICAg
IG1fZGVzdGluYXRpb24udHJ1bmNhdGUobV9kZXN0aW5hdGlvbi5sZW5ndGgoKSAtIEJ1bmRsZUV4
dGVuc2lvbi5sZW5ndGgoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fZGVzdGluYXRpb24gPSBT
dHJpbmcoKTsKLSAgICAKLSAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVXaXRoQ3VycmVudE1lc3Nh
Z2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsKLSAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVEb3du
bG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQuZ2V0KCksIFJlc291cmNlSGFuZGxlOjpsb2FkZXJS
dW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7Ci0KLSAgICBMT0coRG93bmxvYWQsICJX
ZWJEb3dubG9hZCAtIGluaXRXaXRoUmVxdWVzdCBjb21wbGV0ZSwgcmVzdW1lZCBkb3dubG9hZCBv
ZiBidW5kbGUgJXMiLCBTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgp
KS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgcmV0dXJuIFNfT0s7Ci19Ci0KLUhSRVNVTFQgU1RETUVU
SE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNhblJlc3VtZURvd25sb2FkRGVjb2RlZFdpdGhFbmNv
ZGluZ01JTUVUeXBlKAotICAgICAgICAvKiBbaW5dICovIEJTVFIsIAotICAgICAgICAvKiBbb3V0
LCByZXR2YWxdICovIEJPT0wqKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJu
IEVfRkFJTDsKLX0KLQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6c3Rh
cnQoKQotewotICAgIExPRyhEb3dubG9hZCwgIldlYkRvd25sb2FkIC0gU3RhcnRpbmcgZG93bmxv
YWQgKCVwKSIsIHRoaXMpOwotICAgIGlmICghbV9kb3dubG9hZCkKLSAgICAgICAgcmV0dXJuIEVf
RkFJTDsKLQotICAgIENGVVJMRG93bmxvYWRTdGFydChtX2Rvd25sb2FkLmdldCgpKTsKLSAgICAv
LyBGSVhNRTogNDk1MDQ3NyAtIENGVVJMRG93bmxvYWQgbmVnbGVjdHMgdG8gbWFrZSB0aGUgZGlk
U3RhcnQoKSBjbGllbnQgY2FsbCB1cG9uIHN0YXJ0aW5nIHRoZSBkb3dubG9hZC4KLSAgICAvLyBU
aGlzIGlzIGEgc29tZXdoYXQgY3JpdGljYWwgY2FsbCwgc28gd2UnbGwgZmFrZSBpdCBmb3Igbm93
IQotICAgIGRpZFN0YXJ0KCk7Ci0KLSAgICByZXR1cm4gU19PSzsKLX0KLQotSFJFU1VMVCBTVERN
RVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6Y2FuY2VsKCkKLXsKLSAgICBMT0coRG93bmxvYWQs
ICJXZWJEb3dubG9hZCAtIENhbmNlbGxpbmcgZG93bmxvYWQgKCVwKSIsIHRoaXMpOwotICAgIGlm
ICghbV9kb3dubG9hZCkKLSAgICAgICAgcmV0dXJuIEVfRkFJTDsKLQotICAgIENGVVJMRG93bmxv
YWRDYW5jZWwobV9kb3dubG9hZC5nZXQoKSk7Ci0gICAgbV9kb3dubG9hZCA9IDA7Ci0gICAgcmV0
dXJuIFNfT0s7Ci19Ci0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNh
bmNlbEZvclJlc3VtZSgpCi17Ci0gICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBDYW5j
ZWxsaW5nIGRvd25sb2FkICglcCksIHdyaXRpbmcgcmVzdW1lIGluZm9ybWF0aW9uIHRvIGZpbGUg
aWYgcG9zc2libGUiLCB0aGlzKTsKLSAgICBBU1NFUlQobV9kb3dubG9hZCk7Ci0gICAgaWYgKCFt
X2Rvd25sb2FkKQotICAgICAgICByZXR1cm4gRV9GQUlMOwotCi0gICAgSFJFU1VMVCBociA9IFNf
T0s7Ci0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gcmVzdW1lRGF0YTsKLSAgICBpZiAobV9kZXN0
aW5hdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgQ0ZVUkxEb3dubG9hZENhbmNlbChtX2Rvd25s
b2FkLmdldCgpKTsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLQotICAgIENGVVJMRG93bmxv
YWRTZXREZWxldGVzVXBvbkZhaWx1cmUobV9kb3dubG9hZC5nZXQoKSwgZmFsc2UpOwotICAgIENG
VVJMRG93bmxvYWRDYW5jZWwobV9kb3dubG9hZC5nZXQoKSk7Ci0KLSAgICByZXN1bWVEYXRhID0g
Q0ZVUkxEb3dubG9hZENvcHlSZXN1bWVEYXRhKG1fZG93bmxvYWQuZ2V0KCkpOwotICAgIGlmICgh
cmVzdW1lRGF0YSkgewotICAgICAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIFVuYWJs
ZSB0byBjcmVhdGUgcmVzdW1lIGRhdGEgZm9yIGRvd25sb2FkICglcCkiLCB0aGlzKTsKLSAgICAg
ICAgZ290byBleGl0OwotICAgIH0KLQotICAgIGFwcGVuZFJlc3VtZURhdGFUb0J1bmRsZShyZXN1
bWVEYXRhLmdldCgpLCBtX2J1bmRsZVBhdGgpOwotICAgCi1leGl0OgotICAgIG1fZG93bmxvYWQg
PSAwOwotICAgIHJldHVybiBocjsKLX0KLQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJE
b3dubG9hZDo6ZGVsZXRlc0ZpbGVVcG9uRmFpbHVyZSgKLSAgICAgICAgLyogW291dCwgcmV0dmFs
XSAqLyBCT09MKiByZXN1bHQpCi17Ci0gICAgaWYgKCFtX2Rvd25sb2FkKQotICAgICAgICByZXR1
cm4gRV9GQUlMOwotICAgICpyZXN1bHQgPSBDRlVSTERvd25sb2FkRGVsZXRlc1Vwb25GYWlsdXJl
KG1fZG93bmxvYWQuZ2V0KCkpOwotICAgIHJldHVybiBTX09LOwotfQotCi1IUkVTVUxUIFNURE1F
VEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpidW5kbGVQYXRoRm9yVGFyZ2V0UGF0aCgKLSAgICAg
ICAgLyogW2luXSAqLyBCU1RSIHRhcmdldFBhdGgsIAotICAgICAgICAvKiBbb3V0LCByZXR2YWxd
ICovIEJTVFIqIGJ1bmRsZVBhdGgpCi17Ci0gICAgaWYgKCF0YXJnZXRQYXRoKQotICAgICAgICBy
ZXR1cm4gRV9JTlZBTElEQVJHOwotCi0gICAgU3RyaW5nIGJ1bmRsZSh0YXJnZXRQYXRoLCBTeXNT
dHJpbmdMZW4odGFyZ2V0UGF0aCkpOwotICAgIGlmIChidW5kbGUuaXNFbXB0eSgpKQotICAgICAg
ICByZXR1cm4gRV9JTlZBTElEQVJHOwotCi0gICAgaWYgKGJ1bmRsZVtidW5kbGUubGVuZ3RoKCkt
MV0gPT0gJy8nKQotICAgICAgICBidW5kbGUudHJ1bmNhdGUoMSk7Ci0KLSAgICBidW5kbGUgKz0g
QnVuZGxlRXh0ZW5zaW9uOwotICAgICpidW5kbGVQYXRoID0gU3lzQWxsb2NTdHJpbmdMZW4oYnVu
ZGxlLmNoYXJhY3RlcnMoKSwgYnVuZGxlLmxlbmd0aCgpKTsKLSAgICBpZiAoISpidW5kbGVQYXRo
KQotICAgICAgICByZXR1cm4gRV9GQUlMOwotICAgIHJldHVybiBTX09LOwotfQotCi1IUkVTVUxU
IFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpyZXF1ZXN0KAotICAgICAgICAvKiBbb3V0
LCByZXR2YWxdICovIElXZWJVUkxSZXF1ZXN0KiogcmVxdWVzdCkKLXsKLSAgICBpZiAocmVxdWVz
dCkgewotICAgICAgICAqcmVxdWVzdCA9IG1fcmVxdWVzdC5nZXQoKTsKLSAgICAgICAgaWYgKCpy
ZXF1ZXN0KQotICAgICAgICAgICAgKCpyZXF1ZXN0KS0+QWRkUmVmKCk7Ci0gICAgfQotICAgIHJl
dHVybiBTX09LOwotfQotCi1IUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpz
ZXREZWxldGVzRmlsZVVwb25GYWlsdXJlKAotICAgICAgICAvKiBbaW5dICovIEJPT0wgZGVsZXRl
c0ZpbGVVcG9uRmFpbHVyZSkKLXsKLSAgICBpZiAoIW1fZG93bmxvYWQpCi0gICAgICAgIHJldHVy
biBFX0ZBSUw7Ci0gICAgQ0ZVUkxEb3dubG9hZFNldERlbGV0ZXNVcG9uRmFpbHVyZShtX2Rvd25s
b2FkLmdldCgpLCAhIWRlbGV0ZXNGaWxlVXBvbkZhaWx1cmUpOwotICAgIHJldHVybiBTX09LOwot
fQotCi1IUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpzZXREZXN0aW5hdGlv
bigKLSAgICAgICAgLyogW2luXSAqLyBCU1RSIHBhdGgsIAotICAgICAgICAvKiBbaW5dICovIEJP
T0wgYWxsb3dPdmVyd3JpdGUpCi17Ci0gICAgaWYgKCFtX2Rvd25sb2FkKQotICAgICAgICByZXR1
cm4gRV9GQUlMOwotCi0gICAgbV9kZXN0aW5hdGlvbiA9IFN0cmluZyhwYXRoLCBTeXNTdHJpbmdM
ZW4ocGF0aCkpOwotICAgIG1fYnVuZGxlUGF0aCA9IG1fZGVzdGluYXRpb24gKyBCdW5kbGVFeHRl
bnNpb247Ci0KLSAgICBDRlVSTFJlZiBwYXRoVVJMID0gTWFyc2hhbGxpbmdIZWxwZXJzOjpQYXRo
U3RyaW5nVG9GaWxlQ0ZVUkxSZWYobV9idW5kbGVQYXRoKTsKLSAgICBDRlVSTERvd25sb2FkU2V0
RGVzdGluYXRpb24obV9kb3dubG9hZC5nZXQoKSwgcGF0aFVSTCwgISFhbGxvd092ZXJ3cml0ZSk7
Ci0gICAgQ0ZSZWxlYXNlKHBhdGhVUkwpOwotCi0gICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxv
YWQgLSBTZXQgZGVzdGluYXRpb24gdG8gJXMiLCBtX2J1bmRsZVBhdGguYXNjaWkoKS5kYXRhKCkp
OwotCi0gICAgcmV0dXJuIFNfT0s7Ci19Ci0KLS8vIElXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZVNlbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93
bmxvYWQ6OmNhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKAotICAgICAgICAvKiBbaW5dICov
IElXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSopCi17Ci0gICAgaWYgKG1fZG93bmxvYWQp
IHsKLSAgICAgICAgQ0ZVUkxEb3dubG9hZENhbmNlbChtX2Rvd25sb2FkLmdldCgpKTsKLSAgICAg
ICAgbV9kb3dubG9hZCA9IDA7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IERvIHdlIG5lZWQgYSBV
Ukwgb3IgZGVzY3JpcHRpb24gZm9yIHRoaXMgZXJyb3IgY29kZT8KLSAgICBSZXNvdXJjZUVycm9y
IGVycm9yKFN0cmluZyhXZWJVUkxFcnJvckRvbWFpbiksIFdlYlVSTEVycm9yVXNlckNhbmNlbGxl
ZEF1dGhlbnRpY2F0aW9uLCAiIiwgIiIpOwotICAgIENPTVB0cjxXZWJFcnJvcj4gd2ViRXJyb3Io
QWRvcHRDT00sIFdlYkVycm9yOjpjcmVhdGVJbnN0YW5jZShlcnJvcikpOwotICAgIG1fZGVsZWdh
dGUtPmRpZEZhaWxXaXRoRXJyb3IodGhpcywgd2ViRXJyb3IuZ2V0KCkpOwotCi0gICAgcmV0dXJu
IFNfT0s7Ci19Ci0KLUhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNvbnRp
bnVlV2l0aG91dENyZWRlbnRpYWxGb3JBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSgKLSAgICAgICAg
LyogW2luXSAqLyBJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2UqIGNoYWxsZW5nZSkKLXsK
LSAgICBDT01QdHI8V2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U+IHdlYkNoYWxsZW5nZShR
dWVyeSwgY2hhbGxlbmdlKTsKLSAgICBpZiAoIXdlYkNoYWxsZW5nZSkKLSAgICAgICAgcmV0dXJu
IEVfTk9JTlRFUkZBQ0U7Ci0KLSAgICBpZiAobV9kb3dubG9hZCkKLSAgICAgICAgQ0ZVUkxEb3du
bG9hZFVzZUNyZWRlbnRpYWwobV9kb3dubG9hZC5nZXQoKSwgMCwgd2ViQ2hhbGxlbmdlLT5hdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZSgpLmNmVVJMQXV0aENoYWxsZW5nZVJlZigpKTsKLSAgICByZXR1
cm4gU19PSzsKLX0KLQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6dXNl
Q3JlZGVudGlhbCgKLSAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMQ3JlZGVudGlhbCogY3JlZGVu
dGlhbCwgCi0gICAgICAgIC8qIFtpbl0gKi8gSVdlYlVSTEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
KiBjaGFsbGVuZ2UpCi17Ci0gICAgQ09NUHRyPFdlYlVSTEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
PiB3ZWJDaGFsbGVuZ2UoUXVlcnksIGNoYWxsZW5nZSk7Ci0gICAgaWYgKCF3ZWJDaGFsbGVuZ2Up
Ci0gICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOwotCi0gICAgQ09NUHRyPFdlYlVSTENyZWRl
bnRpYWw+IHdlYkNyZWRlbnRpYWwoUXVlcnksIGNyZWRlbnRpYWwpOwotICAgIGlmICghd2ViQ3Jl
ZGVudGlhbCkKLSAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci0KLSAgICBSZXRhaW5QdHI8
Q0ZVUkxDcmVkZW50aWFsUmVmPiBjZkNyZWRlbnRpYWwoQWRvcHRDRiwgY3JlYXRlQ0Yod2ViQ3Jl
ZGVudGlhbC0+Y3JlZGVudGlhbCgpKSk7Ci0KLSAgICBpZiAobV9kb3dubG9hZCkKLSAgICAgICAg
Q0ZVUkxEb3dubG9hZFVzZUNyZWRlbnRpYWwobV9kb3dubG9hZC5nZXQoKSwgY2ZDcmVkZW50aWFs
LmdldCgpLCB3ZWJDaGFsbGVuZ2UtPmF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKCkuY2ZVUkxBdXRo
Q2hhbGxlbmdlUmVmKCkpOwotICAgIHJldHVybiBTX09LOwotfQotCi0vLyBDRlVSTERvd25sb2Fk
IENhbGxiYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIFdlYkRvd25sb2FkOjpkaWRTdGFydCgpCi17Ci0j
aWZuZGVmIE5ERUJVRwotICAgIG1fc3RhcnRUaW1lID0gbV9kYXRhVGltZSA9IGN1cnJlbnRUaW1l
KCk7Ci0gICAgbV9yZWNlaXZlZCA9IDA7Ci0gICAgTE9HKERvd25sb2FkLCAiRE9XTkxPQUQgLSBT
dGFydGVkICVwIGF0ICUuM2Ygc2Vjb25kcyIsIHRoaXMsIG1fc3RhcnRUaW1lKTsKLSNlbmRpZgot
ICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGlkQmVnaW4odGhpcykpKQotICAgICAgICBMT0df
RVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPmRpZEJlZ2luIGZhaWxlZCIpOwotfQotCi1DRlVSTFJl
cXVlc3RSZWYgV2ViRG93bmxvYWQ6OndpbGxTZW5kUmVxdWVzdChDRlVSTFJlcXVlc3RSZWYgcmVx
dWVzdCwgQ0ZVUkxSZXNwb25zZVJlZiByZXNwb25zZSkKLXsKLSAgICBDT01QdHI8V2ViTXV0YWJs
ZVVSTFJlcXVlc3Q+IHdlYlJlcXVlc3QoQWRvcHRDT00sIFdlYk11dGFibGVVUkxSZXF1ZXN0Ojpj
cmVhdGVJbnN0YW5jZShSZXNvdXJjZVJlcXVlc3QocmVxdWVzdCkpKTsKLSAgICBDT01QdHI8V2Vi
VVJMUmVzcG9uc2U+IHdlYlJlc3BvbnNlKEFkb3B0Q09NLCBXZWJVUkxSZXNwb25zZTo6Y3JlYXRl
SW5zdGFuY2UoUmVzb3VyY2VSZXNwb25zZShyZXNwb25zZSkpKTsKLSAgICBDT01QdHI8SVdlYk11
dGFibGVVUkxSZXF1ZXN0PiBmaW5hbFJlcXVlc3Q7Ci0KLSAgICBpZiAoRkFJTEVEKG1fZGVsZWdh
dGUtPndpbGxTZW5kUmVxdWVzdCh0aGlzLCB3ZWJSZXF1ZXN0LmdldCgpLCB3ZWJSZXNwb25zZS5n
ZXQoKSwgJmZpbmFsUmVxdWVzdCkpKQotICAgICAgICBMT0dfRVJST1IoIkRvd25sb2FkRGVsZWdh
dGUtPndpbGxTZW5kUmVxdWVzdCBmYWlsZWQiKTsKLSAgICAKLSAgICBpZiAoIWZpbmFsUmVxdWVz
dCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBDT01QdHI8V2ViTXV0YWJsZVVSTFJlcXVlc3Q+
IGZpbmFsV2ViUmVxdWVzdChBZG9wdENPTSwgV2ViTXV0YWJsZVVSTFJlcXVlc3Q6OmNyZWF0ZUlu
c3RhbmNlKGZpbmFsUmVxdWVzdC5nZXQoKSkpOwotICAgIG1fcmVxdWVzdCA9IGZpbmFsV2ViUmVx
dWVzdC5nZXQoKTsKLSAgICBDRlVSTFJlcXVlc3RSZWYgcmVzdWx0ID0gZmluYWxXZWJSZXF1ZXN0
LT5yZXNvdXJjZVJlcXVlc3QoKS5jZlVSTFJlcXVlc3QoKTsKLSAgICBDRlJldGFpbihyZXN1bHQp
OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgV2ViRG93bmxvYWQ6OmRpZFJlY2VpdmVB
dXRoZW50aWNhdGlvbkNoYWxsZW5nZShDRlVSTEF1dGhDaGFsbGVuZ2VSZWYgY2hhbGxlbmdlKQot
ewotICAgIENPTVB0cjxJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U+IHdlYkNoYWxsZW5n
ZShBZG9wdENPTSwKLSAgICAgICAgV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U6OmNyZWF0
ZUluc3RhbmNlKEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNoYWxsZW5nZSwgMCksIHRoaXMpKTsK
LQotICAgIGlmIChTVUNDRUVERUQobV9kZWxlZ2F0ZS0+ZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9u
Q2hhbGxlbmdlKHRoaXMsIHdlYkNoYWxsZW5nZS5nZXQoKSkpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSh3ZWJDaGFsbGVuZ2UuZ2V0KCkpOwot
fQotCi12b2lkIFdlYkRvd25sb2FkOjpkaWRSZWNlaXZlUmVzcG9uc2UoQ0ZVUkxSZXNwb25zZVJl
ZiByZXNwb25zZSkKLXsKLSAgICBDT01QdHI8V2ViVVJMUmVzcG9uc2U+IHdlYlJlc3BvbnNlKEFk
b3B0Q09NLCBXZWJVUkxSZXNwb25zZTo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VSZXNwb25zZShy
ZXNwb25zZSkpKTsKLSAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZFJlY2VpdmVSZXNwb25z
ZSh0aGlzLCB3ZWJSZXNwb25zZS5nZXQoKSkpKQotICAgICAgICBMT0dfRVJST1IoIkRvd25sb2Fk
RGVsZWdhdGUtPmRpZFJlY2VpdmVSZXNwb25zZSBmYWlsZWQiKTsKLX0KLQotdm9pZCBXZWJEb3du
bG9hZDo6d2lsbFJlc3VtZVdpdGhSZXNwb25zZShDRlVSTFJlc3BvbnNlUmVmIHJlc3BvbnNlLCBV
SW50NjQgZnJvbUJ5dGUpCi17Ci0gICAgQ09NUHRyPFdlYlVSTFJlc3BvbnNlPiB3ZWJSZXNwb25z
ZShBZG9wdENPTSwgV2ViVVJMUmVzcG9uc2U6OmNyZWF0ZUluc3RhbmNlKFJlc291cmNlUmVzcG9u
c2UocmVzcG9uc2UpKSk7Ci0gICAgaWYgKEZBSUxFRChtX2RlbGVnYXRlLT53aWxsUmVzdW1lV2l0
aFJlc3BvbnNlKHRoaXMsIHdlYlJlc3BvbnNlLmdldCgpLCBmcm9tQnl0ZSkpKQotICAgICAgICBM
T0dfRVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPndpbGxSZXN1bWVXaXRoUmVzcG9uc2UgZmFpbGVk
Iik7Ci19Ci0KLXZvaWQgV2ViRG93bmxvYWQ6OmRpZFJlY2VpdmVEYXRhKENGSW5kZXggbGVuZ3Ro
KQotewotI2lmbmRlZiBOREVCVUcKLSAgICBtX3JlY2VpdmVkICs9IGxlbmd0aDsKLSAgICBkb3Vi
bGUgY3VycmVudCA9IGN1cnJlbnRUaW1lKCk7Ci0gICAgaWYgKGN1cnJlbnQgLSBtX2RhdGFUaW1l
ID4gMi4wKQotICAgICAgICBMT0coRG93bmxvYWQsICJET1dOTE9BRCAtICVwIGhhbmdlZCBmb3Ig
JS4zZiBzZWNvbmRzIC0gUmVjZWl2ZWQgJWkgYnl0ZXMgZm9yIGEgdG90YWwgb2YgJWkiLCB0aGlz
LCBjdXJyZW50IC0gbV9kYXRhVGltZSwgbGVuZ3RoLCBtX3JlY2VpdmVkKTsKLSAgICBtX2RhdGFU
aW1lID0gY3VycmVudDsKLSNlbmRpZgotICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGlkUmVj
ZWl2ZURhdGFPZkxlbmd0aCh0aGlzLCBsZW5ndGgpKSkKLSAgICAgICAgTE9HX0VSUk9SKCJEb3du
bG9hZERlbGVnYXRlLT5kaWRSZWNlaXZlRGF0YSBmYWlsZWQiKTsKLX0KLQotYm9vbCBXZWJEb3du
bG9hZDo6c2hvdWxkRGVjb2RlRGF0YU9mTUlNRVR5cGUoQ0ZTdHJpbmdSZWYgbWltZVR5cGUpCi17
Ci0gICAgQk9PTCByZXN1bHQ7Ci0gICAgaWYgKEZBSUxFRChtX2RlbGVnYXRlLT5zaG91bGREZWNv
ZGVTb3VyY2VEYXRhT2ZNSU1FVHlwZSh0aGlzLCBCU3RyaW5nKG1pbWVUeXBlKSwgJnJlc3VsdCkp
KSB7Ci0gICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0ZS0+c2hvdWxkRGVjb2RlU291
cmNlRGF0YU9mTUlNRVR5cGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0gICAgcmV0dXJuICEhcmVzdWx0OwotfQotCi12b2lkIFdlYkRvd25sb2FkOjpkZWNpZGVEZXN0
aW5hdGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lKENGU3RyaW5nUmVmIG5hbWUpCi17ICAgIAot
ICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGVjaWRlRGVzdGluYXRpb25XaXRoU3VnZ2VzdGVk
RmlsZW5hbWUodGhpcywgQlN0cmluZyhuYW1lKSkpKQotICAgICAgICBMT0dfRVJST1IoIkRvd25s
b2FkRGVsZWdhdGUtPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWUgZmFp
bGVkIik7Ci19Ci0KLXZvaWQgV2ViRG93bmxvYWQ6OmRpZENyZWF0ZURlc3RpbmF0aW9uKENGVVJM
UmVmIGRlc3RpbmF0aW9uKQotewotICAgIC8vIFRoZSBjb25jZXB0IG9mIHRoZSAiLmRvd25sb2Fk
IGJ1bmRsZSIgaXMgaW50ZXJuYWwgdG8gdGhlIFdlYkRvd25sb2FkLCBzbyB0aGVyZWZvcmUKLSAg
ICAvLyB3ZSB0cnkgdG8gbWFzayB0aGUgZGVsZWdhdGUgZnJvbSBpdHMgZXhpc3RlbmNlIGFzIG11
Y2ggYXMgcG9zc2libGUgYnkgdGVsbGluZyBpdCB0aGUgZmluYWwKLSAgICAvLyBkZXN0aW5hdGlv
biB3YXMgY3JlYXRlZCwgd2hlbiBpbiByZWFsaXR5IHRoZSBidW5kbGUgd2FzIGNyZWF0ZWQKLQot
ICAgIFN0cmluZyBjcmVhdGVkRGVzdGluYXRpb24gPSBNYXJzaGFsbGluZ0hlbHBlcnM6OkZpbGVD
RlVSTFJlZlRvUGF0aFN0cmluZyhkZXN0aW5hdGlvbik7Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50
IGluIHJlY2VpdmluZyBDRlVSTERvd25sb2FkIGNhbGxiYWNrcywgd2Ugc2hvdWxkIGRlZmluaXRl
bHkgaGF2ZSB0aGUgYnVuZGxlIHBhdGggc3RvcmVkIGxvY2FsbHkKLSAgICAvLyBhbmQgaXQgc2hv
dWxkIG1hdGNoIHdpdGggdGhlIGZpbGUgdGhhdCBDRlVSTERvd25sb2FkIGNyZWF0ZWQKLSAgICBB
U1NFUlQoY3JlYXRlZERlc3RpbmF0aW9uID09IG1fYnVuZGxlUGF0aCk7Ci0gICAgLy8gQW5kIHdl
IHNob3VsZCBhbHNvIGFsd2F5cyBoYXZlIHRoZSBmaW5hbC1kZXN0aW5hdGlvbiBzdG9yZWQKLSAg
ICBBU1NFUlQoIW1fZGVzdGluYXRpb24uaXNFbXB0eSgpKTsKLQotICAgIEJTdHJpbmcgcGF0aCht
X2Rlc3RpbmF0aW9uKTsKLSAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZENyZWF0ZURlc3Rp
bmF0aW9uKHRoaXMsIHBhdGgpKSkKLSAgICAgICAgTE9HX0VSUk9SKCJEb3dubG9hZERlbGVnYXRl
LT5kaWRDcmVhdGVEZXN0aW5hdGlvbiBmYWlsZWQiKTsKLX0KLQotdm9pZCBXZWJEb3dubG9hZDo6
ZGlkRmluaXNoKCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgTE9HKERvd25sb2FkLCAiRE9XTkxP
QUQgLSBGaW5pc2hlZCAlcCBhZnRlciAlaSBieXRlcyBhbmQgJS4zZiBzZWNvbmRzIiwgdGhpcywg
bV9yZWNlaXZlZCwgY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKTsKLSNlbmRpZgotCi0gICAg
QVNTRVJUKCFtX2J1bmRsZVBhdGguaXNFbXB0eSgpICYmICFtX2Rlc3RpbmF0aW9uLmlzRW1wdHko
KSk7Ci0gICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBNb3ZpbmcgZmlsZSBmcm9tIGJ1
bmRsZSAlcyB0byBkZXN0aW5hdGlvbiAlcyIsIG1fYnVuZGxlUGF0aC5hc2NpaSgpLmRhdGEoKSwg
bV9kZXN0aW5hdGlvbi5hc2NpaSgpLmRhdGEoKSk7Ci0KLSAgICAvLyBXZSB0cnkgdG8gcmVuYW1l
IHRoZSBidW5kbGUgdG8gdGhlIGZpbmFsIGZpbGUgbmFtZS4gIElmIHRoYXQgZmFpbHMsIHdlIGdp
dmUgdGhlIGRlbGVnYXRlIG9uZSBtb3JlIGNoYW5jZSB0byBjaG9zZQotICAgIC8vIHRoZSBmaW5h
bCBmaWxlIG5hbWUsIHRoZW4gd2UganVzdCBsZWF2ZSBpdAotICAgIGlmICghTW92ZUZpbGVFeCht
X2J1bmRsZVBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgbV9kZXN0aW5hdGlv
bi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwKSkgewotICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBtb3ZlIGJ1bmRsZSAlcyB0byAlcyBvbiBjb21wbGV0aW9uXG5FcnJvciAt
ICVpIiwgbV9idW5kbGVQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX2Rlc3RpbmF0aW9uLmFzY2lpKCku
ZGF0YSgpLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgICAgIAotICAgICAgICBib29sIHJlcG9ydEJ1
bmRsZVBhdGhBc0ZpbmFsUGF0aCA9IHRydWU7Ci0KLSAgICAgICAgQlN0cmluZyBkZXN0aW5hdGlv
bkJTVFIobV9kZXN0aW5hdGlvbi5jaGFyYWN0ZXJzKCksIG1fZGVzdGluYXRpb24ubGVuZ3RoKCkp
OwotICAgICAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1
Z2dlc3RlZEZpbGVuYW1lKHRoaXMsIGRlc3RpbmF0aW9uQlNUUikpKQotICAgICAgICAgICAgTE9H
X0VSUk9SKCJkZWxlZ2F0ZS0+ZGVjaWRlRGVzdGluYXRpb25XaXRoU3VnZ2VzdGVkRmlsZW5hbWUo
KSBmYWlsZWQiKTsKLQotICAgICAgICAvLyBUaGUgY2FsbCB0byBtX2RlbGVnYXRlLT5kZWNpZGVE
ZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRGaWxlbmFtZSgpIHNob3VsZCBoYXZlIGNoYW5nZWQgb3Vy
IGRlc3RpbmF0aW9uLCBzbyB3ZSdsbCB0cnkgdGhlIG1vdmUKLSAgICAgICAgLy8gb25lIGxhc3Qg
dGltZS4KLSAgICAgICAgaWYgKCFtX2Rlc3RpbmF0aW9uLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
IGlmIChNb3ZlRmlsZUV4KG1fYnVuZGxlUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlv
bigpLCBtX2Rlc3RpbmF0aW9uLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIDApKQot
ICAgICAgICAgICAgICAgIHJlcG9ydEJ1bmRsZVBhdGhBc0ZpbmFsUGF0aCA9IGZhbHNlOwotCi0g
ICAgICAgIC8vIFdlIGVpdGhlciBuZWVkIHRvIHRlbGwgdGhlIGRlbGVnYXRlIG91ciBmaW5hbCBm
aWxlbmFtZSBpcyB0aGUgYnVuZGxlIGZpbGVuYW1lLCBvciBpcyB0aGUgZmlsZSBuYW1lIHRoZXkg
anVzdCB0b2xkIHVzIHRvIHVzZQotICAgICAgICBpZiAocmVwb3J0QnVuZGxlUGF0aEFzRmluYWxQ
YXRoKSB7Ci0gICAgICAgICAgICBCU3RyaW5nIGJ1bmRsZUJTVFIobV9idW5kbGVQYXRoKTsKLSAg
ICAgICAgICAgIG1fZGVsZWdhdGUtPmRpZENyZWF0ZURlc3RpbmF0aW9uKHRoaXMsIGJ1bmRsZUJT
VFIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQlN0cmluZyBmaW5hbERlc3RpbmF0
aW9uQlNUUiA9IEJTdHJpbmcobV9kZXN0aW5hdGlvbik7Ci0gICAgICAgICAgICBtX2RlbGVnYXRl
LT5kaWRDcmVhdGVEZXN0aW5hdGlvbih0aGlzLCBmaW5hbERlc3RpbmF0aW9uQlNUUik7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJdCdzIGV4dHJlbWVseSBsaWtlbHkgdGhlIGNhbGwgdG8g
ZGVsZWdhdGUtPmRpZEZpbmlzaCgpIHdpbGwgZGVyZWYgdGhpcywgc28gbGV0cyBub3QgbGV0IHRo
YXQgY2F1c2Ugb3VyIGRlc3RydWN0aW9uIGp1c3QgeWV0Ci0gICAgQ09NUHRyPFdlYkRvd25sb2Fk
PiBwcm90ZWN0ID0gdGhpczsKLSAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZEZpbmlzaCh0
aGlzKSkpCi0gICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0ZS0+ZGlkRmluaXNoIGZh
aWxlZCIpOwotCi0gICAgbV9kb3dubG9hZCA9IDA7Ci19Ci0KLXZvaWQgV2ViRG93bmxvYWQ6OmRp
ZEZhaWwoQ0ZFcnJvclJlZiBlcnJvcikKLXsKLSAgICBDT01QdHI8V2ViRXJyb3I+IHdlYkVycm9y
KEFkb3B0Q09NLCBXZWJFcnJvcjo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VFcnJvcihlcnJvcikp
KTsKLSAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZEZhaWxXaXRoRXJyb3IodGhpcywgd2Vi
RXJyb3IuZ2V0KCkpKSkKLSAgICAgICAgTE9HX0VSUk9SKCJEb3dubG9hZERlbGVnYXRlLT5kaWRG
YWlsV2l0aEVycm9yIGZhaWxlZCIpOwotfQotCi0vLyBDRlVSTERvd25sb2FkIENhbGxiYWNrcyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi12b2lkIGRpZFN0YXJ0Q2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgY29uc3Qgdm9p
ZCAqY2xpZW50SW5mbykKLXsgKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPmRpZFN0YXJ0KCk7
IH0KLQotQ0ZVUkxSZXF1ZXN0UmVmIHdpbGxTZW5kUmVxdWVzdENhbGxiYWNrKENGVVJMRG93bmxv
YWRSZWYsIENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBDRlVSTFJlc3BvbnNlUmVmIHJlZGlyZWN0
aW9uUmVzcG9uc2UsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCi17IHJldHVybiAoKFdlYkRvd25s
b2FkKiljbGllbnRJbmZvKS0+d2lsbFNlbmRSZXF1ZXN0KHJlcXVlc3QsIHJlZGlyZWN0aW9uUmVz
cG9uc2UpOyB9Ci0KLXZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJh
Y2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxBdXRoQ2hhbGxlbmdlUmVmIGNoYWxsZW5nZSwgY29u
c3Qgdm9pZCAqY2xpZW50SW5mbykKLXsgKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPmRpZFJl
Y2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjaGFsbGVuZ2UpOyB9Ci0KLXZvaWQgZGlkUmVj
ZWl2ZVJlc3BvbnNlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxSZXNwb25zZVJlZiBy
ZXNwb25zZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKLXsgKChXZWJEb3dubG9hZCopY2xpZW50
SW5mbyktPmRpZFJlY2VpdmVSZXNwb25zZShyZXNwb25zZSk7IH0KLQotdm9pZCB3aWxsUmVzdW1l
V2l0aFJlc3BvbnNlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxSZXNwb25zZVJlZiBy
ZXNwb25zZSwgVUludDY0IHN0YXJ0aW5nQnl0ZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKLXsg
KChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPndpbGxSZXN1bWVXaXRoUmVzcG9uc2UocmVzcG9u
c2UsIHN0YXJ0aW5nQnl0ZSk7IH0KLQotdm9pZCBkaWRSZWNlaXZlRGF0YUNhbGxiYWNrKENGVVJM
RG93bmxvYWRSZWYsIENGSW5kZXggbGVuZ3RoLCBjb25zdCB2b2lkICpjbGllbnRJbmZvKQoteyAo
KFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+ZGlkUmVjZWl2ZURhdGEobGVuZ3RoKTsgfQotCi1C
b29sZWFuIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJl
ZiwgQ0ZTdHJpbmdSZWYgZW5jb2RpbmdUeXBlLCBjb25zdCB2b2lkICpjbGllbnRJbmZvKQoteyBy
ZXR1cm4gKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPnNob3VsZERlY29kZURhdGFPZk1JTUVU
eXBlKGVuY29kaW5nVHlwZSk7IH0KLQotdm9pZCBkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0
ZWRPYmplY3ROYW1lQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZTdHJpbmdSZWYgb2JqZWN0
TmFtZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKLXsgKChXZWJEb3dubG9hZCopY2xpZW50SW5m
byktPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWUob2JqZWN0TmFtZSk7
IH0KLQotdm9pZCBkaWRDcmVhdGVEZXN0aW5hdGlvbkNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYs
IENGVVJMUmVmIHBhdGgsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCi17ICgoV2ViRG93bmxvYWQq
KWNsaWVudEluZm8pLT5kaWRDcmVhdGVEZXN0aW5hdGlvbihwYXRoKTsgfQotCi12b2lkIGRpZEZp
bmlzaENhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCi17
ICgoV2ViRG93bmxvYWQqKWNsaWVudEluZm8pLT5kaWRGaW5pc2goKTsgfQotCi12b2lkIGRpZEZh
aWxDYWxsYmFjayhDRlVSTERvd25sb2FkUmVmLCBDRkVycm9yUmVmIGVycm9yLCBjb25zdCB2b2lk
ICpjbGllbnRJbmZvKQoteyAoKFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+ZGlkRmFpbChlcnJv
cik7IH0KLQotLy8gRG93bmxvYWQgQnVuZGxlIGZpbGUgdXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3Rh
dGljIENGRGF0YVJlZiBleHRyYWN0UmVzdW1lRGF0YUZyb21CdW5kbGUoY29uc3QgU3RyaW5nJiBi
dW5kbGVQYXRoKQotewotICAgIGlmIChidW5kbGVQYXRoLmlzRW1wdHkoKSkgewotICAgICAgICBM
T0dfRVJST1IoIkNhbm5vdCBjcmVhdGUgcmVzdW1lIGRhdGEgZnJvbSBlbXB0eSBkb3dubG9hZCBi
dW5kbGUgcGF0aCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgLy8gT3Bl
biBhIGhhbmRsZSB0byB0aGUgYnVuZGxlIGZpbGUKLSAgICBTdHJpbmcgbnVsbGlmaWVkUGF0aCA9
IGJ1bmRsZVBhdGg7Ci0gICAgRklMRSogYnVuZGxlID0gMDsKLSAgICBpZiAoX3dmb3Blbl9zKCZi
dW5kbGUsIG51bGxpZmllZFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgVEVY
VCgicitiIikpIHx8ICFidW5kbGUpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3Bl
biBmaWxlICVzIHRvIGdldCByZXN1bWUgZGF0YSIsIGJ1bmRsZVBhdGguYXNjaWkoKS5kYXRhKCkp
OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBDRkRhdGFSZWYgcmVzdWx0ID0gMDsK
LSAgICBWZWN0b3I8VUludDg+IGZvb3RlckJ1ZmZlcjsKLSAgICAKLSAgICAvLyBTdGF0IHRoZSBm
aWxlIHRvIGdldCBpdHMgc2l6ZQotICAgIHN0cnVjdCBfc3RhdDY0IGZpbGVTdGF0OwotICAgIGlm
IChfZnN0YXQ2NChfZmlsZW5vKGJ1bmRsZSksICZmaWxlU3RhdCkpCi0gICAgICAgIGdvdG8gZXhp
dDsKLSAgICAKLSAgICAvLyBDaGVjayBmb3IgdGhlIGJ1bmRsZSBtYWdpYyBudW1iZXIgYXQgdGhl
IGVuZCBvZiB0aGUgZmlsZQotICAgIGZwb3NfdCBmb290ZXJNYWdpY051bWJlclBvc2l0aW9uID0g
ZmlsZVN0YXQuc3Rfc2l6ZSAtIDQ7Ci0gICAgQVNTRVJUKGZvb3Rlck1hZ2ljTnVtYmVyUG9zaXRp
b24gPj0gMCk7Ci0gICAgaWYgKGZvb3Rlck1hZ2ljTnVtYmVyUG9zaXRpb24gPCAwKQotICAgICAg
ICBnb3RvIGV4aXQ7Ci0gICAgaWYgKGZzZXRwb3MoYnVuZGxlLCAmZm9vdGVyTWFnaWNOdW1iZXJQ
b3NpdGlvbikpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIFVJbnQzMiBmb290ZXJNYWdpY051
bWJlciA9IDA7Ci0gICAgaWYgKGZyZWFkKCZmb290ZXJNYWdpY051bWJlciwgNCwgMSwgYnVuZGxl
KSAhPSAxKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgZm9vdGVyIG1hZ2lj
IG51bWJlciBmcm9tIHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJubyk7ICAKLSAgICAgICAg
Z290byBleGl0OwotICAgIH0KLQotICAgIGlmIChmb290ZXJNYWdpY051bWJlciAhPSBCdW5kbGVN
YWdpY051bWJlcikgewotICAgICAgICBMT0dfRVJST1IoIkZvb3RlcidzIG1hZ2ljIG51bWJlciBk
b2VzIG5vdCBtYXRjaCAweCVYIC0gZXJybm8oJWkpIiwgQnVuZGxlTWFnaWNOdW1iZXIsIGVycm5v
KTsgIAotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotCi0gICAgLy8gTm93IHdlJ3JlICpyZWFz
b25hYmx5KiBzdXJlIHRoaXMgaXMgYSAuZG93bmxvYWQgYnVuZGxlIHdlIGFjdHVhbGx5IHdyb3Rl
LiAKLSAgICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdW1lIGRhdGEKLSAgICBmcG9zX3Qg
Zm9vdGVyTGVuZ3RoUG9zaXRpb24gPSBmaWxlU3RhdC5zdF9zaXplIC0gODsKLSAgICBBU1NFUlQo
Zm9vdGVyTGVuZ3RoUG9zaXRpb24gPj0gMCk7Ci0gICAgaWYgKGZvb3Rlckxlbmd0aFBvc2l0aW9u
IDwgMCkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgaWYgKGZzZXRwb3MoYnVuZGxlLCAmZm9v
dGVyTGVuZ3RoUG9zaXRpb24pKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBVSW50MzIgZm9v
dGVyTGVuZ3RoID0gMDsKLSAgICBpZiAoZnJlYWQoJmZvb3Rlckxlbmd0aCwgNCwgMSwgYnVuZGxl
KSAhPSAxKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgUmVzdW1lRGF0YSBs
ZW5ndGggZnJvbSB0aGUgYnVuZGxlIC0gZXJybm8oJWkpIiwgZXJybm8pOyAgCi0gICAgICAgIGdv
dG8gZXhpdDsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlcmVzIGVub3VnaCBieXRlcyB0
byByZWFkIGluIGZvciB0aGUgcmVzdW1lIGRhdGEsIGFuZCBwZXJmb3JtIHRoZSByZWFkCi0gICAg
ZnBvc190IGZvb3RlclN0YXJ0UG9zaXRpb24gPSBmaWxlU3RhdC5zdF9zaXplIC0gOCAtIGZvb3Rl
ckxlbmd0aDsKLSAgICBBU1NFUlQoZm9vdGVyU3RhcnRQb3NpdGlvbiA+PSAwKTsKLSAgICBpZiAo
Zm9vdGVyU3RhcnRQb3NpdGlvbiA8IDApCi0gICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoZnNl
dHBvcyhidW5kbGUsICZmb290ZXJTdGFydFBvc2l0aW9uKSkKLSAgICAgICAgZ290byBleGl0Owot
Ci0gICAgZm9vdGVyQnVmZmVyLnJlc2l6ZShmb290ZXJMZW5ndGgpOwotICAgIGlmIChmcmVhZChm
b290ZXJCdWZmZXIuZGF0YSgpLCAxLCBmb290ZXJMZW5ndGgsIGJ1bmRsZSkgIT0gZm9vdGVyTGVu
Z3RoKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgUmVzdW1lRGF0YSBmcm9t
IHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJubyk7ICAKLSAgICAgICAgZ290byBleGl0Owot
ICAgIH0KLQotICAgIC8vIENGVVJMRG93bmxvYWQgd2lsbCBzZWVrIHRvIHRoZSBhcHByb3ByaWF0
ZSBwbGFjZSBpbiB0aGUgZmlsZSAoYmVmb3JlIG91ciBmb290ZXIpIGFuZCBzdGFydCBvdmVyd3Jp
dGluZyBmcm9tIHRoZXJlCi0gICAgLy8gSG93ZXZlciwgc2F5IHdlIHdlcmUgd2l0aGluIGEgZmV3
IGh1bmRyZWQgYnl0ZXMgb2YgdGhlIGVuZCBvZiBhIGRvd25sb2FkIHdoZW4gaXQgd2FzIHBhdXNl
ZCAtCi0gICAgLy8gVGhlIGFkZGl0aW9uYWwgZm9vdGVyIGV4dGVuZGVkIHRoZSBsZW5ndGggb2Yg
dGhlIGZpbGUgYmV5b25kIGl0cyBmaW5hbCBsZW5ndGgsIGFuZCB0aGVyZSB3aWxsIGJlIGp1bmsg
ZGF0YSBsZWZ0b3ZlcgotICAgIC8vIGF0IHRoZSBlbmQuICBUaGVyZWZvcmUsIG5vdyB0aGF0IHdl
J3ZlIHJldHJpZXZlZCB0aGUgZm9vdGVyIGRhdGEsIHdlIG5lZWQgdG8gdHJ1bmNhdGUgaXQuCi0g
ICAgaWYgKGVycm5vX3QgcmVzaXplRXJyb3IgPSBfY2hzaXplX3MoX2ZpbGVubyhidW5kbGUpLCBm
b290ZXJTdGFydFBvc2l0aW9uKSkgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byB0cnVu
Y2F0ZSB0aGUgcmVzdW1lIGZvb3RlciBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZSAtIGVycm5vKCVp
KSIsIHJlc2l6ZUVycm9yKTsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLQotICAgIC8vIEZp
bmFsbHksIG1ha2UgdGhlIHJlc3VtZSBkYXRhLiAgTm93LCBpdCBpcyBwb3NzaWJsZSBieSBzb21l
IHR3aXN0IG9mIGZhdGUgdGhlIGJ1bmRsZSBtYWdpYyBudW1iZXIKLSAgICAvLyB3YXMgbmF0dXJh
bGx5IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGl0cyBub3QgYWN0dWFsbHkgYSB2YWxpZCBi
dW5kbGUuICBUaGF0LCBvciBzb21lb25lIGVuZ2luZWVyZWQKLSAgICAvLyBpdCB0aGF0IHdheSB0
byB0cnkgdG8gYXR0YWNrIHVzLiAgSW4gdGhhdCBjYXVzZSwgdGhpcyBDRkRhdGEgd2lsbCBzdWNj
ZXNzZnVsbHkgY3JlYXRlIGJ1dCB3aGVuIHdlIAotICAgIC8vIGFjdHVhbGx5IHRyeSB0byBzdGFy
dCB0aGUgQ0ZVUkxEb3dubG9hZCB1c2luZyB0aGlzIGJvZ3VzIGRhdGEsIGl0IHdpbGwgZmFpbCBh
bmQgd2Ugd2lsbCBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5Ci0gICAgcmVzdWx0ID0gQ0ZEYXRhQ3Jl
YXRlKDAsIGZvb3RlckJ1ZmZlci5kYXRhKCksIGZvb3Rlckxlbmd0aCk7Ci1leGl0OgotICAgIGZj
bG9zZShidW5kbGUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIGFw
cGVuZFJlc3VtZURhdGFUb0J1bmRsZShDRkRhdGFSZWYgcmVzdW1lRGF0YSwgY29uc3QgU3RyaW5n
JiBidW5kbGVQYXRoKQotewotICAgIGlmICghcmVzdW1lRGF0YSkgewotICAgICAgICBMT0dfRVJS
T1IoIkludmFsaWQgcmVzdW1lIGRhdGEgdG8gd3JpdGUgdG8gYnVuZGxlIHBhdGgiKTsKLSAgICAg
ICAgcmV0dXJuIEVfRkFJTDsKLSAgICB9Ci0gICAgaWYgKGJ1bmRsZVBhdGguaXNFbXB0eSgpKSB7
Ci0gICAgICAgIExPR19FUlJPUigiQ2Fubm90IHdyaXRlIHJlc3VtZSBkYXRhIHRvIGVtcHR5IGRv
d25sb2FkIGJ1bmRsZSBwYXRoIik7Ci0gICAgICAgIHJldHVybiBFX0ZBSUw7Ci0gICAgfQotCi0g
ICAgU3RyaW5nIG51bGxpZmllZFBhdGggPSBidW5kbGVQYXRoOwotICAgIEZJTEUqIGJ1bmRsZSA9
IDA7Ci0gICAgaWYgKF93Zm9wZW5fcygmYnVuZGxlLCBudWxsaWZpZWRQYXRoLmNoYXJhY3RlcnNX
aXRoTnVsbFRlcm1pbmF0aW9uKCksIFRFWFQoImFiIikpIHx8ICFidW5kbGUpIHsKLSAgICAgICAg
TE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBmaWxlICVzIHRvIGFwcGVuZCByZXN1bWUgZGF0YSIs
IGJ1bmRsZVBhdGguYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gRV9GQUlMOwotICAg
IH0KLQotICAgIEhSRVNVTFQgaHIgPSBFX0ZBSUw7Ci0KLSAgICBjb25zdCBVSW50OCogcmVzdW1l
Qnl0ZXMgPSBDRkRhdGFHZXRCeXRlUHRyKHJlc3VtZURhdGEpOwotICAgIEFTU0VSVChyZXN1bWVC
eXRlcyk7Ci0gICAgaWYgKCFyZXN1bWVCeXRlcykKLSAgICAgICAgZ290byBleGl0OwotCi0gICAg
VUludDMyIHJlc3VtZUxlbmd0aCA9IENGRGF0YUdldExlbmd0aChyZXN1bWVEYXRhKTsKLSAgICBB
U1NFUlQocmVzdW1lTGVuZ3RoID4gMCk7Ci0gICAgaWYgKHJlc3VtZUxlbmd0aCA8IDEpCi0gICAg
ICAgIGdvdG8gZXhpdDsKLQotICAgIGlmIChmd3JpdGUocmVzdW1lQnl0ZXMsIDEsIHJlc3VtZUxl
bmd0aCwgYnVuZGxlKSAhPSByZXN1bWVMZW5ndGgpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gd3JpdGUgcmVzdW1lIGRhdGEgdG8gdGhlIGJ1bmRsZSAtIGVycm5vKCVpKSIsIGVycm5v
KTsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLQotICAgIGlmIChmd3JpdGUoJnJlc3VtZUxl
bmd0aCwgNCwgMSwgYnVuZGxlKSAhPSAxKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRv
IHdyaXRlIGZvb3RlciBsZW5ndGggdG8gdGhlIGJ1bmRsZSAtIGVycm5vKCVpKSIsIGVycm5vKTsK
LSAgICAgICAgZ290byBleGl0OwotICAgIH0KLQotICAgIGlmIChmd3JpdGUoJkJ1bmRsZU1hZ2lj
TnVtYmVyLCA0LCAxLCBidW5kbGUpICE9IDEpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQg
dG8gd3JpdGUgZm9vdGVyIG1hZ2ljIG51bWJlciB0byB0aGUgYnVuZGxlIC0gZXJybm8oJWkpIiwg
ZXJybm8pOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotICAgIAotICAgIGhyID0gU19PSzsK
LWV4aXQ6Ci0gICAgZmNsb3NlKGJ1bmRsZSk7Ci0gICAgcmV0dXJuIGhyOwotfQpJbmRleDogV2Vi
S2l0L3dpbi9XZWJEb3dubG9hZENGTmV0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dl
YkRvd25sb2FkQ0ZOZXQuY3BwCShyZXZpc2lvbiAzMTgxNCkJKGZyb20gV2ViS2l0L3dpbi9XZWJE
b3dubG9hZC5jcHA6MzE4MTQpCisrKyBXZWJLaXQvd2luL1dlYkRvd25sb2FkQ0ZOZXQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJXZWJLaXRETEwuaCIKKyNpbmNsdWRlICJXZWJEb3dubG9hZC5oIgor
CisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkRlZmF1bHREb3dubG9hZERlbGVnYXRl
LmgiCisjaW5jbHVkZSAiTWFyc2hhbGxpbmdIZWxwZXJzLmgiCisjaW5jbHVkZSAiV2ViRXJyb3Iu
aCIKKyNpbmNsdWRlICJXZWJLaXQuaCIKKyNpbmNsdWRlICJXZWJLaXRMb2dnaW5nLmgiCisjaW5j
bHVkZSAiV2ViTXV0YWJsZVVSTFJlcXVlc3QuaCIKKyNpbmNsdWRlICJXZWJVUkxBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZS5oIgorI2luY2x1ZGUgIldlYlVSTENyZWRlbnRpYWwuaCIKKyNpbmNsdWRl
ICJXZWJVUkxSZXNwb25zZS5oIgorCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxzeXMvc3Rh
dC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjcHJhZ21hIHdhcm5pbmcocHVzaCwgMCkK
KyNpbmNsdWRlIDxXZWJDb3JlL0F1dGhlbnRpY2F0aW9uQ0YuaD4KKyNpbmNsdWRlIDxXZWJDb3Jl
L0JTdHJpbmcuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL05vdEltcGxlbWVudGVkLmg+CisjaW5jbHVk
ZSA8V2ViQ29yZS9SZXNvdXJjZUVycm9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9SZXNvdXJjZUhh
bmRsZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUmVzb3VyY2VSZXF1ZXN0Lmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9SZXNvdXJjZVJlc3BvbnNlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TeXN0ZW1UaW1l
Lmg+CisjcHJhZ21hIHdhcm5pbmcocG9wKQorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKwor
Ly8gQ0ZVUkxEb3dubG9hZCBDYWxsYmFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgZGlkU3RhcnRD
YWxsYmFjayhDRlVSTERvd25sb2FkUmVmIGRvd25sb2FkLCBjb25zdCB2b2lkICpjbGllbnRJbmZv
KTsKK3N0YXRpYyBDRlVSTFJlcXVlc3RSZWYgd2lsbFNlbmRSZXF1ZXN0Q2FsbGJhY2soQ0ZVUkxE
b3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QsIENGVVJMUmVzcG9u
c2VSZWYgcmVkaXJlY3Rpb25SZXNwb25zZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CitzdGF0
aWMgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2VDYWxsYmFjayhDRlVSTERv
d25sb2FkUmVmIGRvd25sb2FkLCBDRlVSTEF1dGhDaGFsbGVuZ2VSZWYgY2hhbGxlbmdlLCBjb25z
dCB2b2lkICpjbGllbnRJbmZvKTsKK3N0YXRpYyB2b2lkIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxi
YWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVzcG9uc2VSZWYgcmVzcG9uc2Us
IGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOworc3RhdGljIHZvaWQgd2lsbFJlc3VtZVdpdGhSZXNw
b25zZUNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVzcG9uc2VSZWYg
cmVzcG9uc2UsIFVJbnQ2NCBzdGFydGluZ0J5dGUsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOwor
c3RhdGljIHZvaWQgZGlkUmVjZWl2ZURhdGFDYWxsYmFjayhDRlVSTERvd25sb2FkUmVmIGRvd25s
b2FkLCBDRkluZGV4IGxlbmd0aCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CitzdGF0aWMgQm9v
bGVhbiBzaG91bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYg
ZG93bmxvYWQsIENGU3RyaW5nUmVmIGVuY29kaW5nVHlwZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5m
byk7CitzdGF0aWMgdm9pZCBkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1l
Q2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZTdHJpbmdSZWYgb2JqZWN0TmFt
ZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CitzdGF0aWMgdm9pZCBkaWRDcmVhdGVEZXN0aW5h
dGlvbkNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVmIHBhdGgsIGNv
bnN0IHZvaWQgKmNsaWVudEluZm8pOworc3RhdGljIHZvaWQgZGlkRmluaXNoQ2FsbGJhY2soQ0ZV
UkxEb3dubG9hZFJlZiBkb3dubG9hZCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CitzdGF0aWMg
dm9pZCBkaWRGYWlsQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZFcnJvclJl
ZiBlcnJvciwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CisKKy8vIERvd25sb2FkIEJ1bmRsZSBm
aWxlIHV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgY29uc3QgU3RyaW5nIEJ1bmRsZUV4dGVuc2lv
bigiLmRvd25sb2FkIik7CitzdGF0aWMgVUludDMyIEJ1bmRsZU1hZ2ljTnVtYmVyID0gMHhERUNB
RjRFQTsKKworc3RhdGljIENGRGF0YVJlZiBleHRyYWN0UmVzdW1lRGF0YUZyb21CdW5kbGUoY29u
c3QgU3RyaW5nJiBidW5kbGVQYXRoKTsKK3N0YXRpYyBIUkVTVUxUIGFwcGVuZFJlc3VtZURhdGFU
b0J1bmRsZShDRkRhdGFSZWYgcmVzdW1lRGF0YSwgY29uc3QgU3RyaW5nJiBidW5kbGVQYXRoKTsK
KworLy8gV2ViRG93bmxvYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZWJEb3dubG9hZDo6V2ViRG93bmxvYWQoKQor
ICAgIDogbV9yZWZDb3VudCgwKQoreworICAgIGdDbGFzc0NvdW50Kys7Cit9CisKK3ZvaWQgV2Vi
RG93bmxvYWQ6OmluaXQoUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSwgY29uc3QgUmVzb3VyY2VSZXF1
ZXN0JiByZXF1ZXN0LCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgSVdlYkRvd25s
b2FkRGVsZWdhdGUqIGRlbGVnYXRlKQoreworICAgIG1fZGVsZWdhdGUgPSBkZWxlZ2F0ZSA/IGRl
bGVnYXRlIDogRGVmYXVsdERvd25sb2FkRGVsZWdhdGU6OnNoYXJlZEluc3RhbmNlKCk7CisgICAg
Q0ZVUkxDb25uZWN0aW9uUmVmIGNvbm5lY3Rpb24gPSBoYW5kbGUtPmNvbm5lY3Rpb24oKTsKKyAg
ICBpZiAoIWNvbm5lY3Rpb24pIHsKKyAgICAgICAgTE9HX0VSUk9SKCJXZWJEb3dubG9hZDo6V2Vi
RG93bmxvYWQoUmVzb3VyY2VIYW5kbGUqLC4uLikgY2FsbGVkIHdpdGggYW4gaW5hY3RpdmUgUmVz
b3VyY2VIYW5kbGUiKTsgICAgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDRlVSTERv
d25sb2FkQ2xpZW50IGNsaWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNr
LCB3aWxsU2VuZFJlcXVlc3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxl
bmdlQ2FsbGJhY2ssIAorICAgICAgICBkaWRSZWNlaXZlUmVzcG9uc2VDYWxsYmFjaywgd2lsbFJl
c3VtZVdpdGhSZXNwb25zZUNhbGxiYWNrLCBkaWRSZWNlaXZlRGF0YUNhbGxiYWNrLCBzaG91bGRE
ZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNrLAorICAgICAgICBkZWNpZGVEZXN0aW5hdGlvbldp
dGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2ssIGRpZENyZWF0ZURlc3RpbmF0aW9uQ2FsbGJh
Y2ssIGRpZEZpbmlzaENhbGxiYWNrLCBkaWRGYWlsQ2FsbGJhY2t9OworCisgICAgbV9yZXF1ZXN0
LmFkb3B0UmVmKFdlYk11dGFibGVVUkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShyZXF1ZXN0KSk7
CisgICAgbV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGVBbmRTdGFydFdpdGhM
b2FkaW5nQ29ubmVjdGlvbigwLCBjb25uZWN0aW9uLCByZXF1ZXN0LmNmVVJMUmVxdWVzdCgpLCBy
ZXNwb25zZS5jZlVSTFJlc3BvbnNlKCksICZjbGllbnQpKTsKKworICAgIC8vIEl0IGlzIHBvc3Np
YmxlIGZvciBDRlVSTERvd25sb2FkQ3JlYXRlQW5kU3RhcnRXaXRoTG9hZGluZ0Nvbm5lY3Rpb24o
KSB0byBmYWlsIGlmIHRoZSBwYXNzZWQgaW4gQ0ZVUkxDb25uZWN0aW9uIGlzIG5vdCBpbiBhICJk
b3dubG9hZGFibGUgc3RhdGUiCisgICAgLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5ldmVyIGhpdCB0
aGF0IGNhc2UKKyAgICBpZiAoIW1fZG93bmxvYWQpIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgICAgIExPR19FUlJPUigiV2ViRG93bmxvYWQgLSBGYWlsZWQgdG8gY3JlYXRl
IFdlYkRvd25sb2FkIGZyb20gZXhpc3RpbmcgY29ubmVjdGlvbiAoJXMpIiwgcmVxdWVzdC51cmwo
KS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgTE9HKERvd25s
b2FkLCAiV2ViRG93bmxvYWQgLSBDcmVhdGVkIFdlYkRvd25sb2FkICVwIGZyb20gZXhpc3Rpbmcg
Y29ubmVjdGlvbiAoJXMpIiwgdGhpcywgcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0
YSgpKTsKKworICAgIC8vIFRoZSBDRlVSTERvd25sb2FkIGVpdGhlciBzdGFydHMgc3VjY2Vzc2Z1
bGx5IGFuZCByZXRhaW5zIHRoZSBDRlVSTENvbm5lY3Rpb24sIAorICAgIC8vIG9yIGl0IGZhaWxz
IHRvIGNyZWF0aW5nIGFuZCB3ZSBoYXZlIGEgbm93LXVzZWxlc3MgY29ubmVjdGlvbiB3aXRoIGEg
ZGFuZ2xpbmcgcmVmLiAKKyAgICAvLyBFaXRoZXIgd2F5LCB3ZSBuZWVkIHRvIHJlbGVhc2UgdGhl
IGNvbm5lY3Rpb24gdG8gYmFsYW5jZSBvdXQgcmVmIGNvdW50cworICAgIGhhbmRsZS0+cmVsZWFz
ZUNvbm5lY3Rpb25Gb3JEb3dubG9hZCgpOworICAgIENGUmVsZWFzZShjb25uZWN0aW9uKTsKK30K
Kwordm9pZCBXZWJEb3dubG9hZDo6aW5pdChjb25zdCBLVVJMJiB1cmwsIElXZWJEb3dubG9hZERl
bGVnYXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBtX2RlbGVnYXRlID0gZGVsZWdhdGUgPyBkZWxlZ2F0
ZSA6IERlZmF1bHREb3dubG9hZERlbGVnYXRlOjpzaGFyZWRJbnN0YW5jZSgpOworICAgIExPR19F
UlJPUigiRGVsZWdhdGUgaXMgJXAiLCBtX2RlbGVnYXRlLmdldCgpKTsKKworICAgIFJlc291cmNl
UmVxdWVzdCByZXF1ZXN0KHVybCk7CisgICAgQ0ZVUkxSZXF1ZXN0UmVmIGNmUmVxdWVzdCA9IHJl
cXVlc3QuY2ZVUkxSZXF1ZXN0KCk7CisKKyAgICBDRlVSTERvd25sb2FkQ2xpZW50IGNsaWVudCA9
IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2VuZFJlcXVlc3RDYWxs
YmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ssIAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxiYWNrLCB3
aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2FsbGJhY2ssIHNo
b3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWVDYWxs
YmFjaywgZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNoQ2FsbGJhY2ssIGRp
ZEZhaWxDYWxsYmFja307CisgICAgbV9yZXF1ZXN0LmFkb3B0UmVmKFdlYk11dGFibGVVUkxSZXF1
ZXN0OjpjcmVhdGVJbnN0YW5jZShyZXF1ZXN0KSk7CisgICAgbV9kb3dubG9hZC5hZG9wdENGKENG
VVJMRG93bmxvYWRDcmVhdGUoMCwgY2ZSZXF1ZXN0LCAmY2xpZW50KSk7CisKKyAgICBDRlVSTERv
d25sb2FkU2NoZWR1bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsK
KyAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQu
Z2V0KCksIFJlc291cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0
TW9kZSk7CisKKyAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIEluaXRpYWxpemVkIGRv
d25sb2FkIG9mIHVybCAlcyBpbiBXZWJEb3dubG9hZCAlcCIsIHVybC5zdHJpbmcoKS51dGY4KCku
ZGF0YSgpLCB0aGlzKTsKK30KKworV2ViRG93bmxvYWQ6On5XZWJEb3dubG9hZCgpCit7CisgICAg
TE9HKERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBEZXN0cm95aW5nIGRvd25sb2FkICglcCkiLCB0
aGlzKTsKKyAgICBjYW5jZWwoKTsKKyAgICBnQ2xhc3NDb3VudC0tOworfQorCitXZWJEb3dubG9h
ZCogV2ViRG93bmxvYWQ6OmNyZWF0ZUluc3RhbmNlKCkKK3sKKyAgICBXZWJEb3dubG9hZCogaW5z
dGFuY2UgPSBuZXcgV2ViRG93bmxvYWQoKTsKKyAgICBpbnN0YW5jZS0+QWRkUmVmKCk7CisgICAg
cmV0dXJuIGluc3RhbmNlOworfQorCitXZWJEb3dubG9hZCogV2ViRG93bmxvYWQ6OmNyZWF0ZUlu
c3RhbmNlKFJlc291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVzdCYgcmVx
dWVzdCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIElXZWJEb3dubG9hZERlbGVn
YXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBXZWJEb3dubG9hZCogaW5zdGFuY2UgPSBuZXcgV2ViRG93
bmxvYWQoKTsKKyAgICBpbnN0YW5jZS0+QWRkUmVmKCk7CisgICAgaW5zdGFuY2UtPmluaXQoaGFu
ZGxlLCByZXF1ZXN0LCByZXNwb25zZSwgZGVsZWdhdGUpOworICAgIHJldHVybiBpbnN0YW5jZTsK
K30KKworV2ViRG93bmxvYWQqIFdlYkRvd25sb2FkOjpjcmVhdGVJbnN0YW5jZShjb25zdCBLVVJM
JiB1cmwsIElXZWJEb3dubG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBXZWJEb3dubG9h
ZCogaW5zdGFuY2UgPSBuZXcgV2ViRG93bmxvYWQoKTsKKyAgICBpbnN0YW5jZS0+QWRkUmVmKCk7
CisgICAgaW5zdGFuY2UtPmluaXQodXJsLCBkZWxlZ2F0ZSk7CisgICAgcmV0dXJuIGluc3RhbmNl
OworfQorCisvLyBJVW5rbm93biAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZ
UEUgV2ViRG93bmxvYWQ6OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2Jq
ZWN0KQoreworICAgICpwcHZPYmplY3QgPSAwOworICAgIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJ
SURfSVVua25vd24pKQorICAgICAgICAqcHB2T2JqZWN0ID0gc3RhdGljX2Nhc3Q8SVdlYkRvd25s
b2FkKj4odGhpcyk7CisgICAgZWxzZSBpZiAoSXNFcXVhbEdVSUQocmlpZCwgSUlEX0lXZWJEb3du
bG9hZCkpCisgICAgICAgICpwcHZPYmplY3QgPSBzdGF0aWNfY2FzdDxJV2ViRG93bmxvYWQqPih0
aGlzKTsKKyAgICBlbHNlIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJSURfSVdlYlVSTEF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlU2VuZGVyKSkKKyAgICAgICAgKnBwdk9iamVjdCA9IHN0YXRpY19jYXN0
PElXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZVNlbmRlcio+KHRoaXMpOworICAgIGVsc2Ug
aWYgKElzRXF1YWxHVUlEKHJpaWQsIENMU0lEX1dlYkRvd25sb2FkKSkKKyAgICAgICAgKnBwdk9i
amVjdCA9IHN0YXRpY19jYXN0PFdlYkRvd25sb2FkKj4odGhpcyk7CisgICAgZWxzZQorICAgICAg
ICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKKworICAgIEFkZFJlZigpOworICAgIHJldHVybiBTX09L
OworfQorCitVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6QWRkUmVmKHZvaWQp
Cit7CisgICAgcmV0dXJuICsrbV9yZWZDb3VudDsKK30KKworVUxPTkcgU1RETUVUSE9EQ0FMTFRZ
UEUgV2ViRG93bmxvYWQ6OlJlbGVhc2Uodm9pZCkKK3sKKyAgICBVTE9ORyBuZXdSZWYgPSAtLW1f
cmVmQ291bnQ7CisgICAgaWYgKCFuZXdSZWYpCisgICAgICAgIGRlbGV0ZSh0aGlzKTsKKworICAg
IHJldHVybiBuZXdSZWY7Cit9CisKKy8vIElXZWJEb3dubG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hSRVNV
TFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmluaXRXaXRoUmVxdWVzdCgKKyAgICAg
ICAgLyogW2luXSAqLyBJV2ViVVJMUmVxdWVzdCogcmVxdWVzdCwgCisgICAgICAgIC8qIFtpbl0g
Ki8gSVdlYkRvd25sb2FkRGVsZWdhdGUqIGRlbGVnYXRlKQoreworICAgIENPTVB0cjxXZWJNdXRh
YmxlVVJMUmVxdWVzdD4gd2ViUmVxdWVzdDsKKyAgICBpZiAoIXJlcXVlc3QgfHwgRkFJTEVEKHJl
cXVlc3QtPlF1ZXJ5SW50ZXJmYWNlKCZ3ZWJSZXF1ZXN0KSkpIHsKKyAgICAgICAgTE9HKERvd25s
b2FkLCAiV2ViRG93bmxvYWQgLSBpbml0V2l0aFJlcXVlc3QgZmFpbGVkIC0gbm90IGEgV2ViTXV0
YWJsZVVSTFJlcXVlc3QiKTsgICAgCisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQorCisg
ICAgaWYgKCFkZWxlZ2F0ZSkKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICBtX2RlbGVnYXRl
ID0gZGVsZWdhdGU7CisgICAgTE9HKERvd25sb2FkLCAiRGVsZWdhdGUgaXMgJXAiLCBtX2RlbGVn
YXRlLmdldCgpKTsKKworICAgIFJldGFpblB0cjxDRlVSTFJlcXVlc3RSZWY+IGNmUmVxdWVzdCA9
IHdlYlJlcXVlc3QtPnJlc291cmNlUmVxdWVzdCgpLmNmVVJMUmVxdWVzdCgpOworCisgICAgQ0ZV
UkxEb3dubG9hZENsaWVudCBjbGllbnQgPSB7MCwgdGhpcywgMCwgMCwgMCwgZGlkU3RhcnRDYWxs
YmFjaywgd2lsbFNlbmRSZXF1ZXN0Q2FsbGJhY2ssIGRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNo
YWxsZW5nZUNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRS
ZWNlaXZlUmVzcG9uc2VDYWxsYmFjaywgd2lsbFJlc3VtZVdpdGhSZXNwb25zZUNhbGxiYWNrLCBk
aWRSZWNlaXZlRGF0YUNhbGxiYWNrLCBzaG91bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNr
LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpZGVEZXN0aW5hdGlvbldp
dGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2ssIGRpZENyZWF0ZURlc3RpbmF0aW9uQ2FsbGJh
Y2ssIGRpZEZpbmlzaENhbGxiYWNrLCBkaWRGYWlsQ2FsbGJhY2t9OworICAgIG1fcmVxdWVzdC5h
ZG9wdFJlZihXZWJNdXRhYmxlVVJMUmVxdWVzdDo6Y3JlYXRlSW5zdGFuY2Uod2ViUmVxdWVzdC5n
ZXQoKSkpOworICAgIG1fZG93bmxvYWQuYWRvcHRDRihDRlVSTERvd25sb2FkQ3JlYXRlKDAsIGNm
UmVxdWVzdC5nZXQoKSwgJmNsaWVudCkpOworCisgICAgLy8gSWYgZm9yIHNvbWUgcmVhc29uIHRo
ZSBkb3dubG9hZCBmYWlsZWQgdG8gY3JlYXRlLCAKKyAgICAvLyB3ZSBoYXZlIHBhcnRpY3VsYXIg
Y2xlYW51cCB0byBkbworICAgIGlmICghbV9kb3dubG9hZCkgeworICAgICAgICBtX3JlcXVlc3Qg
PSAwOyAgICAKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CisKKyAgICBDRlVSTERvd25s
b2FkU2NoZWR1bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsKKyAg
ICBDRlVSTERvd25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQuZ2V0
KCksIFJlc291cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0TW9k
ZSk7CisKKyAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIGluaXRXaXRoUmVxdWVzdCBj
b21wbGV0ZSwgc3RhcnRlZCBkb3dubG9hZCBvZiB1cmwgJXMiLCB3ZWJSZXF1ZXN0LT5yZXNvdXJj
ZVJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICByZXR1cm4gU19P
SzsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6aW5pdFRvUmVz
dW1lV2l0aEJ1bmRsZSgKKyAgICAgICAgLyogW2luXSAqLyBCU1RSIGJ1bmRsZVBhdGgsIAorICAg
ICAgICAvKiBbaW5dICovIElXZWJEb3dubG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBM
T0coRG93bmxvYWQsICJBdHRlbXB0aW5nIHJlc3VtZSBvZiBkb3dubG9hZCBidW5kbGUgJXMiLCBT
dHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgpKS5hc2NpaSgpLmRhdGEo
KSk7CisKKyAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiByZXN1bWVEYXRhKEFkb3B0Q0YsIGV4dHJh
Y3RSZXN1bWVEYXRhRnJvbUJ1bmRsZShTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1
bmRsZVBhdGgpKSkpOworICAgIAorICAgIGlmICghcmVzdW1lRGF0YSkKKyAgICAgICAgcmV0dXJu
IEVfRkFJTDsKKworICAgIGlmICghZGVsZWdhdGUpCisgICAgICAgIHJldHVybiBFX0ZBSUw7Cisg
ICAgbV9kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIExPRyhEb3dubG9hZCwgIkRlbGVnYXRlIGlz
ICVwIiwgbV9kZWxlZ2F0ZS5nZXQoKSk7CisKKyAgICBDRlVSTERvd25sb2FkQ2xpZW50IGNsaWVu
dCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2VuZFJlcXVlc3RD
YWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ssIAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxiYWNr
LCB3aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2FsbGJhY2ss
IHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWVD
YWxsYmFjaywgZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNoQ2FsbGJhY2ss
IGRpZEZhaWxDYWxsYmFja307CisgICAgCisgICAgUmV0YWluUHRyPENGVVJMUmVmPiBwYXRoVVJM
KEFkb3B0Q0YsIE1hcnNoYWxsaW5nSGVscGVyczo6UGF0aFN0cmluZ1RvRmlsZUNGVVJMUmVmKFN0
cmluZyhidW5kbGVQYXRoLCBTeXNTdHJpbmdMZW4oYnVuZGxlUGF0aCkpKSk7CisgICAgQVNTRVJU
KHBhdGhVUkwpOworCisgICAgbV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGVX
aXRoUmVzdW1lRGF0YSgwLCByZXN1bWVEYXRhLmdldCgpLCBwYXRoVVJMLmdldCgpLCAmY2xpZW50
KSk7CisKKyAgICBpZiAoIW1fZG93bmxvYWQpIHsKKyAgICAgICAgTE9HKERvd25sb2FkLCAiRmFp
bGVkIHRvIGNyZWF0ZSBDRlVSTERvd25sb2FkUmVmIGZvciByZXN1bWUiKTsgICAgCisgICAgICAg
IHJldHVybiBFX0ZBSUw7CisgICAgfQorICAgIAorICAgIG1fYnVuZGxlUGF0aCA9IFN0cmluZyhi
dW5kbGVQYXRoLCBTeXNTdHJpbmdMZW4oYnVuZGxlUGF0aCkpOworICAgIC8vIEF0dGVtcHQgdG8g
cmVtb3ZlIHRoZSAiLmRvd25sb2FkIiBleHRlbnNpb24gZnJvbSB0aGUgYnVuZGxlIGZvciB0aGUg
ZmluYWwgZmlsZSBkZXN0aW5hdGlvbgorICAgIC8vIEZhaWxpbmcgdGhhdCwgd2UgY2xlYXIgbV9k
ZXN0aW5hdGlvbiBhbmQgd2lsbCBhc2sgdGhlIGRlbGVnYXRlIGxhdGVyIG9uY2UgdGhlIGRvd25s
b2FkIHN0YXJ0cworICAgIGlmIChtX2J1bmRsZVBhdGguZW5kc1dpdGgoQnVuZGxlRXh0ZW5zaW9u
LCBmYWxzZSkpIHsKKyAgICAgICAgbV9kZXN0aW5hdGlvbiA9IG1fYnVuZGxlUGF0aC5jb3B5KCk7
CisgICAgICAgIG1fZGVzdGluYXRpb24udHJ1bmNhdGUobV9kZXN0aW5hdGlvbi5sZW5ndGgoKSAt
IEJ1bmRsZUV4dGVuc2lvbi5sZW5ndGgoKSk7CisgICAgfSBlbHNlCisgICAgICAgIG1fZGVzdGlu
YXRpb24gPSBTdHJpbmcoKTsKKyAgICAKKyAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVXaXRoQ3Vy
cmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsKKyAgICBDRlVSTERvd25sb2FkU2No
ZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQuZ2V0KCksIFJlc291cmNlSGFuZGxl
Ojpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7CisKKyAgICBMT0coRG93
bmxvYWQsICJXZWJEb3dubG9hZCAtIGluaXRXaXRoUmVxdWVzdCBjb21wbGV0ZSwgcmVzdW1lZCBk
b3dubG9hZCBvZiBidW5kbGUgJXMiLCBTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1
bmRsZVBhdGgpKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNV
TFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNhblJlc3VtZURvd25sb2FkRGVjb2Rl
ZFdpdGhFbmNvZGluZ01JTUVUeXBlKAorICAgICAgICAvKiBbaW5dICovIEJTVFIsIAorICAgICAg
ICAvKiBbb3V0LCByZXR2YWxdICovIEJPT0wqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIEVfRkFJTDsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3du
bG9hZDo6c3RhcnQoKQoreworICAgIExPRyhEb3dubG9hZCwgIldlYkRvd25sb2FkIC0gU3RhcnRp
bmcgZG93bmxvYWQgKCVwKSIsIHRoaXMpOworICAgIGlmICghbV9kb3dubG9hZCkKKyAgICAgICAg
cmV0dXJuIEVfRkFJTDsKKworICAgIENGVVJMRG93bmxvYWRTdGFydChtX2Rvd25sb2FkLmdldCgp
KTsKKyAgICAvLyBGSVhNRTogNDk1MDQ3NyAtIENGVVJMRG93bmxvYWQgbmVnbGVjdHMgdG8gbWFr
ZSB0aGUgZGlkU3RhcnQoKSBjbGllbnQgY2FsbCB1cG9uIHN0YXJ0aW5nIHRoZSBkb3dubG9hZC4K
KyAgICAvLyBUaGlzIGlzIGEgc29tZXdoYXQgY3JpdGljYWwgY2FsbCwgc28gd2UnbGwgZmFrZSBp
dCBmb3Igbm93IQorICAgIGRpZFN0YXJ0KCk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworSFJF
U1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6Y2FuY2VsKCkKK3sKKyAgICBMT0co
RG93bmxvYWQsICJXZWJEb3dubG9hZCAtIENhbmNlbGxpbmcgZG93bmxvYWQgKCVwKSIsIHRoaXMp
OworICAgIGlmICghbV9kb3dubG9hZCkKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKworICAgIENG
VVJMRG93bmxvYWRDYW5jZWwobV9kb3dubG9hZC5nZXQoKSk7CisgICAgbV9kb3dubG9hZCA9IDA7
CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93
bmxvYWQ6OmNhbmNlbEZvclJlc3VtZSgpCit7CisgICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxv
YWQgLSBDYW5jZWxsaW5nIGRvd25sb2FkICglcCksIHdyaXRpbmcgcmVzdW1lIGluZm9ybWF0aW9u
IHRvIGZpbGUgaWYgcG9zc2libGUiLCB0aGlzKTsKKyAgICBBU1NFUlQobV9kb3dubG9hZCk7Cisg
ICAgaWYgKCFtX2Rvd25sb2FkKQorICAgICAgICByZXR1cm4gRV9GQUlMOworCisgICAgSFJFU1VM
VCBociA9IFNfT0s7CisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gcmVzdW1lRGF0YTsKKyAgICBp
ZiAobV9kZXN0aW5hdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgQ0ZVUkxEb3dubG9hZENhbmNl
bChtX2Rvd25sb2FkLmdldCgpKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIENG
VVJMRG93bmxvYWRTZXREZWxldGVzVXBvbkZhaWx1cmUobV9kb3dubG9hZC5nZXQoKSwgZmFsc2Up
OworICAgIENGVVJMRG93bmxvYWRDYW5jZWwobV9kb3dubG9hZC5nZXQoKSk7CisKKyAgICByZXN1
bWVEYXRhID0gQ0ZVUkxEb3dubG9hZENvcHlSZXN1bWVEYXRhKG1fZG93bmxvYWQuZ2V0KCkpOwor
ICAgIGlmICghcmVzdW1lRGF0YSkgeworICAgICAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9h
ZCAtIFVuYWJsZSB0byBjcmVhdGUgcmVzdW1lIGRhdGEgZm9yIGRvd25sb2FkICglcCkiLCB0aGlz
KTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGFwcGVuZFJlc3VtZURhdGFUb0J1
bmRsZShyZXN1bWVEYXRhLmdldCgpLCBtX2J1bmRsZVBhdGgpOworICAgCitleGl0OgorICAgIG1f
ZG93bmxvYWQgPSAwOworICAgIHJldHVybiBocjsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxM
VFlQRSBXZWJEb3dubG9hZDo6ZGVsZXRlc0ZpbGVVcG9uRmFpbHVyZSgKKyAgICAgICAgLyogW291
dCwgcmV0dmFsXSAqLyBCT09MKiByZXN1bHQpCit7CisgICAgaWYgKCFtX2Rvd25sb2FkKQorICAg
ICAgICByZXR1cm4gRV9GQUlMOworICAgICpyZXN1bHQgPSBDRlVSTERvd25sb2FkRGVsZXRlc1Vw
b25GYWlsdXJlKG1fZG93bmxvYWQuZ2V0KCkpOworICAgIHJldHVybiBTX09LOworfQorCitIUkVT
VUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpidW5kbGVQYXRoRm9yVGFyZ2V0UGF0
aCgKKyAgICAgICAgLyogW2luXSAqLyBCU1RSIHRhcmdldFBhdGgsIAorICAgICAgICAvKiBbb3V0
LCByZXR2YWxdICovIEJTVFIqIGJ1bmRsZVBhdGgpCit7CisgICAgaWYgKCF0YXJnZXRQYXRoKQor
ICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOworCisgICAgU3RyaW5nIGJ1bmRsZSh0YXJnZXRQ
YXRoLCBTeXNTdHJpbmdMZW4odGFyZ2V0UGF0aCkpOworICAgIGlmIChidW5kbGUuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOworCisgICAgaWYgKGJ1bmRsZVtidW5kbGUu
bGVuZ3RoKCktMV0gPT0gJy8nKQorICAgICAgICBidW5kbGUudHJ1bmNhdGUoMSk7CisKKyAgICBi
dW5kbGUgKz0gQnVuZGxlRXh0ZW5zaW9uOworICAgICpidW5kbGVQYXRoID0gU3lzQWxsb2NTdHJp
bmdMZW4oYnVuZGxlLmNoYXJhY3RlcnMoKSwgYnVuZGxlLmxlbmd0aCgpKTsKKyAgICBpZiAoISpi
dW5kbGVQYXRoKQorICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIHJldHVybiBTX09LOworfQor
CitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpyZXF1ZXN0KAorICAgICAg
ICAvKiBbb3V0LCByZXR2YWxdICovIElXZWJVUkxSZXF1ZXN0KiogcmVxdWVzdCkKK3sKKyAgICBp
ZiAocmVxdWVzdCkgeworICAgICAgICAqcmVxdWVzdCA9IG1fcmVxdWVzdC5nZXQoKTsKKyAgICAg
ICAgaWYgKCpyZXF1ZXN0KQorICAgICAgICAgICAgKCpyZXF1ZXN0KS0+QWRkUmVmKCk7CisgICAg
fQorICAgIHJldHVybiBTX09LOworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRv
d25sb2FkOjpzZXREZWxldGVzRmlsZVVwb25GYWlsdXJlKAorICAgICAgICAvKiBbaW5dICovIEJP
T0wgZGVsZXRlc0ZpbGVVcG9uRmFpbHVyZSkKK3sKKyAgICBpZiAoIW1fZG93bmxvYWQpCisgICAg
ICAgIHJldHVybiBFX0ZBSUw7CisgICAgQ0ZVUkxEb3dubG9hZFNldERlbGV0ZXNVcG9uRmFpbHVy
ZShtX2Rvd25sb2FkLmdldCgpLCAhIWRlbGV0ZXNGaWxlVXBvbkZhaWx1cmUpOworICAgIHJldHVy
biBTX09LOworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpzZXRE
ZXN0aW5hdGlvbigKKyAgICAgICAgLyogW2luXSAqLyBCU1RSIHBhdGgsIAorICAgICAgICAvKiBb
aW5dICovIEJPT0wgYWxsb3dPdmVyd3JpdGUpCit7CisgICAgaWYgKCFtX2Rvd25sb2FkKQorICAg
ICAgICByZXR1cm4gRV9GQUlMOworCisgICAgbV9kZXN0aW5hdGlvbiA9IFN0cmluZyhwYXRoLCBT
eXNTdHJpbmdMZW4ocGF0aCkpOworICAgIG1fYnVuZGxlUGF0aCA9IG1fZGVzdGluYXRpb24gKyBC
dW5kbGVFeHRlbnNpb247CisKKyAgICBDRlVSTFJlZiBwYXRoVVJMID0gTWFyc2hhbGxpbmdIZWxw
ZXJzOjpQYXRoU3RyaW5nVG9GaWxlQ0ZVUkxSZWYobV9idW5kbGVQYXRoKTsKKyAgICBDRlVSTERv
d25sb2FkU2V0RGVzdGluYXRpb24obV9kb3dubG9hZC5nZXQoKSwgcGF0aFVSTCwgISFhbGxvd092
ZXJ3cml0ZSk7CisgICAgQ0ZSZWxlYXNlKHBhdGhVUkwpOworCisgICAgTE9HKERvd25sb2FkLCAi
V2ViRG93bmxvYWQgLSBTZXQgZGVzdGluYXRpb24gdG8gJXMiLCBtX2J1bmRsZVBhdGguYXNjaWko
KS5kYXRhKCkpOworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKKy8vIElXZWJVUkxBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZVNlbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZ
UEUgV2ViRG93bmxvYWQ6OmNhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKAorICAgICAgICAv
KiBbaW5dICovIElXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSopCit7CisgICAgaWYgKG1f
ZG93bmxvYWQpIHsKKyAgICAgICAgQ0ZVUkxEb3dubG9hZENhbmNlbChtX2Rvd25sb2FkLmdldCgp
KTsKKyAgICAgICAgbV9kb3dubG9hZCA9IDA7CisgICAgfQorCisgICAgLy8gRklYTUU6IERvIHdl
IG5lZWQgYSBVUkwgb3IgZGVzY3JpcHRpb24gZm9yIHRoaXMgZXJyb3IgY29kZT8KKyAgICBSZXNv
dXJjZUVycm9yIGVycm9yKFN0cmluZyhXZWJVUkxFcnJvckRvbWFpbiksIFdlYlVSTEVycm9yVXNl
ckNhbmNlbGxlZEF1dGhlbnRpY2F0aW9uLCAiIiwgIiIpOworICAgIENPTVB0cjxXZWJFcnJvcj4g
d2ViRXJyb3IoQWRvcHRDT00sIFdlYkVycm9yOjpjcmVhdGVJbnN0YW5jZShlcnJvcikpOworICAg
IG1fZGVsZWdhdGUtPmRpZEZhaWxXaXRoRXJyb3IodGhpcywgd2ViRXJyb3IuZ2V0KCkpOworCisg
ICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxv
YWQ6OmNvbnRpbnVlV2l0aG91dENyZWRlbnRpYWxGb3JBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSgK
KyAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2UqIGNoYWxs
ZW5nZSkKK3sKKyAgICBDT01QdHI8V2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U+IHdlYkNo
YWxsZW5nZShRdWVyeSwgY2hhbGxlbmdlKTsKKyAgICBpZiAoIXdlYkNoYWxsZW5nZSkKKyAgICAg
ICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisKKyAgICBpZiAobV9kb3dubG9hZCkKKyAgICAgICAg
Q0ZVUkxEb3dubG9hZFVzZUNyZWRlbnRpYWwobV9kb3dubG9hZC5nZXQoKSwgMCwgd2ViQ2hhbGxl
bmdlLT5hdXRoZW50aWNhdGlvbkNoYWxsZW5nZSgpLmNmVVJMQXV0aENoYWxsZW5nZVJlZigpKTsK
KyAgICByZXR1cm4gU19PSzsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3du
bG9hZDo6dXNlQ3JlZGVudGlhbCgKKyAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMQ3JlZGVudGlh
bCogY3JlZGVudGlhbCwgCisgICAgICAgIC8qIFtpbl0gKi8gSVdlYlVSTEF1dGhlbnRpY2F0aW9u
Q2hhbGxlbmdlKiBjaGFsbGVuZ2UpCit7CisgICAgQ09NUHRyPFdlYlVSTEF1dGhlbnRpY2F0aW9u
Q2hhbGxlbmdlPiB3ZWJDaGFsbGVuZ2UoUXVlcnksIGNoYWxsZW5nZSk7CisgICAgaWYgKCF3ZWJD
aGFsbGVuZ2UpCisgICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOworCisgICAgQ09NUHRyPFdl
YlVSTENyZWRlbnRpYWw+IHdlYkNyZWRlbnRpYWwoUXVlcnksIGNyZWRlbnRpYWwpOworICAgIGlm
ICghd2ViQ3JlZGVudGlhbCkKKyAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisKKyAgICBS
ZXRhaW5QdHI8Q0ZVUkxDcmVkZW50aWFsUmVmPiBjZkNyZWRlbnRpYWwoQWRvcHRDRiwgY3JlYXRl
Q0Yod2ViQ3JlZGVudGlhbC0+Y3JlZGVudGlhbCgpKSk7CisKKyAgICBpZiAobV9kb3dubG9hZCkK
KyAgICAgICAgQ0ZVUkxEb3dubG9hZFVzZUNyZWRlbnRpYWwobV9kb3dubG9hZC5nZXQoKSwgY2ZD
cmVkZW50aWFsLmdldCgpLCB3ZWJDaGFsbGVuZ2UtPmF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKCku
Y2ZVUkxBdXRoQ2hhbGxlbmdlUmVmKCkpOworICAgIHJldHVybiBTX09LOworfQorCisvLyBDRlVS
TERvd25sb2FkIENhbGxiYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFdlYkRvd25sb2FkOjpkaWRTdGFy
dCgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIG1fc3RhcnRUaW1lID0gbV9kYXRhVGltZSA9IGN1
cnJlbnRUaW1lKCk7CisgICAgbV9yZWNlaXZlZCA9IDA7CisgICAgTE9HKERvd25sb2FkLCAiRE9X
TkxPQUQgLSBTdGFydGVkICVwIGF0ICUuM2Ygc2Vjb25kcyIsIHRoaXMsIG1fc3RhcnRUaW1lKTsK
KyNlbmRpZgorICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGlkQmVnaW4odGhpcykpKQorICAg
ICAgICBMT0dfRVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPmRpZEJlZ2luIGZhaWxlZCIpOworfQor
CitDRlVSTFJlcXVlc3RSZWYgV2ViRG93bmxvYWQ6OndpbGxTZW5kUmVxdWVzdChDRlVSTFJlcXVl
c3RSZWYgcmVxdWVzdCwgQ0ZVUkxSZXNwb25zZVJlZiByZXNwb25zZSkKK3sKKyAgICBDT01QdHI8
V2ViTXV0YWJsZVVSTFJlcXVlc3Q+IHdlYlJlcXVlc3QoQWRvcHRDT00sIFdlYk11dGFibGVVUkxS
ZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShSZXNvdXJjZVJlcXVlc3QocmVxdWVzdCkpKTsKKyAgICBD
T01QdHI8V2ViVVJMUmVzcG9uc2U+IHdlYlJlc3BvbnNlKEFkb3B0Q09NLCBXZWJVUkxSZXNwb25z
ZTo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VSZXNwb25zZShyZXNwb25zZSkpKTsKKyAgICBDT01Q
dHI8SVdlYk11dGFibGVVUkxSZXF1ZXN0PiBmaW5hbFJlcXVlc3Q7CisKKyAgICBpZiAoRkFJTEVE
KG1fZGVsZWdhdGUtPndpbGxTZW5kUmVxdWVzdCh0aGlzLCB3ZWJSZXF1ZXN0LmdldCgpLCB3ZWJS
ZXNwb25zZS5nZXQoKSwgJmZpbmFsUmVxdWVzdCkpKQorICAgICAgICBMT0dfRVJST1IoIkRvd25s
b2FkRGVsZWdhdGUtPndpbGxTZW5kUmVxdWVzdCBmYWlsZWQiKTsKKyAgICAKKyAgICBpZiAoIWZp
bmFsUmVxdWVzdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBDT01QdHI8V2ViTXV0YWJsZVVS
TFJlcXVlc3Q+IGZpbmFsV2ViUmVxdWVzdChBZG9wdENPTSwgV2ViTXV0YWJsZVVSTFJlcXVlc3Q6
OmNyZWF0ZUluc3RhbmNlKGZpbmFsUmVxdWVzdC5nZXQoKSkpOworICAgIG1fcmVxdWVzdCA9IGZp
bmFsV2ViUmVxdWVzdC5nZXQoKTsKKyAgICBDRlVSTFJlcXVlc3RSZWYgcmVzdWx0ID0gZmluYWxX
ZWJSZXF1ZXN0LT5yZXNvdXJjZVJlcXVlc3QoKS5jZlVSTFJlcXVlc3QoKTsKKyAgICBDRlJldGFp
bihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgV2ViRG93bmxvYWQ6OmRp
ZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShDRlVSTEF1dGhDaGFsbGVuZ2VSZWYgY2hh
bGxlbmdlKQoreworICAgIENPTVB0cjxJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U+IHdl
YkNoYWxsZW5nZShBZG9wdENPTSwKKyAgICAgICAgV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVu
Z2U6OmNyZWF0ZUluc3RhbmNlKEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNoYWxsZW5nZSwgMCks
IHRoaXMpKTsKKworICAgIGlmIChTVUNDRUVERUQobV9kZWxlZ2F0ZS0+ZGlkUmVjZWl2ZUF1dGhl
bnRpY2F0aW9uQ2hhbGxlbmdlKHRoaXMsIHdlYkNoYWxsZW5nZS5nZXQoKSkpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBjYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSh3ZWJDaGFsbGVuZ2Uu
Z2V0KCkpOworfQorCit2b2lkIFdlYkRvd25sb2FkOjpkaWRSZWNlaXZlUmVzcG9uc2UoQ0ZVUkxS
ZXNwb25zZVJlZiByZXNwb25zZSkKK3sKKyAgICBDT01QdHI8V2ViVVJMUmVzcG9uc2U+IHdlYlJl
c3BvbnNlKEFkb3B0Q09NLCBXZWJVUkxSZXNwb25zZTo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VS
ZXNwb25zZShyZXNwb25zZSkpKTsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZFJlY2Vp
dmVSZXNwb25zZSh0aGlzLCB3ZWJSZXNwb25zZS5nZXQoKSkpKQorICAgICAgICBMT0dfRVJST1Io
IkRvd25sb2FkRGVsZWdhdGUtPmRpZFJlY2VpdmVSZXNwb25zZSBmYWlsZWQiKTsKK30KKwordm9p
ZCBXZWJEb3dubG9hZDo6d2lsbFJlc3VtZVdpdGhSZXNwb25zZShDRlVSTFJlc3BvbnNlUmVmIHJl
c3BvbnNlLCBVSW50NjQgZnJvbUJ5dGUpCit7CisgICAgQ09NUHRyPFdlYlVSTFJlc3BvbnNlPiB3
ZWJSZXNwb25zZShBZG9wdENPTSwgV2ViVVJMUmVzcG9uc2U6OmNyZWF0ZUluc3RhbmNlKFJlc291
cmNlUmVzcG9uc2UocmVzcG9uc2UpKSk7CisgICAgaWYgKEZBSUxFRChtX2RlbGVnYXRlLT53aWxs
UmVzdW1lV2l0aFJlc3BvbnNlKHRoaXMsIHdlYlJlc3BvbnNlLmdldCgpLCBmcm9tQnl0ZSkpKQor
ICAgICAgICBMT0dfRVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPndpbGxSZXN1bWVXaXRoUmVzcG9u
c2UgZmFpbGVkIik7Cit9CisKK3ZvaWQgV2ViRG93bmxvYWQ6OmRpZFJlY2VpdmVEYXRhKENGSW5k
ZXggbGVuZ3RoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBtX3JlY2VpdmVkICs9IGxlbmd0aDsK
KyAgICBkb3VibGUgY3VycmVudCA9IGN1cnJlbnRUaW1lKCk7CisgICAgaWYgKGN1cnJlbnQgLSBt
X2RhdGFUaW1lID4gMi4wKQorICAgICAgICBMT0coRG93bmxvYWQsICJET1dOTE9BRCAtICVwIGhh
bmdlZCBmb3IgJS4zZiBzZWNvbmRzIC0gUmVjZWl2ZWQgJWkgYnl0ZXMgZm9yIGEgdG90YWwgb2Yg
JWkiLCB0aGlzLCBjdXJyZW50IC0gbV9kYXRhVGltZSwgbGVuZ3RoLCBtX3JlY2VpdmVkKTsKKyAg
ICBtX2RhdGFUaW1lID0gY3VycmVudDsKKyNlbmRpZgorICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0
ZS0+ZGlkUmVjZWl2ZURhdGFPZkxlbmd0aCh0aGlzLCBsZW5ndGgpKSkKKyAgICAgICAgTE9HX0VS
Uk9SKCJEb3dubG9hZERlbGVnYXRlLT5kaWRSZWNlaXZlRGF0YSBmYWlsZWQiKTsKK30KKworYm9v
bCBXZWJEb3dubG9hZDo6c2hvdWxkRGVjb2RlRGF0YU9mTUlNRVR5cGUoQ0ZTdHJpbmdSZWYgbWlt
ZVR5cGUpCit7CisgICAgQk9PTCByZXN1bHQ7CisgICAgaWYgKEZBSUxFRChtX2RlbGVnYXRlLT5z
aG91bGREZWNvZGVTb3VyY2VEYXRhT2ZNSU1FVHlwZSh0aGlzLCBCU3RyaW5nKG1pbWVUeXBlKSwg
JnJlc3VsdCkpKSB7CisgICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0ZS0+c2hvdWxk
RGVjb2RlU291cmNlRGF0YU9mTUlNRVR5cGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisgICAgcmV0dXJuICEhcmVzdWx0OworfQorCit2b2lkIFdlYkRvd25sb2FkOjpk
ZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lKENGU3RyaW5nUmVmIG5hbWUp
Cit7ICAgIAorICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGVjaWRlRGVzdGluYXRpb25XaXRo
U3VnZ2VzdGVkRmlsZW5hbWUodGhpcywgQlN0cmluZyhuYW1lKSkpKQorICAgICAgICBMT0dfRVJS
T1IoIkRvd25sb2FkRGVsZWdhdGUtPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVj
dE5hbWUgZmFpbGVkIik7Cit9CisKK3ZvaWQgV2ViRG93bmxvYWQ6OmRpZENyZWF0ZURlc3RpbmF0
aW9uKENGVVJMUmVmIGRlc3RpbmF0aW9uKQoreworICAgIC8vIFRoZSBjb25jZXB0IG9mIHRoZSAi
LmRvd25sb2FkIGJ1bmRsZSIgaXMgaW50ZXJuYWwgdG8gdGhlIFdlYkRvd25sb2FkLCBzbyB0aGVy
ZWZvcmUKKyAgICAvLyB3ZSB0cnkgdG8gbWFzayB0aGUgZGVsZWdhdGUgZnJvbSBpdHMgZXhpc3Rl
bmNlIGFzIG11Y2ggYXMgcG9zc2libGUgYnkgdGVsbGluZyBpdCB0aGUgZmluYWwKKyAgICAvLyBk
ZXN0aW5hdGlvbiB3YXMgY3JlYXRlZCwgd2hlbiBpbiByZWFsaXR5IHRoZSBidW5kbGUgd2FzIGNy
ZWF0ZWQKKworICAgIFN0cmluZyBjcmVhdGVkRGVzdGluYXRpb24gPSBNYXJzaGFsbGluZ0hlbHBl
cnM6OkZpbGVDRlVSTFJlZlRvUGF0aFN0cmluZyhkZXN0aW5hdGlvbik7CisKKyAgICAvLyBBdCB0
aGlzIHBvaW50IGluIHJlY2VpdmluZyBDRlVSTERvd25sb2FkIGNhbGxiYWNrcywgd2Ugc2hvdWxk
IGRlZmluaXRlbHkgaGF2ZSB0aGUgYnVuZGxlIHBhdGggc3RvcmVkIGxvY2FsbHkKKyAgICAvLyBh
bmQgaXQgc2hvdWxkIG1hdGNoIHdpdGggdGhlIGZpbGUgdGhhdCBDRlVSTERvd25sb2FkIGNyZWF0
ZWQKKyAgICBBU1NFUlQoY3JlYXRlZERlc3RpbmF0aW9uID09IG1fYnVuZGxlUGF0aCk7CisgICAg
Ly8gQW5kIHdlIHNob3VsZCBhbHNvIGFsd2F5cyBoYXZlIHRoZSBmaW5hbC1kZXN0aW5hdGlvbiBz
dG9yZWQKKyAgICBBU1NFUlQoIW1fZGVzdGluYXRpb24uaXNFbXB0eSgpKTsKKworICAgIEJTdHJp
bmcgcGF0aChtX2Rlc3RpbmF0aW9uKTsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZENy
ZWF0ZURlc3RpbmF0aW9uKHRoaXMsIHBhdGgpKSkKKyAgICAgICAgTE9HX0VSUk9SKCJEb3dubG9h
ZERlbGVnYXRlLT5kaWRDcmVhdGVEZXN0aW5hdGlvbiBmYWlsZWQiKTsKK30KKwordm9pZCBXZWJE
b3dubG9hZDo6ZGlkRmluaXNoKCkKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgTE9HKERvd25sb2Fk
LCAiRE9XTkxPQUQgLSBGaW5pc2hlZCAlcCBhZnRlciAlaSBieXRlcyBhbmQgJS4zZiBzZWNvbmRz
IiwgdGhpcywgbV9yZWNlaXZlZCwgY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKTsKKyNlbmRp
ZgorCisgICAgQVNTRVJUKCFtX2J1bmRsZVBhdGguaXNFbXB0eSgpICYmICFtX2Rlc3RpbmF0aW9u
LmlzRW1wdHkoKSk7CisgICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBNb3ZpbmcgZmls
ZSBmcm9tIGJ1bmRsZSAlcyB0byBkZXN0aW5hdGlvbiAlcyIsIG1fYnVuZGxlUGF0aC5hc2NpaSgp
LmRhdGEoKSwgbV9kZXN0aW5hdGlvbi5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICAvLyBXZSB0cnkg
dG8gcmVuYW1lIHRoZSBidW5kbGUgdG8gdGhlIGZpbmFsIGZpbGUgbmFtZS4gIElmIHRoYXQgZmFp
bHMsIHdlIGdpdmUgdGhlIGRlbGVnYXRlIG9uZSBtb3JlIGNoYW5jZSB0byBjaG9zZQorICAgIC8v
IHRoZSBmaW5hbCBmaWxlIG5hbWUsIHRoZW4gd2UganVzdCBsZWF2ZSBpdAorICAgIGlmICghTW92
ZUZpbGVFeChtX2J1bmRsZVBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgbV9k
ZXN0aW5hdGlvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBtb3ZlIGJ1bmRsZSAlcyB0byAlcyBvbiBjb21wbGV0aW9u
XG5FcnJvciAtICVpIiwgbV9idW5kbGVQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX2Rlc3RpbmF0aW9u
LmFzY2lpKCkuZGF0YSgpLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIAorICAgICAgICBib29s
IHJlcG9ydEJ1bmRsZVBhdGhBc0ZpbmFsUGF0aCA9IHRydWU7CisKKyAgICAgICAgQlN0cmluZyBk
ZXN0aW5hdGlvbkJTVFIobV9kZXN0aW5hdGlvbi5jaGFyYWN0ZXJzKCksIG1fZGVzdGluYXRpb24u
bGVuZ3RoKCkpOworICAgICAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRlY2lkZURlc3RpbmF0
aW9uV2l0aFN1Z2dlc3RlZEZpbGVuYW1lKHRoaXMsIGRlc3RpbmF0aW9uQlNUUikpKQorICAgICAg
ICAgICAgTE9HX0VSUk9SKCJkZWxlZ2F0ZS0+ZGVjaWRlRGVzdGluYXRpb25XaXRoU3VnZ2VzdGVk
RmlsZW5hbWUoKSBmYWlsZWQiKTsKKworICAgICAgICAvLyBUaGUgY2FsbCB0byBtX2RlbGVnYXRl
LT5kZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRGaWxlbmFtZSgpIHNob3VsZCBoYXZlIGNo
YW5nZWQgb3VyIGRlc3RpbmF0aW9uLCBzbyB3ZSdsbCB0cnkgdGhlIG1vdmUKKyAgICAgICAgLy8g
b25lIGxhc3QgdGltZS4KKyAgICAgICAgaWYgKCFtX2Rlc3RpbmF0aW9uLmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIGlmIChNb3ZlRmlsZUV4KG1fYnVuZGxlUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxU
ZXJtaW5hdGlvbigpLCBtX2Rlc3RpbmF0aW9uLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9u
KCksIDApKQorICAgICAgICAgICAgICAgIHJlcG9ydEJ1bmRsZVBhdGhBc0ZpbmFsUGF0aCA9IGZh
bHNlOworCisgICAgICAgIC8vIFdlIGVpdGhlciBuZWVkIHRvIHRlbGwgdGhlIGRlbGVnYXRlIG91
ciBmaW5hbCBmaWxlbmFtZSBpcyB0aGUgYnVuZGxlIGZpbGVuYW1lLCBvciBpcyB0aGUgZmlsZSBu
YW1lIHRoZXkganVzdCB0b2xkIHVzIHRvIHVzZQorICAgICAgICBpZiAocmVwb3J0QnVuZGxlUGF0
aEFzRmluYWxQYXRoKSB7CisgICAgICAgICAgICBCU3RyaW5nIGJ1bmRsZUJTVFIobV9idW5kbGVQ
YXRoKTsKKyAgICAgICAgICAgIG1fZGVsZWdhdGUtPmRpZENyZWF0ZURlc3RpbmF0aW9uKHRoaXMs
IGJ1bmRsZUJTVFIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQlN0cmluZyBmaW5h
bERlc3RpbmF0aW9uQlNUUiA9IEJTdHJpbmcobV9kZXN0aW5hdGlvbik7CisgICAgICAgICAgICBt
X2RlbGVnYXRlLT5kaWRDcmVhdGVEZXN0aW5hdGlvbih0aGlzLCBmaW5hbERlc3RpbmF0aW9uQlNU
Uik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJdCdzIGV4dHJlbWVseSBsaWtlbHkgdGhl
IGNhbGwgdG8gZGVsZWdhdGUtPmRpZEZpbmlzaCgpIHdpbGwgZGVyZWYgdGhpcywgc28gbGV0cyBu
b3QgbGV0IHRoYXQgY2F1c2Ugb3VyIGRlc3RydWN0aW9uIGp1c3QgeWV0CisgICAgQ09NUHRyPFdl
YkRvd25sb2FkPiBwcm90ZWN0ID0gdGhpczsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRp
ZEZpbmlzaCh0aGlzKSkpCisgICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0ZS0+ZGlk
RmluaXNoIGZhaWxlZCIpOworCisgICAgbV9kb3dubG9hZCA9IDA7Cit9CisKK3ZvaWQgV2ViRG93
bmxvYWQ6OmRpZEZhaWwoQ0ZFcnJvclJlZiBlcnJvcikKK3sKKyAgICBDT01QdHI8V2ViRXJyb3I+
IHdlYkVycm9yKEFkb3B0Q09NLCBXZWJFcnJvcjo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VFcnJv
cihlcnJvcikpKTsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZEZhaWxXaXRoRXJyb3Io
dGhpcywgd2ViRXJyb3IuZ2V0KCkpKSkKKyAgICAgICAgTE9HX0VSUk9SKCJEb3dubG9hZERlbGVn
YXRlLT5kaWRGYWlsV2l0aEVycm9yIGZhaWxlZCIpOworfQorCisvLyBDRlVSTERvd25sb2FkIENh
bGxiYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCit2b2lkIGRpZFN0YXJ0Q2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwg
Y29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPmRp
ZFN0YXJ0KCk7IH0KKworQ0ZVUkxSZXF1ZXN0UmVmIHdpbGxTZW5kUmVxdWVzdENhbGxiYWNrKENG
VVJMRG93bmxvYWRSZWYsIENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBDRlVSTFJlc3BvbnNlUmVm
IHJlZGlyZWN0aW9uUmVzcG9uc2UsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCit7IHJldHVybiAo
KFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+d2lsbFNlbmRSZXF1ZXN0KHJlcXVlc3QsIHJlZGly
ZWN0aW9uUmVzcG9uc2UpOyB9CisKK3ZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxl
bmdlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxBdXRoQ2hhbGxlbmdlUmVmIGNoYWxs
ZW5nZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9hZCopY2xpZW50SW5m
byktPmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjaGFsbGVuZ2UpOyB9CisKK3Zv
aWQgZGlkUmVjZWl2ZVJlc3BvbnNlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxSZXNw
b25zZVJlZiByZXNwb25zZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9h
ZCopY2xpZW50SW5mbyktPmRpZFJlY2VpdmVSZXNwb25zZShyZXNwb25zZSk7IH0KKwordm9pZCB3
aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxSZXNw
b25zZVJlZiByZXNwb25zZSwgVUludDY0IHN0YXJ0aW5nQnl0ZSwgY29uc3Qgdm9pZCAqY2xpZW50
SW5mbykKK3sgKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPndpbGxSZXN1bWVXaXRoUmVzcG9u
c2UocmVzcG9uc2UsIHN0YXJ0aW5nQnl0ZSk7IH0KKwordm9pZCBkaWRSZWNlaXZlRGF0YUNhbGxi
YWNrKENGVVJMRG93bmxvYWRSZWYsIENGSW5kZXggbGVuZ3RoLCBjb25zdCB2b2lkICpjbGllbnRJ
bmZvKQoreyAoKFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+ZGlkUmVjZWl2ZURhdGEobGVuZ3Ro
KTsgfQorCitCb29sZWFuIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2soQ0ZVUkxE
b3dubG9hZFJlZiwgQ0ZTdHJpbmdSZWYgZW5jb2RpbmdUeXBlLCBjb25zdCB2b2lkICpjbGllbnRJ
bmZvKQoreyByZXR1cm4gKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPnNob3VsZERlY29kZURh
dGFPZk1JTUVUeXBlKGVuY29kaW5nVHlwZSk7IH0KKwordm9pZCBkZWNpZGVEZXN0aW5hdGlvbldp
dGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZTdHJpbmdS
ZWYgb2JqZWN0TmFtZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9hZCop
Y2xpZW50SW5mbyktPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWUob2Jq
ZWN0TmFtZSk7IH0KKwordm9pZCBkaWRDcmVhdGVEZXN0aW5hdGlvbkNhbGxiYWNrKENGVVJMRG93
bmxvYWRSZWYsIENGVVJMUmVmIHBhdGgsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCit7ICgoV2Vi
RG93bmxvYWQqKWNsaWVudEluZm8pLT5kaWRDcmVhdGVEZXN0aW5hdGlvbihwYXRoKTsgfQorCit2
b2lkIGRpZEZpbmlzaENhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYsIGNvbnN0IHZvaWQgKmNsaWVu
dEluZm8pCit7ICgoV2ViRG93bmxvYWQqKWNsaWVudEluZm8pLT5kaWRGaW5pc2goKTsgfQorCit2
b2lkIGRpZEZhaWxDYWxsYmFjayhDRlVSTERvd25sb2FkUmVmLCBDRkVycm9yUmVmIGVycm9yLCBj
b25zdCB2b2lkICpjbGllbnRJbmZvKQoreyAoKFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+ZGlk
RmFpbChlcnJvcik7IH0KKworLy8gRG93bmxvYWQgQnVuZGxlIGZpbGUgdXRpbGl0aWVzIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKworc3RhdGljIENGRGF0YVJlZiBleHRyYWN0UmVzdW1lRGF0YUZyb21CdW5kbGUoY29uc3Qg
U3RyaW5nJiBidW5kbGVQYXRoKQoreworICAgIGlmIChidW5kbGVQYXRoLmlzRW1wdHkoKSkgewor
ICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBjcmVhdGUgcmVzdW1lIGRhdGEgZnJvbSBlbXB0eSBk
b3dubG9hZCBidW5kbGUgcGF0aCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisg
ICAgLy8gT3BlbiBhIGhhbmRsZSB0byB0aGUgYnVuZGxlIGZpbGUKKyAgICBTdHJpbmcgbnVsbGlm
aWVkUGF0aCA9IGJ1bmRsZVBhdGg7CisgICAgRklMRSogYnVuZGxlID0gMDsKKyAgICBpZiAoX3dm
b3Blbl9zKCZidW5kbGUsIG51bGxpZmllZFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRp
b24oKSwgVEVYVCgicitiIikpIHx8ICFidW5kbGUpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWls
ZWQgdG8gb3BlbiBmaWxlICVzIHRvIGdldCByZXN1bWUgZGF0YSIsIGJ1bmRsZVBhdGguYXNjaWko
KS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBDRkRhdGFSZWYgcmVz
dWx0ID0gMDsKKyAgICBWZWN0b3I8VUludDg+IGZvb3RlckJ1ZmZlcjsKKyAgICAKKyAgICAvLyBT
dGF0IHRoZSBmaWxlIHRvIGdldCBpdHMgc2l6ZQorICAgIHN0cnVjdCBfc3RhdDY0IGZpbGVTdGF0
OworICAgIGlmIChfZnN0YXQ2NChfZmlsZW5vKGJ1bmRsZSksICZmaWxlU3RhdCkpCisgICAgICAg
IGdvdG8gZXhpdDsKKyAgICAKKyAgICAvLyBDaGVjayBmb3IgdGhlIGJ1bmRsZSBtYWdpYyBudW1i
ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorICAgIGZwb3NfdCBmb290ZXJNYWdpY051bWJlclBv
c2l0aW9uID0gZmlsZVN0YXQuc3Rfc2l6ZSAtIDQ7CisgICAgQVNTRVJUKGZvb3Rlck1hZ2ljTnVt
YmVyUG9zaXRpb24gPj0gMCk7CisgICAgaWYgKGZvb3Rlck1hZ2ljTnVtYmVyUG9zaXRpb24gPCAw
KQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgaWYgKGZzZXRwb3MoYnVuZGxlLCAmZm9vdGVyTWFn
aWNOdW1iZXJQb3NpdGlvbikpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIFVJbnQzMiBmb290
ZXJNYWdpY051bWJlciA9IDA7CisgICAgaWYgKGZyZWFkKCZmb290ZXJNYWdpY051bWJlciwgNCwg
MSwgYnVuZGxlKSAhPSAxKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgZm9v
dGVyIG1hZ2ljIG51bWJlciBmcm9tIHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJubyk7ICAK
KyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChmb290ZXJNYWdpY051bWJlciAh
PSBCdW5kbGVNYWdpY051bWJlcikgeworICAgICAgICBMT0dfRVJST1IoIkZvb3RlcidzIG1hZ2lj
IG51bWJlciBkb2VzIG5vdCBtYXRjaCAweCVYIC0gZXJybm8oJWkpIiwgQnVuZGxlTWFnaWNOdW1i
ZXIsIGVycm5vKTsgIAorICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLy8gTm93IHdl
J3JlICpyZWFzb25hYmx5KiBzdXJlIHRoaXMgaXMgYSAuZG93bmxvYWQgYnVuZGxlIHdlIGFjdHVh
bGx5IHdyb3RlLiAKKyAgICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdW1lIGRhdGEKKyAg
ICBmcG9zX3QgZm9vdGVyTGVuZ3RoUG9zaXRpb24gPSBmaWxlU3RhdC5zdF9zaXplIC0gODsKKyAg
ICBBU1NFUlQoZm9vdGVyTGVuZ3RoUG9zaXRpb24gPj0gMCk7CisgICAgaWYgKGZvb3Rlckxlbmd0
aFBvc2l0aW9uIDwgMCkKKyAgICAgICAgZ290byBleGl0OworCisgICAgaWYgKGZzZXRwb3MoYnVu
ZGxlLCAmZm9vdGVyTGVuZ3RoUG9zaXRpb24pKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBV
SW50MzIgZm9vdGVyTGVuZ3RoID0gMDsKKyAgICBpZiAoZnJlYWQoJmZvb3Rlckxlbmd0aCwgNCwg
MSwgYnVuZGxlKSAhPSAxKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgUmVz
dW1lRGF0YSBsZW5ndGggZnJvbSB0aGUgYnVuZGxlIC0gZXJybm8oJWkpIiwgZXJybm8pOyAgCisg
ICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlcmVzIGVub3Vn
aCBieXRlcyB0byByZWFkIGluIGZvciB0aGUgcmVzdW1lIGRhdGEsIGFuZCBwZXJmb3JtIHRoZSBy
ZWFkCisgICAgZnBvc190IGZvb3RlclN0YXJ0UG9zaXRpb24gPSBmaWxlU3RhdC5zdF9zaXplIC0g
OCAtIGZvb3Rlckxlbmd0aDsKKyAgICBBU1NFUlQoZm9vdGVyU3RhcnRQb3NpdGlvbiA+PSAwKTsK
KyAgICBpZiAoZm9vdGVyU3RhcnRQb3NpdGlvbiA8IDApCisgICAgICAgIGdvdG8gZXhpdDsKKyAg
ICBpZiAoZnNldHBvcyhidW5kbGUsICZmb290ZXJTdGFydFBvc2l0aW9uKSkKKyAgICAgICAgZ290
byBleGl0OworCisgICAgZm9vdGVyQnVmZmVyLnJlc2l6ZShmb290ZXJMZW5ndGgpOworICAgIGlm
IChmcmVhZChmb290ZXJCdWZmZXIuZGF0YSgpLCAxLCBmb290ZXJMZW5ndGgsIGJ1bmRsZSkgIT0g
Zm9vdGVyTGVuZ3RoKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQgUmVzdW1l
RGF0YSBmcm9tIHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJubyk7ICAKKyAgICAgICAgZ290
byBleGl0OworICAgIH0KKworICAgIC8vIENGVVJMRG93bmxvYWQgd2lsbCBzZWVrIHRvIHRoZSBh
cHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUgZmlsZSAoYmVmb3JlIG91ciBmb290ZXIpIGFuZCBzdGFy
dCBvdmVyd3JpdGluZyBmcm9tIHRoZXJlCisgICAgLy8gSG93ZXZlciwgc2F5IHdlIHdlcmUgd2l0
aGluIGEgZmV3IGh1bmRyZWQgYnl0ZXMgb2YgdGhlIGVuZCBvZiBhIGRvd25sb2FkIHdoZW4gaXQg
d2FzIHBhdXNlZCAtCisgICAgLy8gVGhlIGFkZGl0aW9uYWwgZm9vdGVyIGV4dGVuZGVkIHRoZSBs
ZW5ndGggb2YgdGhlIGZpbGUgYmV5b25kIGl0cyBmaW5hbCBsZW5ndGgsIGFuZCB0aGVyZSB3aWxs
IGJlIGp1bmsgZGF0YSBsZWZ0b3ZlcgorICAgIC8vIGF0IHRoZSBlbmQuICBUaGVyZWZvcmUsIG5v
dyB0aGF0IHdlJ3ZlIHJldHJpZXZlZCB0aGUgZm9vdGVyIGRhdGEsIHdlIG5lZWQgdG8gdHJ1bmNh
dGUgaXQuCisgICAgaWYgKGVycm5vX3QgcmVzaXplRXJyb3IgPSBfY2hzaXplX3MoX2ZpbGVubyhi
dW5kbGUpLCBmb290ZXJTdGFydFBvc2l0aW9uKSkgeworICAgICAgICBMT0dfRVJST1IoIkZhaWxl
ZCB0byB0cnVuY2F0ZSB0aGUgcmVzdW1lIGZvb3RlciBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZSAt
IGVycm5vKCVpKSIsIHJlc2l6ZUVycm9yKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKwor
ICAgIC8vIEZpbmFsbHksIG1ha2UgdGhlIHJlc3VtZSBkYXRhLiAgTm93LCBpdCBpcyBwb3NzaWJs
ZSBieSBzb21lIHR3aXN0IG9mIGZhdGUgdGhlIGJ1bmRsZSBtYWdpYyBudW1iZXIKKyAgICAvLyB3
YXMgbmF0dXJhbGx5IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGl0cyBub3QgYWN0dWFsbHkg
YSB2YWxpZCBidW5kbGUuICBUaGF0LCBvciBzb21lb25lIGVuZ2luZWVyZWQKKyAgICAvLyBpdCB0
aGF0IHdheSB0byB0cnkgdG8gYXR0YWNrIHVzLiAgSW4gdGhhdCBjYXVzZSwgdGhpcyBDRkRhdGEg
d2lsbCBzdWNjZXNzZnVsbHkgY3JlYXRlIGJ1dCB3aGVuIHdlIAorICAgIC8vIGFjdHVhbGx5IHRy
eSB0byBzdGFydCB0aGUgQ0ZVUkxEb3dubG9hZCB1c2luZyB0aGlzIGJvZ3VzIGRhdGEsIGl0IHdp
bGwgZmFpbCBhbmQgd2Ugd2lsbCBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5CisgICAgcmVzdWx0ID0g
Q0ZEYXRhQ3JlYXRlKDAsIGZvb3RlckJ1ZmZlci5kYXRhKCksIGZvb3Rlckxlbmd0aCk7CitleGl0
OgorICAgIGZjbG9zZShidW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBI
UkVTVUxUIGFwcGVuZFJlc3VtZURhdGFUb0J1bmRsZShDRkRhdGFSZWYgcmVzdW1lRGF0YSwgY29u
c3QgU3RyaW5nJiBidW5kbGVQYXRoKQoreworICAgIGlmICghcmVzdW1lRGF0YSkgeworICAgICAg
ICBMT0dfRVJST1IoIkludmFsaWQgcmVzdW1lIGRhdGEgdG8gd3JpdGUgdG8gYnVuZGxlIHBhdGgi
KTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CisgICAgaWYgKGJ1bmRsZVBhdGguaXNF
bXB0eSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IHdyaXRlIHJlc3VtZSBkYXRhIHRv
IGVtcHR5IGRvd25sb2FkIGJ1bmRsZSBwYXRoIik7CisgICAgICAgIHJldHVybiBFX0ZBSUw7Cisg
ICAgfQorCisgICAgU3RyaW5nIG51bGxpZmllZFBhdGggPSBidW5kbGVQYXRoOworICAgIEZJTEUq
IGJ1bmRsZSA9IDA7CisgICAgaWYgKF93Zm9wZW5fcygmYnVuZGxlLCBudWxsaWZpZWRQYXRoLmNo
YXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIFRFWFQoImFiIikpIHx8ICFidW5kbGUpIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBmaWxlICVzIHRvIGFwcGVuZCByZXN1
bWUgZGF0YSIsIGJ1bmRsZVBhdGguYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gRV9G
QUlMOworICAgIH0KKworICAgIEhSRVNVTFQgaHIgPSBFX0ZBSUw7CisKKyAgICBjb25zdCBVSW50
OCogcmVzdW1lQnl0ZXMgPSBDRkRhdGFHZXRCeXRlUHRyKHJlc3VtZURhdGEpOworICAgIEFTU0VS
VChyZXN1bWVCeXRlcyk7CisgICAgaWYgKCFyZXN1bWVCeXRlcykKKyAgICAgICAgZ290byBleGl0
OworCisgICAgVUludDMyIHJlc3VtZUxlbmd0aCA9IENGRGF0YUdldExlbmd0aChyZXN1bWVEYXRh
KTsKKyAgICBBU1NFUlQocmVzdW1lTGVuZ3RoID4gMCk7CisgICAgaWYgKHJlc3VtZUxlbmd0aCA8
IDEpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGlmIChmd3JpdGUocmVzdW1lQnl0ZXMsIDEs
IHJlc3VtZUxlbmd0aCwgYnVuZGxlKSAhPSByZXN1bWVMZW5ndGgpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJGYWlsZWQgdG8gd3JpdGUgcmVzdW1lIGRhdGEgdG8gdGhlIGJ1bmRsZSAtIGVycm5vKCVp
KSIsIGVycm5vKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChmd3JpdGUo
JnJlc3VtZUxlbmd0aCwgNCwgMSwgYnVuZGxlKSAhPSAxKSB7CisgICAgICAgIExPR19FUlJPUigi
RmFpbGVkIHRvIHdyaXRlIGZvb3RlciBsZW5ndGggdG8gdGhlIGJ1bmRsZSAtIGVycm5vKCVpKSIs
IGVycm5vKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChmd3JpdGUoJkJ1
bmRsZU1hZ2ljTnVtYmVyLCA0LCAxLCBidW5kbGUpICE9IDEpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gd3JpdGUgZm9vdGVyIG1hZ2ljIG51bWJlciB0byB0aGUgYnVuZGxlIC0gZXJy
bm8oJWkpIiwgZXJybm8pOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIAorICAgIGhy
ID0gU19PSzsKK2V4aXQ6CisgICAgZmNsb3NlKGJ1bmRsZSk7CisgICAgcmV0dXJuIGhyOworfQpJ
bmRleDogV2ViS2l0L3dpbi9XZWJEb3dubG9hZEN1cmwuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC93aW4vV2ViRG93bmxvYWRDdXJsLmNwcAkocmV2aXNpb24gMzE4MTQpCShmcm9tIFdlYktpdC93
aW4vV2ViRG93bmxvYWQuY3BwOjMxODE0KQorKysgV2ViS2l0L3dpbi9XZWJEb3dubG9hZEN1cmwu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzk4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJLaXRETEwuaCIKKyNpbmNsdWRlICJXZWJEb3dubG9h
ZC5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkRlZmF1bHREb3dubG9hZERl
bGVnYXRlLmgiCisjaW5jbHVkZSAiTWFyc2hhbGxpbmdIZWxwZXJzLmgiCisjaW5jbHVkZSAiV2Vi
RXJyb3IuaCIKKyNpbmNsdWRlICJXZWJLaXQuaCIKKyNpbmNsdWRlICJXZWJLaXRMb2dnaW5nLmgi
CisjaW5jbHVkZSAiV2ViTXV0YWJsZVVSTFJlcXVlc3QuaCIKKyNpbmNsdWRlICJXZWJVUkxBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZS5oIgorI2luY2x1ZGUgIldlYlVSTENyZWRlbnRpYWwuaCIKKyNp
bmNsdWRlICJXZWJVUkxSZXNwb25zZS5oIgorCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxz
eXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjcHJhZ21hIHdhcm5pbmcocHVz
aCwgMCkKKyNpbmNsdWRlIDxXZWJDb3JlL0F1dGhlbnRpY2F0aW9uQ0YuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0JTdHJpbmcuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL05vdEltcGxlbWVudGVkLmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9SZXNvdXJjZUVycm9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9SZXNv
dXJjZUhhbmRsZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUmVzb3VyY2VSZXF1ZXN0Lmg+CisjaW5j
bHVkZSA8V2ViQ29yZS9SZXNvdXJjZVJlc3BvbnNlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TeXN0
ZW1UaW1lLmg+CisjcHJhZ21hIHdhcm5pbmcocG9wKQorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKKworLy8gQ0ZVUkxEb3dubG9hZCBDYWxsYmFja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgZGlk
U3RhcnRDYWxsYmFjayhDRlVSTERvd25sb2FkUmVmIGRvd25sb2FkLCBjb25zdCB2b2lkICpjbGll
bnRJbmZvKTsKK3N0YXRpYyBDRlVSTFJlcXVlc3RSZWYgd2lsbFNlbmRSZXF1ZXN0Q2FsbGJhY2so
Q0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QsIENGVVJM
UmVzcG9uc2VSZWYgcmVkaXJlY3Rpb25SZXNwb25zZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7
CitzdGF0aWMgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2VDYWxsYmFjayhD
RlVSTERvd25sb2FkUmVmIGRvd25sb2FkLCBDRlVSTEF1dGhDaGFsbGVuZ2VSZWYgY2hhbGxlbmdl
LCBjb25zdCB2b2lkICpjbGllbnRJbmZvKTsKK3N0YXRpYyB2b2lkIGRpZFJlY2VpdmVSZXNwb25z
ZUNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVzcG9uc2VSZWYgcmVz
cG9uc2UsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOworc3RhdGljIHZvaWQgd2lsbFJlc3VtZVdp
dGhSZXNwb25zZUNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVzcG9u
c2VSZWYgcmVzcG9uc2UsIFVJbnQ2NCBzdGFydGluZ0J5dGUsIGNvbnN0IHZvaWQgKmNsaWVudElu
Zm8pOworc3RhdGljIHZvaWQgZGlkUmVjZWl2ZURhdGFDYWxsYmFjayhDRlVSTERvd25sb2FkUmVm
IGRvd25sb2FkLCBDRkluZGV4IGxlbmd0aCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CitzdGF0
aWMgQm9vbGVhbiBzaG91bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNrKENGVVJMRG93bmxv
YWRSZWYgZG93bmxvYWQsIENGU3RyaW5nUmVmIGVuY29kaW5nVHlwZSwgY29uc3Qgdm9pZCAqY2xp
ZW50SW5mbyk7CitzdGF0aWMgdm9pZCBkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRPYmpl
Y3ROYW1lQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZTdHJpbmdSZWYgb2Jq
ZWN0TmFtZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CitzdGF0aWMgdm9pZCBkaWRDcmVhdGVE
ZXN0aW5hdGlvbkNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGVVJMUmVmIHBh
dGgsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOworc3RhdGljIHZvaWQgZGlkRmluaXNoQ2FsbGJh
Y2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7Citz
dGF0aWMgdm9pZCBkaWRGYWlsQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgQ0ZF
cnJvclJlZiBlcnJvciwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CisKKy8vIERvd25sb2FkIEJ1
bmRsZSBmaWxlIHV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgY29uc3QgU3RyaW5nIEJ1bmRsZUV4
dGVuc2lvbigiLmRvd25sb2FkIik7CitzdGF0aWMgVUludDMyIEJ1bmRsZU1hZ2ljTnVtYmVyID0g
MHhERUNBRjRFQTsKKworc3RhdGljIENGRGF0YVJlZiBleHRyYWN0UmVzdW1lRGF0YUZyb21CdW5k
bGUoY29uc3QgU3RyaW5nJiBidW5kbGVQYXRoKTsKK3N0YXRpYyBIUkVTVUxUIGFwcGVuZFJlc3Vt
ZURhdGFUb0J1bmRsZShDRkRhdGFSZWYgcmVzdW1lRGF0YSwgY29uc3QgU3RyaW5nJiBidW5kbGVQ
YXRoKTsKKworLy8gV2ViRG93bmxvYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZWJEb3dubG9hZDo6V2ViRG93bmxv
YWQoKQorICAgIDogbV9yZWZDb3VudCgwKQoreworICAgIGdDbGFzc0NvdW50Kys7Cit9CisKK3Zv
aWQgV2ViRG93bmxvYWQ6OmluaXQoUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSwgY29uc3QgUmVzb3Vy
Y2VSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgSVdl
YkRvd25sb2FkRGVsZWdhdGUqIGRlbGVnYXRlKQoreworICAgIG1fZGVsZWdhdGUgPSBkZWxlZ2F0
ZSA/IGRlbGVnYXRlIDogRGVmYXVsdERvd25sb2FkRGVsZWdhdGU6OnNoYXJlZEluc3RhbmNlKCk7
CisgICAgQ0ZVUkxDb25uZWN0aW9uUmVmIGNvbm5lY3Rpb24gPSBoYW5kbGUtPmNvbm5lY3Rpb24o
KTsKKyAgICBpZiAoIWNvbm5lY3Rpb24pIHsKKyAgICAgICAgTE9HX0VSUk9SKCJXZWJEb3dubG9h
ZDo6V2ViRG93bmxvYWQoUmVzb3VyY2VIYW5kbGUqLC4uLikgY2FsbGVkIHdpdGggYW4gaW5hY3Rp
dmUgUmVzb3VyY2VIYW5kbGUiKTsgICAgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBD
RlVSTERvd25sb2FkQ2xpZW50IGNsaWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENh
bGxiYWNrLCB3aWxsU2VuZFJlcXVlc3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9u
Q2hhbGxlbmdlQ2FsbGJhY2ssIAorICAgICAgICBkaWRSZWNlaXZlUmVzcG9uc2VDYWxsYmFjaywg
d2lsbFJlc3VtZVdpdGhSZXNwb25zZUNhbGxiYWNrLCBkaWRSZWNlaXZlRGF0YUNhbGxiYWNrLCBz
aG91bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNhbGxiYWNrLAorICAgICAgICBkZWNpZGVEZXN0aW5h
dGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2ssIGRpZENyZWF0ZURlc3RpbmF0aW9u
Q2FsbGJhY2ssIGRpZEZpbmlzaENhbGxiYWNrLCBkaWRGYWlsQ2FsbGJhY2t9OworCisgICAgbV9y
ZXF1ZXN0LmFkb3B0UmVmKFdlYk11dGFibGVVUkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShyZXF1
ZXN0KSk7CisgICAgbV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGVBbmRTdGFy
dFdpdGhMb2FkaW5nQ29ubmVjdGlvbigwLCBjb25uZWN0aW9uLCByZXF1ZXN0LmNmVVJMUmVxdWVz
dCgpLCByZXNwb25zZS5jZlVSTFJlc3BvbnNlKCksICZjbGllbnQpKTsKKworICAgIC8vIEl0IGlz
IHBvc3NpYmxlIGZvciBDRlVSTERvd25sb2FkQ3JlYXRlQW5kU3RhcnRXaXRoTG9hZGluZ0Nvbm5l
Y3Rpb24oKSB0byBmYWlsIGlmIHRoZSBwYXNzZWQgaW4gQ0ZVUkxDb25uZWN0aW9uIGlzIG5vdCBp
biBhICJkb3dubG9hZGFibGUgc3RhdGUiCisgICAgLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5ldmVy
IGhpdCB0aGF0IGNhc2UKKyAgICBpZiAoIW1fZG93bmxvYWQpIHsKKyAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgICAgIExPR19FUlJPUigiV2ViRG93bmxvYWQgLSBGYWlsZWQgdG8g
Y3JlYXRlIFdlYkRvd25sb2FkIGZyb20gZXhpc3RpbmcgY29ubmVjdGlvbiAoJXMpIiwgcmVxdWVz
dC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgTE9H
KERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBDcmVhdGVkIFdlYkRvd25sb2FkICVwIGZyb20gZXhp
c3RpbmcgY29ubmVjdGlvbiAoJXMpIiwgdGhpcywgcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4
KCkuZGF0YSgpKTsKKworICAgIC8vIFRoZSBDRlVSTERvd25sb2FkIGVpdGhlciBzdGFydHMgc3Vj
Y2Vzc2Z1bGx5IGFuZCByZXRhaW5zIHRoZSBDRlVSTENvbm5lY3Rpb24sIAorICAgIC8vIG9yIGl0
IGZhaWxzIHRvIGNyZWF0aW5nIGFuZCB3ZSBoYXZlIGEgbm93LXVzZWxlc3MgY29ubmVjdGlvbiB3
aXRoIGEgZGFuZ2xpbmcgcmVmLiAKKyAgICAvLyBFaXRoZXIgd2F5LCB3ZSBuZWVkIHRvIHJlbGVh
c2UgdGhlIGNvbm5lY3Rpb24gdG8gYmFsYW5jZSBvdXQgcmVmIGNvdW50cworICAgIGhhbmRsZS0+
cmVsZWFzZUNvbm5lY3Rpb25Gb3JEb3dubG9hZCgpOworICAgIENGUmVsZWFzZShjb25uZWN0aW9u
KTsKK30KKwordm9pZCBXZWJEb3dubG9hZDo6aW5pdChjb25zdCBLVVJMJiB1cmwsIElXZWJEb3du
bG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBtX2RlbGVnYXRlID0gZGVsZWdhdGUgPyBk
ZWxlZ2F0ZSA6IERlZmF1bHREb3dubG9hZERlbGVnYXRlOjpzaGFyZWRJbnN0YW5jZSgpOworICAg
IExPR19FUlJPUigiRGVsZWdhdGUgaXMgJXAiLCBtX2RlbGVnYXRlLmdldCgpKTsKKworICAgIFJl
c291cmNlUmVxdWVzdCByZXF1ZXN0KHVybCk7CisgICAgQ0ZVUkxSZXF1ZXN0UmVmIGNmUmVxdWVz
dCA9IHJlcXVlc3QuY2ZVUkxSZXF1ZXN0KCk7CisKKyAgICBDRlVSTERvd25sb2FkQ2xpZW50IGNs
aWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2VuZFJlcXVl
c3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ssIAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxi
YWNrLCB3aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2FsbGJh
Y2ssIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5h
bWVDYWxsYmFjaywgZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNoQ2FsbGJh
Y2ssIGRpZEZhaWxDYWxsYmFja307CisgICAgbV9yZXF1ZXN0LmFkb3B0UmVmKFdlYk11dGFibGVV
UkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShyZXF1ZXN0KSk7CisgICAgbV9kb3dubG9hZC5hZG9w
dENGKENGVVJMRG93bmxvYWRDcmVhdGUoMCwgY2ZSZXF1ZXN0LCAmY2xpZW50KSk7CisKKyAgICBD
RlVSTERvd25sb2FkU2NoZWR1bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdl
dCgpKTsKKyAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93
bmxvYWQuZ2V0KCksIFJlc291cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BE
ZWZhdWx0TW9kZSk7CisKKyAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIEluaXRpYWxp
emVkIGRvd25sb2FkIG9mIHVybCAlcyBpbiBXZWJEb3dubG9hZCAlcCIsIHVybC5zdHJpbmcoKS51
dGY4KCkuZGF0YSgpLCB0aGlzKTsKK30KKworV2ViRG93bmxvYWQ6On5XZWJEb3dubG9hZCgpCit7
CisgICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBEZXN0cm95aW5nIGRvd25sb2FkICgl
cCkiLCB0aGlzKTsKKyAgICBjYW5jZWwoKTsKKyAgICBnQ2xhc3NDb3VudC0tOworfQorCitXZWJE
b3dubG9hZCogV2ViRG93bmxvYWQ6OmNyZWF0ZUluc3RhbmNlKCkKK3sKKyAgICBXZWJEb3dubG9h
ZCogaW5zdGFuY2UgPSBuZXcgV2ViRG93bmxvYWQoKTsKKyAgICBpbnN0YW5jZS0+QWRkUmVmKCk7
CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCitXZWJEb3dubG9hZCogV2ViRG93bmxvYWQ6OmNy
ZWF0ZUluc3RhbmNlKFJlc291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVz
dCYgcmVxdWVzdCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIElXZWJEb3dubG9h
ZERlbGVnYXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBXZWJEb3dubG9hZCogaW5zdGFuY2UgPSBuZXcg
V2ViRG93bmxvYWQoKTsKKyAgICBpbnN0YW5jZS0+QWRkUmVmKCk7CisgICAgaW5zdGFuY2UtPmlu
aXQoaGFuZGxlLCByZXF1ZXN0LCByZXNwb25zZSwgZGVsZWdhdGUpOworICAgIHJldHVybiBpbnN0
YW5jZTsKK30KKworV2ViRG93bmxvYWQqIFdlYkRvd25sb2FkOjpjcmVhdGVJbnN0YW5jZShjb25z
dCBLVVJMJiB1cmwsIElXZWJEb3dubG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKK3sKKyAgICBXZWJE
b3dubG9hZCogaW5zdGFuY2UgPSBuZXcgV2ViRG93bmxvYWQoKTsKKyAgICBpbnN0YW5jZS0+QWRk
UmVmKCk7CisgICAgaW5zdGFuY2UtPmluaXQodXJsLCBkZWxlZ2F0ZSk7CisgICAgcmV0dXJuIGlu
c3RhbmNlOworfQorCisvLyBJVW5rbm93biAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hSRVNVTFQgU1RETUVUSE9E
Q0FMTFRZUEUgV2ViRG93bmxvYWQ6OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkKiog
cHB2T2JqZWN0KQoreworICAgICpwcHZPYmplY3QgPSAwOworICAgIGlmIChJc0VxdWFsR1VJRChy
aWlkLCBJSURfSVVua25vd24pKQorICAgICAgICAqcHB2T2JqZWN0ID0gc3RhdGljX2Nhc3Q8SVdl
YkRvd25sb2FkKj4odGhpcyk7CisgICAgZWxzZSBpZiAoSXNFcXVhbEdVSUQocmlpZCwgSUlEX0lX
ZWJEb3dubG9hZCkpCisgICAgICAgICpwcHZPYmplY3QgPSBzdGF0aWNfY2FzdDxJV2ViRG93bmxv
YWQqPih0aGlzKTsKKyAgICBlbHNlIGlmIChJc0VxdWFsR1VJRChyaWlkLCBJSURfSVdlYlVSTEF1
dGhlbnRpY2F0aW9uQ2hhbGxlbmdlU2VuZGVyKSkKKyAgICAgICAgKnBwdk9iamVjdCA9IHN0YXRp
Y19jYXN0PElXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZVNlbmRlcio+KHRoaXMpOworICAg
IGVsc2UgaWYgKElzRXF1YWxHVUlEKHJpaWQsIENMU0lEX1dlYkRvd25sb2FkKSkKKyAgICAgICAg
KnBwdk9iamVjdCA9IHN0YXRpY19jYXN0PFdlYkRvd25sb2FkKj4odGhpcyk7CisgICAgZWxzZQor
ICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKKworICAgIEFkZFJlZigpOworICAgIHJldHVy
biBTX09LOworfQorCitVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6QWRkUmVm
KHZvaWQpCit7CisgICAgcmV0dXJuICsrbV9yZWZDb3VudDsKK30KKworVUxPTkcgU1RETUVUSE9E
Q0FMTFRZUEUgV2ViRG93bmxvYWQ6OlJlbGVhc2Uodm9pZCkKK3sKKyAgICBVTE9ORyBuZXdSZWYg
PSAtLW1fcmVmQ291bnQ7CisgICAgaWYgKCFuZXdSZWYpCisgICAgICAgIGRlbGV0ZSh0aGlzKTsK
KworICAgIHJldHVybiBuZXdSZWY7Cit9CisKKy8vIElXZWJEb3dubG9hZCAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisK
K0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmluaXRXaXRoUmVxdWVzdCgK
KyAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMUmVxdWVzdCogcmVxdWVzdCwgCisgICAgICAgIC8q
IFtpbl0gKi8gSVdlYkRvd25sb2FkRGVsZWdhdGUqIGRlbGVnYXRlKQoreworICAgIENPTVB0cjxX
ZWJNdXRhYmxlVVJMUmVxdWVzdD4gd2ViUmVxdWVzdDsKKyAgICBpZiAoIXJlcXVlc3QgfHwgRkFJ
TEVEKHJlcXVlc3QtPlF1ZXJ5SW50ZXJmYWNlKCZ3ZWJSZXF1ZXN0KSkpIHsKKyAgICAgICAgTE9H
KERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBpbml0V2l0aFJlcXVlc3QgZmFpbGVkIC0gbm90IGEg
V2ViTXV0YWJsZVVSTFJlcXVlc3QiKTsgICAgCisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAg
fQorCisgICAgaWYgKCFkZWxlZ2F0ZSkKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICBtX2Rl
bGVnYXRlID0gZGVsZWdhdGU7CisgICAgTE9HKERvd25sb2FkLCAiRGVsZWdhdGUgaXMgJXAiLCBt
X2RlbGVnYXRlLmdldCgpKTsKKworICAgIFJldGFpblB0cjxDRlVSTFJlcXVlc3RSZWY+IGNmUmVx
dWVzdCA9IHdlYlJlcXVlc3QtPnJlc291cmNlUmVxdWVzdCgpLmNmVVJMUmVxdWVzdCgpOworCisg
ICAgQ0ZVUkxEb3dubG9hZENsaWVudCBjbGllbnQgPSB7MCwgdGhpcywgMCwgMCwgMCwgZGlkU3Rh
cnRDYWxsYmFjaywgd2lsbFNlbmRSZXF1ZXN0Q2FsbGJhY2ssIGRpZFJlY2VpdmVBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZUNhbGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBkaWRSZWNlaXZlUmVzcG9uc2VDYWxsYmFjaywgd2lsbFJlc3VtZVdpdGhSZXNwb25zZUNhbGxi
YWNrLCBkaWRSZWNlaXZlRGF0YUNhbGxiYWNrLCBzaG91bGREZWNvZGVEYXRhT2ZNSU1FVHlwZUNh
bGxiYWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpZGVEZXN0aW5h
dGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2ssIGRpZENyZWF0ZURlc3RpbmF0aW9u
Q2FsbGJhY2ssIGRpZEZpbmlzaENhbGxiYWNrLCBkaWRGYWlsQ2FsbGJhY2t9OworICAgIG1fcmVx
dWVzdC5hZG9wdFJlZihXZWJNdXRhYmxlVVJMUmVxdWVzdDo6Y3JlYXRlSW5zdGFuY2Uod2ViUmVx
dWVzdC5nZXQoKSkpOworICAgIG1fZG93bmxvYWQuYWRvcHRDRihDRlVSTERvd25sb2FkQ3JlYXRl
KDAsIGNmUmVxdWVzdC5nZXQoKSwgJmNsaWVudCkpOworCisgICAgLy8gSWYgZm9yIHNvbWUgcmVh
c29uIHRoZSBkb3dubG9hZCBmYWlsZWQgdG8gY3JlYXRlLCAKKyAgICAvLyB3ZSBoYXZlIHBhcnRp
Y3VsYXIgY2xlYW51cCB0byBkbworICAgIGlmICghbV9kb3dubG9hZCkgeworICAgICAgICBtX3Jl
cXVlc3QgPSAwOyAgICAKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CisKKyAgICBDRlVS
TERvd25sb2FkU2NoZWR1bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgp
KTsKKyAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxv
YWQuZ2V0KCksIFJlc291cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZh
dWx0TW9kZSk7CisKKyAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIGluaXRXaXRoUmVx
dWVzdCBjb21wbGV0ZSwgc3RhcnRlZCBkb3dubG9hZCBvZiB1cmwgJXMiLCB3ZWJSZXF1ZXN0LT5y
ZXNvdXJjZVJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICByZXR1
cm4gU19PSzsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6aW5p
dFRvUmVzdW1lV2l0aEJ1bmRsZSgKKyAgICAgICAgLyogW2luXSAqLyBCU1RSIGJ1bmRsZVBhdGgs
IAorICAgICAgICAvKiBbaW5dICovIElXZWJEb3dubG9hZERlbGVnYXRlKiBkZWxlZ2F0ZSkKK3sK
KyAgICBMT0coRG93bmxvYWQsICJBdHRlbXB0aW5nIHJlc3VtZSBvZiBkb3dubG9hZCBidW5kbGUg
JXMiLCBTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgpKS5hc2NpaSgp
LmRhdGEoKSk7CisKKyAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiByZXN1bWVEYXRhKEFkb3B0Q0Ys
IGV4dHJhY3RSZXN1bWVEYXRhRnJvbUJ1bmRsZShTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5n
TGVuKGJ1bmRsZVBhdGgpKSkpOworICAgIAorICAgIGlmICghcmVzdW1lRGF0YSkKKyAgICAgICAg
cmV0dXJuIEVfRkFJTDsKKworICAgIGlmICghZGVsZWdhdGUpCisgICAgICAgIHJldHVybiBFX0ZB
SUw7CisgICAgbV9kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIExPRyhEb3dubG9hZCwgIkRlbGVn
YXRlIGlzICVwIiwgbV9kZWxlZ2F0ZS5nZXQoKSk7CisKKyAgICBDRlVSTERvd25sb2FkQ2xpZW50
IGNsaWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2VuZFJl
cXVlc3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ss
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25zZUNh
bGxiYWNrLCB3aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2Fs
bGJhY2ssIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVj
dE5hbWVDYWxsYmFjaywgZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNoQ2Fs
bGJhY2ssIGRpZEZhaWxDYWxsYmFja307CisgICAgCisgICAgUmV0YWluUHRyPENGVVJMUmVmPiBw
YXRoVVJMKEFkb3B0Q0YsIE1hcnNoYWxsaW5nSGVscGVyczo6UGF0aFN0cmluZ1RvRmlsZUNGVVJM
UmVmKFN0cmluZyhidW5kbGVQYXRoLCBTeXNTdHJpbmdMZW4oYnVuZGxlUGF0aCkpKSk7CisgICAg
QVNTRVJUKHBhdGhVUkwpOworCisgICAgbV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRD
cmVhdGVXaXRoUmVzdW1lRGF0YSgwLCByZXN1bWVEYXRhLmdldCgpLCBwYXRoVVJMLmdldCgpLCAm
Y2xpZW50KSk7CisKKyAgICBpZiAoIW1fZG93bmxvYWQpIHsKKyAgICAgICAgTE9HKERvd25sb2Fk
LCAiRmFpbGVkIHRvIGNyZWF0ZSBDRlVSTERvd25sb2FkUmVmIGZvciByZXN1bWUiKTsgICAgCisg
ICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQorICAgIAorICAgIG1fYnVuZGxlUGF0aCA9IFN0
cmluZyhidW5kbGVQYXRoLCBTeXNTdHJpbmdMZW4oYnVuZGxlUGF0aCkpOworICAgIC8vIEF0dGVt
cHQgdG8gcmVtb3ZlIHRoZSAiLmRvd25sb2FkIiBleHRlbnNpb24gZnJvbSB0aGUgYnVuZGxlIGZv
ciB0aGUgZmluYWwgZmlsZSBkZXN0aW5hdGlvbgorICAgIC8vIEZhaWxpbmcgdGhhdCwgd2UgY2xl
YXIgbV9kZXN0aW5hdGlvbiBhbmQgd2lsbCBhc2sgdGhlIGRlbGVnYXRlIGxhdGVyIG9uY2UgdGhl
IGRvd25sb2FkIHN0YXJ0cworICAgIGlmIChtX2J1bmRsZVBhdGguZW5kc1dpdGgoQnVuZGxlRXh0
ZW5zaW9uLCBmYWxzZSkpIHsKKyAgICAgICAgbV9kZXN0aW5hdGlvbiA9IG1fYnVuZGxlUGF0aC5j
b3B5KCk7CisgICAgICAgIG1fZGVzdGluYXRpb24udHJ1bmNhdGUobV9kZXN0aW5hdGlvbi5sZW5n
dGgoKSAtIEJ1bmRsZUV4dGVuc2lvbi5sZW5ndGgoKSk7CisgICAgfSBlbHNlCisgICAgICAgIG1f
ZGVzdGluYXRpb24gPSBTdHJpbmcoKTsKKyAgICAKKyAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVX
aXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2FkLmdldCgpKTsKKyAgICBDRlVSTERvd25s
b2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1fZG93bmxvYWQuZ2V0KCksIFJlc291cmNl
SGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7CisKKyAgICBM
T0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIGluaXRXaXRoUmVxdWVzdCBjb21wbGV0ZSwgcmVz
dW1lZCBkb3dubG9hZCBvZiBidW5kbGUgJXMiLCBTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5n
TGVuKGJ1bmRsZVBhdGgpKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisK
K0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNhblJlc3VtZURvd25sb2Fk
RGVjb2RlZFdpdGhFbmNvZGluZ01JTUVUeXBlKAorICAgICAgICAvKiBbaW5dICovIEJTVFIsIAor
ICAgICAgICAvKiBbb3V0LCByZXR2YWxdICovIEJPT0wqKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgcmV0dXJuIEVfRkFJTDsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBX
ZWJEb3dubG9hZDo6c3RhcnQoKQoreworICAgIExPRyhEb3dubG9hZCwgIldlYkRvd25sb2FkIC0g
U3RhcnRpbmcgZG93bmxvYWQgKCVwKSIsIHRoaXMpOworICAgIGlmICghbV9kb3dubG9hZCkKKyAg
ICAgICAgcmV0dXJuIEVfRkFJTDsKKworICAgIENGVVJMRG93bmxvYWRTdGFydChtX2Rvd25sb2Fk
LmdldCgpKTsKKyAgICAvLyBGSVhNRTogNDk1MDQ3NyAtIENGVVJMRG93bmxvYWQgbmVnbGVjdHMg
dG8gbWFrZSB0aGUgZGlkU3RhcnQoKSBjbGllbnQgY2FsbCB1cG9uIHN0YXJ0aW5nIHRoZSBkb3du
bG9hZC4KKyAgICAvLyBUaGlzIGlzIGEgc29tZXdoYXQgY3JpdGljYWwgY2FsbCwgc28gd2UnbGwg
ZmFrZSBpdCBmb3Igbm93IQorICAgIGRpZFN0YXJ0KCk7CisKKyAgICByZXR1cm4gU19PSzsKK30K
KworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6Y2FuY2VsKCkKK3sKKyAg
ICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIENhbmNlbGxpbmcgZG93bmxvYWQgKCVwKSIs
IHRoaXMpOworICAgIGlmICghbV9kb3dubG9hZCkKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKwor
ICAgIENGVVJMRG93bmxvYWRDYW5jZWwobV9kb3dubG9hZC5nZXQoKSk7CisgICAgbV9kb3dubG9h
ZCA9IDA7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUg
V2ViRG93bmxvYWQ6OmNhbmNlbEZvclJlc3VtZSgpCit7CisgICAgTE9HKERvd25sb2FkLCAiV2Vi
RG93bmxvYWQgLSBDYW5jZWxsaW5nIGRvd25sb2FkICglcCksIHdyaXRpbmcgcmVzdW1lIGluZm9y
bWF0aW9uIHRvIGZpbGUgaWYgcG9zc2libGUiLCB0aGlzKTsKKyAgICBBU1NFUlQobV9kb3dubG9h
ZCk7CisgICAgaWYgKCFtX2Rvd25sb2FkKQorICAgICAgICByZXR1cm4gRV9GQUlMOworCisgICAg
SFJFU1VMVCBociA9IFNfT0s7CisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gcmVzdW1lRGF0YTsK
KyAgICBpZiAobV9kZXN0aW5hdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgQ0ZVUkxEb3dubG9h
ZENhbmNlbChtX2Rvd25sb2FkLmdldCgpKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKwor
ICAgIENGVVJMRG93bmxvYWRTZXREZWxldGVzVXBvbkZhaWx1cmUobV9kb3dubG9hZC5nZXQoKSwg
ZmFsc2UpOworICAgIENGVVJMRG93bmxvYWRDYW5jZWwobV9kb3dubG9hZC5nZXQoKSk7CisKKyAg
ICByZXN1bWVEYXRhID0gQ0ZVUkxEb3dubG9hZENvcHlSZXN1bWVEYXRhKG1fZG93bmxvYWQuZ2V0
KCkpOworICAgIGlmICghcmVzdW1lRGF0YSkgeworICAgICAgICBMT0coRG93bmxvYWQsICJXZWJE
b3dubG9hZCAtIFVuYWJsZSB0byBjcmVhdGUgcmVzdW1lIGRhdGEgZm9yIGRvd25sb2FkICglcCki
LCB0aGlzKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGFwcGVuZFJlc3VtZURh
dGFUb0J1bmRsZShyZXN1bWVEYXRhLmdldCgpLCBtX2J1bmRsZVBhdGgpOworICAgCitleGl0Ogor
ICAgIG1fZG93bmxvYWQgPSAwOworICAgIHJldHVybiBocjsKK30KKworSFJFU1VMVCBTVERNRVRI
T0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6ZGVsZXRlc0ZpbGVVcG9uRmFpbHVyZSgKKyAgICAgICAg
LyogW291dCwgcmV0dmFsXSAqLyBCT09MKiByZXN1bHQpCit7CisgICAgaWYgKCFtX2Rvd25sb2Fk
KQorICAgICAgICByZXR1cm4gRV9GQUlMOworICAgICpyZXN1bHQgPSBDRlVSTERvd25sb2FkRGVs
ZXRlc1Vwb25GYWlsdXJlKG1fZG93bmxvYWQuZ2V0KCkpOworICAgIHJldHVybiBTX09LOworfQor
CitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpidW5kbGVQYXRoRm9yVGFy
Z2V0UGF0aCgKKyAgICAgICAgLyogW2luXSAqLyBCU1RSIHRhcmdldFBhdGgsIAorICAgICAgICAv
KiBbb3V0LCByZXR2YWxdICovIEJTVFIqIGJ1bmRsZVBhdGgpCit7CisgICAgaWYgKCF0YXJnZXRQ
YXRoKQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOworCisgICAgU3RyaW5nIGJ1bmRsZSh0
YXJnZXRQYXRoLCBTeXNTdHJpbmdMZW4odGFyZ2V0UGF0aCkpOworICAgIGlmIChidW5kbGUuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOworCisgICAgaWYgKGJ1bmRsZVti
dW5kbGUubGVuZ3RoKCktMV0gPT0gJy8nKQorICAgICAgICBidW5kbGUudHJ1bmNhdGUoMSk7CisK
KyAgICBidW5kbGUgKz0gQnVuZGxlRXh0ZW5zaW9uOworICAgICpidW5kbGVQYXRoID0gU3lzQWxs
b2NTdHJpbmdMZW4oYnVuZGxlLmNoYXJhY3RlcnMoKSwgYnVuZGxlLmxlbmd0aCgpKTsKKyAgICBp
ZiAoISpidW5kbGVQYXRoKQorICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIHJldHVybiBTX09L
OworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpyZXF1ZXN0KAor
ICAgICAgICAvKiBbb3V0LCByZXR2YWxdICovIElXZWJVUkxSZXF1ZXN0KiogcmVxdWVzdCkKK3sK
KyAgICBpZiAocmVxdWVzdCkgeworICAgICAgICAqcmVxdWVzdCA9IG1fcmVxdWVzdC5nZXQoKTsK
KyAgICAgICAgaWYgKCpyZXF1ZXN0KQorICAgICAgICAgICAgKCpyZXF1ZXN0KS0+QWRkUmVmKCk7
CisgICAgfQorICAgIHJldHVybiBTX09LOworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBF
IFdlYkRvd25sb2FkOjpzZXREZWxldGVzRmlsZVVwb25GYWlsdXJlKAorICAgICAgICAvKiBbaW5d
ICovIEJPT0wgZGVsZXRlc0ZpbGVVcG9uRmFpbHVyZSkKK3sKKyAgICBpZiAoIW1fZG93bmxvYWQp
CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgQ0ZVUkxEb3dubG9hZFNldERlbGV0ZXNVcG9u
RmFpbHVyZShtX2Rvd25sb2FkLmdldCgpLCAhIWRlbGV0ZXNGaWxlVXBvbkZhaWx1cmUpOworICAg
IHJldHVybiBTX09LOworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2Fk
OjpzZXREZXN0aW5hdGlvbigKKyAgICAgICAgLyogW2luXSAqLyBCU1RSIHBhdGgsIAorICAgICAg
ICAvKiBbaW5dICovIEJPT0wgYWxsb3dPdmVyd3JpdGUpCit7CisgICAgaWYgKCFtX2Rvd25sb2Fk
KQorICAgICAgICByZXR1cm4gRV9GQUlMOworCisgICAgbV9kZXN0aW5hdGlvbiA9IFN0cmluZyhw
YXRoLCBTeXNTdHJpbmdMZW4ocGF0aCkpOworICAgIG1fYnVuZGxlUGF0aCA9IG1fZGVzdGluYXRp
b24gKyBCdW5kbGVFeHRlbnNpb247CisKKyAgICBDRlVSTFJlZiBwYXRoVVJMID0gTWFyc2hhbGxp
bmdIZWxwZXJzOjpQYXRoU3RyaW5nVG9GaWxlQ0ZVUkxSZWYobV9idW5kbGVQYXRoKTsKKyAgICBD
RlVSTERvd25sb2FkU2V0RGVzdGluYXRpb24obV9kb3dubG9hZC5nZXQoKSwgcGF0aFVSTCwgISFh
bGxvd092ZXJ3cml0ZSk7CisgICAgQ0ZSZWxlYXNlKHBhdGhVUkwpOworCisgICAgTE9HKERvd25s
b2FkLCAiV2ViRG93bmxvYWQgLSBTZXQgZGVzdGluYXRpb24gdG8gJXMiLCBtX2J1bmRsZVBhdGgu
YXNjaWkoKS5kYXRhKCkpOworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKKy8vIElXZWJVUkxBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZVNlbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hSRVNVTFQgU1RETUVUSE9E
Q0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNhbmNlbEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKAorICAg
ICAgICAvKiBbaW5dICovIElXZWJVUkxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSopCit7CisgICAg
aWYgKG1fZG93bmxvYWQpIHsKKyAgICAgICAgQ0ZVUkxEb3dubG9hZENhbmNlbChtX2Rvd25sb2Fk
LmdldCgpKTsKKyAgICAgICAgbV9kb3dubG9hZCA9IDA7CisgICAgfQorCisgICAgLy8gRklYTUU6
IERvIHdlIG5lZWQgYSBVUkwgb3IgZGVzY3JpcHRpb24gZm9yIHRoaXMgZXJyb3IgY29kZT8KKyAg
ICBSZXNvdXJjZUVycm9yIGVycm9yKFN0cmluZyhXZWJVUkxFcnJvckRvbWFpbiksIFdlYlVSTEVy
cm9yVXNlckNhbmNlbGxlZEF1dGhlbnRpY2F0aW9uLCAiIiwgIiIpOworICAgIENPTVB0cjxXZWJF
cnJvcj4gd2ViRXJyb3IoQWRvcHRDT00sIFdlYkVycm9yOjpjcmVhdGVJbnN0YW5jZShlcnJvcikp
OworICAgIG1fZGVsZWdhdGUtPmRpZEZhaWxXaXRoRXJyb3IodGhpcywgd2ViRXJyb3IuZ2V0KCkp
OworCisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2Vi
RG93bmxvYWQ6OmNvbnRpbnVlV2l0aG91dENyZWRlbnRpYWxGb3JBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZSgKKyAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2Uq
IGNoYWxsZW5nZSkKK3sKKyAgICBDT01QdHI8V2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U+
IHdlYkNoYWxsZW5nZShRdWVyeSwgY2hhbGxlbmdlKTsKKyAgICBpZiAoIXdlYkNoYWxsZW5nZSkK
KyAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisKKyAgICBpZiAobV9kb3dubG9hZCkKKyAg
ICAgICAgQ0ZVUkxEb3dubG9hZFVzZUNyZWRlbnRpYWwobV9kb3dubG9hZC5nZXQoKSwgMCwgd2Vi
Q2hhbGxlbmdlLT5hdXRoZW50aWNhdGlvbkNoYWxsZW5nZSgpLmNmVVJMQXV0aENoYWxsZW5nZVJl
ZigpKTsKKyAgICByZXR1cm4gU19PSzsKK30KKworSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBX
ZWJEb3dubG9hZDo6dXNlQ3JlZGVudGlhbCgKKyAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMQ3Jl
ZGVudGlhbCogY3JlZGVudGlhbCwgCisgICAgICAgIC8qIFtpbl0gKi8gSVdlYlVSTEF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlKiBjaGFsbGVuZ2UpCit7CisgICAgQ09NUHRyPFdlYlVSTEF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlPiB3ZWJDaGFsbGVuZ2UoUXVlcnksIGNoYWxsZW5nZSk7CisgICAgaWYg
KCF3ZWJDaGFsbGVuZ2UpCisgICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOworCisgICAgQ09N
UHRyPFdlYlVSTENyZWRlbnRpYWw+IHdlYkNyZWRlbnRpYWwoUXVlcnksIGNyZWRlbnRpYWwpOwor
ICAgIGlmICghd2ViQ3JlZGVudGlhbCkKKyAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisK
KyAgICBSZXRhaW5QdHI8Q0ZVUkxDcmVkZW50aWFsUmVmPiBjZkNyZWRlbnRpYWwoQWRvcHRDRiwg
Y3JlYXRlQ0Yod2ViQ3JlZGVudGlhbC0+Y3JlZGVudGlhbCgpKSk7CisKKyAgICBpZiAobV9kb3du
bG9hZCkKKyAgICAgICAgQ0ZVUkxEb3dubG9hZFVzZUNyZWRlbnRpYWwobV9kb3dubG9hZC5nZXQo
KSwgY2ZDcmVkZW50aWFsLmdldCgpLCB3ZWJDaGFsbGVuZ2UtPmF1dGhlbnRpY2F0aW9uQ2hhbGxl
bmdlKCkuY2ZVUkxBdXRoQ2hhbGxlbmdlUmVmKCkpOworICAgIHJldHVybiBTX09LOworfQorCisv
LyBDRlVSTERvd25sb2FkIENhbGxiYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFdlYkRvd25sb2FkOjpk
aWRTdGFydCgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIG1fc3RhcnRUaW1lID0gbV9kYXRhVGlt
ZSA9IGN1cnJlbnRUaW1lKCk7CisgICAgbV9yZWNlaXZlZCA9IDA7CisgICAgTE9HKERvd25sb2Fk
LCAiRE9XTkxPQUQgLSBTdGFydGVkICVwIGF0ICUuM2Ygc2Vjb25kcyIsIHRoaXMsIG1fc3RhcnRU
aW1lKTsKKyNlbmRpZgorICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGlkQmVnaW4odGhpcykp
KQorICAgICAgICBMT0dfRVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPmRpZEJlZ2luIGZhaWxlZCIp
OworfQorCitDRlVSTFJlcXVlc3RSZWYgV2ViRG93bmxvYWQ6OndpbGxTZW5kUmVxdWVzdChDRlVS
TFJlcXVlc3RSZWYgcmVxdWVzdCwgQ0ZVUkxSZXNwb25zZVJlZiByZXNwb25zZSkKK3sKKyAgICBD
T01QdHI8V2ViTXV0YWJsZVVSTFJlcXVlc3Q+IHdlYlJlcXVlc3QoQWRvcHRDT00sIFdlYk11dGFi
bGVVUkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShSZXNvdXJjZVJlcXVlc3QocmVxdWVzdCkpKTsK
KyAgICBDT01QdHI8V2ViVVJMUmVzcG9uc2U+IHdlYlJlc3BvbnNlKEFkb3B0Q09NLCBXZWJVUkxS
ZXNwb25zZTo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VSZXNwb25zZShyZXNwb25zZSkpKTsKKyAg
ICBDT01QdHI8SVdlYk11dGFibGVVUkxSZXF1ZXN0PiBmaW5hbFJlcXVlc3Q7CisKKyAgICBpZiAo
RkFJTEVEKG1fZGVsZWdhdGUtPndpbGxTZW5kUmVxdWVzdCh0aGlzLCB3ZWJSZXF1ZXN0LmdldCgp
LCB3ZWJSZXNwb25zZS5nZXQoKSwgJmZpbmFsUmVxdWVzdCkpKQorICAgICAgICBMT0dfRVJST1Io
IkRvd25sb2FkRGVsZWdhdGUtPndpbGxTZW5kUmVxdWVzdCBmYWlsZWQiKTsKKyAgICAKKyAgICBp
ZiAoIWZpbmFsUmVxdWVzdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBDT01QdHI8V2ViTXV0
YWJsZVVSTFJlcXVlc3Q+IGZpbmFsV2ViUmVxdWVzdChBZG9wdENPTSwgV2ViTXV0YWJsZVVSTFJl
cXVlc3Q6OmNyZWF0ZUluc3RhbmNlKGZpbmFsUmVxdWVzdC5nZXQoKSkpOworICAgIG1fcmVxdWVz
dCA9IGZpbmFsV2ViUmVxdWVzdC5nZXQoKTsKKyAgICBDRlVSTFJlcXVlc3RSZWYgcmVzdWx0ID0g
ZmluYWxXZWJSZXF1ZXN0LT5yZXNvdXJjZVJlcXVlc3QoKS5jZlVSTFJlcXVlc3QoKTsKKyAgICBD
RlJldGFpbihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgV2ViRG93bmxv
YWQ6OmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShDRlVSTEF1dGhDaGFsbGVuZ2VS
ZWYgY2hhbGxlbmdlKQoreworICAgIENPTVB0cjxJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVu
Z2U+IHdlYkNoYWxsZW5nZShBZG9wdENPTSwKKyAgICAgICAgV2ViVVJMQXV0aGVudGljYXRpb25D
aGFsbGVuZ2U6OmNyZWF0ZUluc3RhbmNlKEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNoYWxsZW5n
ZSwgMCksIHRoaXMpKTsKKworICAgIGlmIChTVUNDRUVERUQobV9kZWxlZ2F0ZS0+ZGlkUmVjZWl2
ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKHRoaXMsIHdlYkNoYWxsZW5nZS5nZXQoKSkpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSh3ZWJDaGFs
bGVuZ2UuZ2V0KCkpOworfQorCit2b2lkIFdlYkRvd25sb2FkOjpkaWRSZWNlaXZlUmVzcG9uc2Uo
Q0ZVUkxSZXNwb25zZVJlZiByZXNwb25zZSkKK3sKKyAgICBDT01QdHI8V2ViVVJMUmVzcG9uc2U+
IHdlYlJlc3BvbnNlKEFkb3B0Q09NLCBXZWJVUkxSZXNwb25zZTo6Y3JlYXRlSW5zdGFuY2UoUmVz
b3VyY2VSZXNwb25zZShyZXNwb25zZSkpKTsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRp
ZFJlY2VpdmVSZXNwb25zZSh0aGlzLCB3ZWJSZXNwb25zZS5nZXQoKSkpKQorICAgICAgICBMT0df
RVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPmRpZFJlY2VpdmVSZXNwb25zZSBmYWlsZWQiKTsKK30K
Kwordm9pZCBXZWJEb3dubG9hZDo6d2lsbFJlc3VtZVdpdGhSZXNwb25zZShDRlVSTFJlc3BvbnNl
UmVmIHJlc3BvbnNlLCBVSW50NjQgZnJvbUJ5dGUpCit7CisgICAgQ09NUHRyPFdlYlVSTFJlc3Bv
bnNlPiB3ZWJSZXNwb25zZShBZG9wdENPTSwgV2ViVVJMUmVzcG9uc2U6OmNyZWF0ZUluc3RhbmNl
KFJlc291cmNlUmVzcG9uc2UocmVzcG9uc2UpKSk7CisgICAgaWYgKEZBSUxFRChtX2RlbGVnYXRl
LT53aWxsUmVzdW1lV2l0aFJlc3BvbnNlKHRoaXMsIHdlYlJlc3BvbnNlLmdldCgpLCBmcm9tQnl0
ZSkpKQorICAgICAgICBMT0dfRVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPndpbGxSZXN1bWVXaXRo
UmVzcG9uc2UgZmFpbGVkIik7Cit9CisKK3ZvaWQgV2ViRG93bmxvYWQ6OmRpZFJlY2VpdmVEYXRh
KENGSW5kZXggbGVuZ3RoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBtX3JlY2VpdmVkICs9IGxl
bmd0aDsKKyAgICBkb3VibGUgY3VycmVudCA9IGN1cnJlbnRUaW1lKCk7CisgICAgaWYgKGN1cnJl
bnQgLSBtX2RhdGFUaW1lID4gMi4wKQorICAgICAgICBMT0coRG93bmxvYWQsICJET1dOTE9BRCAt
ICVwIGhhbmdlZCBmb3IgJS4zZiBzZWNvbmRzIC0gUmVjZWl2ZWQgJWkgYnl0ZXMgZm9yIGEgdG90
YWwgb2YgJWkiLCB0aGlzLCBjdXJyZW50IC0gbV9kYXRhVGltZSwgbGVuZ3RoLCBtX3JlY2VpdmVk
KTsKKyAgICBtX2RhdGFUaW1lID0gY3VycmVudDsKKyNlbmRpZgorICAgIGlmIChGQUlMRUQobV9k
ZWxlZ2F0ZS0+ZGlkUmVjZWl2ZURhdGFPZkxlbmd0aCh0aGlzLCBsZW5ndGgpKSkKKyAgICAgICAg
TE9HX0VSUk9SKCJEb3dubG9hZERlbGVnYXRlLT5kaWRSZWNlaXZlRGF0YSBmYWlsZWQiKTsKK30K
KworYm9vbCBXZWJEb3dubG9hZDo6c2hvdWxkRGVjb2RlRGF0YU9mTUlNRVR5cGUoQ0ZTdHJpbmdS
ZWYgbWltZVR5cGUpCit7CisgICAgQk9PTCByZXN1bHQ7CisgICAgaWYgKEZBSUxFRChtX2RlbGVn
YXRlLT5zaG91bGREZWNvZGVTb3VyY2VEYXRhT2ZNSU1FVHlwZSh0aGlzLCBCU3RyaW5nKG1pbWVU
eXBlKSwgJnJlc3VsdCkpKSB7CisgICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0ZS0+
c2hvdWxkRGVjb2RlU291cmNlRGF0YU9mTUlNRVR5cGUgZmFpbGVkIik7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICEhcmVzdWx0OworfQorCit2b2lkIFdlYkRvd25s
b2FkOjpkZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lKENGU3RyaW5nUmVm
IG5hbWUpCit7ICAgIAorICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+ZGVjaWRlRGVzdGluYXRp
b25XaXRoU3VnZ2VzdGVkRmlsZW5hbWUodGhpcywgQlN0cmluZyhuYW1lKSkpKQorICAgICAgICBM
T0dfRVJST1IoIkRvd25sb2FkRGVsZWdhdGUtPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3Rl
ZE9iamVjdE5hbWUgZmFpbGVkIik7Cit9CisKK3ZvaWQgV2ViRG93bmxvYWQ6OmRpZENyZWF0ZURl
c3RpbmF0aW9uKENGVVJMUmVmIGRlc3RpbmF0aW9uKQoreworICAgIC8vIFRoZSBjb25jZXB0IG9m
IHRoZSAiLmRvd25sb2FkIGJ1bmRsZSIgaXMgaW50ZXJuYWwgdG8gdGhlIFdlYkRvd25sb2FkLCBz
byB0aGVyZWZvcmUKKyAgICAvLyB3ZSB0cnkgdG8gbWFzayB0aGUgZGVsZWdhdGUgZnJvbSBpdHMg
ZXhpc3RlbmNlIGFzIG11Y2ggYXMgcG9zc2libGUgYnkgdGVsbGluZyBpdCB0aGUgZmluYWwKKyAg
ICAvLyBkZXN0aW5hdGlvbiB3YXMgY3JlYXRlZCwgd2hlbiBpbiByZWFsaXR5IHRoZSBidW5kbGUg
d2FzIGNyZWF0ZWQKKworICAgIFN0cmluZyBjcmVhdGVkRGVzdGluYXRpb24gPSBNYXJzaGFsbGlu
Z0hlbHBlcnM6OkZpbGVDRlVSTFJlZlRvUGF0aFN0cmluZyhkZXN0aW5hdGlvbik7CisKKyAgICAv
LyBBdCB0aGlzIHBvaW50IGluIHJlY2VpdmluZyBDRlVSTERvd25sb2FkIGNhbGxiYWNrcywgd2Ug
c2hvdWxkIGRlZmluaXRlbHkgaGF2ZSB0aGUgYnVuZGxlIHBhdGggc3RvcmVkIGxvY2FsbHkKKyAg
ICAvLyBhbmQgaXQgc2hvdWxkIG1hdGNoIHdpdGggdGhlIGZpbGUgdGhhdCBDRlVSTERvd25sb2Fk
IGNyZWF0ZWQKKyAgICBBU1NFUlQoY3JlYXRlZERlc3RpbmF0aW9uID09IG1fYnVuZGxlUGF0aCk7
CisgICAgLy8gQW5kIHdlIHNob3VsZCBhbHNvIGFsd2F5cyBoYXZlIHRoZSBmaW5hbC1kZXN0aW5h
dGlvbiBzdG9yZWQKKyAgICBBU1NFUlQoIW1fZGVzdGluYXRpb24uaXNFbXB0eSgpKTsKKworICAg
IEJTdHJpbmcgcGF0aChtX2Rlc3RpbmF0aW9uKTsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUt
PmRpZENyZWF0ZURlc3RpbmF0aW9uKHRoaXMsIHBhdGgpKSkKKyAgICAgICAgTE9HX0VSUk9SKCJE
b3dubG9hZERlbGVnYXRlLT5kaWRDcmVhdGVEZXN0aW5hdGlvbiBmYWlsZWQiKTsKK30KKwordm9p
ZCBXZWJEb3dubG9hZDo6ZGlkRmluaXNoKCkKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgTE9HKERv
d25sb2FkLCAiRE9XTkxPQUQgLSBGaW5pc2hlZCAlcCBhZnRlciAlaSBieXRlcyBhbmQgJS4zZiBz
ZWNvbmRzIiwgdGhpcywgbV9yZWNlaXZlZCwgY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKTsK
KyNlbmRpZgorCisgICAgQVNTRVJUKCFtX2J1bmRsZVBhdGguaXNFbXB0eSgpICYmICFtX2Rlc3Rp
bmF0aW9uLmlzRW1wdHkoKSk7CisgICAgTE9HKERvd25sb2FkLCAiV2ViRG93bmxvYWQgLSBNb3Zp
bmcgZmlsZSBmcm9tIGJ1bmRsZSAlcyB0byBkZXN0aW5hdGlvbiAlcyIsIG1fYnVuZGxlUGF0aC5h
c2NpaSgpLmRhdGEoKSwgbV9kZXN0aW5hdGlvbi5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICAvLyBX
ZSB0cnkgdG8gcmVuYW1lIHRoZSBidW5kbGUgdG8gdGhlIGZpbmFsIGZpbGUgbmFtZS4gIElmIHRo
YXQgZmFpbHMsIHdlIGdpdmUgdGhlIGRlbGVnYXRlIG9uZSBtb3JlIGNoYW5jZSB0byBjaG9zZQor
ICAgIC8vIHRoZSBmaW5hbCBmaWxlIG5hbWUsIHRoZW4gd2UganVzdCBsZWF2ZSBpdAorICAgIGlm
ICghTW92ZUZpbGVFeChtX2J1bmRsZVBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24o
KSwgbV9kZXN0aW5hdGlvbi5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwKSkgewor
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBtb3ZlIGJ1bmRsZSAlcyB0byAlcyBvbiBjb21w
bGV0aW9uXG5FcnJvciAtICVpIiwgbV9idW5kbGVQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX2Rlc3Rp
bmF0aW9uLmFzY2lpKCkuZGF0YSgpLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIAorICAgICAg
ICBib29sIHJlcG9ydEJ1bmRsZVBhdGhBc0ZpbmFsUGF0aCA9IHRydWU7CisKKyAgICAgICAgQlN0
cmluZyBkZXN0aW5hdGlvbkJTVFIobV9kZXN0aW5hdGlvbi5jaGFyYWN0ZXJzKCksIG1fZGVzdGlu
YXRpb24ubGVuZ3RoKCkpOworICAgICAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRlY2lkZURl
c3RpbmF0aW9uV2l0aFN1Z2dlc3RlZEZpbGVuYW1lKHRoaXMsIGRlc3RpbmF0aW9uQlNUUikpKQor
ICAgICAgICAgICAgTE9HX0VSUk9SKCJkZWxlZ2F0ZS0+ZGVjaWRlRGVzdGluYXRpb25XaXRoU3Vn
Z2VzdGVkRmlsZW5hbWUoKSBmYWlsZWQiKTsKKworICAgICAgICAvLyBUaGUgY2FsbCB0byBtX2Rl
bGVnYXRlLT5kZWNpZGVEZXN0aW5hdGlvbldpdGhTdWdnZXN0ZWRGaWxlbmFtZSgpIHNob3VsZCBo
YXZlIGNoYW5nZWQgb3VyIGRlc3RpbmF0aW9uLCBzbyB3ZSdsbCB0cnkgdGhlIG1vdmUKKyAgICAg
ICAgLy8gb25lIGxhc3QgdGltZS4KKyAgICAgICAgaWYgKCFtX2Rlc3RpbmF0aW9uLmlzRW1wdHko
KSkKKyAgICAgICAgICAgIGlmIChNb3ZlRmlsZUV4KG1fYnVuZGxlUGF0aC5jaGFyYWN0ZXJzV2l0
aE51bGxUZXJtaW5hdGlvbigpLCBtX2Rlc3RpbmF0aW9uLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1p
bmF0aW9uKCksIDApKQorICAgICAgICAgICAgICAgIHJlcG9ydEJ1bmRsZVBhdGhBc0ZpbmFsUGF0
aCA9IGZhbHNlOworCisgICAgICAgIC8vIFdlIGVpdGhlciBuZWVkIHRvIHRlbGwgdGhlIGRlbGVn
YXRlIG91ciBmaW5hbCBmaWxlbmFtZSBpcyB0aGUgYnVuZGxlIGZpbGVuYW1lLCBvciBpcyB0aGUg
ZmlsZSBuYW1lIHRoZXkganVzdCB0b2xkIHVzIHRvIHVzZQorICAgICAgICBpZiAocmVwb3J0QnVu
ZGxlUGF0aEFzRmluYWxQYXRoKSB7CisgICAgICAgICAgICBCU3RyaW5nIGJ1bmRsZUJTVFIobV9i
dW5kbGVQYXRoKTsKKyAgICAgICAgICAgIG1fZGVsZWdhdGUtPmRpZENyZWF0ZURlc3RpbmF0aW9u
KHRoaXMsIGJ1bmRsZUJTVFIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQlN0cmlu
ZyBmaW5hbERlc3RpbmF0aW9uQlNUUiA9IEJTdHJpbmcobV9kZXN0aW5hdGlvbik7CisgICAgICAg
ICAgICBtX2RlbGVnYXRlLT5kaWRDcmVhdGVEZXN0aW5hdGlvbih0aGlzLCBmaW5hbERlc3RpbmF0
aW9uQlNUUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJdCdzIGV4dHJlbWVseSBsaWtl
bHkgdGhlIGNhbGwgdG8gZGVsZWdhdGUtPmRpZEZpbmlzaCgpIHdpbGwgZGVyZWYgdGhpcywgc28g
bGV0cyBub3QgbGV0IHRoYXQgY2F1c2Ugb3VyIGRlc3RydWN0aW9uIGp1c3QgeWV0CisgICAgQ09N
UHRyPFdlYkRvd25sb2FkPiBwcm90ZWN0ID0gdGhpczsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdh
dGUtPmRpZEZpbmlzaCh0aGlzKSkpCisgICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0
ZS0+ZGlkRmluaXNoIGZhaWxlZCIpOworCisgICAgbV9kb3dubG9hZCA9IDA7Cit9CisKK3ZvaWQg
V2ViRG93bmxvYWQ6OmRpZEZhaWwoQ0ZFcnJvclJlZiBlcnJvcikKK3sKKyAgICBDT01QdHI8V2Vi
RXJyb3I+IHdlYkVycm9yKEFkb3B0Q09NLCBXZWJFcnJvcjo6Y3JlYXRlSW5zdGFuY2UoUmVzb3Vy
Y2VFcnJvcihlcnJvcikpKTsKKyAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUtPmRpZEZhaWxXaXRo
RXJyb3IodGhpcywgd2ViRXJyb3IuZ2V0KCkpKSkKKyAgICAgICAgTE9HX0VSUk9SKCJEb3dubG9h
ZERlbGVnYXRlLT5kaWRGYWlsV2l0aEVycm9yIGZhaWxlZCIpOworfQorCisvLyBDRlVSTERvd25s
b2FkIENhbGxiYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIGRpZFN0YXJ0Q2FsbGJhY2soQ0ZVUkxEb3dubG9h
ZFJlZiwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9hZCopY2xpZW50SW5m
byktPmRpZFN0YXJ0KCk7IH0KKworQ0ZVUkxSZXF1ZXN0UmVmIHdpbGxTZW5kUmVxdWVzdENhbGxi
YWNrKENGVVJMRG93bmxvYWRSZWYsIENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBDRlVSTFJlc3Bv
bnNlUmVmIHJlZGlyZWN0aW9uUmVzcG9uc2UsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCit7IHJl
dHVybiAoKFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+d2lsbFNlbmRSZXF1ZXN0KHJlcXVlc3Qs
IHJlZGlyZWN0aW9uUmVzcG9uc2UpOyB9CisKK3ZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9u
Q2hhbGxlbmdlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZVUkxBdXRoQ2hhbGxlbmdlUmVm
IGNoYWxsZW5nZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9hZCopY2xp
ZW50SW5mbyktPmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjaGFsbGVuZ2UpOyB9
CisKK3ZvaWQgZGlkUmVjZWl2ZVJlc3BvbnNlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZV
UkxSZXNwb25zZVJlZiByZXNwb25zZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJE
b3dubG9hZCopY2xpZW50SW5mbyktPmRpZFJlY2VpdmVSZXNwb25zZShyZXNwb25zZSk7IH0KKwor
dm9pZCB3aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZV
UkxSZXNwb25zZVJlZiByZXNwb25zZSwgVUludDY0IHN0YXJ0aW5nQnl0ZSwgY29uc3Qgdm9pZCAq
Y2xpZW50SW5mbykKK3sgKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPndpbGxSZXN1bWVXaXRo
UmVzcG9uc2UocmVzcG9uc2UsIHN0YXJ0aW5nQnl0ZSk7IH0KKwordm9pZCBkaWRSZWNlaXZlRGF0
YUNhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYsIENGSW5kZXggbGVuZ3RoLCBjb25zdCB2b2lkICpj
bGllbnRJbmZvKQoreyAoKFdlYkRvd25sb2FkKiljbGllbnRJbmZvKS0+ZGlkUmVjZWl2ZURhdGEo
bGVuZ3RoKTsgfQorCitCb29sZWFuIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2so
Q0ZVUkxEb3dubG9hZFJlZiwgQ0ZTdHJpbmdSZWYgZW5jb2RpbmdUeXBlLCBjb25zdCB2b2lkICpj
bGllbnRJbmZvKQoreyByZXR1cm4gKChXZWJEb3dubG9hZCopY2xpZW50SW5mbyktPnNob3VsZERl
Y29kZURhdGFPZk1JTUVUeXBlKGVuY29kaW5nVHlwZSk7IH0KKwordm9pZCBkZWNpZGVEZXN0aW5h
dGlvbldpdGhTdWdnZXN0ZWRPYmplY3ROYW1lQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwgQ0ZT
dHJpbmdSZWYgb2JqZWN0TmFtZSwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbykKK3sgKChXZWJEb3du
bG9hZCopY2xpZW50SW5mbyktPmRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5h
bWUob2JqZWN0TmFtZSk7IH0KKwordm9pZCBkaWRDcmVhdGVEZXN0aW5hdGlvbkNhbGxiYWNrKENG
VVJMRG93bmxvYWRSZWYsIENGVVJMUmVmIHBhdGgsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pCit7
ICgoV2ViRG93bmxvYWQqKWNsaWVudEluZm8pLT5kaWRDcmVhdGVEZXN0aW5hdGlvbihwYXRoKTsg
fQorCit2b2lkIGRpZEZpbmlzaENhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYsIGNvbnN0IHZvaWQg
KmNsaWVudEluZm8pCit7ICgoV2ViRG93bmxvYWQqKWNsaWVudEluZm8pLT5kaWRGaW5pc2goKTsg
fQorCit2b2lkIGRpZEZhaWxDYWxsYmFjayhDRlVSTERvd25sb2FkUmVmLCBDRkVycm9yUmVmIGVy
cm9yLCBjb25zdCB2b2lkICpjbGllbnRJbmZvKQoreyAoKFdlYkRvd25sb2FkKiljbGllbnRJbmZv
KS0+ZGlkRmFpbChlcnJvcik7IH0KKworLy8gRG93bmxvYWQgQnVuZGxlIGZpbGUgdXRpbGl0aWVz
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KKworc3RhdGljIENGRGF0YVJlZiBleHRyYWN0UmVzdW1lRGF0YUZyb21CdW5kbGUo
Y29uc3QgU3RyaW5nJiBidW5kbGVQYXRoKQoreworICAgIGlmIChidW5kbGVQYXRoLmlzRW1wdHko
KSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBjcmVhdGUgcmVzdW1lIGRhdGEgZnJvbSBl
bXB0eSBkb3dubG9hZCBidW5kbGUgcGF0aCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cisg
ICAgCisgICAgLy8gT3BlbiBhIGhhbmRsZSB0byB0aGUgYnVuZGxlIGZpbGUKKyAgICBTdHJpbmcg
bnVsbGlmaWVkUGF0aCA9IGJ1bmRsZVBhdGg7CisgICAgRklMRSogYnVuZGxlID0gMDsKKyAgICBp
ZiAoX3dmb3Blbl9zKCZidW5kbGUsIG51bGxpZmllZFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSwgVEVYVCgicitiIikpIHx8ICFidW5kbGUpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gb3BlbiBmaWxlICVzIHRvIGdldCByZXN1bWUgZGF0YSIsIGJ1bmRsZVBhdGgu
YXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBDRkRhdGFS
ZWYgcmVzdWx0ID0gMDsKKyAgICBWZWN0b3I8VUludDg+IGZvb3RlckJ1ZmZlcjsKKyAgICAKKyAg
ICAvLyBTdGF0IHRoZSBmaWxlIHRvIGdldCBpdHMgc2l6ZQorICAgIHN0cnVjdCBfc3RhdDY0IGZp
bGVTdGF0OworICAgIGlmIChfZnN0YXQ2NChfZmlsZW5vKGJ1bmRsZSksICZmaWxlU3RhdCkpCisg
ICAgICAgIGdvdG8gZXhpdDsKKyAgICAKKyAgICAvLyBDaGVjayBmb3IgdGhlIGJ1bmRsZSBtYWdp
YyBudW1iZXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorICAgIGZwb3NfdCBmb290ZXJNYWdpY051
bWJlclBvc2l0aW9uID0gZmlsZVN0YXQuc3Rfc2l6ZSAtIDQ7CisgICAgQVNTRVJUKGZvb3Rlck1h
Z2ljTnVtYmVyUG9zaXRpb24gPj0gMCk7CisgICAgaWYgKGZvb3Rlck1hZ2ljTnVtYmVyUG9zaXRp
b24gPCAwKQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgaWYgKGZzZXRwb3MoYnVuZGxlLCAmZm9v
dGVyTWFnaWNOdW1iZXJQb3NpdGlvbikpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIFVJbnQz
MiBmb290ZXJNYWdpY051bWJlciA9IDA7CisgICAgaWYgKGZyZWFkKCZmb290ZXJNYWdpY051bWJl
ciwgNCwgMSwgYnVuZGxlKSAhPSAxKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJl
YWQgZm9vdGVyIG1hZ2ljIG51bWJlciBmcm9tIHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJu
byk7ICAKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChmb290ZXJNYWdpY051
bWJlciAhPSBCdW5kbGVNYWdpY051bWJlcikgeworICAgICAgICBMT0dfRVJST1IoIkZvb3Rlcidz
IG1hZ2ljIG51bWJlciBkb2VzIG5vdCBtYXRjaCAweCVYIC0gZXJybm8oJWkpIiwgQnVuZGxlTWFn
aWNOdW1iZXIsIGVycm5vKTsgIAorICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLy8g
Tm93IHdlJ3JlICpyZWFzb25hYmx5KiBzdXJlIHRoaXMgaXMgYSAuZG93bmxvYWQgYnVuZGxlIHdl
IGFjdHVhbGx5IHdyb3RlLiAKKyAgICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdW1lIGRh
dGEKKyAgICBmcG9zX3QgZm9vdGVyTGVuZ3RoUG9zaXRpb24gPSBmaWxlU3RhdC5zdF9zaXplIC0g
ODsKKyAgICBBU1NFUlQoZm9vdGVyTGVuZ3RoUG9zaXRpb24gPj0gMCk7CisgICAgaWYgKGZvb3Rl
ckxlbmd0aFBvc2l0aW9uIDwgMCkKKyAgICAgICAgZ290byBleGl0OworCisgICAgaWYgKGZzZXRw
b3MoYnVuZGxlLCAmZm9vdGVyTGVuZ3RoUG9zaXRpb24pKQorICAgICAgICBnb3RvIGV4aXQ7CisK
KyAgICBVSW50MzIgZm9vdGVyTGVuZ3RoID0gMDsKKyAgICBpZiAoZnJlYWQoJmZvb3Rlckxlbmd0
aCwgNCwgMSwgYnVuZGxlKSAhPSAxKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJl
YWQgUmVzdW1lRGF0YSBsZW5ndGggZnJvbSB0aGUgYnVuZGxlIC0gZXJybm8oJWkpIiwgZXJybm8p
OyAgCisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlcmVz
IGVub3VnaCBieXRlcyB0byByZWFkIGluIGZvciB0aGUgcmVzdW1lIGRhdGEsIGFuZCBwZXJmb3Jt
IHRoZSByZWFkCisgICAgZnBvc190IGZvb3RlclN0YXJ0UG9zaXRpb24gPSBmaWxlU3RhdC5zdF9z
aXplIC0gOCAtIGZvb3Rlckxlbmd0aDsKKyAgICBBU1NFUlQoZm9vdGVyU3RhcnRQb3NpdGlvbiA+
PSAwKTsKKyAgICBpZiAoZm9vdGVyU3RhcnRQb3NpdGlvbiA8IDApCisgICAgICAgIGdvdG8gZXhp
dDsKKyAgICBpZiAoZnNldHBvcyhidW5kbGUsICZmb290ZXJTdGFydFBvc2l0aW9uKSkKKyAgICAg
ICAgZ290byBleGl0OworCisgICAgZm9vdGVyQnVmZmVyLnJlc2l6ZShmb290ZXJMZW5ndGgpOwor
ICAgIGlmIChmcmVhZChmb290ZXJCdWZmZXIuZGF0YSgpLCAxLCBmb290ZXJMZW5ndGgsIGJ1bmRs
ZSkgIT0gZm9vdGVyTGVuZ3RoKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHJlYWQg
UmVzdW1lRGF0YSBmcm9tIHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJubyk7ICAKKyAgICAg
ICAgZ290byBleGl0OworICAgIH0KKworICAgIC8vIENGVVJMRG93bmxvYWQgd2lsbCBzZWVrIHRv
IHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUgZmlsZSAoYmVmb3JlIG91ciBmb290ZXIpIGFu
ZCBzdGFydCBvdmVyd3JpdGluZyBmcm9tIHRoZXJlCisgICAgLy8gSG93ZXZlciwgc2F5IHdlIHdl
cmUgd2l0aGluIGEgZmV3IGh1bmRyZWQgYnl0ZXMgb2YgdGhlIGVuZCBvZiBhIGRvd25sb2FkIHdo
ZW4gaXQgd2FzIHBhdXNlZCAtCisgICAgLy8gVGhlIGFkZGl0aW9uYWwgZm9vdGVyIGV4dGVuZGVk
IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgYmV5b25kIGl0cyBmaW5hbCBsZW5ndGgsIGFuZCB0aGVy
ZSB3aWxsIGJlIGp1bmsgZGF0YSBsZWZ0b3ZlcgorICAgIC8vIGF0IHRoZSBlbmQuICBUaGVyZWZv
cmUsIG5vdyB0aGF0IHdlJ3ZlIHJldHJpZXZlZCB0aGUgZm9vdGVyIGRhdGEsIHdlIG5lZWQgdG8g
dHJ1bmNhdGUgaXQuCisgICAgaWYgKGVycm5vX3QgcmVzaXplRXJyb3IgPSBfY2hzaXplX3MoX2Zp
bGVubyhidW5kbGUpLCBmb290ZXJTdGFydFBvc2l0aW9uKSkgeworICAgICAgICBMT0dfRVJST1Io
IkZhaWxlZCB0byB0cnVuY2F0ZSB0aGUgcmVzdW1lIGZvb3RlciBvZmYgdGhlIGVuZCBvZiB0aGUg
ZmlsZSAtIGVycm5vKCVpKSIsIHJlc2l6ZUVycm9yKTsKKyAgICAgICAgZ290byBleGl0OworICAg
IH0KKworICAgIC8vIEZpbmFsbHksIG1ha2UgdGhlIHJlc3VtZSBkYXRhLiAgTm93LCBpdCBpcyBw
b3NzaWJsZSBieSBzb21lIHR3aXN0IG9mIGZhdGUgdGhlIGJ1bmRsZSBtYWdpYyBudW1iZXIKKyAg
ICAvLyB3YXMgbmF0dXJhbGx5IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGl0cyBub3QgYWN0
dWFsbHkgYSB2YWxpZCBidW5kbGUuICBUaGF0LCBvciBzb21lb25lIGVuZ2luZWVyZWQKKyAgICAv
LyBpdCB0aGF0IHdheSB0byB0cnkgdG8gYXR0YWNrIHVzLiAgSW4gdGhhdCBjYXVzZSwgdGhpcyBD
RkRhdGEgd2lsbCBzdWNjZXNzZnVsbHkgY3JlYXRlIGJ1dCB3aGVuIHdlIAorICAgIC8vIGFjdHVh
bGx5IHRyeSB0byBzdGFydCB0aGUgQ0ZVUkxEb3dubG9hZCB1c2luZyB0aGlzIGJvZ3VzIGRhdGEs
IGl0IHdpbGwgZmFpbCBhbmQgd2Ugd2lsbCBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5CisgICAgcmVz
dWx0ID0gQ0ZEYXRhQ3JlYXRlKDAsIGZvb3RlckJ1ZmZlci5kYXRhKCksIGZvb3Rlckxlbmd0aCk7
CitleGl0OgorICAgIGZjbG9zZShidW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0
YXRpYyBIUkVTVUxUIGFwcGVuZFJlc3VtZURhdGFUb0J1bmRsZShDRkRhdGFSZWYgcmVzdW1lRGF0
YSwgY29uc3QgU3RyaW5nJiBidW5kbGVQYXRoKQoreworICAgIGlmICghcmVzdW1lRGF0YSkgewor
ICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgcmVzdW1lIGRhdGEgdG8gd3JpdGUgdG8gYnVuZGxl
IHBhdGgiKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CisgICAgaWYgKGJ1bmRsZVBh
dGguaXNFbXB0eSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IHdyaXRlIHJlc3VtZSBk
YXRhIHRvIGVtcHR5IGRvd25sb2FkIGJ1bmRsZSBwYXRoIik7CisgICAgICAgIHJldHVybiBFX0ZB
SUw7CisgICAgfQorCisgICAgU3RyaW5nIG51bGxpZmllZFBhdGggPSBidW5kbGVQYXRoOworICAg
IEZJTEUqIGJ1bmRsZSA9IDA7CisgICAgaWYgKF93Zm9wZW5fcygmYnVuZGxlLCBudWxsaWZpZWRQ
YXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIFRFWFQoImFiIikpIHx8ICFidW5k
bGUpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gb3BlbiBmaWxlICVzIHRvIGFwcGVu
ZCByZXN1bWUgZGF0YSIsIGJ1bmRsZVBhdGguYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1
cm4gRV9GQUlMOworICAgIH0KKworICAgIEhSRVNVTFQgaHIgPSBFX0ZBSUw7CisKKyAgICBjb25z
dCBVSW50OCogcmVzdW1lQnl0ZXMgPSBDRkRhdGFHZXRCeXRlUHRyKHJlc3VtZURhdGEpOworICAg
IEFTU0VSVChyZXN1bWVCeXRlcyk7CisgICAgaWYgKCFyZXN1bWVCeXRlcykKKyAgICAgICAgZ290
byBleGl0OworCisgICAgVUludDMyIHJlc3VtZUxlbmd0aCA9IENGRGF0YUdldExlbmd0aChyZXN1
bWVEYXRhKTsKKyAgICBBU1NFUlQocmVzdW1lTGVuZ3RoID4gMCk7CisgICAgaWYgKHJlc3VtZUxl
bmd0aCA8IDEpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGlmIChmd3JpdGUocmVzdW1lQnl0
ZXMsIDEsIHJlc3VtZUxlbmd0aCwgYnVuZGxlKSAhPSByZXN1bWVMZW5ndGgpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJGYWlsZWQgdG8gd3JpdGUgcmVzdW1lIGRhdGEgdG8gdGhlIGJ1bmRsZSAtIGVy
cm5vKCVpKSIsIGVycm5vKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChm
d3JpdGUoJnJlc3VtZUxlbmd0aCwgNCwgMSwgYnVuZGxlKSAhPSAxKSB7CisgICAgICAgIExPR19F
UlJPUigiRmFpbGVkIHRvIHdyaXRlIGZvb3RlciBsZW5ndGggdG8gdGhlIGJ1bmRsZSAtIGVycm5v
KCVpKSIsIGVycm5vKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChmd3Jp
dGUoJkJ1bmRsZU1hZ2ljTnVtYmVyLCA0LCAxLCBidW5kbGUpICE9IDEpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJGYWlsZWQgdG8gd3JpdGUgZm9vdGVyIG1hZ2ljIG51bWJlciB0byB0aGUgYnVuZGxl
IC0gZXJybm8oJWkpIiwgZXJybm8pOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIAor
ICAgIGhyID0gU19PSzsKK2V4aXQ6CisgICAgZmNsb3NlKGJ1bmRsZSk7CisgICAgcmV0dXJuIGhy
OworfQpJbmRleDogV2ViS2l0L3dpbi9XZWJEb3dubG9hZEN1cmwuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC93aW4vV2ViRG93bmxvYWRDdXJsLmNwcAkocmV2aXNpb24gMzE4MTQpCisrKyBXZWJL
aXQvd2luL1dlYkRvd25sb2FkQ3VybC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2LDYgKzU2LDcg
QEAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiAvLyBDRlVSTERvd25sb2FkIENhbGxiYWNr
cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisjaWYgVVNFKENGTkVUV09SSykKIHN0YXRpYyB2b2lkIGRpZFN0YXJ0Q2FsbGJh
Y2soQ0ZVUkxEb3dubG9hZFJlZiBkb3dubG9hZCwgY29uc3Qgdm9pZCAqY2xpZW50SW5mbyk7CiBz
dGF0aWMgQ0ZVUkxSZXF1ZXN0UmVmIHdpbGxTZW5kUmVxdWVzdENhbGxiYWNrKENGVVJMRG93bmxv
YWRSZWYgZG93bmxvYWQsIENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBDRlVSTFJlc3BvbnNlUmVm
IHJlZGlyZWN0aW9uUmVzcG9uc2UsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOwogc3RhdGljIHZv
aWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2soQ0ZVUkxEb3dubG9h
ZFJlZiBkb3dubG9hZCwgQ0ZVUkxBdXRoQ2hhbGxlbmdlUmVmIGNoYWxsZW5nZSwgY29uc3Qgdm9p
ZCAqY2xpZW50SW5mbyk7CkBAIC02NywxMiArNjgsMTMgQEAgc3RhdGljIHZvaWQgZGVjaWRlRGVz
dGluYXRpb25XaXRoU3VnZ2VzdAogc3RhdGljIHZvaWQgZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxs
YmFjayhDRlVSTERvd25sb2FkUmVmIGRvd25sb2FkLCBDRlVSTFJlZiBwYXRoLCBjb25zdCB2b2lk
ICpjbGllbnRJbmZvKTsKIHN0YXRpYyB2b2lkIGRpZEZpbmlzaENhbGxiYWNrKENGVVJMRG93bmxv
YWRSZWYgZG93bmxvYWQsIGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOwogc3RhdGljIHZvaWQgZGlk
RmFpbENhbGxiYWNrKENGVVJMRG93bmxvYWRSZWYgZG93bmxvYWQsIENGRXJyb3JSZWYgZXJyb3Is
IGNvbnN0IHZvaWQgKmNsaWVudEluZm8pOwotCisjZW5kaWYKIC8vIERvd25sb2FkIEJ1bmRsZSBm
aWxlIHV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgY29uc3QgU3RyaW5nIEJ1bmRsZUV4dGVuc2lv
bigiLmRvd25sb2FkIik7CiBzdGF0aWMgVUludDMyIEJ1bmRsZU1hZ2ljTnVtYmVyID0gMHhERUNB
RjRFQTsKLQorI2lmIFVTRShDRk5FVFdPUkspCiBzdGF0aWMgQ0ZEYXRhUmVmIGV4dHJhY3RSZXN1
bWVEYXRhRnJvbUJ1bmRsZShjb25zdCBTdHJpbmcmIGJ1bmRsZVBhdGgpOworI2VuZGlmCiBzdGF0
aWMgSFJFU1VMVCBhcHBlbmRSZXN1bWVEYXRhVG9CdW5kbGUoQ0ZEYXRhUmVmIHJlc3VtZURhdGEs
IGNvbnN0IFN0cmluZyYgYnVuZGxlUGF0aCk7CiAKIC8vIFdlYkRvd25sb2FkIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAg
LTg1LDUzICs4NywxMyBAQCBXZWJEb3dubG9hZDo6V2ViRG93bmxvYWQoKQogCiB2b2lkIFdlYkRv
d25sb2FkOjppbml0KFJlc291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IFJlc291cmNlUmVxdWVz
dCYgcmVxdWVzdCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIElXZWJEb3dubG9h
ZERlbGVnYXRlKiBkZWxlZ2F0ZSkKIHsKLSAgICBtX2RlbGVnYXRlID0gZGVsZWdhdGUgPyBkZWxl
Z2F0ZSA6IERlZmF1bHREb3dubG9hZERlbGVnYXRlOjpzaGFyZWRJbnN0YW5jZSgpOwotICAgIENG
VVJMQ29ubmVjdGlvblJlZiBjb25uZWN0aW9uID0gaGFuZGxlLT5jb25uZWN0aW9uKCk7Ci0gICAg
aWYgKCFjb25uZWN0aW9uKSB7Ci0gICAgICAgIExPR19FUlJPUigiV2ViRG93bmxvYWQ6OldlYkRv
d25sb2FkKFJlc291cmNlSGFuZGxlKiwuLi4pIGNhbGxlZCB3aXRoIGFuIGluYWN0aXZlIFJlc291
cmNlSGFuZGxlIik7ICAgIAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0ZVUkxEb3du
bG9hZENsaWVudCBjbGllbnQgPSB7MCwgdGhpcywgMCwgMCwgMCwgZGlkU3RhcnRDYWxsYmFjaywg
d2lsbFNlbmRSZXF1ZXN0Q2FsbGJhY2ssIGRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5n
ZUNhbGxiYWNrLCAKLSAgICAgICAgZGlkUmVjZWl2ZVJlc3BvbnNlQ2FsbGJhY2ssIHdpbGxSZXN1
bWVXaXRoUmVzcG9uc2VDYWxsYmFjaywgZGlkUmVjZWl2ZURhdGFDYWxsYmFjaywgc2hvdWxkRGVj
b2RlRGF0YU9mTUlNRVR5cGVDYWxsYmFjaywKLSAgICAgICAgZGVjaWRlRGVzdGluYXRpb25XaXRo
U3VnZ2VzdGVkT2JqZWN0TmFtZUNhbGxiYWNrLCBkaWRDcmVhdGVEZXN0aW5hdGlvbkNhbGxiYWNr
LCBkaWRGaW5pc2hDYWxsYmFjaywgZGlkRmFpbENhbGxiYWNrfTsKLQotICAgIG1fcmVxdWVzdC5h
ZG9wdFJlZihXZWJNdXRhYmxlVVJMUmVxdWVzdDo6Y3JlYXRlSW5zdGFuY2UocmVxdWVzdCkpOwot
ICAgIG1fZG93bmxvYWQuYWRvcHRDRihDRlVSTERvd25sb2FkQ3JlYXRlQW5kU3RhcnRXaXRoTG9h
ZGluZ0Nvbm5lY3Rpb24oMCwgY29ubmVjdGlvbiwgcmVxdWVzdC5jZlVSTFJlcXVlc3QoKSwgcmVz
cG9uc2UuY2ZVUkxSZXNwb25zZSgpLCAmY2xpZW50KSk7Ci0KLSAgICAvLyBJdCBpcyBwb3NzaWJs
ZSBmb3IgQ0ZVUkxEb3dubG9hZENyZWF0ZUFuZFN0YXJ0V2l0aExvYWRpbmdDb25uZWN0aW9uKCkg
dG8gZmFpbCBpZiB0aGUgcGFzc2VkIGluIENGVVJMQ29ubmVjdGlvbiBpcyBub3QgaW4gYSAiZG93
bmxvYWRhYmxlIHN0YXRlIgotICAgIC8vIEhvd2V2ZXIsIHdlIHNob3VsZCBuZXZlciBoaXQgdGhh
dCBjYXNlCi0gICAgaWYgKCFtX2Rvd25sb2FkKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICBMT0dfRVJST1IoIldlYkRvd25sb2FkIC0gRmFpbGVkIHRvIGNyZWF0ZSBX
ZWJEb3dubG9hZCBmcm9tIGV4aXN0aW5nIGNvbm5lY3Rpb24gKCVzKSIsIHJlcXVlc3QudXJsKCku
c3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIExPRyhEb3dubG9h
ZCwgIldlYkRvd25sb2FkIC0gQ3JlYXRlZCBXZWJEb3dubG9hZCAlcCBmcm9tIGV4aXN0aW5nIGNv
bm5lY3Rpb24gKCVzKSIsIHRoaXMsIHJlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEo
KSk7Ci0KLSAgICAvLyBUaGUgQ0ZVUkxEb3dubG9hZCBlaXRoZXIgc3RhcnRzIHN1Y2Nlc3NmdWxs
eSBhbmQgcmV0YWlucyB0aGUgQ0ZVUkxDb25uZWN0aW9uLCAKLSAgICAvLyBvciBpdCBmYWlscyB0
byBjcmVhdGluZyBhbmQgd2UgaGF2ZSBhIG5vdy11c2VsZXNzIGNvbm5lY3Rpb24gd2l0aCBhIGRh
bmdsaW5nIHJlZi4gCi0gICAgLy8gRWl0aGVyIHdheSwgd2UgbmVlZCB0byByZWxlYXNlIHRoZSBj
b25uZWN0aW9uIHRvIGJhbGFuY2Ugb3V0IHJlZiBjb3VudHMKLSAgICBoYW5kbGUtPnJlbGVhc2VD
b25uZWN0aW9uRm9yRG93bmxvYWQoKTsKLSAgICBDRlJlbGVhc2UoY29ubmVjdGlvbik7CisKKwlu
b3RJbXBsZW1lbnRlZCgpOwogfQogCiB2b2lkIFdlYkRvd25sb2FkOjppbml0KGNvbnN0IEtVUkwm
IHVybCwgSVdlYkRvd25sb2FkRGVsZWdhdGUqIGRlbGVnYXRlKQogewotICAgIG1fZGVsZWdhdGUg
PSBkZWxlZ2F0ZSA/IGRlbGVnYXRlIDogRGVmYXVsdERvd25sb2FkRGVsZWdhdGU6OnNoYXJlZElu
c3RhbmNlKCk7Ci0gICAgTE9HX0VSUk9SKCJEZWxlZ2F0ZSBpcyAlcCIsIG1fZGVsZWdhdGUuZ2V0
KCkpOwotCi0gICAgUmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3QodXJsKTsKLSAgICBDRlVSTFJlcXVl
c3RSZWYgY2ZSZXF1ZXN0ID0gcmVxdWVzdC5jZlVSTFJlcXVlc3QoKTsKLQotICAgIENGVVJMRG93
bmxvYWRDbGllbnQgY2xpZW50ID0gezAsIHRoaXMsIDAsIDAsIDAsIGRpZFN0YXJ0Q2FsbGJhY2ss
IHdpbGxTZW5kUmVxdWVzdENhbGxiYWNrLCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVu
Z2VDYWxsYmFjaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkUmVjZWl2
ZVJlc3BvbnNlQ2FsbGJhY2ssIHdpbGxSZXN1bWVXaXRoUmVzcG9uc2VDYWxsYmFjaywgZGlkUmVj
ZWl2ZURhdGFDYWxsYmFjaywgc2hvdWxkRGVjb2RlRGF0YU9mTUlNRVR5cGVDYWxsYmFjaywgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaWRlRGVzdGluYXRpb25XaXRoU3Vn
Z2VzdGVkT2JqZWN0TmFtZUNhbGxiYWNrLCBkaWRDcmVhdGVEZXN0aW5hdGlvbkNhbGxiYWNrLCBk
aWRGaW5pc2hDYWxsYmFjaywgZGlkRmFpbENhbGxiYWNrfTsKLSAgICBtX3JlcXVlc3QuYWRvcHRS
ZWYoV2ViTXV0YWJsZVVSTFJlcXVlc3Q6OmNyZWF0ZUluc3RhbmNlKHJlcXVlc3QpKTsKLSAgICBt
X2Rvd25sb2FkLmFkb3B0Q0YoQ0ZVUkxEb3dubG9hZENyZWF0ZSgwLCBjZlJlcXVlc3QsICZjbGll
bnQpKTsKLQotICAgIENGVVJMRG93bmxvYWRTY2hlZHVsZVdpdGhDdXJyZW50TWVzc2FnZVF1ZXVl
KG1fZG93bmxvYWQuZ2V0KCkpOwotICAgIENGVVJMRG93bmxvYWRTY2hlZHVsZURvd25sb2FkV2l0
aFJ1bkxvb3AobV9kb3dubG9hZC5nZXQoKSwgUmVzb3VyY2VIYW5kbGU6OmxvYWRlclJ1bkxvb3Ao
KSwga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKLQotICAgIExPRyhEb3dubG9hZCwgIldlYkRvd25s
b2FkIC0gSW5pdGlhbGl6ZWQgZG93bmxvYWQgb2YgdXJsICVzIGluIFdlYkRvd25sb2FkICVwIiwg
dXJsLnN0cmluZygpLnV0ZjgoKS5kYXRhKCksIHRoaXMpOworCW5vdEltcGxlbWVudGVkKCk7CiB9
CiAKIFdlYkRvd25sb2FkOjp+V2ViRG93bmxvYWQoKQpAQCAtMjA0LDgzICsxNjYsMTYgQEAgSFJF
U1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXZWJEb3dubG9hZDo6aQogICAgICAgICAvKiBbaW5dICov
IElXZWJVUkxSZXF1ZXN0KiByZXF1ZXN0LCAKICAgICAgICAgLyogW2luXSAqLyBJV2ViRG93bmxv
YWREZWxlZ2F0ZSogZGVsZWdhdGUpCiB7Ci0gICAgQ09NUHRyPFdlYk11dGFibGVVUkxSZXF1ZXN0
PiB3ZWJSZXF1ZXN0OwotICAgIGlmICghcmVxdWVzdCB8fCBGQUlMRUQocmVxdWVzdC0+UXVlcnlJ
bnRlcmZhY2UoJndlYlJlcXVlc3QpKSkgewotICAgICAgICBMT0coRG93bmxvYWQsICJXZWJEb3du
bG9hZCAtIGluaXRXaXRoUmVxdWVzdCBmYWlsZWQgLSBub3QgYSBXZWJNdXRhYmxlVVJMUmVxdWVz
dCIpOyAgICAKLSAgICAgICAgcmV0dXJuIEVfRkFJTDsKLSAgICB9Ci0KLSAgICBpZiAoIWRlbGVn
YXRlKQotICAgICAgICByZXR1cm4gRV9GQUlMOwotICAgIG1fZGVsZWdhdGUgPSBkZWxlZ2F0ZTsK
LSAgICBMT0coRG93bmxvYWQsICJEZWxlZ2F0ZSBpcyAlcCIsIG1fZGVsZWdhdGUuZ2V0KCkpOwot
Ci0gICAgUmV0YWluUHRyPENGVVJMUmVxdWVzdFJlZj4gY2ZSZXF1ZXN0ID0gd2ViUmVxdWVzdC0+
cmVzb3VyY2VSZXF1ZXN0KCkuY2ZVUkxSZXF1ZXN0KCk7Ci0KLSAgICBDRlVSTERvd25sb2FkQ2xp
ZW50IGNsaWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRTdGFydENhbGxiYWNrLCB3aWxsU2Vu
ZFJlcXVlc3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlQ2FsbGJh
Y2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlY2VpdmVSZXNwb25z
ZUNhbGxiYWNrLCB3aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2FsbGJhY2ssIGRpZFJlY2VpdmVEYXRh
Q2FsbGJhY2ssIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBlQ2FsbGJhY2ssIAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lkZURlc3RpbmF0aW9uV2l0aFN1Z2dlc3RlZE9i
amVjdE5hbWVDYWxsYmFjaywgZGlkQ3JlYXRlRGVzdGluYXRpb25DYWxsYmFjaywgZGlkRmluaXNo
Q2FsbGJhY2ssIGRpZEZhaWxDYWxsYmFja307Ci0gICAgbV9yZXF1ZXN0LmFkb3B0UmVmKFdlYk11
dGFibGVVUkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZSh3ZWJSZXF1ZXN0LmdldCgpKSk7Ci0gICAg
bV9kb3dubG9hZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGUoMCwgY2ZSZXF1ZXN0LmdldCgp
LCAmY2xpZW50KSk7Ci0KLSAgICAvLyBJZiBmb3Igc29tZSByZWFzb24gdGhlIGRvd25sb2FkIGZh
aWxlZCB0byBjcmVhdGUsIAotICAgIC8vIHdlIGhhdmUgcGFydGljdWxhciBjbGVhbnVwIHRvIGRv
Ci0gICAgaWYgKCFtX2Rvd25sb2FkKSB7Ci0gICAgICAgIG1fcmVxdWVzdCA9IDA7ICAgIAotICAg
ICAgICByZXR1cm4gRV9GQUlMOwotICAgIH0KLQotICAgIENGVVJMRG93bmxvYWRTY2hlZHVsZVdp
dGhDdXJyZW50TWVzc2FnZVF1ZXVlKG1fZG93bmxvYWQuZ2V0KCkpOwotICAgIENGVVJMRG93bmxv
YWRTY2hlZHVsZURvd25sb2FkV2l0aFJ1bkxvb3AobV9kb3dubG9hZC5nZXQoKSwgUmVzb3VyY2VI
YW5kbGU6OmxvYWRlclJ1bkxvb3AoKSwga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKLQotICAgIExP
RyhEb3dubG9hZCwgIldlYkRvd25sb2FkIC0gaW5pdFdpdGhSZXF1ZXN0IGNvbXBsZXRlLCBzdGFy
dGVkIGRvd25sb2FkIG9mIHVybCAlcyIsIHdlYlJlcXVlc3QtPnJlc291cmNlUmVxdWVzdCgpLnVy
bCgpLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOwotICAgIHJldHVybiBTX09LOworICAgIG5vdElt
cGxlbWVudGVkKCk7CisJcmV0dXJuIEVfTk9USU1QTDsKIH0KIAogSFJFU1VMVCBTVERNRVRIT0RD
QUxMVFlQRSBXZWJEb3dubG9hZDo6aW5pdFRvUmVzdW1lV2l0aEJ1bmRsZSgKICAgICAgICAgLyog
W2luXSAqLyBCU1RSIGJ1bmRsZVBhdGgsIAogICAgICAgICAvKiBbaW5dICovIElXZWJEb3dubG9h
ZERlbGVnYXRlKiBkZWxlZ2F0ZSkKIHsKLSAgICBMT0coRG93bmxvYWQsICJBdHRlbXB0aW5nIHJl
c3VtZSBvZiBkb3dubG9hZCBidW5kbGUgJXMiLCBTdHJpbmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5n
TGVuKGJ1bmRsZVBhdGgpKS5hc2NpaSgpLmRhdGEoKSk7Ci0KLSAgICBSZXRhaW5QdHI8Q0ZEYXRh
UmVmPiByZXN1bWVEYXRhKEFkb3B0Q0YsIGV4dHJhY3RSZXN1bWVEYXRhRnJvbUJ1bmRsZShTdHJp
bmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgpKSkpOwotICAgIAotICAgIGlm
ICghcmVzdW1lRGF0YSkKLSAgICAgICAgcmV0dXJuIEVfRkFJTDsKLQotICAgIGlmICghZGVsZWdh
dGUpCi0gICAgICAgIHJldHVybiBFX0ZBSUw7Ci0gICAgbV9kZWxlZ2F0ZSA9IGRlbGVnYXRlOwot
ICAgIExPRyhEb3dubG9hZCwgIkRlbGVnYXRlIGlzICVwIiwgbV9kZWxlZ2F0ZS5nZXQoKSk7Ci0K
LSAgICBDRlVSTERvd25sb2FkQ2xpZW50IGNsaWVudCA9IHswLCB0aGlzLCAwLCAwLCAwLCBkaWRT
dGFydENhbGxiYWNrLCB3aWxsU2VuZFJlcXVlc3RDYWxsYmFjaywgZGlkUmVjZWl2ZUF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlQ2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRpZFJlY2VpdmVSZXNwb25zZUNhbGxiYWNrLCB3aWxsUmVzdW1lV2l0aFJlc3BvbnNlQ2Fs
bGJhY2ssIGRpZFJlY2VpdmVEYXRhQ2FsbGJhY2ssIHNob3VsZERlY29kZURhdGFPZk1JTUVUeXBl
Q2FsbGJhY2ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lkZURlc3Rp
bmF0aW9uV2l0aFN1Z2dlc3RlZE9iamVjdE5hbWVDYWxsYmFjaywgZGlkQ3JlYXRlRGVzdGluYXRp
b25DYWxsYmFjaywgZGlkRmluaXNoQ2FsbGJhY2ssIGRpZEZhaWxDYWxsYmFja307Ci0gICAgCi0g
ICAgUmV0YWluUHRyPENGVVJMUmVmPiBwYXRoVVJMKEFkb3B0Q0YsIE1hcnNoYWxsaW5nSGVscGVy
czo6UGF0aFN0cmluZ1RvRmlsZUNGVVJMUmVmKFN0cmluZyhidW5kbGVQYXRoLCBTeXNTdHJpbmdM
ZW4oYnVuZGxlUGF0aCkpKSk7Ci0gICAgQVNTRVJUKHBhdGhVUkwpOwotCi0gICAgbV9kb3dubG9h
ZC5hZG9wdENGKENGVVJMRG93bmxvYWRDcmVhdGVXaXRoUmVzdW1lRGF0YSgwLCByZXN1bWVEYXRh
LmdldCgpLCBwYXRoVVJMLmdldCgpLCAmY2xpZW50KSk7Ci0KLSAgICBpZiAoIW1fZG93bmxvYWQp
IHsKLSAgICAgICAgTE9HKERvd25sb2FkLCAiRmFpbGVkIHRvIGNyZWF0ZSBDRlVSTERvd25sb2Fk
UmVmIGZvciByZXN1bWUiKTsgICAgCi0gICAgICAgIHJldHVybiBFX0ZBSUw7Ci0gICAgfQotICAg
IAotICAgIG1fYnVuZGxlUGF0aCA9IFN0cmluZyhidW5kbGVQYXRoLCBTeXNTdHJpbmdMZW4oYnVu
ZGxlUGF0aCkpOwotICAgIC8vIEF0dGVtcHQgdG8gcmVtb3ZlIHRoZSAiLmRvd25sb2FkIiBleHRl
bnNpb24gZnJvbSB0aGUgYnVuZGxlIGZvciB0aGUgZmluYWwgZmlsZSBkZXN0aW5hdGlvbgotICAg
IC8vIEZhaWxpbmcgdGhhdCwgd2UgY2xlYXIgbV9kZXN0aW5hdGlvbiBhbmQgd2lsbCBhc2sgdGhl
IGRlbGVnYXRlIGxhdGVyIG9uY2UgdGhlIGRvd25sb2FkIHN0YXJ0cwotICAgIGlmIChtX2J1bmRs
ZVBhdGguZW5kc1dpdGgoQnVuZGxlRXh0ZW5zaW9uLCBmYWxzZSkpIHsKLSAgICAgICAgbV9kZXN0
aW5hdGlvbiA9IG1fYnVuZGxlUGF0aC5jb3B5KCk7Ci0gICAgICAgIG1fZGVzdGluYXRpb24udHJ1
bmNhdGUobV9kZXN0aW5hdGlvbi5sZW5ndGgoKSAtIEJ1bmRsZUV4dGVuc2lvbi5sZW5ndGgoKSk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fZGVzdGluYXRpb24gPSBTdHJpbmcoKTsKLSAgICAKLSAg
ICBDRlVSTERvd25sb2FkU2NoZWR1bGVXaXRoQ3VycmVudE1lc3NhZ2VRdWV1ZShtX2Rvd25sb2Fk
LmdldCgpKTsKLSAgICBDRlVSTERvd25sb2FkU2NoZWR1bGVEb3dubG9hZFdpdGhSdW5Mb29wKG1f
ZG93bmxvYWQuZ2V0KCksIFJlc291cmNlSGFuZGxlOjpsb2FkZXJSdW5Mb29wKCksIGtDRlJ1bkxv
b3BEZWZhdWx0TW9kZSk7Ci0KLSAgICBMT0coRG93bmxvYWQsICJXZWJEb3dubG9hZCAtIGluaXRX
aXRoUmVxdWVzdCBjb21wbGV0ZSwgcmVzdW1lZCBkb3dubG9hZCBvZiBidW5kbGUgJXMiLCBTdHJp
bmcoYnVuZGxlUGF0aCwgU3lzU3RyaW5nTGVuKGJ1bmRsZVBhdGgpKS5hc2NpaSgpLmRhdGEoKSk7
Ci0gICAgcmV0dXJuIFNfT0s7CisJbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRV9OT1RJ
TVBMOwogfQogCiBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYkRvd25sb2FkOjpjYW5SZXN1
bWVEb3dubG9hZERlY29kZWRXaXRoRW5jb2RpbmdNSU1FVHlwZSgKQEAgLTQzNiwzMiArMzMxLDE2
IEBAIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmMKIEhSRVNVTFQgU1RE
TUVUSE9EQ0FMTFRZUEUgV2ViRG93bmxvYWQ6OmNvbnRpbnVlV2l0aG91dENyZWRlbnRpYWxGb3JB
dXRoZW50aWNhdGlvbkNoYWxsZW5nZSgKICAgICAgICAgLyogW2luXSAqLyBJV2ViVVJMQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2UqIGNoYWxsZW5nZSkKIHsKLSAgICBDT01QdHI8V2ViVVJMQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2U+IHdlYkNoYWxsZW5nZShRdWVyeSwgY2hhbGxlbmdlKTsKLSAgICBp
ZiAoIXdlYkNoYWxsZW5nZSkKLSAgICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci0KLSAgICBp
ZiAobV9kb3dubG9hZCkKLSAgICAgICAgQ0ZVUkxEb3dubG9hZFVzZUNyZWRlbnRpYWwobV9kb3du
bG9hZC5nZXQoKSwgMCwgd2ViQ2hhbGxlbmdlLT5hdXRoZW50aWNhdGlvbkNoYWxsZW5nZSgpLmNm
VVJMQXV0aENoYWxsZW5nZVJlZigpKTsKLSAgICByZXR1cm4gU19PSzsKKwlub3RJbXBsZW1lbnRl
ZCgpOworICAgIHJldHVybiBFX05PVElNUEw7CiB9CiAKIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZ
UEUgV2ViRG93bmxvYWQ6OnVzZUNyZWRlbnRpYWwoCiAgICAgICAgIC8qIFtpbl0gKi8gSVdlYlVS
TENyZWRlbnRpYWwqIGNyZWRlbnRpYWwsIAogICAgICAgICAvKiBbaW5dICovIElXZWJVUkxBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZSogY2hhbGxlbmdlKQogewotICAgIENPTVB0cjxXZWJVUkxBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZT4gd2ViQ2hhbGxlbmdlKFF1ZXJ5LCBjaGFsbGVuZ2UpOwotICAg
IGlmICghd2ViQ2hhbGxlbmdlKQotICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLQotICAg
IENPTVB0cjxXZWJVUkxDcmVkZW50aWFsPiB3ZWJDcmVkZW50aWFsKFF1ZXJ5LCBjcmVkZW50aWFs
KTsKLSAgICBpZiAoIXdlYkNyZWRlbnRpYWwpCi0gICAgICAgIHJldHVybiBFX05PSU5URVJGQUNF
OwotCi0gICAgUmV0YWluUHRyPENGVVJMQ3JlZGVudGlhbFJlZj4gY2ZDcmVkZW50aWFsKEFkb3B0
Q0YsIGNyZWF0ZUNGKHdlYkNyZWRlbnRpYWwtPmNyZWRlbnRpYWwoKSkpOwotCi0gICAgaWYgKG1f
ZG93bmxvYWQpCi0gICAgICAgIENGVVJMRG93bmxvYWRVc2VDcmVkZW50aWFsKG1fZG93bmxvYWQu
Z2V0KCksIGNmQ3JlZGVudGlhbC5nZXQoKSwgd2ViQ2hhbGxlbmdlLT5hdXRoZW50aWNhdGlvbkNo
YWxsZW5nZSgpLmNmVVJMQXV0aENoYWxsZW5nZVJlZigpKTsKLSAgICByZXR1cm4gU19PSzsKKwlu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBFX05PVElNUEw7CiB9CiAKIC8vIENGVVJMRG93
bmxvYWQgQ2FsbGJhY2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ3OCw0NiArMzU3LDIzIEBAIHZvaWQgV2Vi
RG93bmxvYWQ6OmRpZFN0YXJ0KCkKIAogQ0ZVUkxSZXF1ZXN0UmVmIFdlYkRvd25sb2FkOjp3aWxs
U2VuZFJlcXVlc3QoQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QsIENGVVJMUmVzcG9uc2VSZWYgcmVz
cG9uc2UpCiB7Ci0gICAgQ09NUHRyPFdlYk11dGFibGVVUkxSZXF1ZXN0PiB3ZWJSZXF1ZXN0KEFk
b3B0Q09NLCBXZWJNdXRhYmxlVVJMUmVxdWVzdDo6Y3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VSZXF1
ZXN0KHJlcXVlc3QpKSk7Ci0gICAgQ09NUHRyPFdlYlVSTFJlc3BvbnNlPiB3ZWJSZXNwb25zZShB
ZG9wdENPTSwgV2ViVVJMUmVzcG9uc2U6OmNyZWF0ZUluc3RhbmNlKFJlc291cmNlUmVzcG9uc2Uo
cmVzcG9uc2UpKSk7Ci0gICAgQ09NUHRyPElXZWJNdXRhYmxlVVJMUmVxdWVzdD4gZmluYWxSZXF1
ZXN0OwotCi0gICAgaWYgKEZBSUxFRChtX2RlbGVnYXRlLT53aWxsU2VuZFJlcXVlc3QodGhpcywg
d2ViUmVxdWVzdC5nZXQoKSwgd2ViUmVzcG9uc2UuZ2V0KCksICZmaW5hbFJlcXVlc3QpKSkKLSAg
ICAgICAgTE9HX0VSUk9SKCJEb3dubG9hZERlbGVnYXRlLT53aWxsU2VuZFJlcXVlc3QgZmFpbGVk
Iik7Ci0gICAgCi0gICAgaWYgKCFmaW5hbFJlcXVlc3QpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgQ09NUHRyPFdlYk11dGFibGVVUkxSZXF1ZXN0PiBmaW5hbFdlYlJlcXVlc3QoQWRvcHRDT00s
IFdlYk11dGFibGVVUkxSZXF1ZXN0OjpjcmVhdGVJbnN0YW5jZShmaW5hbFJlcXVlc3QuZ2V0KCkp
KTsKLSAgICBtX3JlcXVlc3QgPSBmaW5hbFdlYlJlcXVlc3QuZ2V0KCk7Ci0gICAgQ0ZVUkxSZXF1
ZXN0UmVmIHJlc3VsdCA9IGZpbmFsV2ViUmVxdWVzdC0+cmVzb3VyY2VSZXF1ZXN0KCkuY2ZVUkxS
ZXF1ZXN0KCk7Ci0gICAgQ0ZSZXRhaW4ocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OworCW5v
dEltcGxlbWVudGVkKCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgV2ViRG93bmxvYWQ6OmRpZFJl
Y2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShDRlVSTEF1dGhDaGFsbGVuZ2VSZWYgY2hhbGxl
bmdlKQogewotICAgIENPTVB0cjxJV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U+IHdlYkNo
YWxsZW5nZShBZG9wdENPTSwKLSAgICAgICAgV2ViVVJMQXV0aGVudGljYXRpb25DaGFsbGVuZ2U6
OmNyZWF0ZUluc3RhbmNlKEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNoYWxsZW5nZSwgMCksIHRo
aXMpKTsKLQotICAgIGlmIChTVUNDRUVERUQobV9kZWxlZ2F0ZS0+ZGlkUmVjZWl2ZUF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlKHRoaXMsIHdlYkNoYWxsZW5nZS5nZXQoKSkpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBjYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSh3ZWJDaGFsbGVuZ2UuZ2V0
KCkpOworCW5vdEltcGxlbWVudGVkKCk7CiB9CiAKIHZvaWQgV2ViRG93bmxvYWQ6OmRpZFJlY2Vp
dmVSZXNwb25zZShDRlVSTFJlc3BvbnNlUmVmIHJlc3BvbnNlKQogewotICAgIENPTVB0cjxXZWJV
UkxSZXNwb25zZT4gd2ViUmVzcG9uc2UoQWRvcHRDT00sIFdlYlVSTFJlc3BvbnNlOjpjcmVhdGVJ
bnN0YW5jZShSZXNvdXJjZVJlc3BvbnNlKHJlc3BvbnNlKSkpOwotICAgIGlmIChGQUlMRUQobV9k
ZWxlZ2F0ZS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKHRoaXMsIHdlYlJlc3BvbnNlLmdldCgpKSkpCi0g
ICAgICAgIExPR19FUlJPUigiRG93bmxvYWREZWxlZ2F0ZS0+ZGlkUmVjZWl2ZVJlc3BvbnNlIGZh
aWxlZCIpOworCW5vdEltcGxlbWVudGVkKCk7CiB9CiAKIHZvaWQgV2ViRG93bmxvYWQ6OndpbGxS
ZXN1bWVXaXRoUmVzcG9uc2UoQ0ZVUkxSZXNwb25zZVJlZiByZXNwb25zZSwgVUludDY0IGZyb21C
eXRlKQogewotICAgIENPTVB0cjxXZWJVUkxSZXNwb25zZT4gd2ViUmVzcG9uc2UoQWRvcHRDT00s
IFdlYlVSTFJlc3BvbnNlOjpjcmVhdGVJbnN0YW5jZShSZXNvdXJjZVJlc3BvbnNlKHJlc3BvbnNl
KSkpOwotICAgIGlmIChGQUlMRUQobV9kZWxlZ2F0ZS0+d2lsbFJlc3VtZVdpdGhSZXNwb25zZSh0
aGlzLCB3ZWJSZXNwb25zZS5nZXQoKSwgZnJvbUJ5dGUpKSkKLSAgICAgICAgTE9HX0VSUk9SKCJE
b3dubG9hZERlbGVnYXRlLT53aWxsUmVzdW1lV2l0aFJlc3BvbnNlIGZhaWxlZCIpOworCW5vdElt
cGxlbWVudGVkKCk7CiB9CiAKIHZvaWQgV2ViRG93bmxvYWQ6OmRpZFJlY2VpdmVEYXRhKENGSW5k
ZXggbGVuZ3RoKQpAQCAtNjE0LDkgKzQ3MCw3IEBAIHZvaWQgV2ViRG93bmxvYWQ6OmRpZEZpbmlz
aCgpCiAKIHZvaWQgV2ViRG93bmxvYWQ6OmRpZEZhaWwoQ0ZFcnJvclJlZiBlcnJvcikKIHsKLSAg
ICBDT01QdHI8V2ViRXJyb3I+IHdlYkVycm9yKEFkb3B0Q09NLCBXZWJFcnJvcjo6Y3JlYXRlSW5z
dGFuY2UoUmVzb3VyY2VFcnJvcihlcnJvcikpKTsKLSAgICBpZiAoRkFJTEVEKG1fZGVsZWdhdGUt
PmRpZEZhaWxXaXRoRXJyb3IodGhpcywgd2ViRXJyb3IuZ2V0KCkpKSkKLSAgICAgICAgTE9HX0VS
Uk9SKCJEb3dubG9hZERlbGVnYXRlLT5kaWRGYWlsV2l0aEVycm9yIGZhaWxlZCIpOworCW5vdElt
cGxlbWVudGVkKCk7CiB9CiAKIC8vIENGVVJMRG93bmxvYWQgQ2FsbGJhY2tzIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAg
LTY1NSw5NyArNTA5LDYgQEAgdm9pZCBkaWRGYWlsQ2FsbGJhY2soQ0ZVUkxEb3dubG9hZFJlZiwg
QwogCiAvLyBEb3dubG9hZCBCdW5kbGUgZmlsZSB1dGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMg
Q0ZEYXRhUmVmIGV4dHJhY3RSZXN1bWVEYXRhRnJvbUJ1bmRsZShjb25zdCBTdHJpbmcmIGJ1bmRs
ZVBhdGgpCi17Ci0gICAgaWYgKGJ1bmRsZVBhdGguaXNFbXB0eSgpKSB7Ci0gICAgICAgIExPR19F
UlJPUigiQ2Fubm90IGNyZWF0ZSByZXN1bWUgZGF0YSBmcm9tIGVtcHR5IGRvd25sb2FkIGJ1bmRs
ZSBwYXRoIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvLyBPcGVuIGEg
aGFuZGxlIHRvIHRoZSBidW5kbGUgZmlsZQotICAgIFN0cmluZyBudWxsaWZpZWRQYXRoID0gYnVu
ZGxlUGF0aDsKLSAgICBGSUxFKiBidW5kbGUgPSAwOwotICAgIGlmIChfd2ZvcGVuX3MoJmJ1bmRs
ZSwgbnVsbGlmaWVkUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBURVhUKCJy
K2IiKSkgfHwgIWJ1bmRsZSkgewotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBvcGVuIGZp
bGUgJXMgdG8gZ2V0IHJlc3VtZSBkYXRhIiwgYnVuZGxlUGF0aC5hc2NpaSgpLmRhdGEoKSk7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIENGRGF0YVJlZiByZXN1bHQgPSAwOwotICAg
IFZlY3RvcjxVSW50OD4gZm9vdGVyQnVmZmVyOwotICAgIAotICAgIC8vIFN0YXQgdGhlIGZpbGUg
dG8gZ2V0IGl0cyBzaXplCi0gICAgc3RydWN0IF9zdGF0NjQgZmlsZVN0YXQ7Ci0gICAgaWYgKF9m
c3RhdDY0KF9maWxlbm8oYnVuZGxlKSwgJmZpbGVTdGF0KSkKLSAgICAgICAgZ290byBleGl0Owot
ICAgIAotICAgIC8vIENoZWNrIGZvciB0aGUgYnVuZGxlIG1hZ2ljIG51bWJlciBhdCB0aGUgZW5k
IG9mIHRoZSBmaWxlCi0gICAgZnBvc190IGZvb3Rlck1hZ2ljTnVtYmVyUG9zaXRpb24gPSBmaWxl
U3RhdC5zdF9zaXplIC0gNDsKLSAgICBBU1NFUlQoZm9vdGVyTWFnaWNOdW1iZXJQb3NpdGlvbiA+
PSAwKTsKLSAgICBpZiAoZm9vdGVyTWFnaWNOdW1iZXJQb3NpdGlvbiA8IDApCi0gICAgICAgIGdv
dG8gZXhpdDsKLSAgICBpZiAoZnNldHBvcyhidW5kbGUsICZmb290ZXJNYWdpY051bWJlclBvc2l0
aW9uKSkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgVUludDMyIGZvb3Rlck1hZ2ljTnVtYmVy
ID0gMDsKLSAgICBpZiAoZnJlYWQoJmZvb3Rlck1hZ2ljTnVtYmVyLCA0LCAxLCBidW5kbGUpICE9
IDEpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBmb290ZXIgbWFnaWMgbnVt
YmVyIGZyb20gdGhlIGJ1bmRsZSAtIGVycm5vKCVpKSIsIGVycm5vKTsgIAotICAgICAgICBnb3Rv
IGV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKGZvb3Rlck1hZ2ljTnVtYmVyICE9IEJ1bmRsZU1hZ2lj
TnVtYmVyKSB7Ci0gICAgICAgIExPR19FUlJPUigiRm9vdGVyJ3MgbWFnaWMgbnVtYmVyIGRvZXMg
bm90IG1hdGNoIDB4JVggLSBlcnJubyglaSkiLCBCdW5kbGVNYWdpY051bWJlciwgZXJybm8pOyAg
Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0KLSAgICAvLyBOb3cgd2UncmUgKnJlYXNvbmFi
bHkqIHN1cmUgdGhpcyBpcyBhIC5kb3dubG9hZCBidW5kbGUgd2UgYWN0dWFsbHkgd3JvdGUuIAot
ICAgIC8vIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bWUgZGF0YQotICAgIGZwb3NfdCBmb290
ZXJMZW5ndGhQb3NpdGlvbiA9IGZpbGVTdGF0LnN0X3NpemUgLSA4OwotICAgIEFTU0VSVChmb290
ZXJMZW5ndGhQb3NpdGlvbiA+PSAwKTsKLSAgICBpZiAoZm9vdGVyTGVuZ3RoUG9zaXRpb24gPCAw
KQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBpZiAoZnNldHBvcyhidW5kbGUsICZmb290ZXJM
ZW5ndGhQb3NpdGlvbikpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIFVJbnQzMiBmb290ZXJM
ZW5ndGggPSAwOwotICAgIGlmIChmcmVhZCgmZm9vdGVyTGVuZ3RoLCA0LCAxLCBidW5kbGUpICE9
IDEpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBSZXN1bWVEYXRhIGxlbmd0
aCBmcm9tIHRoZSBidW5kbGUgLSBlcnJubyglaSkiLCBlcnJubyk7ICAKLSAgICAgICAgZ290byBl
eGl0OwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0aGVyZXMgZW5vdWdoIGJ5dGVzIHRvIHJl
YWQgaW4gZm9yIHRoZSByZXN1bWUgZGF0YSwgYW5kIHBlcmZvcm0gdGhlIHJlYWQKLSAgICBmcG9z
X3QgZm9vdGVyU3RhcnRQb3NpdGlvbiA9IGZpbGVTdGF0LnN0X3NpemUgLSA4IC0gZm9vdGVyTGVu
Z3RoOwotICAgIEFTU0VSVChmb290ZXJTdGFydFBvc2l0aW9uID49IDApOwotICAgIGlmIChmb290
ZXJTdGFydFBvc2l0aW9uIDwgMCkKLSAgICAgICAgZ290byBleGl0OwotICAgIGlmIChmc2V0cG9z
KGJ1bmRsZSwgJmZvb3RlclN0YXJ0UG9zaXRpb24pKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAg
ICBmb290ZXJCdWZmZXIucmVzaXplKGZvb3Rlckxlbmd0aCk7Ci0gICAgaWYgKGZyZWFkKGZvb3Rl
ckJ1ZmZlci5kYXRhKCksIDEsIGZvb3Rlckxlbmd0aCwgYnVuZGxlKSAhPSBmb290ZXJMZW5ndGgp
IHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBSZXN1bWVEYXRhIGZyb20gdGhl
IGJ1bmRsZSAtIGVycm5vKCVpKSIsIGVycm5vKTsgIAotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAg
fQotCi0gICAgLy8gQ0ZVUkxEb3dubG9hZCB3aWxsIHNlZWsgdG8gdGhlIGFwcHJvcHJpYXRlIHBs
YWNlIGluIHRoZSBmaWxlIChiZWZvcmUgb3VyIGZvb3RlcikgYW5kIHN0YXJ0IG92ZXJ3cml0aW5n
IGZyb20gdGhlcmUKLSAgICAvLyBIb3dldmVyLCBzYXkgd2Ugd2VyZSB3aXRoaW4gYSBmZXcgaHVu
ZHJlZCBieXRlcyBvZiB0aGUgZW5kIG9mIGEgZG93bmxvYWQgd2hlbiBpdCB3YXMgcGF1c2VkIC0K
LSAgICAvLyBUaGUgYWRkaXRpb25hbCBmb290ZXIgZXh0ZW5kZWQgdGhlIGxlbmd0aCBvZiB0aGUg
ZmlsZSBiZXlvbmQgaXRzIGZpbmFsIGxlbmd0aCwgYW5kIHRoZXJlIHdpbGwgYmUganVuayBkYXRh
IGxlZnRvdmVyCi0gICAgLy8gYXQgdGhlIGVuZC4gIFRoZXJlZm9yZSwgbm93IHRoYXQgd2UndmUg
cmV0cmlldmVkIHRoZSBmb290ZXIgZGF0YSwgd2UgbmVlZCB0byB0cnVuY2F0ZSBpdC4KLSAgICBp
ZiAoZXJybm9fdCByZXNpemVFcnJvciA9IF9jaHNpemVfcyhfZmlsZW5vKGJ1bmRsZSksIGZvb3Rl
clN0YXJ0UG9zaXRpb24pKSB7Ci0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHRydW5jYXRl
IHRoZSByZXN1bWUgZm9vdGVyIG9mZiB0aGUgZW5kIG9mIHRoZSBmaWxlIC0gZXJybm8oJWkpIiwg
cmVzaXplRXJyb3IpOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotCi0gICAgLy8gRmluYWxs
eSwgbWFrZSB0aGUgcmVzdW1lIGRhdGEuICBOb3csIGl0IGlzIHBvc3NpYmxlIGJ5IHNvbWUgdHdp
c3Qgb2YgZmF0ZSB0aGUgYnVuZGxlIG1hZ2ljIG51bWJlcgotICAgIC8vIHdhcyBuYXR1cmFsbHkg
YXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgaXRzIG5vdCBhY3R1YWxseSBhIHZhbGlkIGJ1bmRs
ZS4gIFRoYXQsIG9yIHNvbWVvbmUgZW5naW5lZXJlZAotICAgIC8vIGl0IHRoYXQgd2F5IHRvIHRy
eSB0byBhdHRhY2sgdXMuICBJbiB0aGF0IGNhdXNlLCB0aGlzIENGRGF0YSB3aWxsIHN1Y2Nlc3Nm
dWxseSBjcmVhdGUgYnV0IHdoZW4gd2UgCi0gICAgLy8gYWN0dWFsbHkgdHJ5IHRvIHN0YXJ0IHRo
ZSBDRlVSTERvd25sb2FkIHVzaW5nIHRoaXMgYm9ndXMgZGF0YSwgaXQgd2lsbCBmYWlsIGFuZCB3
ZSB3aWxsIGhhbmRsZSB0aGF0IGdyYWNlZnVsbHkKLSAgICByZXN1bHQgPSBDRkRhdGFDcmVhdGUo
MCwgZm9vdGVyQnVmZmVyLmRhdGEoKSwgZm9vdGVyTGVuZ3RoKTsKLWV4aXQ6Ci0gICAgZmNsb3Nl
KGJ1bmRsZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdGljIEhSRVNVTFQgYXBwZW5k
UmVzdW1lRGF0YVRvQnVuZGxlKENGRGF0YVJlZiByZXN1bWVEYXRhLCBjb25zdCBTdHJpbmcmIGJ1
bmRsZVBhdGgpCiB7CiAgICAgaWYgKCFyZXN1bWVEYXRhKSB7CkluZGV4OiBXZWJLaXQvd2luL1dl
YktpdC52Y3Byb2ovV2ViS2l0LnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYktp
dC52Y3Byb2ovV2ViS2l0LnZjcHJvagkocmV2aXNpb24gMzE4MTQpCisrKyBXZWJLaXQvd2luL1dl
YktpdC52Y3Byb2ovV2ViS2l0LnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtOTI3LDggKzkyNyw2
OCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIu
LlxXZWJEb3dubG9hZC5jcHAiDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViRG93bmxvYWRDRk5l
dC5jcHAiDQogCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1
Z19DYWlyb3xXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0K
KwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJ
CQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlO
YW1lPSJSZWxlYXNlX0NhaXJvfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUi
DQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQor
CQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8Rmls
ZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYkRvd25sb2FkQ3VybC5jcHAiDQorCQkJCT4NCisJ
CQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCUV4
Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1l
PSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4N
CisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJ
CQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJ
CU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0
aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnX0ludGVybmFs
fFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8
VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0Zp
bGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJl
bGVhc2VfUEdPSW5zdHJ1bWVudHxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVl
Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0K
KwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0
aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlX1BHT09wdGltaXplfFdpbjMyIg0KKwkJCQkJRXhjbHVk
ZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZD
Q0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KIAkJ
CTwvRmlsZT4NCiAJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYkRyb3BTb3VyY2Uu
Y3BwIg0K
</data>
<flag name="review"
          id="8940"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>