<?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>130479</bug_id>
          
          <creation_ts>2014-03-19 14:47:02 -0700</creation_ts>
          <short_desc>[Mac] Support asynchronous NSTextInputClient</short_desc>
          <delta_ts>2014-03-20 10:45:41 -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>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>andersca</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>enrica</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>992274</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2014-03-19 14:47:02 -0700</bug_when>
    <thetext>NSTextInputClient calls are a huge source of sync calls from UIProcess to WebProcess, which is bad. Add support for handling them asynchronously.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>992301</commentid>
    <comment_count>1</comment_count>
      <attachid>227228</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2014-03-19 16:14:21 -0700</bug_when>
    <thetext>Created attachment 227228
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>992303</commentid>
    <comment_count>2</comment_count>
      <attachid>227229</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2014-03-19 16:23:56 -0700</bug_when>
    <thetext>Created attachment 227229
updated to ToT</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>992306</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-03-19 16:26:38 -0700</bug_when>
    <thetext>Attachment 227229 did not pass style-queue:


ERROR: Source/WebKit2/WebProcess/WebPage/WebPage.cpp:3980:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 1 in 10 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>992588</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2014-03-20 10:45:41 -0700</bug_when>
    <thetext>Committed &lt;http://trac.webkit.org/r165972&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>227228</attachid>
            <date>2014-03-19 16:14:21 -0700</date>
            <delta_ts>2014-03-19 16:23:56 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>Async.txt</filename>
            <type>text/plain</type>
            <size>92164</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NTkyMSkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU1IEBACisyMDE0LTAzLTE5ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtNYWNdIFN1cHBvcnQgYXN5
bmNocm9ub3VzIE5TVGV4dElucHV0Q2xpZW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xMzA0NzkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgY3VycmVudGx5IGRpc2Fi
bGVkLCBwZW5kaW5nIGxvd2VyIGxldmVsIHN1cHBvcnQuCisgICAgICAgIE1vc3Qgb2YgdGhlIGNv
ZGUgaXMgbm90IHVuZGVyIGNvbXBpbGUgdGltZSBndWFyZCBob3dldmVyLCB0byBmYWNpbGl0YXRl
IGNyb3NzLXBsYXRmb3JtCisgICAgICAgIHJldXNlLCBvciBhdCBsZWFzdCB1bmRlciBhIFBMQVRG
T1JNKENPQ09BKSBndWFyZCB0byBzaGFyZSB0aGUgY29kZSB3aXRoIGlPUy4KKworICAgICAgICAq
IFVJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbTogQWRkZWQgYSBjb21waWxlIHRpbWUgYnJhbmNo
IGZvciBVU0UoQVNZTkNfTlNURVhUSU5QVVRDTElFTlQpLgorICAgICAgICBXZSBzdGlsbCBpbXBs
ZW1lbnQgc3luYyBOU1RleHRJbnB1dENsaWVudCBoZXJlLCBpbiBvcmRlciB0byBnZXQgYXNzZXJ0
aW9ucyB3aGVuCisgICAgICAgIGl0cyBtZXRob2RzIGFyZSB1bmV4cGVjdGVkbHkgY2FsbGVkLgor
ICAgICAgICBUaGUgbmV3IGNvZGUgZmlyc3Qgc2VuZHMgYW4gZXZlbnQgdG8gaW5wdXQgbWV0aG9k
IGFzeW5jaHJvbm91c2x5LCBoYW5kbGluZyBhbnkgY2FsbGJhY2tzCisgICAgICAgIHRoYXQgbWF5
IGFycml2ZS4gRHVyaW5nIHRoaXMgdGltZSwgd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgV0tWaWV3
SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycworICAgICAgICBhdCBhbGwuIE9uY2UgZG9uZSwg
d2UgaW50ZXJwcmV0IGtleSBiaW5kaW5ncyBzeW5jaHJvbm91c2x5LCBjb2xsZWN0aW5nIHRoZW0g
aW50bworICAgICAgICBhIHZlY3Rvci4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvbWFjL1dL
Vmlld0ludGVybmFsLmg6IFdlIG5vIGxvbmdlciBleHBvc2UgX2ludGVycHJldEtleUV2ZW50IG91
dHNpZGUKKyAgICAgICAgV0tWaWV3LgorCisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94
eS5jcHA6CisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oOgorICAgICAgICBBZGRl
ZCBhc3luYyBjYWxscyBhbmQgY2FsbGJhY2tzLiBSZW1vdmVkIHVubmVjZXNzYXJ5IGFuZCBzbGln
aHRseSBoYXJtZnVsIC5nZXQoKSB3aGVuIG1vdmluZworICAgICAgICBhIGNhbGxiYWNrIHBvaW50
ZXIgaW50byBtYXAuIE1vdmVkIGluc2VydERpY3RhdGVkVGV4dCgpIGFuZCBnZXRBdHRyaWJ1dGVk
U3Vic3RyaW5nRnJvbVJhbmdlKCkKKyAgICAgICAgZnJvbSBQTEFURk9STShDT0NPQSkgdG8gUExB
VEZPUk0oTUFDKSwgYmVjYXVzZSB0aGV5IGFyZSB1bnVzZWQgYW5kIHVuaW1wbGVtZW50ZWQgb24K
KyAgICAgICAgaU9TLCBhbmQgdW5saWtlbHkgdG8gYmUgbmVlZGVkIGFueSB0aW1lIHNvb24uIENo
YW5nZWQgVVNFKEFQUEtJVCkgdG8gUExBVEZPUk0oTUFDKSwKKyAgICAgICAgYmVjYXVzZSB0aGF0
J3MgbW9yZSBhY2N1cmF0ZSBpbiB0aGlzIGNhc2UgKG5vdGhpbmcgZGVwZW5kcyBvbiBBcHBLaXQs
IGl0J3MganVzdCBjb2RlCisgICAgICAgIHRoYXQgd2Ugb25seSBuZWVkIG9uIE1hYykuCisKKyAg
ICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluOiBBZGRlZCBtZXNzYWdl
cyBmb3IgbmV3IGFzeW5jIElNIHJlc3BvbnNlcy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9pb3Mv
V2ViUGFnZVByb3h5SU9TLm1tOiBSZW1vdmVkIGluc2VydERpY3RhdGVkVGV4dCgpIGFuZCBnZXRB
dHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlKCkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvbWFj
L1dlYlBhZ2VQcm94eU1hYy5tbToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjppbnNl
cnREaWN0YXRlZFRleHRBc3luYyk6CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6YXR0
cmlidXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQXN5bmMpOgorICAgICAgICAoV2ViS2l0
OjpXZWJQYWdlUHJveHk6OmF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNr
KToKKyAgICAgICAgQWRkZWQgYXN5bmMgY2FsbHMgYW5kIGNhbGxiYWNrcyB0aGF0IGFyZSBNYWMg
b25seS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNwcDoKKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oOgorICAgICAgICAqIFdlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvV2ViUGFnZU1hYy5tbToKKyAgICAgICAgQWRkZWQgYXN5bmMgaW1wbGVtZW50
YXRpb25zICh3aGljaCBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgc3luYyBvbmVzLCBzYWRs
eSkuCisKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbjog
QWRkZWQgYXN5bmMgbWVzc2FnZXMsIG1vdmVkIHNvbWUgbWVzc2FnZXMKKyAgICAgICAgdW5kZXIg
UExBVEZPUk0oTUFDKS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFn
ZUlPUy5tbTogTW9yZSBvZiBkZWxldGluZyBmdW5jdGlvbnMgdGhhdCBhcmUgTWFjIG9ubHksCisg
ICAgICAgIGFuZCBjYW5ub3QgYmUgZWFzaWx5IGltcGxlbWVudGVkIGluIFdlYlBhZ2UuY3BwIHdp
dGggc2hhcmVkIGNvZGUuCisKIDIwMTQtMDMtMTkgIEplciBOb2JsZSAgPGplci5ub2JsZUBhcHBs
ZS5jb20+CiAKICAgICAgICAgW01hY11bRU1FXSBRdWVyeSB3aGV0aGVyIGRlY29kZXIgc3VwcG9y
dCBleGlzdHMgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IE1lZGlhS2V5cyBvYmplY3QuCkluZGV4OiBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkocmV2aXNpb24gMTY1ODIz
KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEwNzUsNyArMTA3NSw3IEBAIHZvaWQgV2ViUGFnZVByb3h5Ojp2YWxpZGF0ZUNv
bW1hbmQoY29uc3QKICAgICB9CiAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2st
PmNhbGxiYWNrSUQoKTsKLSAgICBtX3ZhbGlkYXRlQ29tbWFuZENhbGxiYWNrcy5zZXQoY2FsbGJh
Y2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fdmFsaWRhdGVDb21tYW5kQ2FsbGJhY2tzLnNl
dChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpX
ZWJQYWdlOjpWYWxpZGF0ZUNvbW1hbmQoY29tbWFuZE5hbWUsIGNhbGxiYWNrSUQpLCBtX3BhZ2VJ
RCk7CiB9CiAKQEAgLTE5MjUsNyArMTkyNSw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpydW5KYXZh
U2NyaXB0SW5NYWluRnIKICAgICB9CiAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJh
Y2stPmNhbGxiYWNrSUQoKTsKLSAgICBtX3NjcmlwdFZhbHVlQ2FsbGJhY2tzLnNldChjYWxsYmFj
a0lELCBjYWxsYmFjay5nZXQoKSk7CisgICAgbV9zY3JpcHRWYWx1ZUNhbGxiYWNrcy5zZXQoY2Fs
bGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFn
ZTo6UnVuSmF2YVNjcmlwdEluTWFpbkZyYW1lKHNjcmlwdCwgY2FsbGJhY2tJRCksIG1fcGFnZUlE
KTsKIH0KIApAQCAtMTkzOCw3ICsxOTM4LDcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldFJlbmRl
clRyZWVFeHRlcm5hbAogICAgIH0KICAgICAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2Fs
bGJhY2stPmNhbGxiYWNrSUQoKTsKLSAgICBtX3N0cmluZ0NhbGxiYWNrcy5zZXQoY2FsbGJhY2tJ
RCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fc3RyaW5nQ2FsbGJhY2tzLnNldChjYWxsYmFja0lE
LCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRS
ZW5kZXJUcmVlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbihjYWxsYmFja0lEKSwgbV9wYWdlSUQpOwog
fQogCkBAIC0xOTUyLDcgKzE5NTIsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Z2V0U291cmNlRm9y
RnJhbWUoV2ViCiAgICAgCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxs
YmFja0lEKCk7CiAgICAgbV9sb2FkRGVwZW5kZW50U3RyaW5nQ2FsbGJhY2tJRHMuYWRkKGNhbGxi
YWNrSUQpOwotICAgIG1fc3RyaW5nQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjay5n
ZXQoKSk7CisgICAgbV9zdHJpbmdDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsK
ICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkdldFNvdXJjZUZvckZyYW1l
KGZyYW1lLT5mcmFtZUlEKCksIGNhbGxiYWNrSUQpLCBtX3BhZ2VJRCk7CiB9CiAKQEAgLTE5NjYs
NyArMTk2Niw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpnZXRDb250ZW50c0FzU3RyaW5nKFAKICAg
ICAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKICAg
ICBtX2xvYWREZXBlbmRlbnRTdHJpbmdDYWxsYmFja0lEcy5hZGQoY2FsbGJhY2tJRCk7Ci0gICAg
bV9zdHJpbmdDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBt
X3N0cmluZ0NhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJvY2Vz
cy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6R2V0Q29udGVudHNBc1N0cmluZyhjYWxsYmFja0lE
KSwgbV9wYWdlSUQpOwogfQogCkBAIC0xOTgwLDcgKzE5ODAsNyBAQCB2b2lkIFdlYlBhZ2VQcm94
eTo6Z2V0Qnl0ZWNvZGVQcm9maWxlKFBhCiAgICAgCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9
IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7CiAgICAgbV9sb2FkRGVwZW5kZW50U3RyaW5nQ2FsbGJh
Y2tJRHMuYWRkKGNhbGxiYWNrSUQpOwotICAgIG1fc3RyaW5nQ2FsbGJhY2tzLnNldChjYWxsYmFj
a0lELCBjYWxsYmFjay5nZXQoKSk7CisgICAgbV9zdHJpbmdDYWxsYmFja3Muc2V0KGNhbGxiYWNr
SUQsIGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6Okdl
dEJ5dGVjb2RlUHJvZmlsZShjYWxsYmFja0lEKSwgbV9wYWdlSUQpOwogfQogICAgIApAQCAtMTk5
NCw3ICsxOTk0LDcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldENvbnRlbnRzQXNNSFRNTERhdAog
ICAgIH0KIAogICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgp
OwotICAgIG1fZGF0YUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOwor
ICAgIG1fZGF0YUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJv
Y2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6R2V0Q29udGVudHNBc01IVE1MRGF0YShjYWxs
YmFja0lELCB1c2VCaW5hcnlFbmNvZGluZyksIG1fcGFnZUlEKTsKIH0KICNlbmRpZgpAQCAtMjAw
OCw3ICsyMDA4LDcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldFNlbGVjdGlvbk9yQ29udGVudAog
ICAgIH0KICAgICAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNr
SUQoKTsKLSAgICBtX3N0cmluZ0NhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0
KCkpOworICAgIG1fc3RyaW5nQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAg
ICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRTZWxlY3Rpb25PckNvbnRl
bnRzQXNTdHJpbmcoY2FsbGJhY2tJRCksIG1fcGFnZUlEKTsKIH0KIApAQCAtMjAyMSw3ICsyMDIx
LDcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldFNlbGVjdGlvbkFzV2ViQXJjaAogICAgIH0KICAg
ICAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKLSAg
ICBtX2RhdGFDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBt
X2RhdGFDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3Mt
PnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkdldFNlbGVjdGlvbkFzV2ViQXJjaGl2ZURhdGEoY2Fs
bGJhY2tJRCksIG1fcGFnZUlEKTsKIH0KIApAQCAtMjAzNCw3ICsyMDM0LDcgQEAgdm9pZCBXZWJQ
YWdlUHJveHk6OmdldE1haW5SZXNvdXJjZURhdGFPZgogICAgIH0KICAgICAKICAgICB1aW50NjRf
dCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKLSAgICBtX2RhdGFDYWxsYmFj
a3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX2RhdGFDYWxsYmFja3Mu
c2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6
OldlYlBhZ2U6OkdldE1haW5SZXNvdXJjZURhdGFPZkZyYW1lKGZyYW1lLT5mcmFtZUlEKCksIGNh
bGxiYWNrSUQpLCBtX3BhZ2VJRCk7CiB9CiAKQEAgLTIwNDcsNyArMjA0Nyw3IEBAIHZvaWQgV2Vi
UGFnZVByb3h5OjpnZXRSZXNvdXJjZURhdGFGcm9tRnIKICAgICB9CiAgICAgCiAgICAgdWludDY0
X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAgbV9kYXRhQ2FsbGJh
Y2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjay5nZXQoKSk7CisgICAgbV9kYXRhQ2FsbGJhY2tz
LnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2Vz
OjpXZWJQYWdlOjpHZXRSZXNvdXJjZURhdGFGcm9tRnJhbWUoZnJhbWUtPmZyYW1lSUQoKSwgcmVz
b3VyY2VVUkwtPnN0cmluZygpLCBjYWxsYmFja0lEKSwgbV9wYWdlSUQpOwogfQogCkBAIC0yMDYw
LDcgKzIwNjAsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Z2V0V2ViQXJjaGl2ZU9mRnJhbWUoCiAg
ICAgfQogICAgIAogICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJ
RCgpOwotICAgIG1fZGF0YUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkp
OworICAgIG1fZGF0YUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1f
cHJvY2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6R2V0V2ViQXJjaGl2ZU9mRnJhbWUoZnJh
bWUtPmZyYW1lSUQoKSwgY2FsbGJhY2tJRCksIG1fcGFnZUlEKTsKIH0KIApAQCAtMjA3Myw3ICsy
MDczLDcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmZvcmNlUmVwYWludChQYXNzUmVmUAogICAgIH0K
IAogICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgpOwotICAg
IG1fdm9pZENhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1f
dm9pZENhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fZHJhd2luZ0Fy
ZWEtPndhaXRGb3JCYWNraW5nU3RvcmVVcGRhdGVPbk5leHRQYWludCgpOwogICAgIG1fcHJvY2Vz
cy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6Rm9yY2VSZXBhaW50KGNhbGxiYWNrSUQpLCBtX3Bh
Z2VJRCk7IAogfQpAQCAtMzc2MCw2ICszNzYwLDQ2IEBAIHZvaWQgV2ViUGFnZVByb3h5Ojp2YWxp
ZGF0ZUNvbW1hbmRDYWxsYmEKICAgICBjYWxsYmFjay0+cGVyZm9ybUNhbGxiYWNrV2l0aFJldHVy
blZhbHVlKGNvbW1hbmROYW1lLmltcGwoKSwgaXNFbmFibGVkLCBzdGF0ZSk7CiB9CiAKK3ZvaWQg
V2ViUGFnZVByb3h5Ojp1bnNpZ25lZENhbGxiYWNrKHVpbnQ2NF90IHJlc3VsdCwgdWludDY0X3Qg
Y2FsbGJhY2tJRCkKK3sKKyAgICBSZWZQdHI8VW5zaWduZWRDYWxsYmFjaz4gY2FsbGJhY2sgPSBt
X3Vuc2lnbmVkQ2FsbGJhY2tzLnRha2UoY2FsbGJhY2tJRCk7CisgICAgaWYgKCFjYWxsYmFjaykg
eworICAgICAgICAvLyBGSVhNRTogTG9nIGVycm9yIG9yIGFzc2VydC4KKyAgICAgICAgLy8gdGhp
cyBjYW4gdmFsaWRseSBoYXBwZW4gaWYgYSBsb2FkIGludmFsaWRhdGVkIHRoZSBjYWxsYmFjaywg
dGhvdWdoCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYWxsYmFjay0+cGVyZm9ybUNh
bGxiYWNrV2l0aFJldHVyblZhbHVlKHJlc3VsdCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByb3h5Ojpl
ZGl0aW5nUmFuZ2VDYWxsYmFjayhjb25zdCBFZGl0aW5nUmFuZ2UmIHJhbmdlLCB1aW50NjRfdCBj
YWxsYmFja0lEKQoreworICAgIE1FU1NBR0VfQ0hFQ0socmFuZ2UuaXNWYWxpZCgpKTsKKworICAg
IFJlZlB0cjxFZGl0aW5nUmFuZ2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtX2VkaXRpbmdSYW5nZUNh
bGxiYWNrcy50YWtlKGNhbGxiYWNrSUQpOworICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAg
Ly8gRklYTUU6IExvZyBlcnJvciBvciBhc3NlcnQuCisgICAgICAgIC8vIHRoaXMgY2FuIHZhbGlk
bHkgaGFwcGVuIGlmIGEgbG9hZCBpbnZhbGlkYXRlZCB0aGUgY2FsbGJhY2ssIHRob3VnaAorICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgY2FsbGJhY2stPnBlcmZvcm1DYWxsYmFja1dpdGhS
ZXR1cm5WYWx1ZShyYW5nZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByb3h5OjpyZWN0Rm9yQ2hhcmFj
dGVyUmFuZ2VDYWxsYmFjayhjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBFZGl0aW5nUmFuZ2Um
IGFjdHVhbFJhbmdlLCB1aW50NjRfdCBjYWxsYmFja0lEKQoreworICAgIE1FU1NBR0VfQ0hFQ0so
YWN0dWFsUmFuZ2UuaXNWYWxpZCgpKTsKKworICAgIFJlZlB0cjxSZWN0Rm9yQ2hhcmFjdGVyUmFu
Z2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtX3JlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrcy50
YWtlKGNhbGxiYWNrSUQpOworICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgLy8gRklYTUU6
IExvZyBlcnJvciBvciBhc3NlcnQuCisgICAgICAgIC8vIHRoaXMgY2FuIHZhbGlkbHkgaGFwcGVu
IGlmIGEgbG9hZCBpbnZhbGlkYXRlZCB0aGUgY2FsbGJhY2ssIHRob3VnaAorICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgY2FsbGJhY2stPnBlcmZvcm1DYWxsYmFja1dpdGhSZXR1cm5WYWx1
ZShyZWN0LCBhY3R1YWxSYW5nZSk7Cit9CisKICNpZiBQTEFURk9STShHVEspCiB2b2lkIFdlYlBh
Z2VQcm94eTo6cHJpbnRGaW5pc2hlZENhbGxiYWNrKGNvbnN0IFJlc291cmNlRXJyb3ImIHByaW50
RXJyb3IsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiB7CkBAIC0zOTAyLDYgKzM5NDIsMTIgQEAgdm9p
ZCBXZWJQYWdlUHJveHk6OnJlc2V0U3RhdGUoKQogICAgIGludmFsaWRhdGVDYWxsYmFja01hcCht
X3NjcmlwdFZhbHVlQ2FsbGJhY2tzKTsKICAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9jb21w
dXRlZFBhZ2VzQ2FsbGJhY2tzKTsKICAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV92YWxpZGF0
ZUNvbW1hbmRDYWxsYmFja3MpOworICAgIGludmFsaWRhdGVDYWxsYmFja01hcChtX3Vuc2lnbmVk
Q2FsbGJhY2tzKTsKKyAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9lZGl0aW5nUmFuZ2VDYWxs
YmFja3MpOworICAgIGludmFsaWRhdGVDYWxsYmFja01hcChtX3JlY3RGb3JDaGFyYWN0ZXJSYW5n
ZUNhbGxiYWNrcyk7CisjaWYgUExBVEZPUk0oTUFDKQorICAgIGludmFsaWRhdGVDYWxsYmFja01h
cChtX2F0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrcyk7CisjZW5kaWYK
ICNpZiBQTEFURk9STShJT1MpCiAgICAgaW52YWxpZGF0ZUNhbGxiYWNrTWFwKG1fZ2VzdHVyZUNh
bGxiYWNrcyk7CiAgICAgaW52YWxpZGF0ZUNhbGxiYWNrTWFwKG1fdG91Y2hlc0NhbGxiYWNrcyk7
CkBAIC00MzA3LDcgKzQzNTMsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Y29tcHV0ZVBhZ2VzRm9y
UHJpbnRpCiAgICAgfQogCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxs
YmFja0lEKCk7Ci0gICAgbV9jb21wdXRlZFBhZ2VzQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBj
YWxsYmFjay5nZXQoKSk7CisgICAgbV9jb21wdXRlZFBhZ2VzQ2FsbGJhY2tzLnNldChjYWxsYmFj
a0lELCBjYWxsYmFjayk7CiAgICAgbV9pc0luUHJpbnRpbmdNb2RlID0gdHJ1ZTsKICAgICBtX3By
b2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkNvbXB1dGVQYWdlc0ZvclByaW50aW5nKGZy
YW1lLT5mcmFtZUlEKCksIHByaW50SW5mbywgY2FsbGJhY2tJRCksIG1fcGFnZUlELCBtX2lzUGVy
Zm9ybWluZ0RPTVByaW50T3BlcmF0aW9uID8gSVBDOjpEaXNwYXRjaE1lc3NhZ2VFdmVuV2hlbldh
aXRpbmdGb3JTeW5jUmVwbHkgOiAwKTsKIH0KQEAgLTQzMjIsNyArNDM2OCw3IEBAIHZvaWQgV2Vi
UGFnZVByb3h5OjpkcmF3UmVjdFRvSW1hZ2UoV2ViRnIKICAgICB9CiAgICAgCiAgICAgdWludDY0
X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAgbV9pbWFnZUNhbGxi
YWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1faW1hZ2VDYWxsYmFj
a3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2Fn
ZXM6OldlYlBhZ2U6OkRyYXdSZWN0VG9JbWFnZShmcmFtZS0+ZnJhbWVJRCgpLCBwcmludEluZm8s
IHJlY3QsIGltYWdlU2l6ZSwgY2FsbGJhY2tJRCksIG1fcGFnZUlELCBtX2lzUGVyZm9ybWluZ0RP
TVByaW50T3BlcmF0aW9uID8gSVBDOjpEaXNwYXRjaE1lc3NhZ2VFdmVuV2hlbldhaXRpbmdGb3JT
eW5jUmVwbHkgOiAwKTsKIH0KIApAQCAtNDMzNSw3ICs0MzgxLDcgQEAgdm9pZCBXZWJQYWdlUHJv
eHk6OmRyYXdQYWdlc1RvUERGKFdlYkZyYQogICAgIH0KICAgICAKICAgICB1aW50NjRfdCBjYWxs
YmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKLSAgICBtX2RhdGFDYWxsYmFja3Muc2V0
KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX2RhdGFDYWxsYmFja3Muc2V0KGNh
bGxiYWNrSUQsIGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBh
Z2U6OkRyYXdQYWdlc1RvUERGKGZyYW1lLT5mcmFtZUlEKCksIHByaW50SW5mbywgZmlyc3QsIGNv
dW50LCBjYWxsYmFja0lEKSwgbV9wYWdlSUQsIG1faXNQZXJmb3JtaW5nRE9NUHJpbnRPcGVyYXRp
b24gPyBJUEM6OkRpc3BhdGNoTWVzc2FnZUV2ZW5XaGVuV2FpdGluZ0ZvclN5bmNSZXBseSA6IDAp
OwogfQogI2VsaWYgUExBVEZPUk0oR1RLKQpAQCAtNDM0OCw3ICs0Mzk0LDcgQEAgdm9pZCBXZWJQ
YWdlUHJveHk6OmRyYXdQYWdlc0ZvclByaW50aW5nKAogICAgIH0KIAogICAgIHVpbnQ2NF90IGNh
bGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgpOwotICAgIG1fcHJpbnRGaW5pc2hlZENh
bGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fcHJpbnRGaW5p
c2hlZENhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1faXNJblByaW50
aW5nTW9kZSA9IHRydWU7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpE
cmF3UGFnZXNGb3JQcmludGluZyhmcmFtZS0+ZnJhbWVJRCgpLCBwcmludEluZm8sIGNhbGxiYWNr
SUQpLCBtX3BhZ2VJRCwgbV9pc1BlcmZvcm1pbmdET01QcmludE9wZXJhdGlvbiA/IElQQzo6RGlz
cGF0Y2hNZXNzYWdlRXZlbldoZW5XYWl0aW5nRm9yU3luY1JlcGx5IDogMCk7CiB9CkBAIC00NTY3
LDYgKzQ2MTMsODkgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmFkZE1JTUVUeXBlV2l0aEN1c3RvbQog
ICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6QWRkTUlNRVR5cGVXaXRoQ3Vz
dG9tQ29udGVudFByb3ZpZGVyKG1pbWVUeXBlKSwgbV9wYWdlSUQpOwogfQogCisjaWYgUExBVEZP
Uk0oQ09DT0EpCisKK3ZvaWQgV2ViUGFnZVByb3h5OjppbnNlcnRUZXh0QXN5bmMoY29uc3QgU3Ry
aW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UpCit7CisgICAg
aWYgKCFpc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHByb2Nlc3MoKS5zZW5kKE1l
c3NhZ2VzOjpXZWJQYWdlOjpJbnNlcnRUZXh0QXN5bmModGV4dCwgcmVwbGFjZW1lbnRSYW5nZSks
IG1fcGFnZUlEKTsKK30KKwordm9pZCBXZWJQYWdlUHJveHk6OmdldE1hcmtlZFJhbmdlQXN5bmMo
UGFzc1JlZlB0cjxFZGl0aW5nUmFuZ2VDYWxsYmFjaz4gY2FsbGJhY2spCit7CisgICAgaWYgKCFp
c1ZhbGlkKCkpIHsKKyAgICAgICAgY2FsbGJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJh
Y2tJRCgpOworICAgIG1fZWRpdGluZ1JhbmdlQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxs
YmFjayk7CisKKyAgICBwcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6V2ViUGFnZTo6R2V0TWFya2Vk
UmFuZ2VBc3luYyhjYWxsYmFja0lEKSwgbV9wYWdlSUQpOworfQorCit2b2lkIFdlYlBhZ2VQcm94
eTo6Z2V0U2VsZWN0ZWRSYW5nZUFzeW5jKFBhc3NSZWZQdHI8RWRpdGluZ1JhbmdlQ2FsbGJhY2s+
IGNhbGxiYWNrKQoreworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgIGNhbGxiYWNrLT5p
bnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBjYWxs
YmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKKyAgICBtX2VkaXRpbmdSYW5nZUNhbGxi
YWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOworCisgICAgcHJvY2VzcygpLnNlbmQoTWVz
c2FnZXM6OldlYlBhZ2U6OkdldFNlbGVjdGVkUmFuZ2VBc3luYyhjYWxsYmFja0lEKSwgbV9wYWdl
SUQpOworfQorCit2b2lkIFdlYlBhZ2VQcm94eTo6Y2hhcmFjdGVySW5kZXhGb3JQb2ludEFzeW5j
KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBwb2ludCwgUGFzc1JlZlB0cjxVbnNpZ25lZENhbGxi
YWNrPiBjYWxsYmFjaykKK3sKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICBjYWxsYmFj
ay0+aW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3Qg
Y2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7CisgICAgbV91bnNpZ25lZENhbGxi
YWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOworCisgICAgcHJvY2VzcygpLnNlbmQoTWVz
c2FnZXM6OldlYlBhZ2U6OkNoYXJhY3RlckluZGV4Rm9yUG9pbnRBc3luYyhwb2ludCwgY2FsbGJh
Y2tJRCksIG1fcGFnZUlEKTsKK30KKwordm9pZCBXZWJQYWdlUHJveHk6OmZpcnN0UmVjdEZvckNo
YXJhY3RlclJhbmdlQXN5bmMoY29uc3QgRWRpdGluZ1JhbmdlJiByYW5nZSwgUGFzc1JlZlB0cjxS
ZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjaz4gY2FsbGJhY2spCit7CisgICAgaWYgKCFpc1Zh
bGlkKCkpIHsKKyAgICAgICAgY2FsbGJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJ
RCgpOworICAgIG1fcmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2tzLnNldChjYWxsYmFja0lE
LCBjYWxsYmFjayk7CisKKyAgICBwcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6V2ViUGFnZTo6Rmly
c3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhyYW5nZSwgY2FsbGJhY2tJRCksIG1fcGFnZUlE
KTsKK30KKwordm9pZCBXZWJQYWdlUHJveHk6OnNldENvbXBvc2l0aW9uQXN5bmMoY29uc3QgU3Ry
aW5nJiB0ZXh0LCBWZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+IHVuZGVybGluZXMsIGNvbnN0
IEVkaXRpbmdSYW5nZSYgc2VsZWN0aW9uUmFuZ2UsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFj
ZW1lbnRSYW5nZSkKK3sKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICAvLyBJZiB0aGlz
IGZhaWxzLCB3ZSBzaG91bGQgY2FsbCAtZGlzY2FyZE1hcmtlZFRleHQgb24gaW5wdXQgY29udGV4
dCB0byBub3RpZnkgdGhlIGlucHV0IG1ldGhvZC4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGhhcHBl
biBuYXR1cmFsbHkgbGF0ZXIsIGFzIHBhcnQgb2YgcmVsb2FkaW5nIHRoZSBwYWdlLgorICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgcHJvY2VzcygpLnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6
OlNldENvbXBvc2l0aW9uQXN5bmModGV4dCwgdW5kZXJsaW5lcywgc2VsZWN0aW9uUmFuZ2UsIHJl
cGxhY2VtZW50UmFuZ2UpLCBtX3BhZ2VJRCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByb3h5Ojpjb25m
aXJtQ29tcG9zaXRpb25Bc3luYygpCit7CisgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIHByb2Nlc3MoKS5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpDb25maXJtQ29t
cG9zaXRpb25Bc3luYygpLCBtX3BhZ2VJRCk7Cit9CisKKyNlbmRpZgorCiB2b2lkIFdlYlBhZ2VQ
cm94eTo6dGFrZVRodW1ibmFpbFNuYXBzaG90KEltYWdlQ2FsbGJhY2s6OkNhbGxiYWNrRnVuY3Rp
b24gY2FsbGJhY2tGdW5jdGlvbikKIHsKICAgICBpZiAoIWlzVmFsaWQoKSkKSW5kZXg6IFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHJldmlzaW9uIDE2NTgyMykKKysrIFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkod29ya2luZyBjb3B5KQpAQCAt
MzQsNiArMzQsNyBAQAogI2luY2x1ZGUgIkNvbnRleHRNZW51Q29udGV4dERhdGEuaCIKICNpbmNs
dWRlICJEcmFnQ29udHJvbGxlckFjdGlvbi5oIgogI2luY2x1ZGUgIkRyYXdpbmdBcmVhUHJveHku
aCIKKyNpbmNsdWRlICJFZGl0aW5nUmFuZ2UuaCIKICNpbmNsdWRlICJFZGl0b3JTdGF0ZS5oIgog
I2luY2x1ZGUgIkdlb2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RNYW5hZ2VyUHJveHkuaCIKICNp
bmNsdWRlICJJbnRlcmFjdGlvbkluZm9ybWF0aW9uQXRQb3NpdGlvbi5oIgpAQCAtOTgsNiArOTks
MTAgQEAKICNpbmNsdWRlICJMYXllclJlcHJlc2VudGF0aW9uLmgiCiAjZW5kaWYKIAorI2lmIFBM
QVRGT1JNKE1BQykKKyNpbmNsdWRlICJBdHRyaWJ1dGVkU3RyaW5nLmgiCisjZW5kaWYKKwogbmFt
ZXNwYWNlIEFQSSB7CiBjbGFzcyBMb2FkZXJDbGllbnQ7CiBjbGFzcyBQb2xpY3lDbGllbnQ7CkBA
IC0xNzAsNiArMTc1LDggQEAgc3RydWN0IFdlYlBvcHVwSXRlbTsKIGNsYXNzIFdlYlZpYnJhdGlv
blByb3h5OwogI2VuZGlmCiAKK3R5cGVkZWYgR2VuZXJpY0NhbGxiYWNrPHVpbnQ2NF90PiBVbnNp
Z25lZENhbGxiYWNrOwordHlwZWRlZiBHZW5lcmljQ2FsbGJhY2s8RWRpdGluZ1JhbmdlPiBFZGl0
aW5nUmFuZ2VDYWxsYmFjazsKIHR5cGVkZWYgR2VuZXJpY0NhbGxiYWNrPFN0cmluZ0ltcGwqPiBT
dHJpbmdDYWxsYmFjazsKIHR5cGVkZWYgR2VuZXJpY0NhbGxiYWNrPFdlYlNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZSo+IFNjcmlwdFZhbHVlQ2FsbGJhY2s7CiAKQEAgLTIzMSw2ICsyMzgsOTYgQEAgcHJp
dmF0ZToKICAgICBDYWxsYmFja0Z1bmN0aW9uIG1fY2FsbGJhY2s7CiB9OwogCisvLyBGSVhNRTog
TWFrZSBhIHZlcnNpb24gb2YgQ2FsbGJhY2tCYXNlIHdpdGggdHdvIGFyZ3VtZW50cywgYW5kIGRl
ZmluZSBSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayBhcyBhIHNwZWNpYWxpemF0aW9uLgor
Y2xhc3MgUmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2sgOiBwdWJsaWMgQ2FsbGJhY2tCYXNl
IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCAoYm9vbCwgY29uc3Qg
V2ViQ29yZTo6SW50UmVjdCYsIGNvbnN0IEVkaXRpbmdSYW5nZSYpPiBDYWxsYmFja0Z1bmN0aW9u
OworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s+
IGNyZWF0ZShDYWxsYmFja0Z1bmN0aW9uIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhjYWxsYmFjaykpOwor
ICAgIH0KKworICAgIHZpcnR1YWwgflJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKCkKKyAg
ICB7CisgICAgICAgIEFTU0VSVCghbV9jYWxsYmFjayk7CisgICAgfQorCisgICAgdm9pZCBwZXJm
b3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCwg
Y29uc3QgRWRpdGluZ1JhbmdlJiByYW5nZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxi
YWNrKTsKKworICAgICAgICBtX2NhbGxiYWNrKGZhbHNlLCByZWN0LCByYW5nZSk7CisKKyAgICAg
ICAgbV9jYWxsYmFjayA9IDA7CisgICAgfQorICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZSgpCisg
ICAgeworICAgICAgICBBU1NFUlQobV9jYWxsYmFjayk7CisKKyAgICAgICAgbV9jYWxsYmFjayh0
cnVlLCBXZWJDb3JlOjpJbnRSZWN0KCksIEVkaXRpbmdSYW5nZSgpKTsKKworICAgICAgICBtX2Nh
bGxiYWNrID0gMDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBSZWN0Rm9yQ2hhcmFjdGVyUmFu
Z2VDYWxsYmFjayhDYWxsYmFja0Z1bmN0aW9uIGNhbGxiYWNrKQorICAgICAgICA6IG1fY2FsbGJh
Y2soY2FsbGJhY2spCisgICAgeworICAgIH0KKworICAgIENhbGxiYWNrRnVuY3Rpb24gbV9jYWxs
YmFjazsKK307CisKKyNpZiBQTEFURk9STShNQUMpCisKKy8vIEZJWE1FOiBNYWtlIGEgdmVyc2lv
biBvZiBDYWxsYmFja0Jhc2Ugd2l0aCB0d28gYXJndW1lbnRzLCBhbmQgZGVmaW5lIEF0dHJpYnV0
ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrIGFzIGEgc3BlY2lhbGl6YXRpb24uCitj
bGFzcyBBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayA6IHB1YmxpYyBD
YWxsYmFja0Jhc2UgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkIChi
b29sLCBjb25zdCBBdHRyaWJ1dGVkU3RyaW5nJiwgY29uc3QgRWRpdGluZ1JhbmdlJik+IENhbGxi
YWNrRnVuY3Rpb247CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxBdHRyaWJ1dGVkU3RyaW5nRm9y
Q2hhcmFjdGVyUmFuZ2VDYWxsYmFjaz4gY3JlYXRlKENhbGxiYWNrRnVuY3Rpb24gY2FsbGJhY2sp
CisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEF0dHJpYnV0ZWRTdHJpbmdGb3JD
aGFyYWN0ZXJSYW5nZUNhbGxiYWNrKGNhbGxiYWNrKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+
QXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2soKQorICAgIHsKKyAgICAg
ICAgQVNTRVJUKCFtX2NhbGxiYWNrKTsKKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1DYWxsYmFj
a1dpdGhSZXR1cm5WYWx1ZShjb25zdCBBdHRyaWJ1dGVkU3RyaW5nJiBzdHJpbmcsIGNvbnN0IEVk
aXRpbmdSYW5nZSYgcmFuZ2UpCisgICAgeworICAgICAgICBBU1NFUlQobV9jYWxsYmFjayk7CisK
KyAgICAgICAgbV9jYWxsYmFjayhmYWxzZSwgc3RyaW5nLCByYW5nZSk7CisKKyAgICAgICAgbV9j
YWxsYmFjayA9IDA7CisgICAgfQorICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZSgpCisgICAgewor
ICAgICAgICBBU1NFUlQobV9jYWxsYmFjayk7CisKKyAgICAgICAgbV9jYWxsYmFjayh0cnVlLCBB
dHRyaWJ1dGVkU3RyaW5nKCksIEVkaXRpbmdSYW5nZSgpKTsKKworICAgICAgICBtX2NhbGxiYWNr
ID0gMDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFj
dGVyUmFuZ2VDYWxsYmFjayhDYWxsYmFja0Z1bmN0aW9uIGNhbGxiYWNrKQorICAgICAgICA6IG1f
Y2FsbGJhY2soY2FsbGJhY2spCisgICAgeworICAgIH0KKworICAgIENhbGxiYWNrRnVuY3Rpb24g
bV9jYWxsYmFjazsKK307CisKKyNlbmRpZgorCiAjaWYgUExBVEZPUk0oSU9TKQogY2xhc3MgR2Vz
dHVyZUNhbGxiYWNrIDogcHVibGljIENhbGxiYWNrQmFzZSB7CiBwdWJsaWM6CkBAIC01MzAsMTAg
KzYyNyw4IEBAIHB1YmxpYzoKICAgICB2b2lkIGNvbmZpcm1Db21wb3NpdGlvbigpOwogICAgIHZv
aWQgY2FuY2VsQ29tcG9zaXRpb24oKTsKICAgICBib29sIGluc2VydFRleHQoY29uc3QgU3RyaW5n
JiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UpOwotICAgIGJvb2wg
aW5zZXJ0RGljdGF0ZWRUZXh0KGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1Jhbmdl
JiByZXBsYWNlbWVudFJhbmdlLCBjb25zdCBWZWN0b3I8V2ViQ29yZTo6VGV4dEFsdGVybmF0aXZl
V2l0aFJhbmdlPiYgZGljdGF0aW9uQWx0ZXJuYXRpdmVzKTsKICAgICB2b2lkIGdldE1hcmtlZFJh
bmdlKEVkaXRpbmdSYW5nZSYpOwogICAgIHZvaWQgZ2V0U2VsZWN0ZWRSYW5nZShFZGl0aW5nUmFu
Z2UmKTsKLSAgICB2b2lkIGdldEF0dHJpYnV0ZWRTdWJzdHJpbmdGcm9tUmFuZ2UoY29uc3QgRWRp
dGluZ1JhbmdlJiwgQXR0cmlidXRlZFN0cmluZyYpOwogICAgIHVpbnQ2NF90IGNoYXJhY3Rlcklu
ZGV4Rm9yUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQpOwogICAgIFdlYkNvcmU6OkludFJl
Y3QgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UoY29uc3QgRWRpdGluZ1JhbmdlJik7CiAgICAg
Ym9vbCBleGVjdXRlS2V5cHJlc3NDb21tYW5kcyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6S2V5cHJl
c3NDb21tYW5kPiYpOwpAQCAtNTQ1LDcgKzY0MCwyMCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nUm9vdExheWVyKExheWVyT3JWaWV3Kik7CiAgICAgTGF5ZXJP
clZpZXcqIGFjY2VsZXJhdGVkQ29tcG9zaXRpbmdSb290TGF5ZXIoKSBjb25zdDsKIAotI2lmIFVT
RShBUFBLSVQpCisgICAgdm9pZCBpbnNlcnRUZXh0QXN5bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBj
b25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UpOworICAgIHZvaWQgZ2V0TWFya2Vk
UmFuZ2VBc3luYyhQYXNzUmVmUHRyPEVkaXRpbmdSYW5nZUNhbGxiYWNrPik7CisgICAgdm9pZCBn
ZXRTZWxlY3RlZFJhbmdlQXN5bmMoUGFzc1JlZlB0cjxFZGl0aW5nUmFuZ2VDYWxsYmFjaz4pOwor
ICAgIHZvaWQgY2hhcmFjdGVySW5kZXhGb3JQb2ludEFzeW5jKGNvbnN0IFdlYkNvcmU6OkludFBv
aW50JiwgUGFzc1JlZlB0cjxVbnNpZ25lZENhbGxiYWNrPik7CisgICAgdm9pZCBmaXJzdFJlY3RG
b3JDaGFyYWN0ZXJSYW5nZUFzeW5jKGNvbnN0IEVkaXRpbmdSYW5nZSYsIFBhc3NSZWZQdHI8UmVj
dEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s+KTsKKyAgICB2b2lkIHNldENvbXBvc2l0aW9uQXN5
bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBWZWN0b3I8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxp
bmU+IHVuZGVybGluZXMsIGNvbnN0IEVkaXRpbmdSYW5nZSYgc2VsZWN0aW9uUmFuZ2UsIGNvbnN0
IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRSYW5nZSk7CisgICAgdm9pZCBjb25maXJtQ29tcG9z
aXRpb25Bc3luYygpOworCisjaWYgUExBVEZPUk0oTUFDKQorICAgIGJvb2wgaW5zZXJ0RGljdGF0
ZWRUZXh0KGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVu
dFJhbmdlLCBjb25zdCBWZWN0b3I8V2ViQ29yZTo6VGV4dEFsdGVybmF0aXZlV2l0aFJhbmdlPiYg
ZGljdGF0aW9uQWx0ZXJuYXRpdmVzKTsKKyAgICB2b2lkIGluc2VydERpY3RhdGVkVGV4dEFzeW5j
KGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVudFJhbmdl
LCBjb25zdCBWZWN0b3I8V2ViQ29yZTo6VGV4dEFsdGVybmF0aXZlV2l0aFJhbmdlPiYgZGljdGF0
aW9uQWx0ZXJuYXRpdmVzKTsKKyAgICB2b2lkIGdldEF0dHJpYnV0ZWRTdWJzdHJpbmdGcm9tUmFu
Z2UoY29uc3QgRWRpdGluZ1JhbmdlJiwgQXR0cmlidXRlZFN0cmluZyYpOworICAgIHZvaWQgYXR0
cmlidXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQXN5bmMoY29uc3QgRWRpdGluZ1Jhbmdl
JiwgUGFzc1JlZlB0cjxBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjaz4p
OworCiAgICAgV0tWaWV3KiB3a1ZpZXcoKSBjb25zdDsKICAgICB2b2lkIGludHJpbnNpY0NvbnRl
bnRTaXplRGlkQ2hhbmdlKGNvbnN0IFdlYkNvcmU6OkludFNpemUmIGludHJpbnNpY0NvbnRlbnRT
aXplKTsKICNlbmRpZgpAQCAtMTE0Niw2ICsxMjU0LDEyIEBAIHByaXZhdGU6CiAgICAgdm9pZCBz
Y3JpcHRWYWx1ZUNhbGxiYWNrKGNvbnN0IElQQzo6RGF0YVJlZmVyZW5jZSYsIHVpbnQ2NF90KTsK
ICAgICB2b2lkIGNvbXB1dGVkUGFnZXNDYWxsYmFjayhjb25zdCBWZWN0b3I8V2ViQ29yZTo6SW50
UmVjdD4mLCBkb3VibGUgdG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nLCB1aW50NjRfdCk7CiAg
ICAgdm9pZCB2YWxpZGF0ZUNvbW1hbmRDYWxsYmFjayhjb25zdCBTdHJpbmcmLCBib29sLCBpbnQs
IHVpbnQ2NF90KTsKKyAgICB2b2lkIHVuc2lnbmVkQ2FsbGJhY2sodWludDY0X3QsIHVpbnQ2NF90
KTsKKyAgICB2b2lkIGVkaXRpbmdSYW5nZUNhbGxiYWNrKGNvbnN0IEVkaXRpbmdSYW5nZSYsIHVp
bnQ2NF90KTsKKyAgICB2b2lkIHJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKGNvbnN0IFdl
YkNvcmU6OkludFJlY3QmLCBjb25zdCBFZGl0aW5nUmFuZ2UmLCB1aW50NjRfdCk7CisjaWYgUExB
VEZPUk0oTUFDKQorICAgIHZvaWQgYXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2Fs
bGJhY2soY29uc3QgQXR0cmlidXRlZFN0cmluZyYsIGNvbnN0IEVkaXRpbmdSYW5nZSYsIHVpbnQ2
NF90KTsKKyNlbmRpZgogI2lmIFBMQVRGT1JNKElPUykKICAgICB2b2lkIGdlc3R1cmVDYWxsYmFj
ayhjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYsIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3Qs
IHVpbnQ2NF90KTsKICAgICB2b2lkIHRvdWNoZXNDYWxsYmFjayhjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYsIHVpbnQzMl90LCB1aW50NjRfdCk7CkBAIC0xMjgzLDYgKzEzOTcsMTIgQEAgcHJpdmF0
ZToKICAgICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8U2NyaXB0VmFsdWVDYWxsYmFjaz4+IG1f
c2NyaXB0VmFsdWVDYWxsYmFja3M7CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPENvbXB1
dGVkUGFnZXNDYWxsYmFjaz4+IG1fY29tcHV0ZWRQYWdlc0NhbGxiYWNrczsKICAgICBIYXNoTWFw
PHVpbnQ2NF90LCBSZWZQdHI8VmFsaWRhdGVDb21tYW5kQ2FsbGJhY2s+PiBtX3ZhbGlkYXRlQ29t
bWFuZENhbGxiYWNrczsKKyAgICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8VW5zaWduZWRDYWxs
YmFjaz4+IG1fdW5zaWduZWRDYWxsYmFja3M7CisgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRy
PEVkaXRpbmdSYW5nZUNhbGxiYWNrPj4gbV9lZGl0aW5nUmFuZ2VDYWxsYmFja3M7CisgICAgSGFz
aE1hcDx1aW50NjRfdCwgUmVmUHRyPFJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrPj4gbV9y
ZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFja3M7CisjaWYgUExBVEZPUk0oTUFDKQorICAgIEhh
c2hNYXA8dWludDY0X3QsIFJlZlB0cjxBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VD
YWxsYmFjaz4+IG1fYXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2tzOwor
I2VuZGlmCiAjaWYgUExBVEZPUk0oSU9TKQogICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxH
ZXN0dXJlQ2FsbGJhY2s+PiBtX2dlc3R1cmVDYWxsYmFja3M7CiAgICAgSGFzaE1hcDx1aW50NjRf
dCwgUmVmUHRyPFRvdWNoZXNDYWxsYmFjaz4+IG1fdG91Y2hlc0NhbGxiYWNrczsKSW5kZXg6IFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkubWVzc2FnZXMuaW4KPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgko
cmV2aXNpb24gMTY1ODIzKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94
eS5tZXNzYWdlcy5pbgkod29ya2luZyBjb3B5KQpAQCAtMTUxLDYgKzE1MSwxMiBAQCBtZXNzYWdl
cyAtPiBXZWJQYWdlUHJveHkgewogICAgIFNjcmlwdFZhbHVlQ2FsbGJhY2soSVBDOjpEYXRhUmVm
ZXJlbmNlIHJlc3VsdERhdGEsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgQ29tcHV0ZWRQYWdl
c0NhbGxiYWNrKFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiBwYWdlUmVjdHMsIGRvdWJsZSB0b3Rh
bFNjYWxlRmFjdG9yRm9yUHJpbnRpbmcsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgVmFsaWRh
dGVDb21tYW5kQ2FsbGJhY2soU3RyaW5nIGNvbW1hbmQsIGJvb2wgaXNFbmFibGVkLCBpbnQzMl90
IHN0YXRlLCB1aW50NjRfdCBjYWxsYmFja0lEKQorICAgIEVkaXRpbmdSYW5nZUNhbGxiYWNrKFdl
YktpdDo6RWRpdGluZ1JhbmdlIHJhbmdlLCB1aW50NjRfdCBjYWxsYmFja0lEKQorICAgIFVuc2ln
bmVkQ2FsbGJhY2sodWludDY0X3QgcmVzdWx0LCB1aW50NjRfdCBjYWxsYmFja0lEKQorICAgIFJl
Y3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKFdlYkNvcmU6OkludFJlY3QgcmVjdCwgV2ViS2l0
OjpFZGl0aW5nUmFuZ2UgYWN0dWFsUmFuZ2UsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCisjaWYgUExB
VEZPUk0oTUFDKQorICAgIEF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNr
KFdlYktpdDo6QXR0cmlidXRlZFN0cmluZyBzdHJpbmcsIFdlYktpdDo6RWRpdGluZ1JhbmdlIGFj
dHVhbFJhbmdlLCB1aW50NjRfdCBjYWxsYmFja0lEKQorI2VuZGlmCiAjaWYgUExBVEZPUk0oSU9T
KQogICAgIEdlc3R1cmVDYWxsYmFjayhXZWJDb3JlOjpJbnRQb2ludCBwb2ludCwgdWludDMyX3Qg
Z2VzdHVyZVR5cGUsIHVpbnQzMl90IGdlc3R1cmVTdGF0ZSwgdWludDMyX3QgZmxhZ3MsIHVpbnQ2
NF90IGNhbGxiYWNrSUQpCiAgICAgVG91Y2hlc0NhbGxiYWNrKFdlYkNvcmU6OkludFBvaW50IHBv
aW50LCB1aW50MzJfdCB0b3VjaGVzLCB1aW50NjRfdCBjYWxsYmFja0lEKQpJbmRleDogU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3Lm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbQkocmV2aXNpb24gMTY1ODIzKQor
KysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3Lm1tCSh3b3JraW5nIGNv
cHkpCkBAIC0xMTUsNiArMTE1LDE0IEBAIC0gKE5TUmVjdClfaW50ZXJzZWN0Qm90dG9tQ29ybmVy
c1dpdGhSZWMKIC0gKHZvaWQpX21hc2tSb3VuZGVkQm90dG9tQ29ybmVyczooTlNSZWN0KWNsaXBS
ZWN0OwogQGVuZAogCisjaWYgVVNFKEFTWU5DX05TVEVYVElOUFVUQ0xJRU5UKQorQGludGVyZmFj
ZSBOU1RleHRJbnB1dENvbnRleHQgKFdLTlNUZXh0SW5wdXRDb250ZXh0RGV0YWlscykKKy0gKHZv
aWQpaGFuZGxlRXZlbnQ6KE5TRXZlbnQgKil0aGVFdmVudCBjb21wbGV0aW9uSGFuZGxlcjoodm9p
ZCheKShCT09MIGhhbmRsZWQpKWNvbXBsZXRpb25IYW5kbGVyOworLSAodm9pZCloYW5kbGVFdmVu
dEJ5SW5wdXRNZXRob2Q6KE5TRXZlbnQgKil0aGVFdmVudCBjb21wbGV0aW9uSGFuZGxlcjoodm9p
ZCheKShCT09MIGhhbmRsZWQpKWNvbXBsZXRpb25IYW5kbGVyOworLSAoQk9PTCloYW5kbGVFdmVu
dEJ5S2V5Ym9hcmRMYXlvdXQ6KE5TRXZlbnQgKil0aGVFdmVudDsKK0BlbmQKKyNlbmRpZgorCiAj
aWYgZGVmaW5lZChfX2hhc19pbmNsdWRlKSAmJiBfX2hhc19pbmNsdWRlKDxDb3JlR3JhcGhpY3Mv
Q29yZUdyYXBoaWNzUHJpdmF0ZS5oPikKICNpbXBvcnQgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhp
Y3NQcml2YXRlLmg+CiAjaW1wb3J0IDxDb3JlR3JhcGhpY3MvQ0dTQ2FwdHVyZS5oPgpAQCAtMTM5
LDEyICsxNDcsMTQgQEAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblZlY3Rvcgog
CiB9CiAKKyNpZiAhVVNFKEFTWU5DX05TVEVYVElOUFVUQ0xJRU5UKQogc3RydWN0IFdLVmlld0lu
dGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnMgewogICAgIGJvb2wgZXZlbnRJbnRlcnByZXRhdGlv
bkhhZFNpZGVFZmZlY3RzOwogICAgIGJvb2wgY29uc3VtZWRCeUlNOwogICAgIGJvb2wgZXhlY3V0
aW5nU2F2ZWRLZXlwcmVzc0NvbW1hbmRzOwogICAgIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+KiBj
b21tYW5kczsKIH07CisjZW5kaWYKIAogQGludGVyZmFjZSBXS1ZpZXdEYXRhIDogTlNPYmplY3Qg
ewogQHB1YmxpYwpAQCAtMTczLDcgKzE4MywxMSBAQCBAaW50ZXJmYWNlIFdLVmlld0RhdGEgOiBO
U09iamVjdCB7CiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIHRvIGRpc3Rpbmd1aXNoIHRoZSBjYXNl
IG9mIGEgbmV3IGV2ZW50IGZyb20gb25lIAogICAgIC8vIHRoYXQgaGFzIGJlZW4gYWxyZWFkeSBz
ZW50IHRvIFdlYkNvcmUuCiAgICAgUmV0YWluUHRyPE5TRXZlbnQ+IF9rZXlEb3duRXZlbnRCZWlu
Z1Jlc2VudDsKKyNpZiBVU0UoQVNZTkNfTlNURVhUSU5QVVRDTElFTlQpCisgICAgVmVjdG9yPEtl
eXByZXNzQ29tbWFuZD4qIF9jb2xsZWN0ZWRLZXlwcmVzc0NvbW1hbmRzOworI2Vsc2UKICAgICBX
S1ZpZXdJbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzKiBfaW50ZXJwcmV0S2V5RXZlbnRzUGFy
YW1ldGVyczsKKyNlbmRpZgogCiAgICAgTlNTaXplIF9yZXNpemVTY3JvbGxPZmZzZXQ7CiAKQEAg
LTEwODMsNiArMTA5NywyNiBAQCAtICh2b2lkKV9zZXRNb3VzZURvd25FdmVudDooTlNFdmVudCAq
KWV2CiAgICAgX2RhdGEtPl9tb3VzZURvd25FdmVudCA9IFtldmVudCByZXRhaW5dOwogfQogCisj
aWYgVVNFKEFTWU5DX05TVEVYVElOUFVUQ0xJRU5UKQorI2RlZmluZSBOQVRJVkVfTU9VU0VfRVZF
TlRfSEFORExFUihTZWxlY3RvcikgXAorICAgIC0gKHZvaWQpU2VsZWN0b3I6KE5TRXZlbnQgKil0
aGVFdmVudCBcCisgICAgeyBcCisgICAgICAgIGlmIChbc2VsZiBzaG91bGRJZ25vcmVNb3VzZUV2
ZW50c10pIFwKKyAgICAgICAgICAgIHJldHVybjsgXAorICAgICAgICBpZiAoTlNUZXh0SW5wdXRD
b250ZXh0ICpjb250ZXh0ID0gW3NlbGYgaW5wdXRDb250ZXh0XSkgeyBcCisgICAgICAgICAgICBb
Y29udGV4dCBoYW5kbGVFdmVudDp0aGVFdmVudCBjb21wbGV0aW9uSGFuZGxlcjpeKEJPT0wgaGFu
ZGxlZCkgeyBcCisgICAgICAgICAgICAgICAgaWYgKGhhbmRsZWQpIFwKKyAgICAgICAgICAgICAg
ICAgICAgTE9HKFRleHRJbnB1dCwgIiVzIHdhcyBoYW5kbGVkIGJ5IHRleHQgaW5wdXQgY29udGV4
dCIsIFN0cmluZygjU2VsZWN0b3IpLnN1YnN0cmluZygwLCBTdHJpbmcoI1NlbGVjdG9yKS5maW5k
KCJJbnRlcm5hbCIpKS5hc2NpaSgpLmRhdGEoKSk7IFwKKyAgICAgICAgICAgICAgICBlbHNlIHsg
XAorICAgICAgICAgICAgICAgICAgICBOYXRpdmVXZWJNb3VzZUV2ZW50IHdlYkV2ZW50KHRoZUV2
ZW50LCBzZWxmKTsgXAorICAgICAgICAgICAgICAgICAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZU1v
dXNlRXZlbnQod2ViRXZlbnQpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9
XTsgXAorICAgICAgICB9IFwKKyAgICAgICAgTmF0aXZlV2ViTW91c2VFdmVudCB3ZWJFdmVudCh0
aGVFdmVudCwgc2VsZik7IFwKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVNb3VzZUV2ZW50
KHdlYkV2ZW50KTsgXAorICAgIH0KKyNlbHNlCiAjZGVmaW5lIE5BVElWRV9NT1VTRV9FVkVOVF9I
QU5ETEVSKFNlbGVjdG9yKSBcCiAgICAgLSAodm9pZClTZWxlY3RvcjooTlNFdmVudCAqKXRoZUV2
ZW50IFwKICAgICB7IFwKQEAgLTEwOTUsNiArMTEyOSw3IEBAIC0gKHZvaWQpX3NldE1vdXNlRG93
bkV2ZW50OihOU0V2ZW50ICopZXYKICAgICAgICAgTmF0aXZlV2ViTW91c2VFdmVudCB3ZWJFdmVu
dCh0aGVFdmVudCwgc2VsZik7IFwKICAgICAgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVNb3VzZUV2
ZW50KHdlYkV2ZW50KTsgXAogICAgIH0KKyNlbmRpZgogCiBOQVRJVkVfTU9VU0VfRVZFTlRfSEFO
RExFUihtb3VzZUVudGVyZWQpCiBOQVRJVkVfTU9VU0VfRVZFTlRfSEFORExFUihtb3VzZUV4aXRl
ZCkKQEAgLTEyMTMsMjAgKzEyNDgsMTI2IEBAIC0gKEJPT0wpc2hvdWxkRGVsYXlXaW5kb3dPcmRl
cmluZ0ZvckV2ZW4KICAgICByZXR1cm4gcmVzdWx0OwogfQogCistICh2b2lkKV9kaXNhYmxlQ29t
cGxleFRleHRJbnB1dElmTmVjZXNzYXJ5Cit7CisgICAgaWYgKCFfZGF0YS0+X3BsdWdpbkNvbXBs
ZXhUZXh0SW5wdXRJZGVudGlmaWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoX2RhdGEt
Pl9wbHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgIT0gUGx1Z2luQ29tcGxleFRleHRJbnB1dEVu
YWJsZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENoZWNrIGlmIHRoZSB0ZXh0IGlucHV0
IHdpbmRvdyBoYXMgYmVlbiBkaXNtaXNzZWQuCisgICAgaWYgKCFbW1dLVGV4dElucHV0V2luZG93
Q29udHJvbGxlciBzaGFyZWRUZXh0SW5wdXRXaW5kb3dDb250cm9sbGVyXSBoYXNNYXJrZWRUZXh0
XSkKKyAgICAgICAgW3NlbGYgX3NldFBsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZTpQbHVnaW5D
b21wbGV4VGV4dElucHV0RGlzYWJsZWRdOworfQorCistIChCT09MKV9oYW5kbGVQbHVnaW5Db21w
bGV4VGV4dElucHV0S2V5RG93bjooTlNFdmVudCAqKWV2ZW50Cit7CisgICAgQVNTRVJUKF9kYXRh
LT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dElkZW50aWZpZXIpOworICAgIEFTU0VSVChfZGF0YS0+
X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSAhPSBQbHVnaW5Db21wbGV4VGV4dElucHV0RGlz
YWJsZWQpOworCisgICAgQk9PTCB1c2luZ0xlZ2FjeUNvY29hVGV4dElucHV0ID0gX2RhdGEtPl9w
bHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgPT0gUGx1Z2luQ29tcGxleFRleHRJbnB1dEVuYWJs
ZWRMZWdhY3k7CisKKyAgICBOU1N0cmluZyAqc3RyaW5nID0gbmlsOworICAgIEJPT0wgZGlkSGFu
ZGxlRXZlbnQgPSBbW1dLVGV4dElucHV0V2luZG93Q29udHJvbGxlciBzaGFyZWRUZXh0SW5wdXRX
aW5kb3dDb250cm9sbGVyXSBpbnRlcnByZXRLZXlFdmVudDpldmVudCB1c2luZ0xlZ2FjeUNvY29h
VGV4dElucHV0OnVzaW5nTGVnYWN5Q29jb2FUZXh0SW5wdXQgc3RyaW5nOiZzdHJpbmddOworCisg
ICAgaWYgKHN0cmluZykgeworICAgICAgICBfZGF0YS0+X3BhZ2UtPnNlbmRDb21wbGV4VGV4dElu
cHV0VG9QbHVnaW4oX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0SWRlbnRpZmllciwgc3Ry
aW5nKTsKKworICAgICAgICBpZiAoIXVzaW5nTGVnYWN5Q29jb2FUZXh0SW5wdXQpCisgICAgICAg
ICAgICBfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSA9IFBsdWdpbkNvbXBsZXhU
ZXh0SW5wdXREaXNhYmxlZDsKKyAgICB9CisKKyAgICByZXR1cm4gZGlkSGFuZGxlRXZlbnQ7Cit9
CisKKy0gKEJPT0wpX3RyeUhhbmRsZVBsdWdpbkNvbXBsZXhUZXh0SW5wdXRLZXlEb3duOihOU0V2
ZW50ICopZXZlbnQKK3sKKyAgICBpZiAoIV9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dElk
ZW50aWZpZXIgfHwgX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgPT0gUGx1Z2lu
Q29tcGxleFRleHRJbnB1dERpc2FibGVkKQorICAgICAgICByZXR1cm4gTk87CisKKyAgICAvLyBD
aGVjayBpZiB0aGUgdGV4dCBpbnB1dCB3aW5kb3cgaGFzIGJlZW4gZGlzbWlzc2VkIGFuZCBsZXQg
dGhlIHBsdWctaW4gcHJvY2VzcyBrbm93LgorICAgIC8vIFRoaXMgaXMgb25seSB2YWxpZCB3aXRo
IHRoZSB1cGRhdGVkIENvY29hIHRleHQgaW5wdXQgc3BlYy4KKyAgICBbc2VsZiBfZGlzYWJsZUNv
bXBsZXhUZXh0SW5wdXRJZk5lY2Vzc2FyeV07CisKKyAgICAvLyBUcnkgZmVlZGluZyB0aGUga2V5
Ym9hcmQgZXZlbnQgZGlyZWN0bHkgdG8gdGhlIHBsdWctaW4uCisgICAgaWYgKF9kYXRhLT5fcGx1
Z2luQ29tcGxleFRleHRJbnB1dFN0YXRlID09IFBsdWdpbkNvbXBsZXhUZXh0SW5wdXRFbmFibGVk
TGVnYWN5KQorICAgICAgICByZXR1cm4gW3NlbGYgX2hhbmRsZVBsdWdpbkNvbXBsZXhUZXh0SW5w
dXRLZXlEb3duOmV2ZW50XTsKKworICAgIHJldHVybiBOTzsKK30KKworc3RhdGljIHZvaWQgZXh0
cmFjdFVuZGVybGluZXMoTlNBdHRyaWJ1dGVkU3RyaW5nICpzdHJpbmcsIFZlY3RvcjxDb21wb3Np
dGlvblVuZGVybGluZT4mIHJlc3VsdCkKK3sKKyAgICBpbnQgbGVuZ3RoID0gW1tzdHJpbmcgc3Ry
aW5nXSBsZW5ndGhdOworICAgIAorICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0
aCkgeworICAgICAgICBOU1JhbmdlIHJhbmdlOworICAgICAgICBOU0RpY3Rpb25hcnkgKmF0dHJz
ID0gW3N0cmluZyBhdHRyaWJ1dGVzQXRJbmRleDppIGxvbmdlc3RFZmZlY3RpdmVSYW5nZTomcmFu
Z2UgaW5SYW5nZTpOU01ha2VSYW5nZShpLCBsZW5ndGggLSBpKV07CisgICAgICAgIAorICAgICAg
ICBpZiAoTlNOdW1iZXIgKnN0eWxlID0gW2F0dHJzIG9iamVjdEZvcktleTpOU1VuZGVybGluZVN0
eWxlQXR0cmlidXRlTmFtZV0pIHsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yID0gQ29sb3I6OmJs
YWNrOworICAgICAgICAgICAgaWYgKE5TQ29sb3IgKmNvbG9yQXR0ciA9IFthdHRycyBvYmplY3RG
b3JLZXk6TlNVbmRlcmxpbmVDb2xvckF0dHJpYnV0ZU5hbWVdKQorICAgICAgICAgICAgICAgIGNv
bG9yID0gY29sb3JGcm9tTlNDb2xvcihbY29sb3JBdHRyIGNvbG9yVXNpbmdDb2xvclNwYWNlTmFt
ZTpOU0RldmljZVJHQkNvbG9yU3BhY2VdKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoQ29t
cG9zaXRpb25VbmRlcmxpbmUocmFuZ2UubG9jYXRpb24sIE5TTWF4UmFuZ2UocmFuZ2UpLCBjb2xv
ciwgW3N0eWxlIGludFZhbHVlXSA+IDEpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
aSA9IHJhbmdlLmxvY2F0aW9uICsgcmFuZ2UubGVuZ3RoOworICAgIH0KK30KKworI2lmIFVTRShB
U1lOQ19OU1RFWFRJTlBVVENMSUVOVCkKKworLSAodm9pZClfY29sbGVjdEtleWJvYXJkTGF5b3V0
Q29tbWFuZHNGb3JFdmVudDooTlNFdmVudCAqKWV2ZW50IHRvOihWZWN0b3I8S2V5cHJlc3NDb21t
YW5kPiYpY29tbWFuZHMKK3sKKyAgICBpZiAoW2V2ZW50IHR5cGVdICE9IE5TS2V5RG93bikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKCFfZGF0YS0+X2NvbGxlY3RlZEtleXByZXNzQ29t
bWFuZHMpOworICAgIF9kYXRhLT5fY29sbGVjdGVkS2V5cHJlc3NDb21tYW5kcyA9ICZjb21tYW5k
czsKKworICAgIGlmIChOU1RleHRJbnB1dENvbnRleHQgKmNvbnRleHQgPSBbc2VsZiBpbnB1dENv
bnRleHRdKQorICAgICAgICBbY29udGV4dCBoYW5kbGVFdmVudEJ5S2V5Ym9hcmRMYXlvdXQ6ZXZl
bnRdOworICAgIGVsc2UKKyAgICAgICAgW3NlbGYgaW50ZXJwcmV0S2V5RXZlbnRzOltOU0FycmF5
IGFycmF5V2l0aE9iamVjdDpldmVudF1dOworCisgICAgX2RhdGEtPl9jb2xsZWN0ZWRLZXlwcmVz
c0NvbW1hbmRzID0gbnVsbHB0cjsKK30KKworLSAodm9pZClfaW50ZXJwcmV0S2V5RXZlbnQ6KE5T
RXZlbnQgKilldmVudCBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCheKShCT09MIGhhbmRsZWQsIGNv
bnN0IFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+JiBjb21tYW5kcykpY29tcGxldGlvbkhhbmRsZXIK
K3sKKyAgICBpZiAoIVtzZWxmIGlucHV0Q29udGV4dF0pIHsKKyAgICAgICAgVmVjdG9yPEtleXBy
ZXNzQ29tbWFuZD4gY29tbWFuZHM7CisgICAgICAgIFtzZWxmIF9jb2xsZWN0S2V5Ym9hcmRMYXlv
dXRDb21tYW5kc0ZvckV2ZW50OmV2ZW50IHRvOmNvbW1hbmRzXTsKKyAgICAgICAgY29tcGxldGlv
bkhhbmRsZXIoTk8sIGNvbW1hbmRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExP
RyhUZXh0SW5wdXQsICItPiBoYW5kbGVFdmVudEJ5SW5wdXRNZXRob2Q6JXAgJUAiLCBldmVudCwg
ZXZlbnQpOworICAgIFtbc2VsZiBpbnB1dENvbnRleHRdIGhhbmRsZUV2ZW50QnlJbnB1dE1ldGhv
ZDpldmVudCBjb21wbGV0aW9uSGFuZGxlcjpeKEJPT0wgaGFuZGxlZCkgeworICAgICAgICAKKyAg
ICAgICAgTE9HKFRleHRJbnB1dCwgIi4uLiBoYW5kbGVFdmVudEJ5SW5wdXRNZXRob2QlcyBoYW5k
bGVkIiwgaGFuZGxlZCA/ICIiIDogIiBub3QiKTsKKyAgICAgICAgaWYgKGhhbmRsZWQpIHsKKyAg
ICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKFlFUywgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4o
KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8S2V5
cHJlc3NDb21tYW5kPiBjb21tYW5kczsKKyAgICAgICAgW3NlbGYgX2NvbGxlY3RLZXlib2FyZExh
eW91dENvbW1hbmRzRm9yRXZlbnQ6ZXZlbnQgdG86Y29tbWFuZHNdOworICAgICAgICBjb21wbGV0
aW9uSGFuZGxlcihOTywgY29tbWFuZHMpOworICAgIH1dOworfQorCiAtICh2b2lkKWRvQ29tbWFu
ZEJ5U2VsZWN0b3I6KFNFTClzZWxlY3RvcgogewogICAgIExPRyhUZXh0SW5wdXQsICJkb0NvbW1h
bmRCeVNlbGVjdG9yOlwiJXNcIiIsIHNlbF9nZXROYW1lKHNlbGVjdG9yKSk7CiAKLSAgICBXS1Zp
ZXdJbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzKiBwYXJhbWV0ZXJzID0gX2RhdGEtPl9pbnRl
cnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzOwotICAgIGlmIChwYXJhbWV0ZXJzKQotICAgICAgICBw
YXJhbWV0ZXJzLT5jb25zdW1lZEJ5SU0gPSBmYWxzZTsKLQotICAgIC8vIEFzIGluIGluc2VydFRl
eHQ6cmVwbGFjZW1lbnRSYW5nZTosIHdlIGFzc3VtZSB0aGF0IHRoZSBjYWxsIGNvbWVzIGZyb20g
YW4gaW5wdXQgbWV0aG9kIGlmIHRoZXJlIGlzIG1hcmtlZCB0ZXh0LgotICAgIGJvb2wgaXNGcm9t
SW5wdXRNZXRob2QgPSBfZGF0YS0+X3BhZ2UtPmVkaXRvclN0YXRlKCkuaGFzQ29tcG9zaXRpb247
CisgICAgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4qIGtleXByZXNzQ29tbWFuZHMgPSBfZGF0YS0+
X2NvbGxlY3RlZEtleXByZXNzQ29tbWFuZHM7CiAKLSAgICBpZiAocGFyYW1ldGVycyAmJiAhaXNG
cm9tSW5wdXRNZXRob2QpIHsKKyAgICBpZiAoa2V5cHJlc3NDb21tYW5kcykgewogICAgICAgICBL
ZXlwcmVzc0NvbW1hbmQgY29tbWFuZChOU1N0cmluZ0Zyb21TZWxlY3RvcihzZWxlY3RvcikpOwot
ICAgICAgICBwYXJhbWV0ZXJzLT5jb21tYW5kcy0+YXBwZW5kKGNvbW1hbmQpOworICAgICAgICBr
ZXlwcmVzc0NvbW1hbmRzLT5hcHBlbmQoY29tbWFuZCk7CiAgICAgICAgIExPRyhUZXh0SW5wdXQs
ICIuLi5zdG9yZWQiKTsKICAgICAgICAgX2RhdGEtPl9wYWdlLT5yZWdpc3RlcktleXByZXNzQ29t
bWFuZE5hbWUoY29tbWFuZC5jb21tYW5kTmFtZSk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMzgsNyAr
MTM3OSw3IEBAIC0gKHZvaWQpZG9Db21tYW5kQnlTZWxlY3RvcjooU0VMKXNlbGVjdG8KIAogLSAo
dm9pZClpbnNlcnRUZXh0OihpZClzdHJpbmcKIHsKLSAgICAvLyBVbmxpa2UgYW5kIE5TVGV4dElu
cHV0Q2xpZW50IHZhcmlhbnQgd2l0aCByZXBsYWNlbWVudFJhbmdlLCB0aGlzIE5TUmVzcG9uZGVy
IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBpbnB1dCBjb250ZXh0LAorICAgIC8v
IFVubGlrZSBhbiBOU1RleHRJbnB1dENsaWVudCB2YXJpYW50IHdpdGggcmVwbGFjZW1lbnRSYW5n
ZSwgdGhpcyBOU1Jlc3BvbmRlciBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gaW5w
dXQgY29udGV4dCwKICAgICAvLyBzbyB0ZXh0IGlucHV0IHByb2Nlc3NpbmcgaXNuJ3QgcGVyZm9y
bWVkLiBXZSBhcmUgbm90IGdvaW5nIHRvIGFjdHVhbGx5IGluc2VydCBhbnkgdGV4dCBpbiB0aGF0
IGNhc2UsIGJ1dCBzYXZpbmcgYW4gaW5zZXJ0VGV4dAogICAgIC8vIGNvbW1hbmQgZW5zdXJlcyB0
aGF0IGEga2V5cHJlc3MgZXZlbnQgaXMgZGlzcGF0Y2hlZCBhcyBhcHByb3ByaWF0ZS4KICAgICBb
c2VsZiBpbnNlcnRUZXh0OnN0cmluZyByZXBsYWNlbWVudFJhbmdlOk5TTWFrZVJhbmdlKE5TTm90
Rm91bmQsIDApXTsKQEAgLTEyNTMsMTMgKzEzOTQsOCBAQCAtICh2b2lkKWluc2VydFRleHQ6KGlk
KXN0cmluZyByZXBsYWNlbWVuCiAgICAgICAgIExPRyhUZXh0SW5wdXQsICJpbnNlcnRUZXh0Olwi
JUBcIiByZXBsYWNlbWVudFJhbmdlOigldSwgJXUpIiwgaXNBdHRyaWJ1dGVkU3RyaW5nID8gW3N0
cmluZyBzdHJpbmddIDogc3RyaW5nLCByZXBsYWNlbWVudFJhbmdlLmxvY2F0aW9uLCByZXBsYWNl
bWVudFJhbmdlLmxlbmd0aCk7CiAgICAgZWxzZQogICAgICAgICBMT0coVGV4dElucHV0LCAiaW5z
ZXJ0VGV4dDpcIiVAXCIiLCBpc0F0dHJpYnV0ZWRTdHJpbmcgPyBbc3RyaW5nIHN0cmluZ10gOiBz
dHJpbmcpOwotICAgIFdLVmlld0ludGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnMqIHBhcmFtZXRl
cnMgPSBfZGF0YS0+X2ludGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnM7Ci0gICAgaWYgKHBhcmFt
ZXRlcnMpCi0gICAgICAgIHBhcmFtZXRlcnMtPmNvbnN1bWVkQnlJTSA9IGZhbHNlOwogCiAgICAg
TlNTdHJpbmcgKnRleHQ7Ci0gICAgYm9vbCBpc0Zyb21JbnB1dE1ldGhvZCA9IF9kYXRhLT5fcGFn
ZS0+ZWRpdG9yU3RhdGUoKS5oYXNDb21wb3NpdGlvbjsKLQogICAgIFZlY3RvcjxUZXh0QWx0ZXJu
YXRpdmVXaXRoUmFuZ2U+IGRpY3RhdGlvbkFsdGVybmF0aXZlczsKIAogICAgIGlmIChpc0F0dHJp
YnV0ZWRTdHJpbmcpIHsKQEAgLTEyNzIsMTM2ICsxNDA4LDMwNyBAQCAtICh2b2lkKWluc2VydFRl
eHQ6KGlkKXN0cmluZyByZXBsYWNlbWVuCiAgICAgICAgIHRleHQgPSBzdHJpbmc7CiAKICAgICAv
LyBpbnNlcnRUZXh0IGNhbiBiZSBjYWxsZWQgZm9yIHNldmVyYWwgcmVhc29uczoKLSAgICAvLyAt
IElmIGl0J3MgZnJvbSBub3JtYWwga2V5IGV2ZW50IHByb2Nlc3NpbmcgKGluY2x1ZGluZyBrZXkg
YmluZGluZ3MpLCB3ZSBtYXkgbmVlZCB0byBzYXZlIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSBpdCBs
YXRlci4KLSAgICAvLyAtIElmIGl0J3MgZnJvbSBhbiBpbnB1dCBtZXRob2QsIHRoZW4gd2Ugc2hv
dWxkIGdvIGFoZWFkIGFuZCBpbnNlcnQgdGhlIHRleHQgbm93LiBXZSBhc3N1bWUgaXQncyBmcm9t
IHRoZSBpbnB1dCBtZXRob2QgaWYgd2UgaGF2ZSBtYXJrZWQgdGV4dC4KLSAgICAvLyBGSVhNRTog
SW4gdGhlb3J5LCB0aGlzIGNvdWxkIGJlIHdyb25nIGZvciBzb21lIGlucHV0IG1ldGhvZHMsIHNv
IHdlIHNob3VsZCB0cnkgdG8gZmluZCBhbm90aGVyIHdheSB0byBkZXRlcm1pbmUgaWYgdGhlIGNh
bGwgaXMgZnJvbSB0aGUgaW5wdXQgbWV0aG9kLgorICAgIC8vIC0gSWYgaXQncyBmcm9tIG5vcm1h
bCBrZXkgZXZlbnQgcHJvY2Vzc2luZyAoaW5jbHVkaW5nIGtleSBiaW5kaW5ncyksIHdlIHNhdmUg
dGhlIGFjdGlvbiB0byBwZXJmb3JtIGl0IGxhdGVyLgorICAgIC8vIC0gSWYgaXQncyBmcm9tIGFu
IGlucHV0IG1ldGhvZCwgdGhlbiB3ZSBzaG91bGQgZ28gYWhlYWQgYW5kIGluc2VydCB0aGUgdGV4
dCBub3cuCiAgICAgLy8gLSBJZiBpdCdzIHNlbnQgb3V0c2lkZSBvZiBrZXlib2FyZCBldmVudCBw
cm9jZXNzaW5nIChlLmcuIGZyb20gQ2hhcmFjdGVyIFZpZXdlciwgb3Igd2hlbiBjb25maXJtaW5n
IGFuIGlubGluZSBpbnB1dCBhcmVhIHdpdGggYSBtb3VzZSksCiAgICAgLy8gdGhlbiB3ZSBhbHNv
IGV4ZWN1dGUgaXQgaW1tZWRpYXRlbHksIGFzIHRoZXJlIHdpbGwgYmUgbm8gb3RoZXIgY2hhbmNl
LgotICAgIGlmIChwYXJhbWV0ZXJzICYmICFpc0Zyb21JbnB1dE1ldGhvZCkgewotICAgICAgICAv
LyBGSVhNRTogSGFuZGxlIHJlcGxhY2VtZW50UmFuZ2UgaW4gdGhpcyBjYXNlLCB0b28uIEl0J3Mg
a25vd24gdG8gb2NjdXIgaW4gcHJhY3RpY2Ugd2hlbiBjYW5jZWxpbmcgUHJlc3MgYW5kIEhvbGQg
KHNlZSA8cmRhcjovLzExOTQwNjcwPikuCisgICAgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4qIGtl
eXByZXNzQ29tbWFuZHMgPSBfZGF0YS0+X2NvbGxlY3RlZEtleXByZXNzQ29tbWFuZHM7CisgICAg
aWYgKGtleXByZXNzQ29tbWFuZHMpIHsKICAgICAgICAgQVNTRVJUKHJlcGxhY2VtZW50UmFuZ2Uu
bG9jYXRpb24gPT0gTlNOb3RGb3VuZCk7CiAgICAgICAgIEtleXByZXNzQ29tbWFuZCBjb21tYW5k
KCJpbnNlcnRUZXh0OiIsIHRleHQpOwotICAgICAgICBwYXJhbWV0ZXJzLT5jb21tYW5kcy0+YXBw
ZW5kKGNvbW1hbmQpOworICAgICAgICBrZXlwcmVzc0NvbW1hbmRzLT5hcHBlbmQoY29tbWFuZCk7
CisgICAgICAgIExPRyhUZXh0SW5wdXQsICIuLi5zdG9yZWQiKTsKICAgICAgICAgX2RhdGEtPl9w
YWdlLT5yZWdpc3RlcktleXByZXNzQ29tbWFuZE5hbWUoY29tbWFuZC5jb21tYW5kTmFtZSk7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBTdHJpbmcgZXZlbnRUZXh0ID0gdGV4dDsKICAg
ICBldmVudFRleHQucmVwbGFjZShOU0JhY2tUYWJDaGFyYWN0ZXIsIE5TVGFiQ2hhcmFjdGVyKTsg
Ly8gc2FtZSB0aGluZyBpcyBkb25lIGluIEtleUV2ZW50TWFjLm1tIGluIFdlYkNvcmUKLSAgICBi
b29sIGV2ZW50SGFuZGxlZDsKICAgICBpZiAoIWRpY3RhdGlvbkFsdGVybmF0aXZlcy5pc0VtcHR5
KCkpCi0gICAgICAgIGV2ZW50SGFuZGxlZCA9IF9kYXRhLT5fcGFnZS0+aW5zZXJ0RGljdGF0ZWRU
ZXh0KGV2ZW50VGV4dCwgcmVwbGFjZW1lbnRSYW5nZSwgZGljdGF0aW9uQWx0ZXJuYXRpdmVzKTsK
KyAgICAgICAgX2RhdGEtPl9wYWdlLT5pbnNlcnREaWN0YXRlZFRleHRBc3luYyhldmVudFRleHQs
IHJlcGxhY2VtZW50UmFuZ2UsIGRpY3RhdGlvbkFsdGVybmF0aXZlcyk7CiAgICAgZWxzZQotICAg
ICAgICBldmVudEhhbmRsZWQgPSBfZGF0YS0+X3BhZ2UtPmluc2VydFRleHQoZXZlbnRUZXh0LCBy
ZXBsYWNlbWVudFJhbmdlKTsKLQotICAgIGlmIChwYXJhbWV0ZXJzKQotICAgICAgICBwYXJhbWV0
ZXJzLT5ldmVudEludGVycHJldGF0aW9uSGFkU2lkZUVmZmVjdHMgfD0gZXZlbnRIYW5kbGVkOwor
ICAgICAgICBfZGF0YS0+X3BhZ2UtPmluc2VydFRleHRBc3luYyhldmVudFRleHQsIHJlcGxhY2Vt
ZW50UmFuZ2UpOwogfQogCi0tIChCT09MKXBlcmZvcm1LZXlFcXVpdmFsZW50OihOU0V2ZW50ICop
ZXZlbnQKKy0gKHZvaWQpc2VsZWN0ZWRSYW5nZVdpdGhDb21wbGV0aW9uSGFuZGxlcjoodm9pZChe
KShOU1JhbmdlIHNlbGVjdGVkUmFuZ2UpKWNvbXBsZXRpb25IYW5kbGVyUHRyCiB7Ci0gICAgLy8g
VGhlcmUncyBhIGNoYW5jZSB0aGF0IHJlc3BvbmRpbmcgdG8gdGhpcyBldmVudCB3aWxsIHJ1biBh
IG5lc3RlZCBldmVudCBsb29wLCBhbmQKLSAgICAvLyBmZXRjaGluZyBhIG5ldyBldmVudCBtaWdo
dCByZWxlYXNlIHRoZSBvbGQgb25lLiBSZXRhaW5pbmcgYW5kIHRoZW4gYXV0b3JlbGVhc2luZwot
ICAgIC8vIHRoZSBjdXJyZW50IGV2ZW50IHByZXZlbnRzIHRoYXQgZnJvbSBjYXVzaW5nIGEgcHJv
YmxlbSBpbnNpZGUgV2ViS2l0IG9yIEFwcEtpdCBjb2RlLgotICAgIFtbZXZlbnQgcmV0YWluXSBh
dXRvcmVsZWFzZV07CisgICAgUmV0YWluUHRyPGlkPiBjb21wbGV0aW9uSGFuZGxlciA9IGFkb3B0
TlMoW2NvbXBsZXRpb25IYW5kbGVyUHRyIGNvcHldKTsKIAotICAgIC8vIFdlIGdldCBFc2Mga2V5
IGhlcmUgYWZ0ZXIgcHJvY2Vzc2luZyBlaXRoZXIgRXNjIG9yIENtZCtwZXJpb2QuIFRoZSBmb3Jt
ZXIgc3RhcnRzIGFzIGEga2V5RG93biwgYW5kIHRoZSBsYXR0ZXIgc3RhcnRzIGFzIGEga2V5IGVx
dWl2YWxlbnQsCi0gICAgLy8gYnV0IGJvdGggZ2V0IHRyYW5zZm9ybWVkIHRvIGEgY2FuY2VsT3Bl
cmF0aW9uOiBjb21tYW5kLCBleGVjdXRpbmcgd2hpY2ggcGFzc2VzIGFuIEVzYyBrZXkgZXZlbnQg
dG8gLXBlcmZvcm1LZXlFcXVpdmFsZW50Oi4KLSAgICAvLyBEb24ndCBpbnRlcnByZXQgdGhpcyBl
dmVudCBhZ2FpbiwgYXZvaWRpbmcgcmUtZW50cmFuY3kgYW5kIGluZmluaXRlIGxvb3BzLgotICAg
IGlmIChbW2V2ZW50IGNoYXJhY3RlcnNJZ25vcmluZ01vZGlmaWVyc10gaXNFcXVhbFRvU3RyaW5n
OkAiXGUiXSAmJiAhKFtldmVudCBtb2RpZmllckZsYWdzXSAmIE5TRGV2aWNlSW5kZXBlbmRlbnRN
b2RpZmllckZsYWdzTWFzaykpCi0gICAgICAgIHJldHVybiBbc3VwZXIgcGVyZm9ybUtleUVxdWl2
YWxlbnQ6ZXZlbnRdOworICAgIExPRyhUZXh0SW5wdXQsICJzZWxlY3RlZFJhbmdlIik7CisgICAg
X2RhdGEtPl9wYWdlLT5nZXRTZWxlY3RlZFJhbmdlQXN5bmMoRWRpdGluZ1JhbmdlQ2FsbGJhY2s6
OmNyZWF0ZShbY29tcGxldGlvbkhhbmRsZXJdKGJvb2wgZXJyb3IsIGNvbnN0IEVkaXRpbmdSYW5n
ZSYgZWRpdGluZ1JhbmdlUmVzdWx0KSB7CisgICAgICAgIHZvaWQgKF5jb21wbGV0aW9uSGFuZGxl
ckJsb2NrKShOU1JhbmdlKSA9ICh2b2lkICheKShOU1JhbmdlKSljb21wbGV0aW9uSGFuZGxlci5n
ZXQoKTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBMT0coVGV4dElucHV0LCAi
ICAgIC4uLnNlbGVjdGVkUmFuZ2UgZmFpbGVkLiIpOworICAgICAgICAgICAgY29tcGxldGlvbkhh
bmRsZXJCbG9jayhOU01ha2VSYW5nZShOU05vdEZvdW5kLCAwKSk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKyAgICAgICAgTlNSYW5nZSByZXN1bHQgPSBlZGl0aW5nUmFuZ2VSZXN1
bHQ7CisgICAgICAgIGlmIChyZXN1bHQubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkKKyAgICAgICAg
ICAgIExPRyhUZXh0SW5wdXQsICIgICAgLT4gc2VsZWN0ZWRSYW5nZSByZXR1cm5lZCAoTlNOb3RG
b3VuZCwgJWxsdSkiLCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
TE9HKFRleHRJbnB1dCwgIiAgICAtPiBzZWxlY3RlZFJhbmdlIHJldHVybmVkICglbGx1LCAlbGx1
KSIsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGNvbXBsZXRpb25I
YW5kbGVyQmxvY2socmVzdWx0KTsKKyAgICB9KSk7Cit9CiAKLSAgICAvLyBJZiB3ZSBhcmUgYWxy
ZWFkeSByZS1zZW5kaW5nIHRoZSBldmVudCwgdGhlbiBXZWJDb3JlIGhhcyBhbHJlYWR5IHNlZW4g
aXQsIG5vIG5lZWQgZm9yIGN1c3RvbSBwcm9jZXNzaW5nLgotICAgIEJPT0wgZXZlbnRXYXNTZW50
VG9XZWJDb3JlID0gKF9kYXRhLT5fa2V5RG93bkV2ZW50QmVpbmdSZXNlbnQgPT0gZXZlbnQpOwot
ICAgIGlmIChldmVudFdhc1NlbnRUb1dlYkNvcmUpCi0gICAgICAgIHJldHVybiBbc3VwZXIgcGVy
Zm9ybUtleUVxdWl2YWxlbnQ6ZXZlbnRdOworLSAodm9pZCltYXJrZWRSYW5nZVdpdGhDb21wbGV0
aW9uSGFuZGxlcjoodm9pZCheKShOU1JhbmdlIG1hcmtlZFJhbmdlKSljb21wbGV0aW9uSGFuZGxl
clB0cgoreworICAgIFJldGFpblB0cjxpZD4gY29tcGxldGlvbkhhbmRsZXIgPSBhZG9wdE5TKFtj
b21wbGV0aW9uSGFuZGxlclB0ciBjb3B5XSk7CiAKLSAgICBBU1NFUlQoZXZlbnQgPT0gW05TQXBw
IGN1cnJlbnRFdmVudF0pOworICAgIExPRyhUZXh0SW5wdXQsICJtYXJrZWRSYW5nZSIpOworICAg
IF9kYXRhLT5fcGFnZS0+Z2V0TWFya2VkUmFuZ2VBc3luYyhFZGl0aW5nUmFuZ2VDYWxsYmFjazo6
Y3JlYXRlKFtjb21wbGV0aW9uSGFuZGxlcl0oYm9vbCBlcnJvciwgY29uc3QgRWRpdGluZ1Jhbmdl
JiBlZGl0aW5nUmFuZ2VSZXN1bHQpIHsKKyAgICAgICAgdm9pZCAoXmNvbXBsZXRpb25IYW5kbGVy
QmxvY2spKE5TUmFuZ2UpID0gKHZvaWQgKF4pKE5TUmFuZ2UpKWNvbXBsZXRpb25IYW5kbGVyLmdl
dCgpOworICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIExPRyhUZXh0SW5wdXQsICIg
ICAgLi4ubWFya2VkUmFuZ2UgZmFpbGVkLiIpOworICAgICAgICAgICAgY29tcGxldGlvbkhhbmRs
ZXJCbG9jayhOU01ha2VSYW5nZShOU05vdEZvdW5kLCAwKSk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICAgICAgTlNSYW5nZSByZXN1bHQgPSBlZGl0aW5nUmFuZ2VSZXN1bHQ7
CisgICAgICAgIGlmIChyZXN1bHQubG9jYXRpb24gPT0gTlNOb3RGb3VuZCkKKyAgICAgICAgICAg
IExPRyhUZXh0SW5wdXQsICIgICAgLT4gbWFya2VkUmFuZ2UgcmV0dXJuZWQgKE5TTm90Rm91bmQs
ICVsbHUpIiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPRyhU
ZXh0SW5wdXQsICIgICAgLT4gbWFya2VkUmFuZ2UgcmV0dXJuZWQgKCVsbHUsICVsbHUpIiwgcmVz
dWx0LmxvY2F0aW9uLCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXJC
bG9jayhyZXN1bHQpOworICAgIH0pKTsKK30KIAotICAgIFtzZWxmIF9kaXNhYmxlQ29tcGxleFRl
eHRJbnB1dElmTmVjZXNzYXJ5XTsKKy0gKHZvaWQpaGFzTWFya2VkVGV4dFdpdGhDb21wbGV0aW9u
SGFuZGxlcjoodm9pZCheKShCT09MIGhhc01hcmtlZFRleHQpKWNvbXBsZXRpb25IYW5kbGVyUHRy
Cit7CisgICAgUmV0YWluUHRyPGlkPiBjb21wbGV0aW9uSGFuZGxlciA9IGFkb3B0TlMoW2NvbXBs
ZXRpb25IYW5kbGVyUHRyIGNvcHldKTsKIAotICAgIC8vIFBhc3Mga2V5IGNvbWJvcyB0aHJvdWdo
IFdlYkNvcmUgaWYgdGhlcmUgaXMgYSBrZXkgYmluZGluZyBhdmFpbGFibGUgZm9yCi0gICAgLy8g
dGhpcyBldmVudC4gVGhpcyBsZXRzIHdlYiBwYWdlcyBoYXZlIGEgY3JhY2sgYXQgaW50ZXJjZXB0
aW5nIGtleS1tb2RpZmllZCBrZXlwcmVzc2VzLgotICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhlIGZp
cnN0UmVzcG9uZGVyIGNoZWNrIG5lZWRlZD8KLSAgICBpZiAoc2VsZiA9PSBbW3NlbGYgd2luZG93
XSBmaXJzdFJlc3BvbmRlcl0pIHsKLSAgICAgICAgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4gY29t
bWFuZHM7Ci0gICAgICAgIEJPT0wgaGFuZGxlZEJ5SW5wdXRNZXRob2QgPSBbc2VsZiBfaW50ZXJw
cmV0S2V5RXZlbnQ6ZXZlbnQgc2F2aW5nQ29tbWFuZHNUbzpjb21tYW5kc107Ci0gICAgICAgIF9k
YXRhLT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRpdmVXZWJLZXlib2FyZEV2ZW50KGV2
ZW50LCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29tbWFuZHMpKTsKLSAgICAgICAgcmV0dXJuIFlF
UzsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtzdXBlciBwZXJmb3JtS2V5RXF1aXZhbGVudDpl
dmVudF07CisgICAgTE9HKFRleHRJbnB1dCwgImhhc01hcmtlZFRleHQiKTsKKyAgICBfZGF0YS0+
X3BhZ2UtPmdldE1hcmtlZFJhbmdlQXN5bmMoRWRpdGluZ1JhbmdlQ2FsbGJhY2s6OmNyZWF0ZShb
Y29tcGxldGlvbkhhbmRsZXJdKGJvb2wgZXJyb3IsIGNvbnN0IEVkaXRpbmdSYW5nZSYgZWRpdGlu
Z1JhbmdlUmVzdWx0KSB7CisgICAgICAgIHZvaWQgKF5jb21wbGV0aW9uSGFuZGxlckJsb2NrKShC
T09MKSA9ICh2b2lkICheKShCT09MKSljb21wbGV0aW9uSGFuZGxlci5nZXQoKTsKKyAgICAgICAg
aWYgKGVycm9yKSB7CisgICAgICAgICAgICBMT0coVGV4dElucHV0LCAiICAgIC4uLmhhc01hcmtl
ZFRleHQgZmFpbGVkLiIpOworICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXJCbG9jayhOTyk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQk9PTCBoYXNNYXJrZWRU
ZXh0ID0gZWRpdGluZ1JhbmdlUmVzdWx0LmxvY2F0aW9uICE9IG5vdEZvdW5kOworICAgICAgICBM
T0coVGV4dElucHV0LCAiICAgIC0+IGhhc01hcmtlZFRleHQgcmV0dXJuZWQgJXUiLCBoYXNNYXJr
ZWRUZXh0KTsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXJCbG9jayhoYXNNYXJrZWRUZXh0KTsK
KyAgICB9KSk7CiB9CiAKLS0gKHZvaWQpa2V5VXA6KE5TRXZlbnQgKil0aGVFdmVudAorLSAodm9p
ZClhdHRyaWJ1dGVkU3Vic3RyaW5nRm9yUHJvcG9zZWRSYW5nZTooTlNSYW5nZSluc1JhbmdlIGNv
bXBsZXRpb25IYW5kbGVyOih2b2lkKF4pKE5TQXR0cmlidXRlZFN0cmluZyAqYXR0clN0cmluZywg
TlNSYW5nZSBhY3R1YWxSYW5nZSkpY29tcGxldGlvbkhhbmRsZXJQdHIKIHsKLSAgICBMT0coVGV4
dElucHV0LCAia2V5VXA6JXAgJUAiLCB0aGVFdmVudCwgdGhlRXZlbnQpOwotICAgIC8vIFdlIGRv
bid0IGludGVycHJldCB0aGUga2V5VXAgZXZlbnQsIGFzIHRoaXMgYnJlYWtzIGtleSBiaW5kaW5n
cyAoc2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMTAwPiku
Ci0gICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVLZXlib2FyZEV2ZW50KE5hdGl2ZVdlYktleWJvYXJk
RXZlbnQodGhlRXZlbnQsIGZhbHNlLCBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPigpKSk7CisgICAg
UmV0YWluUHRyPGlkPiBjb21wbGV0aW9uSGFuZGxlciA9IGFkb3B0TlMoW2NvbXBsZXRpb25IYW5k
bGVyUHRyIGNvcHldKTsKKworICAgIExPRyhUZXh0SW5wdXQsICJhdHRyaWJ1dGVkU3Vic3RyaW5n
RnJvbVJhbmdlOigldSwgJXUpIiwgbnNSYW5nZS5sb2NhdGlvbiwgbnNSYW5nZS5sZW5ndGgpOwor
ICAgIF9kYXRhLT5fcGFnZS0+YXR0cmlidXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQXN5
bmMobnNSYW5nZSwgQXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s6OmNy
ZWF0ZShbY29tcGxldGlvbkhhbmRsZXJdKGJvb2wgZXJyb3IsIGNvbnN0IEF0dHJpYnV0ZWRTdHJp
bmcmIHN0cmluZywgY29uc3QgRWRpdGluZ1JhbmdlJiBhY3R1YWxSYW5nZSkgeworICAgICAgICB2
b2lkICheY29tcGxldGlvbkhhbmRsZXJCbG9jaykoTlNBdHRyaWJ1dGVkU3RyaW5nICosIE5TUmFu
Z2UpID0gKHZvaWQgKF4pKE5TQXR0cmlidXRlZFN0cmluZyAqLCBOU1JhbmdlKSljb21wbGV0aW9u
SGFuZGxlci5nZXQoKTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBMT0coVGV4
dElucHV0LCAiICAgIC4uLmF0dHJpYnV0ZWRTdWJzdHJpbmdGcm9tUmFuZ2UgZmFpbGVkLiIpOwor
ICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXJCbG9jaygwLCBOU01ha2VSYW5nZShOU05vdEZv
dW5kLCAwKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTE9HKFRl
eHRJbnB1dCwgIiAgICAtPiBhdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlIHJldHVybmVkICVA
IiwgW3N0cmluZy5zdHJpbmcuZ2V0KCkgc3RyaW5nXSk7CisgICAgICAgIGNvbXBsZXRpb25IYW5k
bGVyQmxvY2soW1tzdHJpbmcuc3RyaW5nLmdldCgpIHJldGFpbl0gYXV0b3JlbGVhc2VdLCBhY3R1
YWxSYW5nZSk7CisgICAgfSkpOwogfQogCi0tICh2b2lkKV9kaXNhYmxlQ29tcGxleFRleHRJbnB1
dElmTmVjZXNzYXJ5CistICh2b2lkKWZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlOihOU1Jhbmdl
KXRoZVJhbmdlIGNvbXBsZXRpb25IYW5kbGVyOih2b2lkKF4pKE5TUmVjdCBmaXJzdFJlY3QsIE5T
UmFuZ2UgYWN0dWFsUmFuZ2UpKWNvbXBsZXRpb25IYW5kbGVyUHRyCiB7Ci0gICAgaWYgKCFfZGF0
YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRJZGVudGlmaWVyKQotICAgICAgICByZXR1cm47Cisg
ICAgUmV0YWluUHRyPGlkPiBjb21wbGV0aW9uSGFuZGxlciA9IGFkb3B0TlMoW2NvbXBsZXRpb25I
YW5kbGVyUHRyIGNvcHldKTsKIAotICAgIGlmIChfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5w
dXRTdGF0ZSAhPSBQbHVnaW5Db21wbGV4VGV4dElucHV0RW5hYmxlZCkKLSAgICAgICAgcmV0dXJu
OworICAgIExPRyhUZXh0SW5wdXQsICJmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZTooJXUsICV1
KSIsIHRoZVJhbmdlLmxvY2F0aW9uLCB0aGVSYW5nZS5sZW5ndGgpOwogCi0gICAgLy8gQ2hlY2sg
aWYgdGhlIHRleHQgaW5wdXQgd2luZG93IGhhcyBiZWVuIGRpc21pc3NlZC4KLSAgICBpZiAoIVtb
V0tUZXh0SW5wdXRXaW5kb3dDb250cm9sbGVyIHNoYXJlZFRleHRJbnB1dFdpbmRvd0NvbnRyb2xs
ZXJdIGhhc01hcmtlZFRleHRdKQotICAgICAgICBbc2VsZiBfc2V0UGx1Z2luQ29tcGxleFRleHRJ
bnB1dFN0YXRlOlBsdWdpbkNvbXBsZXhUZXh0SW5wdXREaXNhYmxlZF07CisgICAgLy8gSnVzdCB0
byBtYXRjaCBOU1RleHRWaWV3J3MgYmVoYXZpb3IuIFJlZ3Jlc3Npb24gdGVzdHMgY2Fubm90IGRl
dGVjdCB0aGlzOworICAgIC8vIHRvIHJlcHJvZHVjZSwgdXNlIGEgdGVzdCBhcHBsaWNhdGlvbiBm
cm9tIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2ODIKKyAgICAvLyAo
dHlwZSBzb21ldGhpbmc7IHRyeSByYW5nZXMgKDEsIC0xKSBhbmQgKDIsIC0xKS4KKyAgICBpZiAo
KHRoZVJhbmdlLmxvY2F0aW9uICsgdGhlUmFuZ2UubGVuZ3RoIDwgdGhlUmFuZ2UubG9jYXRpb24p
ICYmICh0aGVSYW5nZS5sb2NhdGlvbiArIHRoZVJhbmdlLmxlbmd0aCAhPSAwKSkKKyAgICAgICAg
dGhlUmFuZ2UubGVuZ3RoID0gMDsKKworICAgIF9kYXRhLT5fcGFnZS0+Zmlyc3RSZWN0Rm9yQ2hh
cmFjdGVyUmFuZ2VBc3luYyh0aGVSYW5nZSwgUmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s6
OmNyZWF0ZShbc2VsZiwgY29tcGxldGlvbkhhbmRsZXJdKGJvb2wgZXJyb3IsIGNvbnN0IEludFJl
Y3QmIHJlY3QsIGNvbnN0IEVkaXRpbmdSYW5nZSYgYWN0dWFsUmFuZ2UpIHsKKyAgICAgICAgdm9p
ZCAoXmNvbXBsZXRpb25IYW5kbGVyQmxvY2spKE5TUmVjdCwgTlNSYW5nZSkgPSAodm9pZCAoXiko
TlNSZWN0LCBOU1JhbmdlKSljb21wbGV0aW9uSGFuZGxlci5nZXQoKTsKKyAgICAgICAgaWYgKGVy
cm9yKSB7CisgICAgICAgICAgICBMT0coVGV4dElucHV0LCAiICAgIC4uLmZpcnN0UmVjdEZvckNo
YXJhY3RlclJhbmdlIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyQmxv
Y2soTlNNYWtlUmVjdCgwLCAwLCAwLCAwKSwgTlNNYWtlUmFuZ2UoTlNOb3RGb3VuZCwgMCkpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTlNSZWN0IHJlc3VsdFJl
Y3QgPSBbc2VsZiBjb252ZXJ0UmVjdDpyZWN0IHRvVmlldzpuaWxdOworICAgICAgICByZXN1bHRS
ZWN0ID0gW3NlbGYud2luZG93IGNvbnZlcnRSZWN0VG9TY3JlZW46cmVzdWx0UmVjdF07CisKKyAg
ICAgICAgTE9HKFRleHRJbnB1dCwgIiAgICAtPiBmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZSBy
ZXR1cm5lZCAoJWYsICVmLCAlZiwgJWYpIiwgcmVzdWx0UmVjdC5vcmlnaW4ueCwgcmVzdWx0UmVj
dC5vcmlnaW4ueSwgcmVzdWx0UmVjdC5zaXplLndpZHRoLCByZXN1bHRSZWN0LnNpemUuaGVpZ2h0
KTsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXJCbG9jayhyZXN1bHRSZWN0LCBhY3R1YWxSYW5n
ZSk7CisgICAgfSkpOwogfQogCi0tIChCT09MKV9oYW5kbGVQbHVnaW5Db21wbGV4VGV4dElucHV0
S2V5RG93bjooTlNFdmVudCAqKWV2ZW50CistICh2b2lkKWNoYXJhY3RlckluZGV4Rm9yUG9pbnQ6
KE5TUG9pbnQpdGhlUG9pbnQgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQoXikoTlNVSW50ZWdlcikp
Y29tcGxldGlvbkhhbmRsZXJQdHIKIHsKLSAgICBBU1NFUlQoX2RhdGEtPl9wbHVnaW5Db21wbGV4
VGV4dElucHV0SWRlbnRpZmllcik7Ci0gICAgQVNTRVJUKF9kYXRhLT5fcGx1Z2luQ29tcGxleFRl
eHRJbnB1dFN0YXRlICE9IFBsdWdpbkNvbXBsZXhUZXh0SW5wdXREaXNhYmxlZCk7CisgICAgUmV0
YWluUHRyPGlkPiBjb21wbGV0aW9uSGFuZGxlciA9IGFkb3B0TlMoW2NvbXBsZXRpb25IYW5kbGVy
UHRyIGNvcHldKTsKIAotICAgIEJPT0wgdXNpbmdMZWdhY3lDb2NvYVRleHRJbnB1dCA9IF9kYXRh
LT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dFN0YXRlID09IFBsdWdpbkNvbXBsZXhUZXh0SW5wdXRF
bmFibGVkTGVnYWN5OwotCi0gICAgTlNTdHJpbmcgKnN0cmluZyA9IG5pbDsKLSAgICBCT09MIGRp
ZEhhbmRsZUV2ZW50ID0gW1tXS1RleHRJbnB1dFdpbmRvd0NvbnRyb2xsZXIgc2hhcmVkVGV4dElu
cHV0V2luZG93Q29udHJvbGxlcl0gaW50ZXJwcmV0S2V5RXZlbnQ6ZXZlbnQgdXNpbmdMZWdhY3lD
b2NvYVRleHRJbnB1dDp1c2luZ0xlZ2FjeUNvY29hVGV4dElucHV0IHN0cmluZzomc3RyaW5nXTsK
KyAgICBMT0coVGV4dElucHV0LCAiY2hhcmFjdGVySW5kZXhGb3JQb2ludDooJWYsICVmKSIsIHRo
ZVBvaW50LngsIHRoZVBvaW50LnkpOwogCi0gICAgaWYgKHN0cmluZykgewotICAgICAgICBfZGF0
YS0+X3BhZ2UtPnNlbmRDb21wbGV4VGV4dElucHV0VG9QbHVnaW4oX2RhdGEtPl9wbHVnaW5Db21w
bGV4VGV4dElucHV0SWRlbnRpZmllciwgc3RyaW5nKTsKKyAgICBOU1dpbmRvdyAqd2luZG93ID0g
W3NlbGYgd2luZG93XTsKIAotICAgICAgICBpZiAoIXVzaW5nTGVnYWN5Q29jb2FUZXh0SW5wdXQp
Ci0gICAgICAgICAgICBfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSA9IFBsdWdp
bkNvbXBsZXhUZXh0SW5wdXREaXNhYmxlZDsKLSAgICB9CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0
aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1k
ZWNsYXJhdGlvbnMiCisgICAgaWYgKHdpbmRvdykKKyAgICAgICAgdGhlUG9pbnQgPSBbd2luZG93
IGNvbnZlcnRTY3JlZW5Ub0Jhc2U6dGhlUG9pbnRdOworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGlj
IHBvcAorICAgIHRoZVBvaW50ID0gW3NlbGYgY29udmVydFBvaW50OnRoZVBvaW50IGZyb21WaWV3
Om5pbF07ICAvLyB0aGUgcG9pbnQgaXMgcmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUKIAotICAg
IHJldHVybiBkaWRIYW5kbGVFdmVudDsKKyAgICBfZGF0YS0+X3BhZ2UtPmNoYXJhY3RlckluZGV4
Rm9yUG9pbnRBc3luYyhJbnRQb2ludCh0aGVQb2ludCksIFVuc2lnbmVkQ2FsbGJhY2s6OmNyZWF0
ZShbY29tcGxldGlvbkhhbmRsZXJdKGJvb2wgZXJyb3IsIHVpbnQ2NF90IHJlc3VsdCkgeworICAg
ICAgICB2b2lkICheY29tcGxldGlvbkhhbmRsZXJCbG9jaykoTlNVSW50ZWdlcikgPSAodm9pZCAo
XikoTlNVSW50ZWdlcikpY29tcGxldGlvbkhhbmRsZXIuZ2V0KCk7CisgICAgICAgIGlmIChlcnJv
cikgeworICAgICAgICAgICAgTE9HKFRleHRJbnB1dCwgIiAgICAuLi5jaGFyYWN0ZXJJbmRleEZv
clBvaW50IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyQmxvY2soMCk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBu
b3RGb3VuZCkKKyAgICAgICAgICAgIHJlc3VsdCA9IE5TTm90Rm91bmQ7CisgICAgICAgIExPRyhU
ZXh0SW5wdXQsICIgICAgLT4gY2hhcmFjdGVySW5kZXhGb3JQb2ludCByZXR1cm5lZCAlbHUiLCBy
ZXN1bHQpOworICAgICAgICBjb21wbGV0aW9uSGFuZGxlckJsb2NrKHJlc3VsdCk7CisgICAgfSkp
OwogfQogCi0tIChCT09MKV90cnlIYW5kbGVQbHVnaW5Db21wbGV4VGV4dElucHV0S2V5RG93bjoo
TlNFdmVudCAqKWV2ZW50CistIChOU1RleHRJbnB1dENvbnRleHQgKilpbnB1dENvbnRleHQKIHsK
LSAgICBpZiAoIV9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dElkZW50aWZpZXIgfHwgX2Rh
dGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgPT0gUGx1Z2luQ29tcGxleFRleHRJbnB1
dERpc2FibGVkKQotICAgICAgICByZXR1cm4gTk87CisgICAgYm9vbCBjb2xsZWN0aW5nS2V5cHJl
c3NDb21tYW5kcyA9IF9kYXRhLT5fY29sbGVjdGVkS2V5cHJlc3NDb21tYW5kczsKIAotICAgIC8v
IENoZWNrIGlmIHRoZSB0ZXh0IGlucHV0IHdpbmRvdyBoYXMgYmVlbiBkaXNtaXNzZWQgYW5kIGxl
dCB0aGUgcGx1Zy1pbiBwcm9jZXNzIGtub3cuCi0gICAgLy8gVGhpcyBpcyBvbmx5IHZhbGlkIHdp
dGggdGhlIHVwZGF0ZWQgQ29jb2EgdGV4dCBpbnB1dCBzcGVjLgotICAgIFtzZWxmIF9kaXNhYmxl
Q29tcGxleFRleHRJbnB1dElmTmVjZXNzYXJ5XTsKKyAgICBpZiAoX2RhdGEtPl9wbHVnaW5Db21w
bGV4VGV4dElucHV0SWRlbnRpZmllciAmJiAhY29sbGVjdGluZ0tleXByZXNzQ29tbWFuZHMpCisg
ICAgICAgIHJldHVybiBbW1dLVGV4dElucHV0V2luZG93Q29udHJvbGxlciBzaGFyZWRUZXh0SW5w
dXRXaW5kb3dDb250cm9sbGVyXSBpbnB1dENvbnRleHRdOwogCi0gICAgLy8gVHJ5IGZlZWRpbmcg
dGhlIGtleWJvYXJkIGV2ZW50IGRpcmVjdGx5IHRvIHRoZSBwbHVnLWluLgotICAgIGlmIChfZGF0
YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSA9PSBQbHVnaW5Db21wbGV4VGV4dElucHV0
RW5hYmxlZExlZ2FjeSkKLSAgICAgICAgcmV0dXJuIFtzZWxmIF9oYW5kbGVQbHVnaW5Db21wbGV4
VGV4dElucHV0S2V5RG93bjpldmVudF07CisgICAgLy8gRGlzYWJsZSB0ZXh0IGlucHV0IG1hY2hp
bmVyeSB3aGVuIGluIG5vbi1lZGl0YWJsZSBjb250ZW50LiBBbiBpbnZpc2libGUgaW5saW5lIGlu
cHV0IGFyZWEgYWZmZWN0cyBwZXJmb3JtYW5jZSwgYW5kIGNhbiBwcmV2ZW50IEV4cG9zZSBmcm9t
IHdvcmtpbmcuCisgICAgaWYgKCFfZGF0YS0+X3BhZ2UtPmVkaXRvclN0YXRlKCkuaXNDb250ZW50
RWRpdGFibGUpCisgICAgICAgIHJldHVybiBuaWw7CiAKLSAgICByZXR1cm4gTk87CisgICAgcmV0
dXJuIFtzdXBlciBpbnB1dENvbnRleHRdOwogfQogCi0tICh2b2lkKWtleURvd246KE5TRXZlbnQg
Kil0aGVFdmVudAorLSAodm9pZCl1bm1hcmtUZXh0CiB7Ci0gICAgTE9HKFRleHRJbnB1dCwgImtl
eURvd246JXAgJUAlcyIsIHRoZUV2ZW50LCB0aGVFdmVudCwgKHRoZUV2ZW50ID09IF9kYXRhLT5f
a2V5RG93bkV2ZW50QmVpbmdSZXNlbnQpID8gIiAocmUtc2VudCkiIDogIiIpOworICAgIExPRyhU
ZXh0SW5wdXQsICJ1bm1hcmtUZXh0Iik7CiAKLSAgICAvLyBUaGVyZSdzIGEgY2hhbmNlIHRoYXQg
cmVzcG9uZGluZyB0byB0aGlzIGV2ZW50IHdpbGwgcnVuIGEgbmVzdGVkIGV2ZW50IGxvb3AsIGFu
ZAotICAgIC8vIGZldGNoaW5nIGEgbmV3IGV2ZW50IG1pZ2h0IHJlbGVhc2UgdGhlIG9sZCBvbmUu
IFJldGFpbmluZyBhbmQgdGhlbiBhdXRvcmVsZWFzaW5nCi0gICAgLy8gdGhlIGN1cnJlbnQgZXZl
bnQgcHJldmVudHMgdGhhdCBmcm9tIGNhdXNpbmcgYSBwcm9ibGVtIGluc2lkZSBXZWJLaXQgb3Ig
QXBwS2l0IGNvZGUuCi0gICAgW1t0aGVFdmVudCByZXRhaW5dIGF1dG9yZWxlYXNlXTsKKyAgICBf
ZGF0YS0+X3BhZ2UtPmNvbmZpcm1Db21wb3NpdGlvbkFzeW5jKCk7Cit9CiAKLSAgICBpZiAoW3Nl
bGYgX3RyeUhhbmRsZVBsdWdpbkNvbXBsZXhUZXh0SW5wdXRLZXlEb3duOnRoZUV2ZW50XSkgewot
ICAgICAgICBMT0coVGV4dElucHV0LCAiLi4uaGFuZGxlZCBieSBwbHVnLWluIik7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9CistICh2b2lkKXNldE1hcmtlZFRleHQ6KGlkKXN0cmluZyBzZWxlY3Rl
ZFJhbmdlOihOU1JhbmdlKXNlbGVjdGVkUmFuZ2UgcmVwbGFjZW1lbnRSYW5nZTooTlNSYW5nZSly
ZXBsYWNlbWVudFJhbmdlCit7CisgICAgQk9PTCBpc0F0dHJpYnV0ZWRTdHJpbmcgPSBbc3RyaW5n
IGlzS2luZE9mQ2xhc3M6W05TQXR0cmlidXRlZFN0cmluZyBjbGFzc11dOworICAgIEFTU0VSVChp
c0F0dHJpYnV0ZWRTdHJpbmcgfHwgW3N0cmluZyBpc0tpbmRPZkNsYXNzOltOU1N0cmluZyBjbGFz
c11dKTsKKworICAgIExPRyhUZXh0SW5wdXQsICJzZXRNYXJrZWRUZXh0OlwiJUBcIiBzZWxlY3Rl
ZFJhbmdlOigldSwgJXUpIHJlcGxhY2VtZW50UmFuZ2U6KCV1LCAldSkiLCBpc0F0dHJpYnV0ZWRT
dHJpbmcgPyBbc3RyaW5nIHN0cmluZ10gOiBzdHJpbmcsIHNlbGVjdGVkUmFuZ2UubG9jYXRpb24s
IHNlbGVjdGVkUmFuZ2UubGVuZ3RoLCByZXBsYWNlbWVudFJhbmdlLmxvY2F0aW9uLCByZXBsYWNl
bWVudFJhbmdlLmxlbmd0aCk7CisKKyAgICBWZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+IHVu
ZGVybGluZXM7CisgICAgTlNTdHJpbmcgKnRleHQ7CisKKyAgICBpZiAoaXNBdHRyaWJ1dGVkU3Ry
aW5nKSB7CisgICAgICAgIC8vIEZJWE1FOiBXZSBpZ25vcmUgbW9zdCBhdHRyaWJ1dGVzIGZyb20g
dGhlIHN0cmluZywgc28gYW4gaW5wdXQgbWV0aG9kIGNhbm5vdCBzcGVjaWZ5IGUuZy4gYSBmb250
IG9yIGEgZ2x5cGggdmFyaWF0aW9uLgorICAgICAgICB0ZXh0ID0gW3N0cmluZyBzdHJpbmddOwor
ICAgICAgICBleHRyYWN0VW5kZXJsaW5lcyhzdHJpbmcsIHVuZGVybGluZXMpOworICAgIH0gZWxz
ZQorICAgICAgICB0ZXh0ID0gc3RyaW5nOworCisgICAgaWYgKF9kYXRhLT5faW5TZWN1cmVJbnB1
dFN0YXRlKSB7CisgICAgICAgIC8vIEluIHBhc3N3b3JkIGZpZWxkcywgd2Ugb25seSBhbGxvdyBB
U0NJSSBkZWFkIGtleXMsIGFuZCBkb24ndCBhbGxvdyBpbmxpbmUgaW5wdXQsIG1hdGNoaW5nIE5T
U2VjdXJlVGV4dElucHV0RmllbGQuCisgICAgICAgIC8vIEFsbG93aW5nIEFTQ0lJIGRlYWQga2V5
cyBpcyBuZWNlc3NhcnkgdG8gZW5hYmxlIGZ1bGwgUm9tYW4gaW5wdXQgd2hlbiB1c2luZyBhIFZp
ZXRuYW1lc2Uga2V5Ym9hcmQuCisgICAgICAgIEFTU0VSVCghX2RhdGEtPl9wYWdlLT5lZGl0b3JT
dGF0ZSgpLmhhc0NvbXBvc2l0aW9uKTsKKyAgICAgICAgW3NlbGYgX25vdGlmeUlucHV0Q29udGV4
dEFib3V0RGlzY2FyZGVkQ29tcG9zaXRpb25dOworICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IHN0b3JlIHRoZSBjb21tYW5kIHRvIGhhbmRsZSBpdCBhZnRlciBET00gZXZlbnQgcHJvY2Vzc2lu
ZywgYXMgaXQncyByZWd1bGFyIGtleWJvYXJkIGlucHV0IG5vdywgbm90IGEgY29tcG9zaXRpb24u
CisgICAgICAgIGlmIChbdGV4dCBsZW5ndGhdID09IDEgJiYgaXNBU0NJSShbdGV4dCBjaGFyYWN0
ZXJBdEluZGV4OjBdKSkKKyAgICAgICAgICAgIF9kYXRhLT5fcGFnZS0+aW5zZXJ0VGV4dEFzeW5j
KHRleHQsIHJlcGxhY2VtZW50UmFuZ2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOU0Jl
ZXAoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9kYXRhLT5fcGFnZS0+c2V0Q29t
cG9zaXRpb25Bc3luYyh0ZXh0LCB1bmRlcmxpbmVzLCBzZWxlY3RlZFJhbmdlLCByZXBsYWNlbWVu
dFJhbmdlKTsKK30KKworLy8gU3luY2hyb25vdXMgTlNUZXh0SW5wdXRDbGllbnQgaXMgc3RpbGwg
aW1wbGVtZW50ZWQgdG8gY2F0Y2ggc3B1cmlvdXMgc3luYyBjYWxscy4gUmVtb3ZlIHdoZW4gdGhh
dCBpcyBubyBsb25nZXIgbmVlZGVkLgorCistIChOU1JhbmdlKXNlbGVjdGVkUmFuZ2UgTk9fUkVU
VVJOX0RVRV9UT19BU1NFUlQKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1
cm4gTlNNYWtlUmFuZ2UoTlNOb3RGb3VuZCwgMCk7Cit9CisKKy0gKEJPT0wpaGFzTWFya2VkVGV4
dCBOT19SRVRVUk5fRFVFX1RPX0FTU0VSVAoreworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgIHJldHVybiBOTzsKK30KKworLSAoTlNSYW5nZSltYXJrZWRSYW5nZSBOT19SRVRVUk5fRFVF
X1RPX0FTU0VSVAoreworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBOU01h
a2VSYW5nZShOU05vdEZvdW5kLCAwKTsKK30KKworLSAoTlNBdHRyaWJ1dGVkU3RyaW5nICopYXR0
cmlidXRlZFN1YnN0cmluZ0ZvclByb3Bvc2VkUmFuZ2U6KE5TUmFuZ2UpbnNSYW5nZSBhY3R1YWxS
YW5nZTooTlNSYW5nZVBvaW50ZXIpYWN0dWFsUmFuZ2UgTk9fUkVUVVJOX0RVRV9UT19BU1NFUlQK
K3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gbmlsOworfQorCistIChO
U1VJbnRlZ2VyKWNoYXJhY3RlckluZGV4Rm9yUG9pbnQ6KE5TUG9pbnQpdGhlUG9pbnQgTk9fUkVU
VVJOX0RVRV9UT19BU1NFUlQKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1
cm4gMDsKK30KKworLSAoTlNSZWN0KWZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlOihOU1Jhbmdl
KXRoZVJhbmdlIGFjdHVhbFJhbmdlOihOU1JhbmdlUG9pbnRlcilhY3R1YWxSYW5nZSBOT19SRVRV
Uk5fRFVFX1RPX0FTU0VSVAoreyAKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1
cm4gTlNNYWtlUmVjdCgwLCAwLCAwLCAwKTsKK30KKworLSAoQk9PTClwZXJmb3JtS2V5RXF1aXZh
bGVudDooTlNFdmVudCAqKWV2ZW50Cit7CisgICAgLy8gVGhlcmUncyBhIGNoYW5jZSB0aGF0IHJl
c3BvbmRpbmcgdG8gdGhpcyBldmVudCB3aWxsIHJ1biBhIG5lc3RlZCBldmVudCBsb29wLCBhbmQK
KyAgICAvLyBmZXRjaGluZyBhIG5ldyBldmVudCBtaWdodCByZWxlYXNlIHRoZSBvbGQgb25lLiBS
ZXRhaW5pbmcgYW5kIHRoZW4gYXV0b3JlbGVhc2luZworICAgIC8vIHRoZSBjdXJyZW50IGV2ZW50
IHByZXZlbnRzIHRoYXQgZnJvbSBjYXVzaW5nIGEgcHJvYmxlbSBpbnNpZGUgV2ViS2l0IG9yIEFw
cEtpdCBjb2RlLgorICAgIFtbZXZlbnQgcmV0YWluXSBhdXRvcmVsZWFzZV07CisKKyAgICAvLyBX
ZSBnZXQgRXNjIGtleSBoZXJlIGFmdGVyIHByb2Nlc3NpbmcgZWl0aGVyIEVzYyBvciBDbWQrcGVy
aW9kLiBUaGUgZm9ybWVyIHN0YXJ0cyBhcyBhIGtleURvd24sIGFuZCB0aGUgbGF0dGVyIHN0YXJ0
cyBhcyBhIGtleSBlcXVpdmFsZW50LAorICAgIC8vIGJ1dCBib3RoIGdldCB0cmFuc2Zvcm1lZCB0
byBhIGNhbmNlbE9wZXJhdGlvbjogY29tbWFuZCwgZXhlY3V0aW5nIHdoaWNoIHBhc3NlcyBhbiBF
c2Mga2V5IGV2ZW50IHRvIC1wZXJmb3JtS2V5RXF1aXZhbGVudDouCisgICAgLy8gRG9uJ3QgaW50
ZXJwcmV0IHRoaXMgZXZlbnQgYWdhaW4sIGF2b2lkaW5nIHJlLWVudHJhbmN5IGFuZCBpbmZpbml0
ZSBsb29wcy4KKyAgICBpZiAoW1tldmVudCBjaGFyYWN0ZXJzSWdub3JpbmdNb2RpZmllcnNdIGlz
RXF1YWxUb1N0cmluZzpAIlxlIl0gJiYgIShbZXZlbnQgbW9kaWZpZXJGbGFnc10gJiBOU0Rldmlj
ZUluZGVwZW5kZW50TW9kaWZpZXJGbGFnc01hc2spKQorICAgICAgICByZXR1cm4gW3N1cGVyIHBl
cmZvcm1LZXlFcXVpdmFsZW50OmV2ZW50XTsKKworICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5IHJl
LXNlbmRpbmcgdGhlIGV2ZW50LCB0aGVuIFdlYkNvcmUgaGFzIGFscmVhZHkgc2VlbiBpdCwgbm8g
bmVlZCBmb3IgY3VzdG9tIHByb2Nlc3NpbmcuCisgICAgQk9PTCBldmVudFdhc1NlbnRUb1dlYkNv
cmUgPSAoX2RhdGEtPl9rZXlEb3duRXZlbnRCZWluZ1Jlc2VudCA9PSBldmVudCk7CisgICAgaWYg
KGV2ZW50V2FzU2VudFRvV2ViQ29yZSkKKyAgICAgICAgcmV0dXJuIFtzdXBlciBwZXJmb3JtS2V5
RXF1aXZhbGVudDpldmVudF07CisKKyAgICBBU1NFUlQoZXZlbnQgPT0gW05TQXBwIGN1cnJlbnRF
dmVudF0pOworCisgICAgW3NlbGYgX2Rpc2FibGVDb21wbGV4VGV4dElucHV0SWZOZWNlc3Nhcnld
OworCisgICAgLy8gUGFzcyBrZXkgY29tYm9zIHRocm91Z2ggV2ViQ29yZSBpZiB0aGVyZSBpcyBh
IGtleSBiaW5kaW5nIGF2YWlsYWJsZSBmb3IKKyAgICAvLyB0aGlzIGV2ZW50LiBUaGlzIGxldHMg
d2ViIHBhZ2VzIGhhdmUgYSBjcmFjayBhdCBpbnRlcmNlcHRpbmcga2V5LW1vZGlmaWVkIGtleXBy
ZXNzZXMuCisgICAgLy8gRklYTUU6IFdoeSBpcyB0aGUgZmlyc3RSZXNwb25kZXIgY2hlY2sgbmVl
ZGVkPworICAgIGlmIChzZWxmID09IFtbc2VsZiB3aW5kb3ddIGZpcnN0UmVzcG9uZGVyXSkgewor
ICAgICAgICBbc2VsZiBfaW50ZXJwcmV0S2V5RXZlbnQ6ZXZlbnQgY29tcGxldGlvbkhhbmRsZXI6
XihCT09MIGhhbmRsZWRCeUlucHV0TWV0aG9kLCBjb25zdCBWZWN0b3I8S2V5cHJlc3NDb21tYW5k
PiYgY29tbWFuZHMpIHsKKyAgICAgICAgICAgIF9kYXRhLT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRF
dmVudChOYXRpdmVXZWJLZXlib2FyZEV2ZW50KGV2ZW50LCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwg
Y29tbWFuZHMpKTsKKyAgICAgICAgfV07CisgICAgICAgIHJldHVybiBZRVM7CisgICAgfQorICAg
IAorICAgIHJldHVybiBbc3VwZXIgcGVyZm9ybUtleUVxdWl2YWxlbnQ6ZXZlbnRdOworfQorCist
ICh2b2lkKWtleVVwOihOU0V2ZW50ICopdGhlRXZlbnQKK3sKKyAgICBMT0coVGV4dElucHV0LCAi
a2V5VXA6JXAgJUAiLCB0aGVFdmVudCwgdGhlRXZlbnQpOworCisgICAgW3NlbGYgX2ludGVycHJl
dEtleUV2ZW50OnRoZUV2ZW50IGNvbXBsZXRpb25IYW5kbGVyOl4oQk9PTCBoYW5kbGVkQnlJbnB1
dE1ldGhvZCwgY29uc3QgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4mIGNvbW1hbmRzKSB7CisgICAg
ICAgIEFTU0VSVCghaGFuZGxlZEJ5SW5wdXRNZXRob2QgfHwgY29tbWFuZHMuaXNFbXB0eSgpKTsK
KyAgICAgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVLZXlib2FyZEV2ZW50KE5hdGl2ZVdlYktleWJv
YXJkRXZlbnQodGhlRXZlbnQsIGhhbmRsZWRCeUlucHV0TWV0aG9kLCBjb21tYW5kcykpOworICAg
IH1dOworfQorCistICh2b2lkKWtleURvd246KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIExP
RyhUZXh0SW5wdXQsICJrZXlEb3duOiVwICVAJXMiLCB0aGVFdmVudCwgdGhlRXZlbnQsICh0aGVF
dmVudCA9PSBfZGF0YS0+X2tleURvd25FdmVudEJlaW5nUmVzZW50KSA/ICIgKHJlLXNlbnQpIiA6
ICIiKTsKKworICAgIGlmIChbc2VsZiBfdHJ5SGFuZGxlUGx1Z2luQ29tcGxleFRleHRJbnB1dEtl
eURvd246dGhlRXZlbnRdKSB7CisgICAgICAgIExPRyhUZXh0SW5wdXQsICIuLi5oYW5kbGVkIGJ5
IHBsdWctaW4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIC8vIFdlIGNvdWxkIGJl
IHJlY2VpdmluZyBhIGtleSBkb3duIGZyb20gQXBwS2l0IGlmIHdlIGhhdmUgcmUtc2VudCBhbiBl
dmVudAogICAgIC8vIHRoYXQgbWFwcyB0byBhbiBhY3Rpb24gdGhhdCBpcyBjdXJyZW50bHkgdW5h
dmFpbGFibGUgKGZvciBleGFtcGxlIGEgY29weSB3aGVuCkBAIC0xNDEyLDM0ICsxNzE5LDYzIEBA
IC0gKHZvaWQpa2V5RG93bjooTlNFdmVudCAqKXRoZUV2ZW50CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiBjb21tYW5kczsKLSAgICBCT09MIGhh
bmRsZWRCeUlucHV0TWV0aG9kID0gW3NlbGYgX2ludGVycHJldEtleUV2ZW50OnRoZUV2ZW50IHNh
dmluZ0NvbW1hbmRzVG86Y29tbWFuZHNdOwotICAgIGlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIC8vIEFuIGlucHV0IG1ldGhvZCBtYXkgbWFrZSBzZXZlcmFsIGFjdGlvbnMgcGVy
IGtleXByZXNzLiBGb3IgZXhhbXBsZSwgcHJlc3NpbmcgUmV0dXJuIHdpdGggS29yZWFuIElNIGJv
dGggY29uZmlybXMgaXQgYW5kIHNlbmRzIGEgbmV3bGluZS4KLSAgICAgICAgLy8gSU0tbGlrZSBh
Y3Rpb25zIGFyZSBoYW5kbGVkIGltbWVkaWF0ZWx5IChzbyB0aGUgcmV0dXJuIHZhbHVlIGZyb20g
VUkgcHJvY2VzcyBpcyB0cnVlKSwgYnV0IHRoZXJlIGFyZSBzYXZlZCBjb21tYW5kcyB0aGF0Ci0g
ICAgICAgIC8vIHNob3VsZCBiZSBoYW5kbGVkIGxpa2Ugbm9ybWFsIHRleHQgaW5wdXQgYWZ0ZXIg
RE9NIGV2ZW50IGRpc3BhdGNoLgotICAgICAgICBoYW5kbGVkQnlJbnB1dE1ldGhvZCA9IE5POwot
ICAgIH0KLQotICAgIF9kYXRhLT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRpdmVXZWJL
ZXlib2FyZEV2ZW50KHRoZUV2ZW50LCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29tbWFuZHMpKTsK
KyAgICBbc2VsZiBfaW50ZXJwcmV0S2V5RXZlbnQ6dGhlRXZlbnQgY29tcGxldGlvbkhhbmRsZXI6
XihCT09MIGhhbmRsZWRCeUlucHV0TWV0aG9kLCBjb25zdCBWZWN0b3I8S2V5cHJlc3NDb21tYW5k
PiYgY29tbWFuZHMpIHsKKyAgICAgICAgQVNTRVJUKCFoYW5kbGVkQnlJbnB1dE1ldGhvZCB8fCBj
b21tYW5kcy5pc0VtcHR5KCkpOworICAgICAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJk
RXZlbnQoTmF0aXZlV2ViS2V5Ym9hcmRFdmVudCh0aGVFdmVudCwgaGFuZGxlZEJ5SW5wdXRNZXRo
b2QsIGNvbW1hbmRzKSk7CisgICAgfV07CiB9CiAKIC0gKHZvaWQpZmxhZ3NDaGFuZ2VkOihOU0V2
ZW50ICopdGhlRXZlbnQKIHsKICAgICBMT0coVGV4dElucHV0LCAiZmxhZ3NDaGFuZ2VkOiVwICVA
IiwgdGhlRXZlbnQsIHRoZUV2ZW50KTsKIAotICAgIC8vIFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBy
ZXNwb25kaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBydW4gYSBuZXN0ZWQgZXZlbnQgbG9vcCwgYW5k
Ci0gICAgLy8gZmV0Y2hpbmcgYSBuZXcgZXZlbnQgbWlnaHQgcmVsZWFzZSB0aGUgb2xkIG9uZS4g
UmV0YWluaW5nIGFuZCB0aGVuIGF1dG9yZWxlYXNpbmcKLSAgICAvLyB0aGUgY3VycmVudCBldmVu
dCBwcmV2ZW50cyB0aGF0IGZyb20gY2F1c2luZyBhIHByb2JsZW0gaW5zaWRlIFdlYktpdCBvciBB
cHBLaXQgY29kZS4KLSAgICBbW3RoZUV2ZW50IHJldGFpbl0gYXV0b3JlbGVhc2VdOwotCiAgICAg
dW5zaWduZWQgc2hvcnQga2V5Q29kZSA9IFt0aGVFdmVudCBrZXlDb2RlXTsKIAogICAgIC8vIERv
bid0IG1ha2UgYW4gZXZlbnQgZnJvbSB0aGUgbnVtIGxvY2sgYW5kIGZ1bmN0aW9uIGtleXMKICAg
ICBpZiAoIWtleUNvZGUgfHwga2V5Q29kZSA9PSAxMCB8fCBrZXlDb2RlID09IDYzKQogICAgICAg
ICByZXR1cm47CiAKLSAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJkRXZlbnQoTmF0aXZl
V2ViS2V5Ym9hcmRFdmVudCh0aGVFdmVudCwgZmFsc2UsIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+
KCkpKTsKKyAgICBbc2VsZiBfaW50ZXJwcmV0S2V5RXZlbnQ6dGhlRXZlbnQgY29tcGxldGlvbkhh
bmRsZXI6XihCT09MIGhhbmRsZWRCeUlucHV0TWV0aG9kLCBjb25zdCBWZWN0b3I8S2V5cHJlc3ND
b21tYW5kPiYgY29tbWFuZHMpIHsKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVLZXlib2Fy
ZEV2ZW50KE5hdGl2ZVdlYktleWJvYXJkRXZlbnQodGhlRXZlbnQsIGhhbmRsZWRCeUlucHV0TWV0
aG9kLCBjb21tYW5kcykpOworICAgIH1dOworfQorCisjZWxzZSAvLyBVU0UoQVNZTkNfTlNURVhU
SU5QVVRDTElFTlQpCisKKy0gKEJPT0wpX2ludGVycHJldEtleUV2ZW50OihOU0V2ZW50ICopZXZl
bnQgc2F2aW5nQ29tbWFuZHNUbzooVmVjdG9yPFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4mKWNv
bW1hbmRzCit7CisgICAgQVNTRVJUKCFfZGF0YS0+X2ludGVycHJldEtleUV2ZW50c1BhcmFtZXRl
cnMpOworICAgIEFTU0VSVChjb21tYW5kcy5pc0VtcHR5KCkpOworCisgICAgaWYgKFtldmVudCB0
eXBlXSA9PSBOU0ZsYWdzQ2hhbmdlZCkKKyAgICAgICAgcmV0dXJuIE5POworCisgICAgV0tWaWV3
SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgIHBhcmFtZXRlcnMu
ZXZlbnRJbnRlcnByZXRhdGlvbkhhZFNpZGVFZmZlY3RzID0gZmFsc2U7CisgICAgcGFyYW1ldGVy
cy5leGVjdXRpbmdTYXZlZEtleXByZXNzQ29tbWFuZHMgPSBmYWxzZTsKKyAgICAvLyBXZSBhc3N1
bWUgdGhhdCBhbiBpbnB1dCBtZXRob2QgaGFzIGNvbnN1bWVkIHRoZSBldmVudCwgYW5kIG9ubHkg
Y2hhbmdlIHRoaXMgYXNzdW1wdGlvbiBpZiBvbmUgb2YgdGhlIE5TVGV4dElucHV0IG1ldGhvZHMg
aXMgY2FsbGVkLgorICAgIC8vIFdlIGFzc3VtZSB0aGUgSU0gd2lsbCAqbm90KiBjb25zdW1lIGhv
dGtleSBzZXF1ZW5jZXMuCisgICAgcGFyYW1ldGVycy5jb25zdW1lZEJ5SU0gPSAhKFtldmVudCBt
b2RpZmllckZsYWdzXSAmIE5TQ29tbWFuZEtleU1hc2spOworICAgIHBhcmFtZXRlcnMuY29tbWFu
ZHMgPSAmY29tbWFuZHM7CisgICAgX2RhdGEtPl9pbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJz
ID0gJnBhcmFtZXRlcnM7CisKKyAgICBMT0coVGV4dElucHV0LCAiLT4gaW50ZXJwcmV0S2V5RXZl
bnRzOiVwICVAIiwgZXZlbnQsIGV2ZW50KTsKKyAgICBbc2VsZiBpbnRlcnByZXRLZXlFdmVudHM6
W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0OmV2ZW50XV07CisKKyAgICBfZGF0YS0+X2ludGVycHJl
dEtleUV2ZW50c1BhcmFtZXRlcnMgPSBudWxscHRyOworCisgICAgLy8gQW4gaW5wdXQgbWV0aG9k
IG1heSBjb25zdW1lIGFuIGV2ZW50IGFuZCBub3QgdGVsbCB1cyAoZS5nLiB3aGVuIGRpc3BsYXlp
bmcgYSBjYW5kaWRhdGUgd2luZG93KSwKKyAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBu
b3QgYnViYmxlIHRoZSBldmVudCB1cCB0aGUgRE9NLgorICAgIGlmIChwYXJhbWV0ZXJzLmNvbnN1
bWVkQnlJTSkgeworICAgICAgICBBU1NFUlQoY29tbWFuZHMuaXNFbXB0eSgpKTsKKyAgICAgICAg
TE9HKFRleHRJbnB1dCwgIi4uLmV2ZW50ICVwIHdhcyBjb25zdW1lZCBieSBhbiBpbnB1dCBtZXRo
b2QiLCBldmVudCk7CisgICAgICAgIHJldHVybiBZRVM7CisgICAgfQorCisgICAgTE9HKFRleHRJ
bnB1dCwgIi4uLmludGVycHJldEtleUV2ZW50cyBmb3IgZXZlbnQgJXAgZG9uZSwgcmV0dXJucyAl
ZCIsIGV2ZW50LCBwYXJhbWV0ZXJzLmV2ZW50SW50ZXJwcmV0YXRpb25IYWRTaWRlRWZmZWN0cyk7
CisKKyAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgZXhlY3V0ZWQgYWxsIG9yIHNvbWUgb2YgdGhl
IGNvbW1hbmRzLCB0aGUgZXZlbnQgaXMgImhhbmRsZWQiLiBOb3RlIHRoYXQgdGhlcmUgYXJlIGFk
ZGl0aW9uYWwgY2hlY2tzIG9uIHdlYiBwcm9jZXNzIHNpZGUuCisgICAgcmV0dXJuIHBhcmFtZXRl
cnMuZXZlbnRJbnRlcnByZXRhdGlvbkhhZFNpZGVFZmZlY3RzOwogfQogCiAtICh2b2lkKV9leGVj
dXRlU2F2ZWRLZXlwcmVzc0NvbW1hbmRzCkBAIC0xNDYzLDE4ICsxNzk5LDg5IEBAIC0gKHZvaWQp
X2V4ZWN1dGVTYXZlZEtleXByZXNzQ29tbWFuZHMKICAgICBMT0coVGV4dElucHV0LCAiLi4uZG9u
ZSBleGVjdXRpbmcgc2F2ZWQga2V5cHJlc3MgY29tbWFuZHMuIik7CiB9CiAKLS0gKE5TVGV4dElu
cHV0Q29udGV4dCAqKWlucHV0Q29udGV4dAorLSAodm9pZClkb0NvbW1hbmRCeVNlbGVjdG9yOihT
RUwpc2VsZWN0b3IKIHsKKyAgICBMT0coVGV4dElucHV0LCAiZG9Db21tYW5kQnlTZWxlY3Rvcjpc
IiVzXCIiLCBzZWxfZ2V0TmFtZShzZWxlY3RvcikpOworCiAgICAgV0tWaWV3SW50ZXJwcmV0S2V5
RXZlbnRzUGFyYW1ldGVycyogcGFyYW1ldGVycyA9IF9kYXRhLT5faW50ZXJwcmV0S2V5RXZlbnRz
UGFyYW1ldGVyczsKKyAgICBpZiAocGFyYW1ldGVycykKKyAgICAgICAgcGFyYW1ldGVycy0+Y29u
c3VtZWRCeUlNID0gZmFsc2U7CiAKLSAgICBpZiAoX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElu
cHV0SWRlbnRpZmllciAmJiAhcGFyYW1ldGVycykKLSAgICAgICAgcmV0dXJuIFtbV0tUZXh0SW5w
dXRXaW5kb3dDb250cm9sbGVyIHNoYXJlZFRleHRJbnB1dFdpbmRvd0NvbnRyb2xsZXJdIGlucHV0
Q29udGV4dF07CisgICAgLy8gQXMgaW4gaW5zZXJ0VGV4dDpyZXBsYWNlbWVudFJhbmdlOiwgd2Ug
YXNzdW1lIHRoYXQgdGhlIGNhbGwgY29tZXMgZnJvbSBhbiBpbnB1dCBtZXRob2QgaWYgdGhlcmUg
aXMgbWFya2VkIHRleHQuCisgICAgYm9vbCBpc0Zyb21JbnB1dE1ldGhvZCA9IF9kYXRhLT5fcGFn
ZS0+ZWRpdG9yU3RhdGUoKS5oYXNDb21wb3NpdGlvbjsKIAotICAgIC8vIERpc2FibGUgdGV4dCBp
bnB1dCBtYWNoaW5lcnkgd2hlbiBpbiBub24tZWRpdGFibGUgY29udGVudC4gQW4gaW52aXNpYmxl
IGlubGluZSBpbnB1dCBhcmVhIGFmZmVjdHMgcGVyZm9ybWFuY2UsIGFuZCBjYW4gcHJldmVudCBF
eHBvc2UgZnJvbSB3b3JraW5nLgotICAgIGlmICghX2RhdGEtPl9wYWdlLT5lZGl0b3JTdGF0ZSgp
LmlzQ29udGVudEVkaXRhYmxlKQotICAgICAgICByZXR1cm4gbmlsOworICAgIGlmIChwYXJhbWV0
ZXJzICYmICFpc0Zyb21JbnB1dE1ldGhvZCkgeworICAgICAgICBLZXlwcmVzc0NvbW1hbmQgY29t
bWFuZChOU1N0cmluZ0Zyb21TZWxlY3RvcihzZWxlY3RvcikpOworICAgICAgICBwYXJhbWV0ZXJz
LT5jb21tYW5kcy0+YXBwZW5kKGNvbW1hbmQpOworICAgICAgICBMT0coVGV4dElucHV0LCAiLi4u
c3RvcmVkIik7CisgICAgICAgIF9kYXRhLT5fcGFnZS0+cmVnaXN0ZXJLZXlwcmVzc0NvbW1hbmRO
YW1lKGNvbW1hbmQuY29tbWFuZE5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZJWE1F
OiBTZW5kIHRoZSBjb21tYW5kIHRvIEVkaXRvciBzeW5jaHJvbm91c2x5IGFuZCBvbmx5IHNlbmQg
aXQgYWxvbmcgdGhlCisgICAgICAgIC8vIHJlc3BvbmRlciBjaGFpbiBpZiBpdCdzIGEgc2VsZWN0
b3IgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIGVkaXRpbmcgY29tbWFuZC4KKyAgICAg
ICAgW3N1cGVyIGRvQ29tbWFuZEJ5U2VsZWN0b3I6c2VsZWN0b3JdOworICAgIH0KK30KIAotICAg
IHJldHVybiBbc3VwZXIgaW5wdXRDb250ZXh0XTsKKy0gKHZvaWQpaW5zZXJ0VGV4dDooaWQpc3Ry
aW5nCit7CisgICAgLy8gVW5saWtlIGFuIE5TVGV4dElucHV0Q2xpZW50IHZhcmlhbnQgd2l0aCBy
ZXBsYWNlbWVudFJhbmdlLCB0aGlzIE5TUmVzcG9uZGVyIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0
aGVyZSBpcyBubyBpbnB1dCBjb250ZXh0LAorICAgIC8vIHNvIHRleHQgaW5wdXQgcHJvY2Vzc2lu
ZyBpc24ndCBwZXJmb3JtZWQuIFdlIGFyZSBub3QgZ29pbmcgdG8gYWN0dWFsbHkgaW5zZXJ0IGFu
eSB0ZXh0IGluIHRoYXQgY2FzZSwgYnV0IHNhdmluZyBhbiBpbnNlcnRUZXh0CisgICAgLy8gY29t
bWFuZCBlbnN1cmVzIHRoYXQgYSBrZXlwcmVzcyBldmVudCBpcyBkaXNwYXRjaGVkIGFzIGFwcHJv
cHJpYXRlLgorICAgIFtzZWxmIGluc2VydFRleHQ6c3RyaW5nIHJlcGxhY2VtZW50UmFuZ2U6TlNN
YWtlUmFuZ2UoTlNOb3RGb3VuZCwgMCldOworfQorCistICh2b2lkKWluc2VydFRleHQ6KGlkKXN0
cmluZyByZXBsYWNlbWVudFJhbmdlOihOU1JhbmdlKXJlcGxhY2VtZW50UmFuZ2UKK3sKKyAgICBC
T09MIGlzQXR0cmlidXRlZFN0cmluZyA9IFtzdHJpbmcgaXNLaW5kT2ZDbGFzczpbTlNBdHRyaWJ1
dGVkU3RyaW5nIGNsYXNzXV07CisgICAgQVNTRVJUKGlzQXR0cmlidXRlZFN0cmluZyB8fCBbc3Ry
aW5nIGlzS2luZE9mQ2xhc3M6W05TU3RyaW5nIGNsYXNzXV0pOworCisgICAgaWYgKHJlcGxhY2Vt
ZW50UmFuZ2UubG9jYXRpb24gIT0gTlNOb3RGb3VuZCkKKyAgICAgICAgTE9HKFRleHRJbnB1dCwg
Imluc2VydFRleHQ6XCIlQFwiIHJlcGxhY2VtZW50UmFuZ2U6KCV1LCAldSkiLCBpc0F0dHJpYnV0
ZWRTdHJpbmcgPyBbc3RyaW5nIHN0cmluZ10gOiBzdHJpbmcsIHJlcGxhY2VtZW50UmFuZ2UubG9j
YXRpb24sIHJlcGxhY2VtZW50UmFuZ2UubGVuZ3RoKTsKKyAgICBlbHNlCisgICAgICAgIExPRyhU
ZXh0SW5wdXQsICJpbnNlcnRUZXh0OlwiJUBcIiIsIGlzQXR0cmlidXRlZFN0cmluZyA/IFtzdHJp
bmcgc3RyaW5nXSA6IHN0cmluZyk7CisgICAgV0tWaWV3SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1l
dGVycyogcGFyYW1ldGVycyA9IF9kYXRhLT5faW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVyczsK
KyAgICBpZiAocGFyYW1ldGVycykKKyAgICAgICAgcGFyYW1ldGVycy0+Y29uc3VtZWRCeUlNID0g
ZmFsc2U7CisKKyAgICBOU1N0cmluZyAqdGV4dDsKKyAgICBib29sIGlzRnJvbUlucHV0TWV0aG9k
ID0gX2RhdGEtPl9wYWdlLT5lZGl0b3JTdGF0ZSgpLmhhc0NvbXBvc2l0aW9uOworCisgICAgVmVj
dG9yPFRleHRBbHRlcm5hdGl2ZVdpdGhSYW5nZT4gZGljdGF0aW9uQWx0ZXJuYXRpdmVzOworCisg
ICAgaWYgKGlzQXR0cmlidXRlZFN0cmluZykgeworI2lmIFVTRShESUNUQVRJT05fQUxURVJOQVRJ
VkVTKQorICAgICAgICBjb2xsZWN0RGljdGF0aW9uVGV4dEFsdGVybmF0aXZlcyhzdHJpbmcsIGRp
Y3RhdGlvbkFsdGVybmF0aXZlcyk7CisjZW5kaWYKKyAgICAgICAgLy8gRklYTUU6IFdlIGlnbm9y
ZSBtb3N0IGF0dHJpYnV0ZXMgZnJvbSB0aGUgc3RyaW5nLCBzbyBmb3IgZXhhbXBsZSBpbnNlcnRp
bmcgZnJvbSBDaGFyYWN0ZXIgUGFsZXR0ZSBsb3NlcyBmb250IGFuZCBnbHlwaCB2YXJpYXRpb24g
ZGF0YS4KKyAgICAgICAgdGV4dCA9IFtzdHJpbmcgc3RyaW5nXTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgdGV4dCA9IHN0cmluZzsKKworICAgIC8vIGluc2VydFRleHQgY2FuIGJlIGNhbGxlZCBmb3Ig
c2V2ZXJhbCByZWFzb25zOgorICAgIC8vIC0gSWYgaXQncyBmcm9tIG5vcm1hbCBrZXkgZXZlbnQg
cHJvY2Vzc2luZyAoaW5jbHVkaW5nIGtleSBiaW5kaW5ncyksIHdlIG1heSBuZWVkIHRvIHNhdmUg
dGhlIGFjdGlvbiB0byBwZXJmb3JtIGl0IGxhdGVyLgorICAgIC8vIC0gSWYgaXQncyBmcm9tIGFu
IGlucHV0IG1ldGhvZCwgdGhlbiB3ZSBzaG91bGQgZ28gYWhlYWQgYW5kIGluc2VydCB0aGUgdGV4
dCBub3cuIFdlIGFzc3VtZSBpdCdzIGZyb20gdGhlIGlucHV0IG1ldGhvZCBpZiB3ZSBoYXZlIG1h
cmtlZCB0ZXh0LgorICAgIC8vIEZJWE1FOiBJbiB0aGVvcnksIHRoaXMgY291bGQgYmUgd3Jvbmcg
Zm9yIHNvbWUgaW5wdXQgbWV0aG9kcywgc28gd2Ugc2hvdWxkIHRyeSB0byBmaW5kIGFub3RoZXIg
d2F5IHRvIGRldGVybWluZSBpZiB0aGUgY2FsbCBpcyBmcm9tIHRoZSBpbnB1dCBtZXRob2QuCisg
ICAgLy8gLSBJZiBpdCdzIHNlbnQgb3V0c2lkZSBvZiBrZXlib2FyZCBldmVudCBwcm9jZXNzaW5n
IChlLmcuIGZyb20gQ2hhcmFjdGVyIFZpZXdlciwgb3Igd2hlbiBjb25maXJtaW5nIGFuIGlubGlu
ZSBpbnB1dCBhcmVhIHdpdGggYSBtb3VzZSksCisgICAgLy8gdGhlbiB3ZSBhbHNvIGV4ZWN1dGUg
aXQgaW1tZWRpYXRlbHksIGFzIHRoZXJlIHdpbGwgYmUgbm8gb3RoZXIgY2hhbmNlLgorICAgIGlm
IChwYXJhbWV0ZXJzICYmICFpc0Zyb21JbnB1dE1ldGhvZCkgeworICAgICAgICAvLyBGSVhNRTog
SGFuZGxlIHJlcGxhY2VtZW50UmFuZ2UgaW4gdGhpcyBjYXNlLCB0b28uIEl0J3Mga25vd24gdG8g
b2NjdXIgaW4gcHJhY3RpY2Ugd2hlbiBjYW5jZWxpbmcgUHJlc3MgYW5kIEhvbGQgKHNlZSA8cmRh
cjovLzExOTQwNjcwPikuCisgICAgICAgIEFTU0VSVChyZXBsYWNlbWVudFJhbmdlLmxvY2F0aW9u
ID09IE5TTm90Rm91bmQpOworICAgICAgICBLZXlwcmVzc0NvbW1hbmQgY29tbWFuZCgiaW5zZXJ0
VGV4dDoiLCB0ZXh0KTsKKyAgICAgICAgcGFyYW1ldGVycy0+Y29tbWFuZHMtPmFwcGVuZChjb21t
YW5kKTsKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5yZWdpc3RlcktleXByZXNzQ29tbWFuZE5hbWUo
Y29tbWFuZC5jb21tYW5kTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJp
bmcgZXZlbnRUZXh0ID0gdGV4dDsKKyAgICBldmVudFRleHQucmVwbGFjZShOU0JhY2tUYWJDaGFy
YWN0ZXIsIE5TVGFiQ2hhcmFjdGVyKTsgLy8gc2FtZSB0aGluZyBpcyBkb25lIGluIEtleUV2ZW50
TWFjLm1tIGluIFdlYkNvcmUKKyAgICBib29sIGV2ZW50SGFuZGxlZDsKKyAgICBpZiAoIWRpY3Rh
dGlvbkFsdGVybmF0aXZlcy5pc0VtcHR5KCkpCisgICAgICAgIGV2ZW50SGFuZGxlZCA9IF9kYXRh
LT5fcGFnZS0+aW5zZXJ0RGljdGF0ZWRUZXh0KGV2ZW50VGV4dCwgcmVwbGFjZW1lbnRSYW5nZS5s
b2NhdGlvbiwgcmVwbGFjZW1lbnRSYW5nZS5sZW5ndGgsIGRpY3RhdGlvbkFsdGVybmF0aXZlcyk7
CisgICAgZWxzZQorICAgICAgICBldmVudEhhbmRsZWQgPSBfZGF0YS0+X3BhZ2UtPmluc2VydFRl
eHQoZXZlbnRUZXh0LCByZXBsYWNlbWVudFJhbmdlLmxvY2F0aW9uLCByZXBsYWNlbWVudFJhbmdl
Lmxlbmd0aCk7CisKKyAgICBpZiAocGFyYW1ldGVycykKKyAgICAgICAgcGFyYW1ldGVycy0+ZXZl
bnRJbnRlcnByZXRhdGlvbkhhZFNpZGVFZmZlY3RzIHw9IGV2ZW50SGFuZGxlZDsKIH0KIAogLSAo
TlNSYW5nZSlzZWxlY3RlZFJhbmdlCkBAIC0xNTMyLDQ4ICsxOTM5LDYgQEAgLSAodm9pZCl1bm1h
cmtUZXh0CiAgICAgX2RhdGEtPl9wYWdlLT5jb25maXJtQ29tcG9zaXRpb24oKTsKIH0KIAotLSAo
TlNBcnJheSAqKXZhbGlkQXR0cmlidXRlc0Zvck1hcmtlZFRleHQKLXsKLSAgICBzdGF0aWMgTlNB
cnJheSAqdmFsaWRBdHRyaWJ1dGVzOwotICAgIGlmICghdmFsaWRBdHRyaWJ1dGVzKSB7Ci0gICAg
ICAgIHZhbGlkQXR0cmlidXRlcyA9IFtbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNVbmRlcmxpbmVTdHlsZUF0dHJpYnV0ZU5hbWUs
IE5TVW5kZXJsaW5lQ29sb3JBdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgTlNNYXJrZWRDbGF1c2VTZWdtZW50QXR0cmlidXRlTmFtZSwKLSNpZiBVU0UoRElDVEFUSU9O
X0FMVEVSTkFUSVZFUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TVGV4dEFsdGVybmF0
aXZlc0F0dHJpYnV0ZU5hbWUsCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5p
bF07Ci0gICAgICAgIC8vIE5TVGV4dCBhbHNvIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmli
dXRlcywgYnV0IGl0J3MKLSAgICAgICAgLy8gaGFyZCB0byB0ZWxsIHdoaWNoIGFyZSByZWFsbHkg
cmVxdWlyZWQgZm9yIHRleHQgaW5wdXQgdG8KLSAgICAgICAgLy8gd29yayB3ZWxsOyBJIGhhdmUg
bm90IHNlZW4gYW55IGlucHV0IG1ldGhvZCBtYWtlIHVzZSBvZiB0aGVtIHlldC4KLSAgICAgICAg
Ly8gICAgIE5TRm9udEF0dHJpYnV0ZU5hbWUsIE5TRm9yZWdyb3VuZENvbG9yQXR0cmlidXRlTmFt
ZSwKLSAgICAgICAgLy8gICAgIE5TQmFja2dyb3VuZENvbG9yQXR0cmlidXRlTmFtZSwgTlNMYW5n
dWFnZUF0dHJpYnV0ZU5hbWUuCi0gICAgICAgIENGUmV0YWluKHZhbGlkQXR0cmlidXRlcyk7Ci0g
ICAgfQotICAgIExPRyhUZXh0SW5wdXQsICJ2YWxpZEF0dHJpYnV0ZXNGb3JNYXJrZWRUZXh0IC0+
ICguLi4pIik7Ci0gICAgcmV0dXJuIHZhbGlkQXR0cmlidXRlczsKLX0KLQotc3RhdGljIHZvaWQg
ZXh0cmFjdFVuZGVybGluZXMoTlNBdHRyaWJ1dGVkU3RyaW5nICpzdHJpbmcsIFZlY3RvcjxDb21w
b3NpdGlvblVuZGVybGluZT4mIHJlc3VsdCkKLXsKLSAgICBpbnQgbGVuZ3RoID0gW1tzdHJpbmcg
c3RyaW5nXSBsZW5ndGhdOwotICAgIAotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoaSA8IGxl
bmd0aCkgewotICAgICAgICBOU1JhbmdlIHJhbmdlOwotICAgICAgICBOU0RpY3Rpb25hcnkgKmF0
dHJzID0gW3N0cmluZyBhdHRyaWJ1dGVzQXRJbmRleDppIGxvbmdlc3RFZmZlY3RpdmVSYW5nZTom
cmFuZ2UgaW5SYW5nZTpOU01ha2VSYW5nZShpLCBsZW5ndGggLSBpKV07Ci0gICAgICAgIAotICAg
ICAgICBpZiAoTlNOdW1iZXIgKnN0eWxlID0gW2F0dHJzIG9iamVjdEZvcktleTpOU1VuZGVybGlu
ZVN0eWxlQXR0cmlidXRlTmFtZV0pIHsKLSAgICAgICAgICAgIENvbG9yIGNvbG9yID0gQ29sb3I6
OmJsYWNrOwotICAgICAgICAgICAgaWYgKE5TQ29sb3IgKmNvbG9yQXR0ciA9IFthdHRycyBvYmpl
Y3RGb3JLZXk6TlNVbmRlcmxpbmVDb2xvckF0dHJpYnV0ZU5hbWVdKQotICAgICAgICAgICAgICAg
IGNvbG9yID0gY29sb3JGcm9tTlNDb2xvcihbY29sb3JBdHRyIGNvbG9yVXNpbmdDb2xvclNwYWNl
TmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2VdKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQo
Q29tcG9zaXRpb25VbmRlcmxpbmUocmFuZ2UubG9jYXRpb24sIE5TTWF4UmFuZ2UocmFuZ2UpLCBj
b2xvciwgW3N0eWxlIGludFZhbHVlXSA+IDEpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgaSA9IHJhbmdlLmxvY2F0aW9uICsgcmFuZ2UubGVuZ3RoOwotICAgIH0KLX0KLQogLSAodm9p
ZClzZXRNYXJrZWRUZXh0OihpZClzdHJpbmcgc2VsZWN0ZWRSYW5nZTooTlNSYW5nZSluZXdTZWxl
Y3RlZFJhbmdlIHJlcGxhY2VtZW50UmFuZ2U6KE5TUmFuZ2UpcmVwbGFjZW1lbnRSYW5nZQogewog
ICAgIFtzZWxmIF9leGVjdXRlU2F2ZWRLZXlwcmVzc0NvbW1hbmRzXTsKQEAgLTE2OTksNiArMjA2
NCwxMjUgQEAgLSAoTlNSZWN0KWZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlOihOUwogICAgIHJl
dHVybiByZXN1bHRSZWN0OwogfQogCistIChCT09MKXBlcmZvcm1LZXlFcXVpdmFsZW50OihOU0V2
ZW50ICopZXZlbnQKK3sKKyAgICAvLyBUaGVyZSdzIGEgY2hhbmNlIHRoYXQgcmVzcG9uZGluZyB0
byB0aGlzIGV2ZW50IHdpbGwgcnVuIGEgbmVzdGVkIGV2ZW50IGxvb3AsIGFuZAorICAgIC8vIGZl
dGNoaW5nIGEgbmV3IGV2ZW50IG1pZ2h0IHJlbGVhc2UgdGhlIG9sZCBvbmUuIFJldGFpbmluZyBh
bmQgdGhlbiBhdXRvcmVsZWFzaW5nCisgICAgLy8gdGhlIGN1cnJlbnQgZXZlbnQgcHJldmVudHMg
dGhhdCBmcm9tIGNhdXNpbmcgYSBwcm9ibGVtIGluc2lkZSBXZWJLaXQgb3IgQXBwS2l0IGNvZGUu
CisgICAgW1tldmVudCByZXRhaW5dIGF1dG9yZWxlYXNlXTsKKworICAgIC8vIFdlIGdldCBFc2Mg
a2V5IGhlcmUgYWZ0ZXIgcHJvY2Vzc2luZyBlaXRoZXIgRXNjIG9yIENtZCtwZXJpb2QuIFRoZSBm
b3JtZXIgc3RhcnRzIGFzIGEga2V5RG93biwgYW5kIHRoZSBsYXR0ZXIgc3RhcnRzIGFzIGEga2V5
IGVxdWl2YWxlbnQsCisgICAgLy8gYnV0IGJvdGggZ2V0IHRyYW5zZm9ybWVkIHRvIGEgY2FuY2Vs
T3BlcmF0aW9uOiBjb21tYW5kLCBleGVjdXRpbmcgd2hpY2ggcGFzc2VzIGFuIEVzYyBrZXkgZXZl
bnQgdG8gLXBlcmZvcm1LZXlFcXVpdmFsZW50Oi4KKyAgICAvLyBEb24ndCBpbnRlcnByZXQgdGhp
cyBldmVudCBhZ2FpbiwgYXZvaWRpbmcgcmUtZW50cmFuY3kgYW5kIGluZmluaXRlIGxvb3BzLgor
ICAgIGlmIChbW2V2ZW50IGNoYXJhY3RlcnNJZ25vcmluZ01vZGlmaWVyc10gaXNFcXVhbFRvU3Ry
aW5nOkAiXGUiXSAmJiAhKFtldmVudCBtb2RpZmllckZsYWdzXSAmIE5TRGV2aWNlSW5kZXBlbmRl
bnRNb2RpZmllckZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBbc3VwZXIgcGVyZm9ybUtleUVx
dWl2YWxlbnQ6ZXZlbnRdOworCisgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgcmUtc2VuZGluZyB0
aGUgZXZlbnQsIHRoZW4gV2ViQ29yZSBoYXMgYWxyZWFkeSBzZWVuIGl0LCBubyBuZWVkIGZvciBj
dXN0b20gcHJvY2Vzc2luZy4KKyAgICBCT09MIGV2ZW50V2FzU2VudFRvV2ViQ29yZSA9IChfZGF0
YS0+X2tleURvd25FdmVudEJlaW5nUmVzZW50ID09IGV2ZW50KTsKKyAgICBpZiAoZXZlbnRXYXNT
ZW50VG9XZWJDb3JlKQorICAgICAgICByZXR1cm4gW3N1cGVyIHBlcmZvcm1LZXlFcXVpdmFsZW50
OmV2ZW50XTsKKworICAgIEFTU0VSVChldmVudCA9PSBbTlNBcHAgY3VycmVudEV2ZW50XSk7CisK
KyAgICBbc2VsZiBfZGlzYWJsZUNvbXBsZXhUZXh0SW5wdXRJZk5lY2Vzc2FyeV07CisKKyAgICAv
LyBQYXNzIGtleSBjb21ib3MgdGhyb3VnaCBXZWJDb3JlIGlmIHRoZXJlIGlzIGEga2V5IGJpbmRp
bmcgYXZhaWxhYmxlIGZvcgorICAgIC8vIHRoaXMgZXZlbnQuIFRoaXMgbGV0cyB3ZWIgcGFnZXMg
aGF2ZSBhIGNyYWNrIGF0IGludGVyY2VwdGluZyBrZXktbW9kaWZpZWQga2V5cHJlc3Nlcy4KKyAg
ICAvLyBGSVhNRTogV2h5IGlzIHRoZSBmaXJzdFJlc3BvbmRlciBjaGVjayBuZWVkZWQ/CisgICAg
aWYgKHNlbGYgPT0gW1tzZWxmIHdpbmRvd10gZmlyc3RSZXNwb25kZXJdKSB7CisgICAgICAgIFZl
Y3RvcjxLZXlwcmVzc0NvbW1hbmQ+IGNvbW1hbmRzOworICAgICAgICBCT09MIGhhbmRsZWRCeUlu
cHV0TWV0aG9kID0gW3NlbGYgX2ludGVycHJldEtleUV2ZW50OmV2ZW50IHNhdmluZ0NvbW1hbmRz
VG86Y29tbWFuZHNdOworICAgICAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJkRXZlbnQo
TmF0aXZlV2ViS2V5Ym9hcmRFdmVudChldmVudCwgaGFuZGxlZEJ5SW5wdXRNZXRob2QsIGNvbW1h
bmRzKSk7CisgICAgICAgIHJldHVybiBZRVM7CisgICAgfQorICAgIAorICAgIHJldHVybiBbc3Vw
ZXIgcGVyZm9ybUtleUVxdWl2YWxlbnQ6ZXZlbnRdOworfQorCistICh2b2lkKWtleVVwOihOU0V2
ZW50ICopdGhlRXZlbnQKK3sKKyAgICBMT0coVGV4dElucHV0LCAia2V5VXA6JXAgJUAiLCB0aGVF
dmVudCwgdGhlRXZlbnQpOworICAgIC8vIFdlIGRvbid0IGludGVycHJldCB0aGUga2V5VXAgZXZl
bnQsIGFzIHRoaXMgYnJlYWtzIGtleSBiaW5kaW5ncyAoc2VlIDxodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMTAwPikuCisgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVL
ZXlib2FyZEV2ZW50KE5hdGl2ZVdlYktleWJvYXJkRXZlbnQodGhlRXZlbnQsIGZhbHNlLCBWZWN0
b3I8S2V5cHJlc3NDb21tYW5kPigpKSk7Cit9CisKKy0gKHZvaWQpa2V5RG93bjooTlNFdmVudCAq
KXRoZUV2ZW50Cit7CisgICAgTE9HKFRleHRJbnB1dCwgImtleURvd246JXAgJUAlcyIsIHRoZUV2
ZW50LCB0aGVFdmVudCwgKHRoZUV2ZW50ID09IF9kYXRhLT5fa2V5RG93bkV2ZW50QmVpbmdSZXNl
bnQpID8gIiAocmUtc2VudCkiIDogIiIpOworCisgICAgLy8gVGhlcmUncyBhIGNoYW5jZSB0aGF0
IHJlc3BvbmRpbmcgdG8gdGhpcyBldmVudCB3aWxsIHJ1biBhIG5lc3RlZCBldmVudCBsb29wLCBh
bmQKKyAgICAvLyBmZXRjaGluZyBhIG5ldyBldmVudCBtaWdodCByZWxlYXNlIHRoZSBvbGQgb25l
LiBSZXRhaW5pbmcgYW5kIHRoZW4gYXV0b3JlbGVhc2luZworICAgIC8vIHRoZSBjdXJyZW50IGV2
ZW50IHByZXZlbnRzIHRoYXQgZnJvbSBjYXVzaW5nIGEgcHJvYmxlbSBpbnNpZGUgV2ViS2l0IG9y
IEFwcEtpdCBjb2RlLgorICAgIFtbdGhlRXZlbnQgcmV0YWluXSBhdXRvcmVsZWFzZV07CisKKyAg
ICBpZiAoW3NlbGYgX3RyeUhhbmRsZVBsdWdpbkNvbXBsZXhUZXh0SW5wdXRLZXlEb3duOnRoZUV2
ZW50XSkgeworICAgICAgICBMT0coVGV4dElucHV0LCAiLi4uaGFuZGxlZCBieSBwbHVnLWluIik7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBjb3VsZCBiZSByZWNlaXZpbmcg
YSBrZXkgZG93biBmcm9tIEFwcEtpdCBpZiB3ZSBoYXZlIHJlLXNlbnQgYW4gZXZlbnQKKyAgICAv
LyB0aGF0IG1hcHMgdG8gYW4gYWN0aW9uIHRoYXQgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIChm
b3IgZXhhbXBsZSBhIGNvcHkgd2hlbgorICAgIC8vIHRoZXJlIGlzIG5vIHJhbmdlIHNlbGVjdGlv
bikuCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBrZXkg
ZG93bi4KKyAgICBpZiAoX2RhdGEtPl9rZXlEb3duRXZlbnRCZWluZ1Jlc2VudCA9PSB0aGVFdmVu
dCkgeworICAgICAgICBbc3VwZXIga2V5RG93bjp0aGVFdmVudF07CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiBjb21tYW5kczsKKyAgICBCT09M
IGhhbmRsZWRCeUlucHV0TWV0aG9kID0gW3NlbGYgX2ludGVycHJldEtleUV2ZW50OnRoZUV2ZW50
IHNhdmluZ0NvbW1hbmRzVG86Y29tbWFuZHNdOworICAgIGlmICghY29tbWFuZHMuaXNFbXB0eSgp
KSB7CisgICAgICAgIC8vIEFuIGlucHV0IG1ldGhvZCBtYXkgbWFrZSBzZXZlcmFsIGFjdGlvbnMg
cGVyIGtleXByZXNzLiBGb3IgZXhhbXBsZSwgcHJlc3NpbmcgUmV0dXJuIHdpdGggS29yZWFuIElN
IGJvdGggY29uZmlybXMgaXQgYW5kIHNlbmRzIGEgbmV3bGluZS4KKyAgICAgICAgLy8gSU0tbGlr
ZSBhY3Rpb25zIGFyZSBoYW5kbGVkIGltbWVkaWF0ZWx5IChzbyB0aGUgcmV0dXJuIHZhbHVlIGZy
b20gVUkgcHJvY2VzcyBpcyB0cnVlKSwgYnV0IHRoZXJlIGFyZSBzYXZlZCBjb21tYW5kcyB0aGF0
CisgICAgICAgIC8vIHNob3VsZCBiZSBoYW5kbGVkIGxpa2Ugbm9ybWFsIHRleHQgaW5wdXQgYWZ0
ZXIgRE9NIGV2ZW50IGRpc3BhdGNoLgorICAgICAgICBoYW5kbGVkQnlJbnB1dE1ldGhvZCA9IE5P
OworICAgIH0KKworICAgIF9kYXRhLT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRpdmVX
ZWJLZXlib2FyZEV2ZW50KHRoZUV2ZW50LCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29tbWFuZHMp
KTsKK30KKworLSAodm9pZClmbGFnc0NoYW5nZWQ6KE5TRXZlbnQgKil0aGVFdmVudAoreworICAg
IExPRyhUZXh0SW5wdXQsICJmbGFnc0NoYW5nZWQ6JXAgJUAiLCB0aGVFdmVudCwgdGhlRXZlbnQp
OworCisgICAgLy8gVGhlcmUncyBhIGNoYW5jZSB0aGF0IHJlc3BvbmRpbmcgdG8gdGhpcyBldmVu
dCB3aWxsIHJ1biBhIG5lc3RlZCBldmVudCBsb29wLCBhbmQKKyAgICAvLyBmZXRjaGluZyBhIG5l
dyBldmVudCBtaWdodCByZWxlYXNlIHRoZSBvbGQgb25lLiBSZXRhaW5pbmcgYW5kIHRoZW4gYXV0
b3JlbGVhc2luZworICAgIC8vIHRoZSBjdXJyZW50IGV2ZW50IHByZXZlbnRzIHRoYXQgZnJvbSBj
YXVzaW5nIGEgcHJvYmxlbSBpbnNpZGUgV2ViS2l0IG9yIEFwcEtpdCBjb2RlLgorICAgIFtbdGhl
RXZlbnQgcmV0YWluXSBhdXRvcmVsZWFzZV07CisKKyAgICB1bnNpZ25lZCBzaG9ydCBrZXlDb2Rl
ID0gW3RoZUV2ZW50IGtleUNvZGVdOworCisgICAgLy8gRG9uJ3QgbWFrZSBhbiBldmVudCBmcm9t
IHRoZSBudW0gbG9jayBhbmQgZnVuY3Rpb24ga2V5cworICAgIGlmICgha2V5Q29kZSB8fCBrZXlD
b2RlID09IDEwIHx8IGtleUNvZGUgPT0gNjMpCisgICAgICAgIHJldHVybjsKKworICAgIF9kYXRh
LT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRpdmVXZWJLZXlib2FyZEV2ZW50KHRoZUV2
ZW50LCBmYWxzZSwgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4oKSkpOworfQorCisjZW5kaWYgLy8g
VVNFKEFTWU5DX05TVEVYVElOUFVUQ0xJRU5UKQorCistIChOU0FycmF5ICopdmFsaWRBdHRyaWJ1
dGVzRm9yTWFya2VkVGV4dAoreworICAgIHN0YXRpYyBOU0FycmF5ICp2YWxpZEF0dHJpYnV0ZXM7
CisgICAgaWYgKCF2YWxpZEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdmFsaWRBdHRyaWJ1dGVzID0g
W1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBOU1VuZGVybGluZVN0eWxlQXR0cmlidXRlTmFtZSwgTlNVbmRlcmxpbmVDb2xvckF0dHJp
YnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOU01hcmtlZENsYXVzZVNlZ21l
bnRBdHRyaWJ1dGVOYW1lLAorI2lmIFVTRShESUNUQVRJT05fQUxURVJOQVRJVkVTKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgTlNUZXh0QWx0ZXJuYXRpdmVzQXR0cmlidXRlTmFtZSwKKyNl
bmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsXTsKKyAgICAgICAgLy8gTlNUZXh0
IGFsc28gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzLCBidXQgaXQncworICAgICAg
ICAvLyBoYXJkIHRvIHRlbGwgd2hpY2ggYXJlIHJlYWxseSByZXF1aXJlZCBmb3IgdGV4dCBpbnB1
dCB0bworICAgICAgICAvLyB3b3JrIHdlbGw7IEkgaGF2ZSBub3Qgc2VlbiBhbnkgaW5wdXQgbWV0
aG9kIG1ha2UgdXNlIG9mIHRoZW0geWV0LgorICAgICAgICAvLyAgICAgTlNGb250QXR0cmlidXRl
TmFtZSwgTlNGb3JlZ3JvdW5kQ29sb3JBdHRyaWJ1dGVOYW1lLAorICAgICAgICAvLyAgICAgTlNC
YWNrZ3JvdW5kQ29sb3JBdHRyaWJ1dGVOYW1lLCBOU0xhbmd1YWdlQXR0cmlidXRlTmFtZS4KKyAg
ICAgICAgQ0ZSZXRhaW4odmFsaWRBdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgTE9HKFRleHRJbnB1
dCwgInZhbGlkQXR0cmlidXRlc0Zvck1hcmtlZFRleHQgLT4gKC4uLikiKTsKKyAgICByZXR1cm4g
dmFsaWRBdHRyaWJ1dGVzOworfQorCiAjaWYgRU5BQkxFKERSQUdfU1VQUE9SVCkKIC0gKHZvaWQp
ZHJhZ2dlZEltYWdlOihOU0ltYWdlICopYW5JbWFnZSBlbmRlZEF0OihOU1BvaW50KWFQb2ludCBv
cGVyYXRpb246KE5TRHJhZ09wZXJhdGlvbilvcGVyYXRpb24KIHsKQEAgLTIzMTksNDIgKzI4MDMs
NiBAQCAtICh2b2lkKV9kb25lV2l0aEtleUV2ZW50OihOU0V2ZW50ICopZXZlCiAgICAgX2RhdGEt
Pl9rZXlEb3duRXZlbnRCZWluZ1Jlc2VudCA9IG51bGxwdHI7CiB9CiAKLS0gKEJPT0wpX2ludGVy
cHJldEtleUV2ZW50OihOU0V2ZW50ICopZXZlbnQgc2F2aW5nQ29tbWFuZHNUbzooVmVjdG9yPFdl
YkNvcmU6OktleXByZXNzQ29tbWFuZD4mKWNvbW1hbmRzCi17Ci0gICAgQVNTRVJUKCFfZGF0YS0+
X2ludGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnMpOwotICAgIEFTU0VSVChjb21tYW5kcy5pc0Vt
cHR5KCkpOwotCi0gICAgaWYgKFtldmVudCB0eXBlXSA9PSBOU0ZsYWdzQ2hhbmdlZCkKLSAgICAg
ICAgcmV0dXJuIE5POwotCi0gICAgV0tWaWV3SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycyBw
YXJhbWV0ZXJzOwotICAgIHBhcmFtZXRlcnMuZXZlbnRJbnRlcnByZXRhdGlvbkhhZFNpZGVFZmZl
Y3RzID0gZmFsc2U7Ci0gICAgcGFyYW1ldGVycy5leGVjdXRpbmdTYXZlZEtleXByZXNzQ29tbWFu
ZHMgPSBmYWxzZTsKLSAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbiBpbnB1dCBtZXRob2QgaGFzIGNv
bnN1bWVkIHRoZSBldmVudCwgYW5kIG9ubHkgY2hhbmdlIHRoaXMgYXNzdW1wdGlvbiBpZiBvbmUg
b2YgdGhlIE5TVGV4dElucHV0IG1ldGhvZHMgaXMgY2FsbGVkLgotICAgIC8vIFdlIGFzc3VtZSB0
aGUgSU0gd2lsbCAqbm90KiBjb25zdW1lIGhvdGtleSBzZXF1ZW5jZXMuCi0gICAgcGFyYW1ldGVy
cy5jb25zdW1lZEJ5SU0gPSAhKFtldmVudCBtb2RpZmllckZsYWdzXSAmIE5TQ29tbWFuZEtleU1h
c2spOwotICAgIHBhcmFtZXRlcnMuY29tbWFuZHMgPSAmY29tbWFuZHM7Ci0gICAgX2RhdGEtPl9p
bnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzID0gJnBhcmFtZXRlcnM7Ci0KLSAgICBMT0coVGV4
dElucHV0LCAiLT4gaW50ZXJwcmV0S2V5RXZlbnRzOiVwICVAIiwgZXZlbnQsIGV2ZW50KTsKLSAg
ICBbc2VsZiBpbnRlcnByZXRLZXlFdmVudHM6W05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0OmV2ZW50
XV07Ci0KLSAgICBfZGF0YS0+X2ludGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnMgPSBudWxscHRy
OwotCi0gICAgLy8gQW4gaW5wdXQgbWV0aG9kIG1heSBjb25zdW1lIGFuIGV2ZW50IGFuZCBub3Qg
dGVsbCB1cyAoZS5nLiB3aGVuIGRpc3BsYXlpbmcgYSBjYW5kaWRhdGUgd2luZG93KSwKLSAgICAv
LyBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBub3QgYnViYmxlIHRoZSBldmVudCB1cCB0aGUgRE9N
LgotICAgIGlmIChwYXJhbWV0ZXJzLmNvbnN1bWVkQnlJTSkgewotICAgICAgICBBU1NFUlQoY29t
bWFuZHMuaXNFbXB0eSgpKTsKLSAgICAgICAgTE9HKFRleHRJbnB1dCwgIi4uLmV2ZW50ICVwIHdh
cyBjb25zdW1lZCBieSBhbiBpbnB1dCBtZXRob2QiLCBldmVudCk7Ci0gICAgICAgIHJldHVybiBZ
RVM7Ci0gICAgfQotCi0gICAgTE9HKFRleHRJbnB1dCwgIi4uLmludGVycHJldEtleUV2ZW50cyBm
b3IgZXZlbnQgJXAgZG9uZSwgcmV0dXJucyAlZCIsIGV2ZW50LCBwYXJhbWV0ZXJzLmV2ZW50SW50
ZXJwcmV0YXRpb25IYWRTaWRlRWZmZWN0cyk7Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkg
ZXhlY3V0ZWQgYWxsIG9yIHNvbWUgb2YgdGhlIGNvbW1hbmRzLCB0aGUgZXZlbnQgaXMgImhhbmRs
ZWQiLiBOb3RlIHRoYXQgdGhlcmUgYXJlIGFkZGl0aW9uYWwgY2hlY2tzIG9uIHdlYiBwcm9jZXNz
IHNpZGUuCi0gICAgcmV0dXJuIHBhcmFtZXRlcnMuZXZlbnRJbnRlcnByZXRhdGlvbkhhZFNpZGVF
ZmZlY3RzOwotfQotCiAtIChOU1JlY3QpX2NvbnZlcnRUb0RldmljZVNwYWNlOihOU1JlY3QpcmVj
dAogewogICAgIHJldHVybiB0b0RldmljZVNwYWNlKHJlY3QsIFtzZWxmIHdpbmRvd10pOwpJbmRl
eDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3SW50ZXJuYWwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXdJbnRlcm5h
bC5oCShyZXZpc2lvbiAxNjU4MjMpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21h
Yy9XS1ZpZXdJbnRlcm5hbC5oCSh3b3JraW5nIGNvcHkpCkBAIC03Miw3ICs3Miw2IEBAIEBpbnRl
cmZhY2UgV0tWaWV3ICgpCiAtICh2b2lkKV90b29sVGlwQ2hhbmdlZEZyb206KE5TU3RyaW5nICop
b2xkVG9vbFRpcCB0bzooTlNTdHJpbmcgKiluZXdUb29sVGlwOwogLSAodm9pZClfc2V0Q3Vyc29y
OihOU0N1cnNvciAqKWN1cnNvcjsKIC0gKHZvaWQpX3NldFVzZXJJbnRlcmZhY2VJdGVtU3RhdGU6
KE5TU3RyaW5nICopY29tbWFuZE5hbWUgZW5hYmxlZDooQk9PTClpc0VuYWJsZWQgc3RhdGU6KGlu
dCluZXdTdGF0ZTsKLS0gKEJPT0wpX2ludGVycHJldEtleUV2ZW50OihOU0V2ZW50ICopdGhlRXZl
bnQgc2F2aW5nQ29tbWFuZHNUbzooVmVjdG9yPFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4mKWNv
bW1hbmRzOwogLSAodm9pZClfZG9uZVdpdGhLZXlFdmVudDooTlNFdmVudCAqKWV2ZW50IGV2ZW50
V2FzSGFuZGxlZDooQk9PTClldmVudFdhc0hhbmRsZWQ7CiAtIChib29sKV9leGVjdXRlU2F2ZWRD
b21tYW5kQnlTZWxlY3RvcjooU0VMKXNlbGVjdG9yOwogLSAodm9pZClfc2V0SW50cmluc2ljQ29u
dGVudFNpemU6KE5TU2l6ZSlpbnRyaW5zaWNDb250ZW50U2l6ZTsKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9pb3MvV2ViUGFnZVByb3h5SU9TLm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV2ViUGFnZVByb3h5SU9TLm1tCShyZXZpc2lvbiAxNjU4
MjMpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dlYlBhZ2VQcm94eUlPUy5tbQko
d29ya2luZyBjb3B5KQpAQCAtMTMwLDEyICsxMzAsNiBAQCBib29sIFdlYlBhZ2VQcm94eTo6aW5z
ZXJ0VGV4dChjb25zdCBTdHJpCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgV2ViUGFnZVBy
b3h5OjppbnNlcnREaWN0YXRlZFRleHQoY29uc3QgU3RyaW5nJiwgY29uc3QgRWRpdGluZ1Jhbmdl
JiwgY29uc3QgVmVjdG9yPFdlYkNvcmU6OlRleHRBbHRlcm5hdGl2ZVdpdGhSYW5nZT4mKQotewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIFdlYlBh
Z2VQcm94eTo6Z2V0TWFya2VkUmFuZ2UoRWRpdGluZ1JhbmdlJikKIHsKICAgICBub3RJbXBsZW1l
bnRlZCgpOwpAQCAtMTQ2LDExICsxNDAsNiBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Z2V0U2VsZWN0
ZWRSYW5nZShFZGl0CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBXZWJQYWdlUHJv
eHk6OmdldEF0dHJpYnV0ZWRTdWJzdHJpbmdGcm9tUmFuZ2UoY29uc3QgRWRpdGluZ1JhbmdlJiwg
QXR0cmlidXRlZFN0cmluZyYpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQogdWludDY0
X3QgV2ViUGFnZVByb3h5OjpjaGFyYWN0ZXJJbmRleEZvclBvaW50KGNvbnN0IEludFBvaW50KQog
ewogICAgIG5vdEltcGxlbWVudGVkKCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
bWFjL1dlYlBhZ2VQcm94eU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvbWFjL1dlYlBhZ2VQcm94eU1hYy5tbQkocmV2aXNpb24gMTY1ODIzKQorKysgU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL21hYy9XZWJQYWdlUHJveHlNYWMubW0JKHdvcmtpbmcgY29weSkK
QEAgLTIyMCw2ICsyMjAsMzEgQEAgYm9vbCBXZWJQYWdlUHJveHk6Omluc2VydERpY3RhdGVkVGV4
dChjbwogI2VuZGlmCiB9CiAKK3ZvaWQgV2ViUGFnZVByb3h5OjppbnNlcnREaWN0YXRlZFRleHRB
c3luYyhjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRS
YW5nZSwgY29uc3QgVmVjdG9yPFRleHRBbHRlcm5hdGl2ZVdpdGhSYW5nZT4mIGRpY3RhdGlvbkFs
dGVybmF0aXZlc1dpdGhSYW5nZSkKK3sKKyNpZiBVU0UoRElDVEFUSU9OX0FMVEVSTkFUSVZFUykK
KyAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPERpY3Rh
dGlvbkFsdGVybmF0aXZlPiBkaWN0YXRpb25BbHRlcm5hdGl2ZXM7CisKKyAgICBmb3IgKGNvbnN0
IFRleHRBbHRlcm5hdGl2ZVdpdGhSYW5nZSYgYWx0ZXJuYXRpdmVXaXRoUmFuZ2UgOiBkaWN0YXRp
b25BbHRlcm5hdGl2ZXNXaXRoUmFuZ2UpIHsKKyAgICAgICAgdWludDY0X3QgZGljdGF0aW9uQ29u
dGV4dCA9IG1fcGFnZUNsaWVudC5hZGREaWN0YXRpb25BbHRlcm5hdGl2ZXMoYWx0ZXJuYXRpdmVX
aXRoUmFuZ2UuYWx0ZXJuYXRpdmVzKTsKKyAgICAgICAgaWYgKGRpY3RhdGlvbkNvbnRleHQpCisg
ICAgICAgICAgICBkaWN0YXRpb25BbHRlcm5hdGl2ZXMuYXBwZW5kKERpY3RhdGlvbkFsdGVybmF0
aXZlKGFsdGVybmF0aXZlV2l0aFJhbmdlLnJhbmdlLmxvY2F0aW9uLCBhbHRlcm5hdGl2ZVdpdGhS
YW5nZS5yYW5nZS5sZW5ndGgsIGRpY3RhdGlvbkNvbnRleHQpKTsKKyAgICB9CisKKyAgICBpZiAo
ZGljdGF0aW9uQWx0ZXJuYXRpdmVzLmlzRW1wdHkoKSkgeworICAgICAgICBpbnNlcnRUZXh0QXN5
bmModGV4dCwgcmVwbGFjZW1lbnRSYW5nZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBwcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6V2ViUGFnZTo6SW5zZXJ0RGljdGF0ZWRUZXh0QXN5
bmModGV4dCwgcmVwbGFjZW1lbnRSYW5nZSwgZGljdGF0aW9uQWx0ZXJuYXRpdmVzKSwgbV9wYWdl
SUQpOworI2Vsc2UKKyAgICBpbnNlcnRUZXh0QXN5bmModGV4dCwgcmVwbGFjZW1lbnRSYW5nZSk7
CisjZW5kaWYKK30KKwogdm9pZCBXZWJQYWdlUHJveHk6OmdldE1hcmtlZFJhbmdlKEVkaXRpbmdS
YW5nZSYgcmVzdWx0KQogewogICAgIHJlc3VsdCA9IEVkaXRpbmdSYW5nZSgpOwpAQCAtMjQ5LDYg
KzI3NCwzMyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Z2V0QXR0cmlidXRlZFN1YnN0cmluCiAgICAg
cHJvY2VzcygpLnNlbmRTeW5jKE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRBdHRyaWJ1dGVkU3Vic3Ry
aW5nRnJvbVJhbmdlKHJhbmdlKSwgTWVzc2FnZXM6OldlYlBhZ2U6OkdldEF0dHJpYnV0ZWRTdWJz
dHJpbmdGcm9tUmFuZ2U6OlJlcGx5KHJlc3VsdCksIG1fcGFnZUlEKTsKIH0KIAordm9pZCBXZWJQ
YWdlUHJveHk6OmF0dHJpYnV0ZWRTdWJzdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUFzeW5jKGNvbnN0
IEVkaXRpbmdSYW5nZSYgcmFuZ2UsIFBhc3NSZWZQdHI8QXR0cmlidXRlZFN0cmluZ0ZvckNoYXJh
Y3RlclJhbmdlQ2FsbGJhY2s+IGNhbGxiYWNrKQoreworICAgIGlmICghaXNWYWxpZCgpKSB7Cisg
ICAgICAgIGNhbGxiYWNrLT5pbnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKKyAgICBt
X2F0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJ
RCwgY2FsbGJhY2spOworCisgICAgcHJvY2VzcygpLnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkF0
dHJpYnV0ZWRTdWJzdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUFzeW5jKHJhbmdlLCBjYWxsYmFja0lE
KSwgbV9wYWdlSUQpOworfQorCit2b2lkIFdlYlBhZ2VQcm94eTo6YXR0cmlidXRlZFN0cmluZ0Zv
ckNoYXJhY3RlclJhbmdlQ2FsbGJhY2soY29uc3QgQXR0cmlidXRlZFN0cmluZyYgc3RyaW5nLCBj
b25zdCBFZGl0aW5nUmFuZ2UmIGFjdHVhbFJhbmdlLCB1aW50NjRfdCBjYWxsYmFja0lEKQorewor
ICAgIE1FU1NBR0VfQ0hFQ0soYWN0dWFsUmFuZ2UuaXNWYWxpZCgpKTsKKworICAgIFJlZlB0cjxB
dHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtX2F0
dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrcy50YWtlKGNhbGxiYWNrSUQp
OworICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgLy8gRklYTUU6IExvZyBlcnJvciBvciBh
c3NlcnQuCisgICAgICAgIC8vIHRoaXMgY2FuIHZhbGlkbHkgaGFwcGVuIGlmIGEgbG9hZCBpbnZh
bGlkYXRlZCB0aGUgY2FsbGJhY2ssIHRob3VnaAorICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgY2FsbGJhY2stPnBlcmZvcm1DYWxsYmFja1dpdGhSZXR1cm5WYWx1ZShzdHJpbmcsIGFjdHVh
bFJhbmdlKTsKK30KKwogdWludDY0X3QgV2ViUGFnZVByb3h5OjpjaGFyYWN0ZXJJbmRleEZvclBv
aW50KGNvbnN0IEludFBvaW50IHBvaW50KQogewogICAgIGlmICghaXNWYWxpZCgpKQpJbmRleDog
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNwcAkocmV2aXNp
b24gMTY1ODIzKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2Uu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zODYxLDYgKzM4NjEsMTE3IEBAIGJvb2wgV2ViUGFnZTo6
c2hvdWxkVXNlQ3VzdG9tQ29udGVudFByb3YKICAgICByZXR1cm4gbV9taW1lVHlwZXNXaXRoQ3Vz
dG9tQ29udGVudFByb3ZpZGVycy5jb250YWlucyhyZXNwb25zZS5taW1lVHlwZSgpKSAmJiAhY2Fu
UGx1Z2luSGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpOwogfQogCisjaWYgUExBVEZPUk0oQ09DT0Ep
CisKK3ZvaWQgV2ViUGFnZTo6aW5zZXJ0VGV4dEFzeW5jKGNvbnN0IFN0cmluZyYgdGV4dCwgY29u
c3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVudEVkaXRpbmdSYW5nZSkKK3sKKyAgICBGcmFtZSYg
ZnJhbWUgPSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFtZSgpOwor
CisgICAgaWYgKHJlcGxhY2VtZW50RWRpdGluZ1JhbmdlLmxvY2F0aW9uICE9IG5vdEZvdW5kKSB7
CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmVwbGFjZW1lbnRSYW5nZSA9IHJhbmdlRnJvbUVkaXRp
bmdSYW5nZShmcmFtZSwgcmVwbGFjZW1lbnRFZGl0aW5nUmFuZ2UpOworICAgICAgICBpZiAocmVw
bGFjZW1lbnRSYW5nZSkKKyAgICAgICAgICAgIGZyYW1lLnNlbGVjdGlvbigpLnNldFNlbGVjdGlv
bihWaXNpYmxlU2VsZWN0aW9uKHJlcGxhY2VtZW50UmFuZ2UuZ2V0KCksIFNFTF9ERUZBVUxUX0FG
RklOSVRZKSk7CisgICAgfQorCisgICAgaWYgKCFmcmFtZS5lZGl0b3IoKS5oYXNDb21wb3NpdGlv
bigpKSB7CisgICAgICAgIC8vIEFuIGluc2VydFRleHQ6IG1pZ2h0IGJlIGhhbmRsZWQgYnkgb3Ro
ZXIgcmVzcG9uZGVycyBpbiB0aGUgY2hhaW4gaWYgd2UgZG9uJ3QgaGFuZGxlIGl0LgorICAgICAg
ICAvLyBPbmUgZXhhbXBsZSBpcyBzcGFjZSBiYXIgdGhhdCByZXN1bHRzIGluIHNjcm9sbGluZyBk
b3duIHRoZSBwYWdlLgorICAgICAgICBmcmFtZS5lZGl0b3IoKS5pbnNlcnRUZXh0KHRleHQsIG51
bGxwdHIpOworICAgIH0gZWxzZQorICAgICAgICBmcmFtZS5lZGl0b3IoKS5jb25maXJtQ29tcG9z
aXRpb24odGV4dCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Z2V0TWFya2VkUmFuZ2VBc3luYyh1aW50
NjRfdCBjYWxsYmFja0lEKQoreworICAgIEZyYW1lJiBmcmFtZSA9IG1fcGFnZS0+Zm9jdXNDb250
cm9sbGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdl
ID0gZnJhbWUuZWRpdG9yKCkuY29tcG9zaXRpb25SYW5nZSgpOworICAgIHNpemVfdCBsb2NhdGlv
bjsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGlmICghcmFuZ2UgfHwgIVRleHRJdGVyYXRvcjo6
Z2V0TG9jYXRpb25BbmRMZW5ndGhGcm9tUmFuZ2UoZnJhbWUuc2VsZWN0aW9uKCkucm9vdEVkaXRh
YmxlRWxlbWVudE9yRG9jdW1lbnRFbGVtZW50KCksIHJhbmdlLmdldCgpLCBsb2NhdGlvbiwgbGVu
Z3RoKSkgeworICAgICAgICBsb2NhdGlvbiA9IG5vdEZvdW5kOworICAgICAgICBsZW5ndGggPSAw
OworICAgIH0KKworICAgIHNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6RWRpdGluZ1Jhbmdl
Q2FsbGJhY2soRWRpdGluZ1JhbmdlKGxvY2F0aW9uLCBsZW5ndGgpLCBjYWxsYmFja0lEKSk7Cit9
CisKK3ZvaWQgV2ViUGFnZTo6Z2V0U2VsZWN0ZWRSYW5nZUFzeW5jKHVpbnQ2NF90IGNhbGxiYWNr
SUQpCit7CisgICAgRnJhbWUmIGZyYW1lID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS5mb2N1
c2VkT3JNYWluRnJhbWUoKTsKKworICAgIHNpemVfdCBsb2NhdGlvbjsKKyAgICBzaXplX3QgbGVu
Z3RoOworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBmcmFtZS5zZWxlY3Rpb24oKS50b05vcm1h
bGl6ZWRSYW5nZSgpOworICAgIGlmICghcmFuZ2UgfHwgIVRleHRJdGVyYXRvcjo6Z2V0TG9jYXRp
b25BbmRMZW5ndGhGcm9tUmFuZ2UoZnJhbWUuc2VsZWN0aW9uKCkucm9vdEVkaXRhYmxlRWxlbWVu
dE9yRG9jdW1lbnRFbGVtZW50KCksIHJhbmdlLmdldCgpLCBsb2NhdGlvbiwgbGVuZ3RoKSkgewor
ICAgICAgICBsb2NhdGlvbiA9IG5vdEZvdW5kOworICAgICAgICBsZW5ndGggPSAwOworICAgIH0K
KworICAgIHNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6RWRpdGluZ1JhbmdlQ2FsbGJhY2so
RWRpdGluZ1JhbmdlKGxvY2F0aW9uLCBsZW5ndGgpLCBjYWxsYmFja0lEKSk7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6Y2hhcmFjdGVySW5kZXhGb3JQb2ludEFzeW5jKGNvbnN0IFdlYkNvcmU6OkludFBv
aW50JiBwb2ludCwgdWludDY0X3QgY2FsbGJhY2tJRCkKK3sKKyAgICB1aW50NjRfdCBpbmRleCA9
IG5vdEZvdW5kOworCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBtX3BhZ2UtPm1haW5GcmFt
ZSgpLmV2ZW50SGFuZGxlcigpLmhpdFRlc3RSZXN1bHRBdFBvaW50KHBvaW50KTsKKyAgICBGcmFt
ZSogZnJhbWUgPSByZXN1bHQuaW5uZXJOb25TaGFyZWROb2RlKCkgPyByZXN1bHQuaW5uZXJOb2Rl
RnJhbWUoKSA6ICZtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFtZSgp
OworICAgIAorICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBmcmFtZS0+cmFuZ2VGb3JQb2ludChy
ZXN1bHQucm91bmRlZFBvaW50SW5Jbm5lck5vZGVGcmFtZSgpKTsKKyAgICBpZiAocmFuZ2UpIHsK
KyAgICAgICAgc2l6ZV90IGxvY2F0aW9uOworICAgICAgICBzaXplX3QgbGVuZ3RoOworICAgICAg
ICBpZiAoVGV4dEl0ZXJhdG9yOjpnZXRMb2NhdGlvbkFuZExlbmd0aEZyb21SYW5nZShmcmFtZS0+
c2VsZWN0aW9uKCkucm9vdEVkaXRhYmxlRWxlbWVudE9yRG9jdW1lbnRFbGVtZW50KCksIHJhbmdl
LmdldCgpLCBsb2NhdGlvbiwgbGVuZ3RoKSkKKyAgICAgICAgICAgIGluZGV4ID0gc3RhdGljX2Nh
c3Q8dWludDY0X3Q+KGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICBzZW5kKE1lc3NhZ2VzOjpXZWJQ
YWdlUHJveHk6OlVuc2lnbmVkQ2FsbGJhY2soaW5kZXgsIGNhbGxiYWNrSUQpKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZUFzeW5jKGNvbnN0IEVkaXRpbmdS
YW5nZSYgZWRpdGluZ1JhbmdlLCB1aW50NjRfdCBjYWxsYmFja0lEKQoreworICAgIEZyYW1lJiBm
cmFtZSA9IG1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7Cisg
ICAgSW50UmVjdCByZXN1bHQoSW50UG9pbnQoMCwgMCksIEludFNpemUoMCwgMCkpOworICAgIAor
ICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSByYW5nZUZyb21FZGl0aW5nUmFuZ2UoZnJhbWUsIGVk
aXRpbmdSYW5nZSk7CisgICAgaWYgKCFyYW5nZSkgeworICAgICAgICBzZW5kKE1lc3NhZ2VzOjpX
ZWJQYWdlUHJveHk6OlJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKHJlc3VsdCwgRWRpdGlu
Z1JhbmdlKG5vdEZvdW5kLCAwKSwgY2FsbGJhY2tJRCkpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgQVNTRVJUKHJhbmdlLT5zdGFydENvbnRhaW5lcigpKTsKKyAgICBBU1NFUlQocmFu
Z2UtPmVuZENvbnRhaW5lcigpKTsKKyAgICAgCisgICAgcmVzdWx0ID0gZnJhbWUudmlldygpLT5j
b250ZW50c1RvV2luZG93KGZyYW1lLmVkaXRvcigpLmZpcnN0UmVjdEZvclJhbmdlKHJhbmdlLmdl
dCgpKSk7CisKKyAgICAvLyBGSVhNRTogVXBkYXRlIGFjdHVhbFJhbmdlIHRvIG1hdGNoIHRoZSBy
YW5nZSBvZiBmaXJzdCByZWN0LgorICAgIHNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6UmVj
dEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2socmVzdWx0LCBlZGl0aW5nUmFuZ2UsIGNhbGxiYWNr
SUQpKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRDb21wb3NpdGlvbkFzeW5jKGNvbnN0IFN0cmlu
ZyYgdGV4dCwgVmVjdG9yPENvbXBvc2l0aW9uVW5kZXJsaW5lPiB1bmRlcmxpbmVzLCBjb25zdCBF
ZGl0aW5nUmFuZ2UmIHNlbGVjdGlvbiwgY29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVudEVk
aXRpbmdSYW5nZSkKK3sKKyAgICBGcmFtZSYgZnJhbWUgPSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxl
cigpLmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAgaWYgKGZyYW1lLnNlbGVjdGlvbigpLnNl
bGVjdGlvbigpLmlzQ29udGVudEVkaXRhYmxlKCkpIHsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiBy
ZXBsYWNlbWVudFJhbmdlOworICAgICAgICBpZiAocmVwbGFjZW1lbnRFZGl0aW5nUmFuZ2UubG9j
YXRpb24gIT0gbm90Rm91bmQpIHsKKyAgICAgICAgICAgIHJlcGxhY2VtZW50UmFuZ2UgPSByYW5n
ZUZyb21FZGl0aW5nUmFuZ2UoZnJhbWUsIHJlcGxhY2VtZW50RWRpdGluZ1JhbmdlKTsKKyAgICAg
ICAgICAgIGZyYW1lLnNlbGVjdGlvbigpLnNldFNlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHJl
cGxhY2VtZW50UmFuZ2UuZ2V0KCksIFNFTF9ERUZBVUxUX0FGRklOSVRZKSk7CisgICAgICAgIH0K
KworICAgICAgICBmcmFtZS5lZGl0b3IoKS5zZXRDb21wb3NpdGlvbih0ZXh0LCB1bmRlcmxpbmVz
LCBzZWxlY3Rpb24ubG9jYXRpb24sIHNlbGVjdGlvbi5sb2NhdGlvbiArIHNlbGVjdGlvbi5sZW5n
dGgpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpjb25maXJtQ29tcG9zaXRpb25Bc3luYygp
Cit7CisgICAgRnJhbWUmIGZyYW1lID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS5mb2N1c2Vk
T3JNYWluRnJhbWUoKTsKKyAgICBmcmFtZS5lZGl0b3IoKS5jb25maXJtQ29tcG9zaXRpb24oKTsK
K30KKworI2VuZGlmIC8vIFBMQVRGT1JNKENPQ09BKQorCiAjaWYgUExBVEZPUk0oR1RLKQogc3Rh
dGljIEZyYW1lKiB0YXJnZXRGcmFtZUZvckVkaXRpbmcoV2ViUGFnZSogcGFnZSkKIHsKSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAkocmV2aXNpb24g
MTY1ODIzKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAko
d29ya2luZyBjb3B5KQpAQCAtNTM3LDE1ICs1MzcsMjcgQEAgcHVibGljOgogICAgIAogICAgIHZv
aWQgc2VuZENvbXBsZXhUZXh0SW5wdXRUb1BsdWdpbih1aW50NjRfdCBwbHVnaW5Db21wbGV4VGV4
dElucHV0SWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiB0ZXh0SW5wdXQpOwogCi0gICAgdm9pZCBj
YW5jZWxDb21wb3NpdGlvbihFZGl0b3JTdGF0ZSYgbmV3U3RhdGUpOwotI2lmICFQTEFURk9STShJ
T1MpCisjaWYgUExBVEZPUk0oTUFDKQogICAgIHZvaWQgaW5zZXJ0VGV4dChjb25zdCBTdHJpbmcm
IHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRSYW5nZSwgYm9vbCYgaGFuZGxl
ZCwgRWRpdG9yU3RhdGUmIG5ld1N0YXRlKTsKICAgICB2b2lkIHNldENvbXBvc2l0aW9uKGNvbnN0
IFN0cmluZyYgdGV4dCwgVmVjdG9yPFdlYkNvcmU6OkNvbXBvc2l0aW9uVW5kZXJsaW5lPiB1bmRl
cmxpbmVzLCBjb25zdCBFZGl0aW5nUmFuZ2UmIHNlbGVjdGlvblJhbmdlLCBjb25zdCBFZGl0aW5n
UmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UsIEVkaXRvclN0YXRlJiBuZXdTdGF0ZSk7CiAgICAgdm9p
ZCBjb25maXJtQ29tcG9zaXRpb24oRWRpdG9yU3RhdGUmIG5ld1N0YXRlKTsKKyAgICB2b2lkIGlu
c2VydERpY3RhdGVkVGV4dChjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYg
cmVwbGFjZW1lbnRSYW5nZSwgY29uc3QgVmVjdG9yPFdlYkNvcmU6OkRpY3RhdGlvbkFsdGVybmF0
aXZlPiYgZGljdGF0aW9uQWx0ZXJuYXRpdmVMb2NhdGlvbnMsIGJvb2wmIGhhbmRsZWQsIEVkaXRv
clN0YXRlJiBuZXdTdGF0ZSk7CisgICAgdm9pZCBpbnNlcnREaWN0YXRlZFRleHRBc3luYyhjb25z
dCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRSYW5nZSwgY29u
c3QgVmVjdG9yPFdlYkNvcmU6OkRpY3RhdGlvbkFsdGVybmF0aXZlPiYgZGljdGF0aW9uQWx0ZXJu
YXRpdmVMb2NhdGlvbnMpOworICAgIHZvaWQgZ2V0QXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5n
ZShjb25zdCBFZGl0aW5nUmFuZ2UmLCBBdHRyaWJ1dGVkU3RyaW5nJik7CisgICAgdm9pZCBhdHRy
aWJ1dGVkU3Vic3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhjb25zdCBFZGl0aW5nUmFuZ2Um
LCB1aW50NjRfdCBjYWxsYmFja0lEKTsKICNlbmRpZgorCisgICAgdm9pZCBpbnNlcnRUZXh0QXN5
bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFu
Z2UpOworICAgIHZvaWQgZ2V0TWFya2VkUmFuZ2VBc3luYyh1aW50NjRfdCBjYWxsYmFja0lEKTsK
KyAgICB2b2lkIGdldFNlbGVjdGVkUmFuZ2VBc3luYyh1aW50NjRfdCBjYWxsYmFja0lEKTsKKyAg
ICB2b2lkIGNoYXJhY3RlckluZGV4Rm9yUG9pbnRBc3luYyhjb25zdCBXZWJDb3JlOjpJbnRQb2lu
dCYsIHVpbnQ2NF90IGNhbGxiYWNrSUQpOworICAgIHZvaWQgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVy
UmFuZ2VBc3luYyhjb25zdCBFZGl0aW5nUmFuZ2UmLCB1aW50NjRfdCBjYWxsYmFja0lEKTsKKyAg
ICB2b2lkIHNldENvbXBvc2l0aW9uQXN5bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBWZWN0b3I8V2Vi
Q29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+IHVuZGVybGluZXMsIGNvbnN0IEVkaXRpbmdSYW5n
ZSYgc2VsZWN0aW9uUmFuZ2UsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRSYW5nZSk7
CisgICAgdm9pZCBjb25maXJtQ29tcG9zaXRpb25Bc3luYygpOworCisgICAgdm9pZCBjYW5jZWxD
b21wb3NpdGlvbihFZGl0b3JTdGF0ZSYgbmV3U3RhdGUpOwogICAgIHZvaWQgZ2V0TWFya2VkUmFu
Z2UoRWRpdGluZ1JhbmdlJik7CiAgICAgdm9pZCBnZXRTZWxlY3RlZFJhbmdlKEVkaXRpbmdSYW5n
ZSYpOwotICAgIHZvaWQgZ2V0QXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5nZShjb25zdCBFZGl0
aW5nUmFuZ2UmLCBBdHRyaWJ1dGVkU3RyaW5nJik7CiAgICAgdm9pZCBjaGFyYWN0ZXJJbmRleEZv
clBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50IHBvaW50LCB1aW50NjRfdCYgcmVzdWx0KTsK
ICAgICB2b2lkIGZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlKGNvbnN0IEVkaXRpbmdSYW5nZSYs
IFdlYkNvcmU6OkludFJlY3QmIHJlc3VsdFJlY3QpOwogICAgIHZvaWQgZXhlY3V0ZUtleXByZXNz
Q29tbWFuZHMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4mLCBib29sJiBo
YW5kbGVkLCBFZGl0b3JTdGF0ZSYgbmV3U3RhdGUpOwpAQCAtNTU1LDcgKzU2Nyw2IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHNob3VsZERlbGF5V2luZG93T3JkZXJpbmdFdmVudChjb25zdCBXZWJLaXQ6
OldlYk1vdXNlRXZlbnQmLCBib29sJiByZXN1bHQpOwogICAgIHZvaWQgYWNjZXB0c0ZpcnN0TW91
c2UoaW50IGV2ZW50TnVtYmVyLCBjb25zdCBXZWJLaXQ6OldlYk1vdXNlRXZlbnQmLCBib29sJiBy
ZXN1bHQpOwogICAgIGJvb2wgcGVyZm9ybU5vbkVkaXRpbmdCZWhhdmlvckZvclNlbGVjdG9yKGNv
bnN0IFN0cmluZyYsIFdlYkNvcmU6OktleWJvYXJkRXZlbnQqKTsKLSAgICB2b2lkIGluc2VydERp
Y3RhdGVkVGV4dChjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFj
ZW1lbnRSYW5nZSwgY29uc3QgVmVjdG9yPFdlYkNvcmU6OkRpY3RhdGlvbkFsdGVybmF0aXZlPiYg
ZGljdGF0aW9uQWx0ZXJuYXRpdmVMb2NhdGlvbnMsIGJvb2wmIGhhbmRsZWQsIEVkaXRvclN0YXRl
JiBuZXdTdGF0ZSk7CiAjZWxpZiBQTEFURk9STShFRkwpCiAgICAgdm9pZCBjb25maXJtQ29tcG9z
aXRpb24oY29uc3QgU3RyaW5nJiBjb21wb3NpdGlvblN0cmluZyk7CiAgICAgdm9pZCBzZXRDb21w
b3NpdGlvbihjb25zdCBXVEY6OlN0cmluZyYgY29tcG9zaXRpb25TdHJpbmcsIGNvbnN0IFdURjo6
VmVjdG9yPFdlYkNvcmU6OkNvbXBvc2l0aW9uVW5kZXJsaW5lPiYgdW5kZXJsaW5lcywgdWludDY0
X3QgY3Vyc29yUG9zaXRpb24pOwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQ
YWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2Vi
UHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4JKHJldmlzaW9uIDE2NTgyMykKKysr
IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCSh3
b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niw3IEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2UgTGVnYWN5
UmVjZWl2ZXIgewogICAgIFN5bmNBcHBseUF1dG9jb3JyZWN0aW9uKFN0cmluZyBjb3JyZWN0aW9u
LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSAtPiAoYm9vbCBhdXRvY29ycmVjdGlvbkFwcGxpZWQpCiAg
ICAgUmVxdWVzdEF1dG9jb3JyZWN0aW9uQ29udGV4dCh1aW50NjRfdCBjYWxsYmFja0lEKQogICAg
IEdldEF1dG9jb3JyZWN0aW9uQ29udGV4dCgpIC0+IChTdHJpbmcgYmVmb3JlQ29udGV4dCwgU3Ry
aW5nIG1hcmtlZFRleHQsIFN0cmluZyBzZWxlY3RlZFRleHQsIFN0cmluZyBhZnRlckNvbnRleHQs
IHVpbnQ2NF90IGxvY2F0aW9uLCB1aW50NjRfdCBsZW5ndGgpIAorICAgICMgRklYTUU6IFVzZSBz
aGFyZWQgQ09DT0EgdGV4dCBpbnB1dCBtZXRob2RzIGxpa2UgaW5zZXJ0VGV4dEFzeW5jLgogICAg
IEluc2VydFRleHQoU3RyaW5nIHRleHQsIFdlYktpdDo6RWRpdGluZ1JhbmdlIHJlcGxhY2VtZW50
UmFuZ2UpCiAgICAgU2V0Q29tcG9zaXRpb24oU3RyaW5nIHRleHQsIFZlY3RvcjxXZWJDb3JlOjpD
b21wb3NpdGlvblVuZGVybGluZT4gdW5kZXJsaW5lcywgV2ViS2l0OjpFZGl0aW5nUmFuZ2Ugc2Vs
ZWN0aW9uUmFuZ2UpCiAgICAgQ29uZmlybUNvbXBvc2l0aW9uKCkKQEAgLTI5NCwxOCArMjk1LDI4
IEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2UgTGVnYWN5UmVjZWl2ZXIgewogICAgIENhbmNlbENvbXBv
c2l0aW9uKCkgLT4gKFdlYktpdDo6RWRpdG9yU3RhdGUgbmV3U3RhdGUpCiAgICAgR2V0TWFya2Vk
UmFuZ2UoKSAtPiAoV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmFuZ2UpCiAgICAgR2V0U2VsZWN0ZWRS
YW5nZSgpIC0+IChXZWJLaXQ6OkVkaXRpbmdSYW5nZSByYW5nZSkKLSAgICBHZXRBdHRyaWJ1dGVk
U3Vic3RyaW5nRnJvbVJhbmdlKFdlYktpdDo6RWRpdGluZ1JhbmdlIHJhbmdlKSAtPiAoV2ViS2l0
OjpBdHRyaWJ1dGVkU3RyaW5nIHJlc3VsdCkKICAgICBDaGFyYWN0ZXJJbmRleEZvclBvaW50KFdl
YkNvcmU6OkludFBvaW50IHBvaW50KSAtPiAodWludDY0X3QgcmVzdWx0KQogICAgIEZpcnN0UmVj
dEZvckNoYXJhY3RlclJhbmdlKFdlYktpdDo6RWRpdGluZ1JhbmdlIHJhbmdlKSAtPiAoV2ViQ29y
ZTo6SW50UmVjdCByZXN1bHRSZWN0KQogICAgIEV4ZWN1dGVLZXlwcmVzc0NvbW1hbmRzKFZlY3Rv
cjxXZWJDb3JlOjpLZXlwcmVzc0NvbW1hbmQ+IHNhdmVkQ29tbWFuZHMpIC0+IChib29sIGhhbmRs
ZWQsIFdlYktpdDo6RWRpdG9yU3RhdGUgbmV3U3RhdGUpCiAgICAgU2hvdWxkRGVsYXlXaW5kb3dP
cmRlcmluZ0V2ZW50KFdlYktpdDo6V2ViTW91c2VFdmVudCBldmVudCkgLT4gKGJvb2wgcmVzdWx0
KQogICAgIEFjY2VwdHNGaXJzdE1vdXNlKGludCBldmVudE51bWJlciwgV2ViS2l0OjpXZWJNb3Vz
ZUV2ZW50IGV2ZW50KSAtPiAoYm9vbCByZXN1bHQpCi0gICAgSW5zZXJ0RGljdGF0ZWRUZXh0KFN0
cmluZyB0ZXh0LCBXZWJLaXQ6OkVkaXRpbmdSYW5nZSByZXBsYWNlbWVudFJhbmdlLCBWZWN0b3I8
V2ViQ29yZTo6RGljdGF0aW9uQWx0ZXJuYXRpdmU+IGRpY3RhdGlvbkFsdGVybmF0aXZlcykgLT4g
KGJvb2wgaGFuZGxlZCwgV2ViS2l0OjpFZGl0b3JTdGF0ZSBuZXdTdGF0ZSkKKworICAgIEluc2Vy
dFRleHRBc3luYyhTdHJpbmcgdGV4dCwgV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmVwbGFjZW1lbnRS
YW5nZSkKKyAgICBHZXRNYXJrZWRSYW5nZUFzeW5jKHVpbnQ2NF90IGNhbGxiYWNrSUQpCisgICAg
R2V0U2VsZWN0ZWRSYW5nZUFzeW5jKHVpbnQ2NF90IGNhbGxiYWNrSUQpCisgICAgQ2hhcmFjdGVy
SW5kZXhGb3JQb2ludEFzeW5jKFdlYkNvcmU6OkludFBvaW50IHBvaW50LCB1aW50NjRfdCBjYWxs
YmFja0lEKTsKKyAgICBGaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZUFzeW5jKFdlYktpdDo6RWRp
dGluZ1JhbmdlIHJhbmdlLCB1aW50NjRfdCBjYWxsYmFja0lEKTsKKyAgICBTZXRDb21wb3NpdGlv
bkFzeW5jKFN0cmluZyB0ZXh0LCBWZWN0b3I8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+
IHVuZGVybGluZXMsIFdlYktpdDo6RWRpdGluZ1JhbmdlIHNlbGVjdGlvblJhbmdlLCBXZWJLaXQ6
OkVkaXRpbmdSYW5nZSByZXBsYWNlbWVudFJhbmdlKQorICAgIENvbmZpcm1Db21wb3NpdGlvbkFz
eW5jKCkKICNlbmRpZgogI2lmIFBMQVRGT1JNKE1BQykKICAgICBJbnNlcnRUZXh0KFN0cmluZyB0
ZXh0LCBXZWJLaXQ6OkVkaXRpbmdSYW5nZSByZXBsYWNlbWVudFJhbmdlKSAtPiAoYm9vbCBoYW5k
bGVkLCBXZWJLaXQ6OkVkaXRvclN0YXRlIG5ld1N0YXRlKQogICAgIFNldENvbXBvc2l0aW9uKFN0
cmluZyB0ZXh0LCBWZWN0b3I8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+IHVuZGVybGlu
ZXMsIFdlYktpdDo6RWRpdGluZ1JhbmdlIHNlbGVjdGlvblJhbmdlLCBXZWJLaXQ6OkVkaXRpbmdS
YW5nZSByZXBsYWNlbWVudFJhbmdlKSAtPiAoV2ViS2l0OjpFZGl0b3JTdGF0ZSBuZXdTdGF0ZSkK
ICAgICBDb25maXJtQ29tcG9zaXRpb24oKSAtPiAoV2ViS2l0OjpFZGl0b3JTdGF0ZSBuZXdTdGF0
ZSkKKyAgICBJbnNlcnREaWN0YXRlZFRleHQoU3RyaW5nIHRleHQsIFdlYktpdDo6RWRpdGluZ1Jh
bmdlIHJlcGxhY2VtZW50UmFuZ2UsIFZlY3RvcjxXZWJDb3JlOjpEaWN0YXRpb25BbHRlcm5hdGl2
ZT4gZGljdGF0aW9uQWx0ZXJuYXRpdmVzKSAtPiAoYm9vbCBoYW5kbGVkLCBXZWJLaXQ6OkVkaXRv
clN0YXRlIG5ld1N0YXRlKQorICAgIEluc2VydERpY3RhdGVkVGV4dEFzeW5jKFN0cmluZyB0ZXh0
LCBXZWJLaXQ6OkVkaXRpbmdSYW5nZSByZXBsYWNlbWVudFJhbmdlLCBWZWN0b3I8V2ViQ29yZTo6
RGljdGF0aW9uQWx0ZXJuYXRpdmU+IGRpY3RhdGlvbkFsdGVybmF0aXZlcykKKyAgICBHZXRBdHRy
aWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlKFdlYktpdDo6RWRpdGluZ1JhbmdlIHJhbmdlKSAtPiAo
V2ViS2l0OjpBdHRyaWJ1dGVkU3RyaW5nIHJlc3VsdCkKKyAgICBBdHRyaWJ1dGVkU3Vic3RyaW5n
Rm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhXZWJLaXQ6OkVkaXRpbmdSYW5nZSByYW5nZSwgdWludDY0
X3QgY2FsbGJhY2tJRCk7CiAjZW5kaWYKICAgICBTZXRNaW5pbXVtTGF5b3V0U2l6ZShXZWJDb3Jl
OjpJbnRTaXplIG1pbmltdW1MYXlvdXRTaXplKQogICAgIFNldEF1dG9TaXppbmdTaG91bGRFeHBh
bmRUb1ZpZXdIZWlnaHQoYm9vbCBzaG91bGRFeHBhbmQpCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9X
ZWJQcm9jZXNzL1dlYlBhZ2UvaW9zL1dlYlBhZ2VJT1MubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCShyZXZpc2lvbiAx
NjU4MjMpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvaW9zL1dlYlBhZ2VJ
T1MubW0JKHdvcmtpbmcgY29weSkKQEAgLTIwNCwxMSArMjA0LDYgQEAgdm9pZCBXZWJQYWdlOjpp
bnNlcnRUZXh0KGNvbnN0IFN0cmluZyYgdAogICAgICAgICBmcmFtZS5lZGl0b3IoKS5jb25maXJt
Q29tcG9zaXRpb24odGV4dCk7CiB9CiAKLXZvaWQgV2ViUGFnZTo6aW5zZXJ0RGljdGF0ZWRUZXh0
KGNvbnN0IFN0cmluZyYsIGNvbnN0IEVkaXRpbmdSYW5nZSYsIGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpEaWN0YXRpb25BbHRlcm5hdGl2ZT4mLCBib29sJiwgRWRpdG9yU3RhdGUmKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci19Ci0KIHZvaWQgV2ViUGFnZTo6Z2V0TWFya2VkUmFuZ2UoRWRpdGlu
Z1JhbmdlJikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwpAQCAtMjE5LDExICsyMTQsNiBAQCB2
b2lkIFdlYlBhZ2U6OmdldFNlbGVjdGVkUmFuZ2UoRWRpdGluZ1JhCiAgICAgbm90SW1wbGVtZW50
ZWQoKTsKIH0KIAotdm9pZCBXZWJQYWdlOjpnZXRBdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdl
KGNvbnN0IEVkaXRpbmdSYW5nZSYsIEF0dHJpYnV0ZWRTdHJpbmcmKQotewotICAgIG5vdEltcGxl
bWVudGVkKCk7Ci19Ci0KIHZvaWQgV2ViUGFnZTo6Y2hhcmFjdGVySW5kZXhGb3JQb2ludChJbnRQ
b2ludCwgdWludDY0X3QmKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dlYlBhZ2VNYWMubW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XZWJQYWdlTWFjLm1tCShy
ZXZpc2lvbiAxNjU4MjMpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFj
L1dlYlBhZ2VNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTMxNCw2ICszMTQsMjAgQEAgdm9pZCBX
ZWJQYWdlOjppbnNlcnREaWN0YXRlZFRleHQoY29uc3QgUwogICAgIG5ld1N0YXRlID0gZWRpdG9y
U3RhdGUoKTsKIH0KIAordm9pZCBXZWJQYWdlOjppbnNlcnREaWN0YXRlZFRleHRBc3luYyhjb25z
dCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRFZGl0aW5nUmFu
Z2UsIGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpEaWN0YXRpb25BbHRlcm5hdGl2ZT4mIGRpY3RhdGlv
bkFsdGVybmF0aXZlTG9jYXRpb25zKQoreworICAgIEZyYW1lJiBmcmFtZSA9IG1fcGFnZS0+Zm9j
dXNDb250cm9sbGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBpZiAocmVwbGFjZW1l
bnRFZGl0aW5nUmFuZ2UubG9jYXRpb24gIT0gbm90Rm91bmQpIHsKKyAgICAgICAgUmVmUHRyPFJh
bmdlPiByZXBsYWNlbWVudFJhbmdlID0gcmFuZ2VGcm9tRWRpdGluZ1JhbmdlKGZyYW1lLCByZXBs
YWNlbWVudEVkaXRpbmdSYW5nZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudFJhbmdlKQorICAg
ICAgICAgICAgZnJhbWUuc2VsZWN0aW9uKCkuc2V0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24o
cmVwbGFjZW1lbnRSYW5nZS5nZXQoKSwgU0VMX0RFRkFVTFRfQUZGSU5JVFkpKTsKKyAgICB9CisK
KyAgICBBU1NFUlQoIWZyYW1lLmVkaXRvcigpLmhhc0NvbXBvc2l0aW9uKCkpOworICAgIGZyYW1l
LmVkaXRvcigpLmluc2VydERpY3RhdGVkVGV4dCh0ZXh0LCBkaWN0YXRpb25BbHRlcm5hdGl2ZUxv
Y2F0aW9ucywgbnVsbHB0cik7Cit9CisKIHZvaWQgV2ViUGFnZTo6Z2V0TWFya2VkUmFuZ2UoRWRp
dGluZ1JhbmdlJiByZXN1bHQpCiB7CiAgICAgRnJhbWUmIGZyYW1lID0gbV9wYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS5mb2N1c2VkT3JNYWluRnJhbWUoKTsKQEAgLTM2NSw2ICszNzksMzkgQEAgdm9p
ZCBXZWJQYWdlOjpnZXRBdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbQogICAgIH0KIH0KIAordm9pZCBX
ZWJQYWdlOjphdHRyaWJ1dGVkU3Vic3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhjb25zdCBF
ZGl0aW5nUmFuZ2UmIGVkaXRpbmdSYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKK3sKKyAgICBB
dHRyaWJ1dGVkU3RyaW5nIHJlc3VsdDsKKworICAgIEZyYW1lJiBmcmFtZSA9IG1fcGFnZS0+Zm9j
dXNDb250cm9sbGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBjb25zdCBWaXNpYmxl
U2VsZWN0aW9uJiBzZWxlY3Rpb24gPSBmcmFtZS5zZWxlY3Rpb24oKS5zZWxlY3Rpb24oKTsKKyAg
ICBpZiAoc2VsZWN0aW9uLmlzTm9uZSgpIHx8ICFzZWxlY3Rpb24uaXNDb250ZW50RWRpdGFibGUo
KSB8fCBzZWxlY3Rpb24uaXNJblBhc3N3b3JkRmllbGQoKSkgeworICAgICAgICBzZW5kKE1lc3Nh
Z2VzOjpXZWJQYWdlUHJveHk6OkF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxi
YWNrKHJlc3VsdCwgRWRpdGluZ1JhbmdlKCksIGNhbGxiYWNrSUQpKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSByYW5nZUZyb21FZGl0aW5nUmFu
Z2UoZnJhbWUsIGVkaXRpbmdSYW5nZSk7CisgICAgaWYgKCFyYW5nZSkgeworICAgICAgICBzZW5k
KE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OkF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5n
ZUNhbGxiYWNrKHJlc3VsdCwgRWRpdGluZ1JhbmdlKCksIGNhbGxiYWNrSUQpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIHJlc3VsdC5zdHJpbmcgPSBbV2ViSFRNTENvbnZlcnRlciBl
ZGl0aW5nQXR0cmlidXRlZFN0cmluZ0Zyb21SYW5nZTpyYW5nZS5nZXQoKV07CisgICAgTlNBdHRy
aWJ1dGVkU3RyaW5nKiBhdHRyaWJ1dGVkU3RyaW5nID0gcmVzdWx0LnN0cmluZy5nZXQoKTsKKyAg
ICAKKyAgICAvLyBbV2ViSFRNTENvbnZlcnRlciBlZGl0aW5nQXR0cmlidXRlZFN0cmluZ0Zyb21S
YW5nZTpdIGluc2lzdHMgb24gaW5zZXJ0aW5nIGEgdHJhaWxpbmcgCisgICAgLy8gd2hpdGVzcGFj
ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgd2hpY2ggYnJlYWtzIHRoZSBBVE9LIGlucHV0IG1l
dGhvZC4gIDxyZGFyOi8vcHJvYmxlbS81NDAwNTUxPgorICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRo
aXMgd2UgdHJ1bmNhdGUgdGhlIHJlc3VsdGFudCBzdHJpbmcgdG8gdGhlIGNvcnJlY3QgbGVuZ3Ro
LgorICAgIGlmIChbYXR0cmlidXRlZFN0cmluZyBsZW5ndGhdID4gZWRpdGluZ1JhbmdlLmxlbmd0
aCkgeworICAgICAgICBBU1NFUlQoW2F0dHJpYnV0ZWRTdHJpbmcgbGVuZ3RoXSA9PSBlZGl0aW5n
UmFuZ2UubGVuZ3RoICsgMSk7CisgICAgICAgIEFTU0VSVChbW2F0dHJpYnV0ZWRTdHJpbmcgc3Ry
aW5nXSBjaGFyYWN0ZXJBdEluZGV4OmVkaXRpbmdSYW5nZS5sZW5ndGhdID09ICdcbicgfHwgW1th
dHRyaWJ1dGVkU3RyaW5nIHN0cmluZ10gY2hhcmFjdGVyQXRJbmRleDplZGl0aW5nUmFuZ2UubGVu
Z3RoXSA9PSAnICcpOworICAgICAgICByZXN1bHQuc3RyaW5nID0gW2F0dHJpYnV0ZWRTdHJpbmcg
YXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5nZTpOU01ha2VSYW5nZSgwLCBlZGl0aW5nUmFuZ2Uu
bGVuZ3RoKV07CisgICAgfQorCisgICAgc2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpBdHRy
aWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhyZXN1bHQsIEVkaXRpbmdSYW5n
ZShlZGl0aW5nUmFuZ2UubG9jYXRpb24sIFtyZXN1bHQuc3RyaW5nIGxlbmd0aF0pLCBjYWxsYmFj
a0lEKSk7Cit9CisKIHZvaWQgV2ViUGFnZTo6Y2hhcmFjdGVySW5kZXhGb3JQb2ludChJbnRQb2lu
dCBwb2ludCwgdWludDY0X3QmIGluZGV4KQogewogICAgIGluZGV4ID0gbm90Rm91bmQ7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>227229</attachid>
            <date>2014-03-19 16:23:56 -0700</date>
            <delta_ts>2014-03-20 10:15:39 -0700</delta_ts>
            <desc>updated to ToT</desc>
            <filename>Async.txt</filename>
            <type>text/plain</type>
            <size>92291</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NTkyOCkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU1IEBACisyMDE0LTAzLTE5ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtNYWNdIFN1cHBvcnQgYXN5
bmNocm9ub3VzIE5TVGV4dElucHV0Q2xpZW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xMzA0NzkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgY3VycmVudGx5IGRpc2Fi
bGVkLCBwZW5kaW5nIGxvd2VyIGxldmVsIHN1cHBvcnQuCisgICAgICAgIE1vc3Qgb2YgdGhlIGNv
ZGUgaXMgbm90IHVuZGVyIGNvbXBpbGUgdGltZSBndWFyZCBob3dldmVyLCB0byBmYWNpbGl0YXRl
IGNyb3NzLXBsYXRmb3JtCisgICAgICAgIHJldXNlLCBvciBhdCBsZWFzdCB1bmRlciBhIFBMQVRG
T1JNKENPQ09BKSBndWFyZCB0byBzaGFyZSB0aGUgY29kZSB3aXRoIGlPUy4KKworICAgICAgICAq
IFVJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbTogQWRkZWQgYSBjb21waWxlIHRpbWUgYnJhbmNo
IGZvciBVU0UoQVNZTkNfTlNURVhUSU5QVVRDTElFTlQpLgorICAgICAgICBXZSBzdGlsbCBpbXBs
ZW1lbnQgc3luYyBOU1RleHRJbnB1dENsaWVudCBoZXJlLCBpbiBvcmRlciB0byBnZXQgYXNzZXJ0
aW9ucyB3aGVuCisgICAgICAgIGl0cyBtZXRob2RzIGFyZSB1bmV4cGVjdGVkbHkgY2FsbGVkLgor
ICAgICAgICBUaGUgbmV3IGNvZGUgZmlyc3Qgc2VuZHMgYW4gZXZlbnQgdG8gaW5wdXQgbWV0aG9k
IGFzeW5jaHJvbm91c2x5LCBoYW5kbGluZyBhbnkgY2FsbGJhY2tzCisgICAgICAgIHRoYXQgbWF5
IGFycml2ZS4gRHVyaW5nIHRoaXMgdGltZSwgd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgV0tWaWV3
SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycworICAgICAgICBhdCBhbGwuIE9uY2UgZG9uZSwg
d2UgaW50ZXJwcmV0IGtleSBiaW5kaW5ncyBzeW5jaHJvbm91c2x5LCBjb2xsZWN0aW5nIHRoZW0g
aW50bworICAgICAgICBhIHZlY3Rvci4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvbWFjL1dL
Vmlld0ludGVybmFsLmg6IFdlIG5vIGxvbmdlciBleHBvc2UgX2ludGVycHJldEtleUV2ZW50IG91
dHNpZGUKKyAgICAgICAgV0tWaWV3LgorCisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94
eS5jcHA6CisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oOgorICAgICAgICBBZGRl
ZCBhc3luYyBjYWxscyBhbmQgY2FsbGJhY2tzLiBSZW1vdmVkIHVubmVjZXNzYXJ5IGFuZCBzbGln
aHRseSBoYXJtZnVsIC5nZXQoKSB3aGVuIG1vdmluZworICAgICAgICBhIGNhbGxiYWNrIHBvaW50
ZXIgaW50byBtYXAuIE1vdmVkIGluc2VydERpY3RhdGVkVGV4dCgpIGFuZCBnZXRBdHRyaWJ1dGVk
U3Vic3RyaW5nRnJvbVJhbmdlKCkKKyAgICAgICAgZnJvbSBQTEFURk9STShDT0NPQSkgdG8gUExB
VEZPUk0oTUFDKSwgYmVjYXVzZSB0aGV5IGFyZSB1bnVzZWQgYW5kIHVuaW1wbGVtZW50ZWQgb24K
KyAgICAgICAgaU9TLCBhbmQgdW5saWtlbHkgdG8gYmUgbmVlZGVkIGFueSB0aW1lIHNvb24uIENo
YW5nZWQgVVNFKEFQUEtJVCkgdG8gUExBVEZPUk0oTUFDKSwKKyAgICAgICAgYmVjYXVzZSB0aGF0
J3MgbW9yZSBhY2N1cmF0ZSBpbiB0aGlzIGNhc2UgKG5vdGhpbmcgZGVwZW5kcyBvbiBBcHBLaXQs
IGl0J3MganVzdCBjb2RlCisgICAgICAgIHRoYXQgd2Ugb25seSBuZWVkIG9uIE1hYykuCisKKyAg
ICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluOiBBZGRlZCBtZXNzYWdl
cyBmb3IgbmV3IGFzeW5jIElNIHJlc3BvbnNlcy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9pb3Mv
V2ViUGFnZVByb3h5SU9TLm1tOiBSZW1vdmVkIGluc2VydERpY3RhdGVkVGV4dCgpIGFuZCBnZXRB
dHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlKCkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvbWFj
L1dlYlBhZ2VQcm94eU1hYy5tbToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjppbnNl
cnREaWN0YXRlZFRleHRBc3luYyk6CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6YXR0
cmlidXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQXN5bmMpOgorICAgICAgICAoV2ViS2l0
OjpXZWJQYWdlUHJveHk6OmF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNr
KToKKyAgICAgICAgQWRkZWQgYXN5bmMgY2FsbHMgYW5kIGNhbGxiYWNrcyB0aGF0IGFyZSBNYWMg
b25seS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNwcDoKKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oOgorICAgICAgICAqIFdlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvV2ViUGFnZU1hYy5tbToKKyAgICAgICAgQWRkZWQgYXN5bmMgaW1wbGVtZW50
YXRpb25zICh3aGljaCBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgc3luYyBvbmVzLCBzYWRs
eSkuCisKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbjog
QWRkZWQgYXN5bmMgbWVzc2FnZXMsIG1vdmVkIHNvbWUgbWVzc2FnZXMKKyAgICAgICAgdW5kZXIg
UExBVEZPUk0oTUFDKS4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFn
ZUlPUy5tbTogTW9yZSBvZiBkZWxldGluZyBmdW5jdGlvbnMgdGhhdCBhcmUgTWFjIG9ubHksCisg
ICAgICAgIGFuZCBjYW5ub3QgYmUgZWFzaWx5IGltcGxlbWVudGVkIGluIFdlYlBhZ2UuY3BwIHdp
dGggc2hhcmVkIGNvZGUuCisKIDIwMTQtMDMtMTkgIEJlbmphbWluIFBvdWxhaW4gIDxicG91bGFp
bkBhcHBsZS5jb20+CiAKICAgICAgICAgW2lPU11bV0syXSBSZWR1Y2UgdGhlIGV4dGVuZGVkIGJh
Y2tncm91bmQncyBvcGFjaXR5IHdoZW4gV0tDb250ZW50VmlldyBpcyBzbWFsbGVyIHRoYW4gaXRz
IFdLV2ViVmlldwpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5j
cHAJKHJldmlzaW9uIDE2NTkyOCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdl
UHJveHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDkxLDcgKzEwOTEsNyBAQCB2b2lkIFdlYlBh
Z2VQcm94eTo6dmFsaWRhdGVDb21tYW5kKGNvbnN0CiAgICAgfQogCiAgICAgdWludDY0X3QgY2Fs
bGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAgbV92YWxpZGF0ZUNvbW1hbmRD
YWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX3ZhbGlkYXRl
Q29tbWFuZENhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJvY2Vz
cy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6VmFsaWRhdGVDb21tYW5kKGNvbW1hbmROYW1lLCBj
YWxsYmFja0lEKSwgbV9wYWdlSUQpOwogfQogCkBAIC0xOTQxLDcgKzE5NDEsNyBAQCB2b2lkIFdl
YlBhZ2VQcm94eTo6cnVuSmF2YVNjcmlwdEluTWFpbkZyCiAgICAgfQogCiAgICAgdWludDY0X3Qg
Y2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAgbV9zY3JpcHRWYWx1ZUNh
bGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fc2NyaXB0VmFs
dWVDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNl
bmQoTWVzc2FnZXM6OldlYlBhZ2U6OlJ1bkphdmFTY3JpcHRJbk1haW5GcmFtZShzY3JpcHQsIGNh
bGxiYWNrSUQpLCBtX3BhZ2VJRCk7CiB9CiAKQEAgLTE5NTQsNyArMTk1NCw3IEBAIHZvaWQgV2Vi
UGFnZVByb3h5OjpnZXRSZW5kZXJUcmVlRXh0ZXJuYWwKICAgICB9CiAgICAgCiAgICAgdWludDY0
X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAgbV9zdHJpbmdDYWxs
YmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX3N0cmluZ0NhbGxi
YWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNz
YWdlczo6V2ViUGFnZTo6R2V0UmVuZGVyVHJlZUV4dGVybmFsUmVwcmVzZW50YXRpb24oY2FsbGJh
Y2tJRCksIG1fcGFnZUlEKTsKIH0KIApAQCAtMTk2OCw3ICsxOTY4LDcgQEAgdm9pZCBXZWJQYWdl
UHJveHk6OmdldFNvdXJjZUZvckZyYW1lKFdlYgogICAgIAogICAgIHVpbnQ2NF90IGNhbGxiYWNr
SUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgpOwogICAgIG1fbG9hZERlcGVuZGVudFN0cmluZ0Nh
bGxiYWNrSURzLmFkZChjYWxsYmFja0lEKTsKLSAgICBtX3N0cmluZ0NhbGxiYWNrcy5zZXQoY2Fs
bGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fc3RyaW5nQ2FsbGJhY2tzLnNldChjYWxs
YmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdl
OjpHZXRTb3VyY2VGb3JGcmFtZShmcmFtZS0+ZnJhbWVJRCgpLCBjYWxsYmFja0lEKSwgbV9wYWdl
SUQpOwogfQogCkBAIC0xOTgyLDcgKzE5ODIsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Z2V0Q29u
dGVudHNBc1N0cmluZyhQCiAgICAgCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNr
LT5jYWxsYmFja0lEKCk7CiAgICAgbV9sb2FkRGVwZW5kZW50U3RyaW5nQ2FsbGJhY2tJRHMuYWRk
KGNhbGxiYWNrSUQpOwotICAgIG1fc3RyaW5nQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxs
YmFjay5nZXQoKSk7CisgICAgbV9zdHJpbmdDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxi
YWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkdldENvbnRlbnRz
QXNTdHJpbmcoY2FsbGJhY2tJRCksIG1fcGFnZUlEKTsKIH0KIApAQCAtMTk5Niw3ICsxOTk2LDcg
QEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldEJ5dGVjb2RlUHJvZmlsZShQYQogICAgIAogICAgIHVp
bnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgpOwogICAgIG1fbG9hZERl
cGVuZGVudFN0cmluZ0NhbGxiYWNrSURzLmFkZChjYWxsYmFja0lEKTsKLSAgICBtX3N0cmluZ0Nh
bGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fc3RyaW5nQ2Fs
bGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1l
c3NhZ2VzOjpXZWJQYWdlOjpHZXRCeXRlY29kZVByb2ZpbGUoY2FsbGJhY2tJRCksIG1fcGFnZUlE
KTsKIH0KICAgICAKQEAgLTIwMTAsNyArMjAxMCw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpnZXRD
b250ZW50c0FzTUhUTUxEYXQKICAgICB9CiAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2Fs
bGJhY2stPmNhbGxiYWNrSUQoKTsKLSAgICBtX2RhdGFDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQs
IGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX2RhdGFDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNh
bGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkdldENvbnRl
bnRzQXNNSFRNTERhdGEoY2FsbGJhY2tJRCwgdXNlQmluYXJ5RW5jb2RpbmcpLCBtX3BhZ2VJRCk7
CiB9CiAjZW5kaWYKQEAgLTIwMjQsNyArMjAyNCw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpnZXRT
ZWxlY3Rpb25PckNvbnRlbnQKICAgICB9CiAgICAgCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9
IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAgbV9zdHJpbmdDYWxsYmFja3Muc2V0KGNhbGxi
YWNrSUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX3N0cmluZ0NhbGxiYWNrcy5zZXQoY2FsbGJh
Y2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6
R2V0U2VsZWN0aW9uT3JDb250ZW50c0FzU3RyaW5nKGNhbGxiYWNrSUQpLCBtX3BhZ2VJRCk7CiB9
CiAKQEAgLTIwMzcsNyArMjAzNyw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpnZXRTZWxlY3Rpb25B
c1dlYkFyY2gKICAgICB9CiAgICAgCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNr
LT5jYWxsYmFja0lEKCk7Ci0gICAgbV9kYXRhQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxs
YmFjay5nZXQoKSk7CisgICAgbV9kYXRhQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFj
ayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRTZWxlY3Rpb25B
c1dlYkFyY2hpdmVEYXRhKGNhbGxiYWNrSUQpLCBtX3BhZ2VJRCk7CiB9CiAKQEAgLTIwNTAsNyAr
MjA1MCw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpnZXRNYWluUmVzb3VyY2VEYXRhT2YKICAgICB9
CiAgICAgCiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7
Ci0gICAgbV9kYXRhQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjay5nZXQoKSk7Cisg
ICAgbV9kYXRhQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9j
ZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRNYWluUmVzb3VyY2VEYXRhT2ZGcmFtZShm
cmFtZS0+ZnJhbWVJRCgpLCBjYWxsYmFja0lEKSwgbV9wYWdlSUQpOwogfQogCkBAIC0yMDYzLDcg
KzIwNjMsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6Z2V0UmVzb3VyY2VEYXRhRnJvbUZyCiAgICAg
fQogICAgIAogICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgp
OwotICAgIG1fZGF0YUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOwor
ICAgIG1fZGF0YUNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJv
Y2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6R2V0UmVzb3VyY2VEYXRhRnJvbUZyYW1lKGZy
YW1lLT5mcmFtZUlEKCksIHJlc291cmNlVVJMLT5zdHJpbmcoKSwgY2FsbGJhY2tJRCksIG1fcGFn
ZUlEKTsKIH0KIApAQCAtMjA3Niw3ICsyMDc2LDcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldFdl
YkFyY2hpdmVPZkZyYW1lKAogICAgIH0KICAgICAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0g
Y2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKLSAgICBtX2RhdGFDYWxsYmFja3Muc2V0KGNhbGxiYWNr
SUQsIGNhbGxiYWNrLmdldCgpKTsKKyAgICBtX2RhdGFDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQs
IGNhbGxiYWNrKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkdldFdl
YkFyY2hpdmVPZkZyYW1lKGZyYW1lLT5mcmFtZUlEKCksIGNhbGxiYWNrSUQpLCBtX3BhZ2VJRCk7
CiB9CiAKQEAgLTIwODksNyArMjA4OSw3IEBAIHZvaWQgV2ViUGFnZVByb3h5Ojpmb3JjZVJlcGFp
bnQoUGFzc1JlZlAKICAgICB9CiAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2st
PmNhbGxiYWNrSUQoKTsKLSAgICBtX3ZvaWRDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxi
YWNrLmdldCgpKTsKKyAgICBtX3ZvaWRDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNr
KTsKICAgICBtX2RyYXdpbmdBcmVhLT53YWl0Rm9yQmFja2luZ1N0b3JlVXBkYXRlT25OZXh0UGFp
bnQoKTsKICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6OkZvcmNlUmVwYWlu
dChjYWxsYmFja0lEKSwgbV9wYWdlSUQpOyAKIH0KQEAgLTM3ODYsNiArMzc4Niw0NiBAQCB2b2lk
IFdlYlBhZ2VQcm94eTo6dmFsaWRhdGVDb21tYW5kQ2FsbGJhCiAgICAgY2FsbGJhY2stPnBlcmZv
cm1DYWxsYmFja1dpdGhSZXR1cm5WYWx1ZShjb21tYW5kTmFtZS5pbXBsKCksIGlzRW5hYmxlZCwg
c3RhdGUpOwogfQogCit2b2lkIFdlYlBhZ2VQcm94eTo6dW5zaWduZWRDYWxsYmFjayh1aW50NjRf
dCByZXN1bHQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCit7CisgICAgUmVmUHRyPFVuc2lnbmVkQ2Fs
bGJhY2s+IGNhbGxiYWNrID0gbV91bnNpZ25lZENhbGxiYWNrcy50YWtlKGNhbGxiYWNrSUQpOwor
ICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgLy8gRklYTUU6IExvZyBlcnJvciBvciBhc3Nl
cnQuCisgICAgICAgIC8vIHRoaXMgY2FuIHZhbGlkbHkgaGFwcGVuIGlmIGEgbG9hZCBpbnZhbGlk
YXRlZCB0aGUgY2FsbGJhY2ssIHRob3VnaAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Y2FsbGJhY2stPnBlcmZvcm1DYWxsYmFja1dpdGhSZXR1cm5WYWx1ZShyZXN1bHQpOworfQorCit2
b2lkIFdlYlBhZ2VQcm94eTo6ZWRpdGluZ1JhbmdlQ2FsbGJhY2soY29uc3QgRWRpdGluZ1Jhbmdl
JiByYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKK3sKKyAgICBNRVNTQUdFX0NIRUNLKHJhbmdl
LmlzVmFsaWQoKSk7CisKKyAgICBSZWZQdHI8RWRpdGluZ1JhbmdlQ2FsbGJhY2s+IGNhbGxiYWNr
ID0gbV9lZGl0aW5nUmFuZ2VDYWxsYmFja3MudGFrZShjYWxsYmFja0lEKTsKKyAgICBpZiAoIWNh
bGxiYWNrKSB7CisgICAgICAgIC8vIEZJWE1FOiBMb2cgZXJyb3Igb3IgYXNzZXJ0LgorICAgICAg
ICAvLyB0aGlzIGNhbiB2YWxpZGx5IGhhcHBlbiBpZiBhIGxvYWQgaW52YWxpZGF0ZWQgdGhlIGNh
bGxiYWNrLCB0aG91Z2gKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhbGxiYWNrLT5w
ZXJmb3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUocmFuZ2UpOworfQorCit2b2lkIFdlYlBhZ2VQ
cm94eTo6cmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2soY29uc3QgSW50UmVjdCYgcmVjdCwg
Y29uc3QgRWRpdGluZ1JhbmdlJiBhY3R1YWxSYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKK3sK
KyAgICBNRVNTQUdFX0NIRUNLKGFjdHVhbFJhbmdlLmlzVmFsaWQoKSk7CisKKyAgICBSZWZQdHI8
UmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbV9yZWN0Rm9yQ2hhcmFj
dGVyUmFuZ2VDYWxsYmFja3MudGFrZShjYWxsYmFja0lEKTsKKyAgICBpZiAoIWNhbGxiYWNrKSB7
CisgICAgICAgIC8vIEZJWE1FOiBMb2cgZXJyb3Igb3IgYXNzZXJ0LgorICAgICAgICAvLyB0aGlz
IGNhbiB2YWxpZGx5IGhhcHBlbiBpZiBhIGxvYWQgaW52YWxpZGF0ZWQgdGhlIGNhbGxiYWNrLCB0
aG91Z2gKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhbGxiYWNrLT5wZXJmb3JtQ2Fs
bGJhY2tXaXRoUmV0dXJuVmFsdWUocmVjdCwgYWN0dWFsUmFuZ2UpOworfQorCiAjaWYgUExBVEZP
Uk0oR1RLKQogdm9pZCBXZWJQYWdlUHJveHk6OnByaW50RmluaXNoZWRDYWxsYmFjayhjb25zdCBS
ZXNvdXJjZUVycm9yJiBwcmludEVycm9yLCB1aW50NjRfdCBjYWxsYmFja0lEKQogewpAQCAtMzky
OCw2ICszOTY4LDEyIEBAIHZvaWQgV2ViUGFnZVByb3h5OjpyZXNldFN0YXRlKCkKICAgICBpbnZh
bGlkYXRlQ2FsbGJhY2tNYXAobV9zY3JpcHRWYWx1ZUNhbGxiYWNrcyk7CiAgICAgaW52YWxpZGF0
ZUNhbGxiYWNrTWFwKG1fY29tcHV0ZWRQYWdlc0NhbGxiYWNrcyk7CiAgICAgaW52YWxpZGF0ZUNh
bGxiYWNrTWFwKG1fdmFsaWRhdGVDb21tYW5kQ2FsbGJhY2tzKTsKKyAgICBpbnZhbGlkYXRlQ2Fs
bGJhY2tNYXAobV91bnNpZ25lZENhbGxiYWNrcyk7CisgICAgaW52YWxpZGF0ZUNhbGxiYWNrTWFw
KG1fZWRpdGluZ1JhbmdlQ2FsbGJhY2tzKTsKKyAgICBpbnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9y
ZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFja3MpOworI2lmIFBMQVRGT1JNKE1BQykKKyAgICBp
bnZhbGlkYXRlQ2FsbGJhY2tNYXAobV9hdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VD
YWxsYmFja3MpOworI2VuZGlmCiAjaWYgUExBVEZPUk0oSU9TKQogICAgIGludmFsaWRhdGVDYWxs
YmFja01hcChtX2dlc3R1cmVDYWxsYmFja3MpOwogICAgIGludmFsaWRhdGVDYWxsYmFja01hcCht
X3RvdWNoZXNDYWxsYmFja3MpOwpAQCAtNDMzNSw3ICs0MzgxLDcgQEAgdm9pZCBXZWJQYWdlUHJv
eHk6OmNvbXB1dGVQYWdlc0ZvclByaW50aQogICAgIH0KIAogICAgIHVpbnQ2NF90IGNhbGxiYWNr
SUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgpOwotICAgIG1fY29tcHV0ZWRQYWdlc0NhbGxiYWNr
cy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2suZ2V0KCkpOworICAgIG1fY29tcHV0ZWRQYWdlc0Nh
bGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1faXNJblByaW50aW5nTW9k
ZSA9IHRydWU7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpDb21wdXRl
UGFnZXNGb3JQcmludGluZyhmcmFtZS0+ZnJhbWVJRCgpLCBwcmludEluZm8sIGNhbGxiYWNrSUQp
LCBtX3BhZ2VJRCwgbV9pc1BlcmZvcm1pbmdET01QcmludE9wZXJhdGlvbiA/IElQQzo6RGlzcGF0
Y2hNZXNzYWdlRXZlbldoZW5XYWl0aW5nRm9yU3luY1JlcGx5IDogMCk7CiB9CkBAIC00MzUwLDcg
KzQzOTYsNyBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6ZHJhd1JlY3RUb0ltYWdlKFdlYkZyCiAgICAg
fQogICAgIAogICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgp
OwotICAgIG1faW1hZ2VDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgpKTsK
KyAgICBtX2ltYWdlQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9w
cm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpEcmF3UmVjdFRvSW1hZ2UoZnJhbWUtPmZy
YW1lSUQoKSwgcHJpbnRJbmZvLCByZWN0LCBpbWFnZVNpemUsIGNhbGxiYWNrSUQpLCBtX3BhZ2VJ
RCwgbV9pc1BlcmZvcm1pbmdET01QcmludE9wZXJhdGlvbiA/IElQQzo6RGlzcGF0Y2hNZXNzYWdl
RXZlbldoZW5XYWl0aW5nRm9yU3luY1JlcGx5IDogMCk7CiB9CiAKQEAgLTQzNjMsNyArNDQwOSw3
IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpkcmF3UGFnZXNUb1BERihXZWJGcmEKICAgICB9CiAgICAg
CiAgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7Ci0gICAg
bV9kYXRhQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjay5nZXQoKSk7CisgICAgbV9k
YXRhQ2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5z
ZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpEcmF3UGFnZXNUb1BERihmcmFtZS0+ZnJhbWVJRCgpLCBw
cmludEluZm8sIGZpcnN0LCBjb3VudCwgY2FsbGJhY2tJRCksIG1fcGFnZUlELCBtX2lzUGVyZm9y
bWluZ0RPTVByaW50T3BlcmF0aW9uID8gSVBDOjpEaXNwYXRjaE1lc3NhZ2VFdmVuV2hlbldhaXRp
bmdGb3JTeW5jUmVwbHkgOiAwKTsKIH0KICNlbGlmIFBMQVRGT1JNKEdUSykKQEAgLTQzNzYsNyAr
NDQyMiw3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjpkcmF3UGFnZXNGb3JQcmludGluZygKICAgICB9
CiAKICAgICB1aW50NjRfdCBjYWxsYmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKLSAg
ICBtX3ByaW50RmluaXNoZWRDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrLmdldCgp
KTsKKyAgICBtX3ByaW50RmluaXNoZWRDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNr
KTsKICAgICBtX2lzSW5QcmludGluZ01vZGUgPSB0cnVlOwogICAgIG1fcHJvY2Vzcy0+c2VuZChN
ZXNzYWdlczo6V2ViUGFnZTo6RHJhd1BhZ2VzRm9yUHJpbnRpbmcoZnJhbWUtPmZyYW1lSUQoKSwg
cHJpbnRJbmZvLCBjYWxsYmFja0lEKSwgbV9wYWdlSUQsIG1faXNQZXJmb3JtaW5nRE9NUHJpbnRP
cGVyYXRpb24gPyBJUEM6OkRpc3BhdGNoTWVzc2FnZUV2ZW5XaGVuV2FpdGluZ0ZvclN5bmNSZXBs
eSA6IDApOwogfQpAQCAtNDU5NSw2ICs0NjQxLDg5IEBAIHZvaWQgV2ViUGFnZVByb3h5OjphZGRN
SU1FVHlwZVdpdGhDdXN0b20KICAgICBtX3Byb2Nlc3MtPnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6
OkFkZE1JTUVUeXBlV2l0aEN1c3RvbUNvbnRlbnRQcm92aWRlcihtaW1lVHlwZSksIG1fcGFnZUlE
KTsKIH0KIAorI2lmIFBMQVRGT1JNKENPQ09BKQorCit2b2lkIFdlYlBhZ2VQcm94eTo6aW5zZXJ0
VGV4dEFzeW5jKGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNl
bWVudFJhbmdlKQoreworICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBwcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6V2ViUGFnZTo6SW5zZXJ0VGV4dEFzeW5jKHRleHQs
IHJlcGxhY2VtZW50UmFuZ2UpLCBtX3BhZ2VJRCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByb3h5Ojpn
ZXRNYXJrZWRSYW5nZUFzeW5jKFBhc3NSZWZQdHI8RWRpdGluZ1JhbmdlQ2FsbGJhY2s+IGNhbGxi
YWNrKQoreworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgIGNhbGxiYWNrLT5pbnZhbGlk
YXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBjYWxsYmFja0lE
ID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKKyAgICBtX2VkaXRpbmdSYW5nZUNhbGxiYWNrcy5z
ZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOworCisgICAgcHJvY2VzcygpLnNlbmQoTWVzc2FnZXM6
OldlYlBhZ2U6OkdldE1hcmtlZFJhbmdlQXN5bmMoY2FsbGJhY2tJRCksIG1fcGFnZUlEKTsKK30K
Kwordm9pZCBXZWJQYWdlUHJveHk6OmdldFNlbGVjdGVkUmFuZ2VBc3luYyhQYXNzUmVmUHRyPEVk
aXRpbmdSYW5nZUNhbGxiYWNrPiBjYWxsYmFjaykKK3sKKyAgICBpZiAoIWlzVmFsaWQoKSkgewor
ICAgICAgICBjYWxsYmFjay0+aW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7CisgICAg
bV9lZGl0aW5nUmFuZ2VDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKKworICAg
IHByb2Nlc3MoKS5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRTZWxlY3RlZFJhbmdlQXN5bmMo
Y2FsbGJhY2tJRCksIG1fcGFnZUlEKTsKK30KKwordm9pZCBXZWJQYWdlUHJveHk6OmNoYXJhY3Rl
ckluZGV4Rm9yUG9pbnRBc3luYyhjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcG9pbnQsIFBhc3NS
ZWZQdHI8VW5zaWduZWRDYWxsYmFjaz4gY2FsbGJhY2spCit7CisgICAgaWYgKCFpc1ZhbGlkKCkp
IHsKKyAgICAgICAgY2FsbGJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIHVpbnQ2NF90IGNhbGxiYWNrSUQgPSBjYWxsYmFjay0+Y2FsbGJhY2tJRCgpOwor
ICAgIG1fdW5zaWduZWRDYWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKKworICAg
IHByb2Nlc3MoKS5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpDaGFyYWN0ZXJJbmRleEZvclBvaW50
QXN5bmMocG9pbnQsIGNhbGxiYWNrSUQpLCBtX3BhZ2VJRCk7Cit9CisKK3ZvaWQgV2ViUGFnZVBy
b3h5OjpmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZUFzeW5jKGNvbnN0IEVkaXRpbmdSYW5nZSYg
cmFuZ2UsIFBhc3NSZWZQdHI8UmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s+IGNhbGxiYWNr
KQoreworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgIGNhbGxiYWNrLT5pbnZhbGlkYXRl
KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBjYWxsYmFja0lEID0g
Y2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKKyAgICBtX3JlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxi
YWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOworCisgICAgcHJvY2VzcygpLnNlbmQoTWVz
c2FnZXM6OldlYlBhZ2U6OkZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlQXN5bmMocmFuZ2UsIGNh
bGxiYWNrSUQpLCBtX3BhZ2VJRCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByb3h5OjpzZXRDb21wb3Np
dGlvbkFzeW5jKGNvbnN0IFN0cmluZyYgdGV4dCwgVmVjdG9yPENvbXBvc2l0aW9uVW5kZXJsaW5l
PiB1bmRlcmxpbmVzLCBjb25zdCBFZGl0aW5nUmFuZ2UmIHNlbGVjdGlvblJhbmdlLCBjb25zdCBF
ZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UpCit7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsK
KyAgICAgICAgLy8gSWYgdGhpcyBmYWlscywgd2Ugc2hvdWxkIGNhbGwgLWRpc2NhcmRNYXJrZWRU
ZXh0IG9uIGlucHV0IGNvbnRleHQgdG8gbm90aWZ5IHRoZSBpbnB1dCBtZXRob2QuCisgICAgICAg
IC8vIFRoaXMgd2lsbCBoYXBwZW4gbmF0dXJhbGx5IGxhdGVyLCBhcyBwYXJ0IG9mIHJlbG9hZGlu
ZyB0aGUgcGFnZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2Nlc3MoKS5zZW5k
KE1lc3NhZ2VzOjpXZWJQYWdlOjpTZXRDb21wb3NpdGlvbkFzeW5jKHRleHQsIHVuZGVybGluZXMs
IHNlbGVjdGlvblJhbmdlLCByZXBsYWNlbWVudFJhbmdlKSwgbV9wYWdlSUQpOworfQorCit2b2lk
IFdlYlBhZ2VQcm94eTo6Y29uZmlybUNvbXBvc2l0aW9uQXN5bmMoKQoreworICAgIGlmICghaXNW
YWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwcm9jZXNzKCkuc2VuZChNZXNzYWdlczo6
V2ViUGFnZTo6Q29uZmlybUNvbXBvc2l0aW9uQXN5bmMoKSwgbV9wYWdlSUQpOworfQorCisjZW5k
aWYKKwogdm9pZCBXZWJQYWdlUHJveHk6OnRha2VTbmFwc2hvdChJbnRSZWN0IHJlY3QsIEludFNp
emUgYml0bWFwU2l6ZSwgU25hcHNob3RPcHRpb25zIG9wdGlvbnMsIEltYWdlQ2FsbGJhY2s6OkNh
bGxiYWNrRnVuY3Rpb24gY2FsbGJhY2tGdW5jdGlvbikKIHsKICAgICBSZWZQdHI8SW1hZ2VDYWxs
YmFjaz4gY2FsbGJhY2sgPSBJbWFnZUNhbGxiYWNrOjpjcmVhdGUoY2FsbGJhY2tGdW5jdGlvbik7
CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCShyZXZpc2lvbiAx
NjU5MjgpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHdvcmtp
bmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJDb250ZXh0TWVudUNvbnRleHRE
YXRhLmgiCiAjaW5jbHVkZSAiRHJhZ0NvbnRyb2xsZXJBY3Rpb24uaCIKICNpbmNsdWRlICJEcmF3
aW5nQXJlYVByb3h5LmgiCisjaW5jbHVkZSAiRWRpdGluZ1JhbmdlLmgiCiAjaW5jbHVkZSAiRWRp
dG9yU3RhdGUuaCIKICNpbmNsdWRlICJHZW9sb2NhdGlvblBlcm1pc3Npb25SZXF1ZXN0TWFuYWdl
clByb3h5LmgiCiAjaW5jbHVkZSAiSW50ZXJhY3Rpb25JbmZvcm1hdGlvbkF0UG9zaXRpb24uaCIK
QEAgLTk4LDYgKzk5LDEwIEBACiAjaW5jbHVkZSAiTGF5ZXJSZXByZXNlbnRhdGlvbi5oIgogI2Vu
ZGlmCiAKKyNpZiBQTEFURk9STShNQUMpCisjaW5jbHVkZSAiQXR0cmlidXRlZFN0cmluZy5oIgor
I2VuZGlmCisKIG5hbWVzcGFjZSBBUEkgewogY2xhc3MgTG9hZGVyQ2xpZW50OwogY2xhc3MgUG9s
aWN5Q2xpZW50OwpAQCAtMTcwLDYgKzE3NSw4IEBAIHN0cnVjdCBXZWJQb3B1cEl0ZW07CiBjbGFz
cyBXZWJWaWJyYXRpb25Qcm94eTsKICNlbmRpZgogCit0eXBlZGVmIEdlbmVyaWNDYWxsYmFjazx1
aW50NjRfdD4gVW5zaWduZWRDYWxsYmFjazsKK3R5cGVkZWYgR2VuZXJpY0NhbGxiYWNrPEVkaXRp
bmdSYW5nZT4gRWRpdGluZ1JhbmdlQ2FsbGJhY2s7CiB0eXBlZGVmIEdlbmVyaWNDYWxsYmFjazxT
dHJpbmdJbXBsKj4gU3RyaW5nQ2FsbGJhY2s7CiB0eXBlZGVmIEdlbmVyaWNDYWxsYmFjazxXZWJT
ZXJpYWxpemVkU2NyaXB0VmFsdWUqPiBTY3JpcHRWYWx1ZUNhbGxiYWNrOwogCkBAIC0yMzEsNiAr
MjM4LDk2IEBAIHByaXZhdGU6CiAgICAgQ2FsbGJhY2tGdW5jdGlvbiBtX2NhbGxiYWNrOwogfTsK
IAorLy8gRklYTUU6IE1ha2UgYSB2ZXJzaW9uIG9mIENhbGxiYWNrQmFzZSB3aXRoIHR3byBhcmd1
bWVudHMsIGFuZCBkZWZpbmUgUmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2sgYXMgYSBzcGVj
aWFsaXphdGlvbi4KK2NsYXNzIFJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrIDogcHVibGlj
IENhbGxiYWNrQmFzZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQg
KGJvb2wsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBjb25zdCBFZGl0aW5nUmFuZ2UmKT4gQ2Fs
bGJhY2tGdW5jdGlvbjsKKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlY3RGb3JDaGFyYWN0ZXJS
YW5nZUNhbGxiYWNrPiBjcmVhdGUoQ2FsbGJhY2tGdW5jdGlvbiBjYWxsYmFjaykKKyAgICB7Cisg
ICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2so
Y2FsbGJhY2spKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5SZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VD
YWxsYmFjaygpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fY2FsbGJhY2spOworICAgIH0KKwor
ICAgIHZvaWQgcGVyZm9ybUNhbGxiYWNrV2l0aFJldHVyblZhbHVlKGNvbnN0IFdlYkNvcmU6Oklu
dFJlY3QmIHJlY3QsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmFuZ2UpCisgICAgeworICAgICAgICBB
U1NFUlQobV9jYWxsYmFjayk7CisKKyAgICAgICAgbV9jYWxsYmFjayhmYWxzZSwgcmVjdCwgcmFu
Z2UpOworCisgICAgICAgIG1fY2FsbGJhY2sgPSAwOworICAgIH0KKyAgICAKKyAgICB2b2lkIGlu
dmFsaWRhdGUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fY2FsbGJhY2spOworCisgICAgICAg
IG1fY2FsbGJhY2sodHJ1ZSwgV2ViQ29yZTo6SW50UmVjdCgpLCBFZGl0aW5nUmFuZ2UoKSk7CisK
KyAgICAgICAgbV9jYWxsYmFjayA9IDA7CisgICAgfQorCitwcml2YXRlOgorCisgICAgUmVjdEZv
ckNoYXJhY3RlclJhbmdlQ2FsbGJhY2soQ2FsbGJhY2tGdW5jdGlvbiBjYWxsYmFjaykKKyAgICAg
ICAgOiBtX2NhbGxiYWNrKGNhbGxiYWNrKQorICAgIHsKKyAgICB9CisKKyAgICBDYWxsYmFja0Z1
bmN0aW9uIG1fY2FsbGJhY2s7Cit9OworCisjaWYgUExBVEZPUk0oTUFDKQorCisvLyBGSVhNRTog
TWFrZSBhIHZlcnNpb24gb2YgQ2FsbGJhY2tCYXNlIHdpdGggdHdvIGFyZ3VtZW50cywgYW5kIGRl
ZmluZSBBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayBhcyBhIHNwZWNp
YWxpemF0aW9uLgorY2xhc3MgQXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJh
Y2sgOiBwdWJsaWMgQ2FsbGJhY2tCYXNlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZnVu
Y3Rpb248dm9pZCAoYm9vbCwgY29uc3QgQXR0cmlidXRlZFN0cmluZyYsIGNvbnN0IEVkaXRpbmdS
YW5nZSYpPiBDYWxsYmFja0Z1bmN0aW9uOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8QXR0cmli
dXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s+IGNyZWF0ZShDYWxsYmFja0Z1bmN0
aW9uIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBBdHRyaWJ1
dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhjYWxsYmFjaykpOworICAgIH0KKwor
ICAgIHZpcnR1YWwgfkF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKCkK
KyAgICB7CisgICAgICAgIEFTU0VSVCghbV9jYWxsYmFjayk7CisgICAgfQorCisgICAgdm9pZCBw
ZXJmb3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUoY29uc3QgQXR0cmlidXRlZFN0cmluZyYgc3Ry
aW5nLCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJhbmdlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1f
Y2FsbGJhY2spOworCisgICAgICAgIG1fY2FsbGJhY2soZmFsc2UsIHN0cmluZywgcmFuZ2UpOwor
CisgICAgICAgIG1fY2FsbGJhY2sgPSAwOworICAgIH0KKyAgICAKKyAgICB2b2lkIGludmFsaWRh
dGUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fY2FsbGJhY2spOworCisgICAgICAgIG1fY2Fs
bGJhY2sodHJ1ZSwgQXR0cmlidXRlZFN0cmluZygpLCBFZGl0aW5nUmFuZ2UoKSk7CisKKyAgICAg
ICAgbV9jYWxsYmFjayA9IDA7CisgICAgfQorCitwcml2YXRlOgorCisgICAgQXR0cmlidXRlZFN0
cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2soQ2FsbGJhY2tGdW5jdGlvbiBjYWxsYmFjaykK
KyAgICAgICAgOiBtX2NhbGxiYWNrKGNhbGxiYWNrKQorICAgIHsKKyAgICB9CisKKyAgICBDYWxs
YmFja0Z1bmN0aW9uIG1fY2FsbGJhY2s7Cit9OworCisjZW5kaWYKKwogI2lmIFBMQVRGT1JNKElP
UykKIGNsYXNzIEdlc3R1cmVDYWxsYmFjayA6IHB1YmxpYyBDYWxsYmFja0Jhc2UgewogcHVibGlj
OgpAQCAtNTM1LDEwICs2MzIsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBjb25maXJtQ29tcG9zaXRp
b24oKTsKICAgICB2b2lkIGNhbmNlbENvbXBvc2l0aW9uKCk7CiAgICAgYm9vbCBpbnNlcnRUZXh0
KGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVudFJhbmdl
KTsKLSAgICBib29sIGluc2VydERpY3RhdGVkVGV4dChjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0
IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRSYW5nZSwgY29uc3QgVmVjdG9yPFdlYkNvcmU6OlRl
eHRBbHRlcm5hdGl2ZVdpdGhSYW5nZT4mIGRpY3RhdGlvbkFsdGVybmF0aXZlcyk7CiAgICAgdm9p
ZCBnZXRNYXJrZWRSYW5nZShFZGl0aW5nUmFuZ2UmKTsKICAgICB2b2lkIGdldFNlbGVjdGVkUmFu
Z2UoRWRpdGluZ1JhbmdlJik7Ci0gICAgdm9pZCBnZXRBdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJh
bmdlKGNvbnN0IEVkaXRpbmdSYW5nZSYsIEF0dHJpYnV0ZWRTdHJpbmcmKTsKICAgICB1aW50NjRf
dCBjaGFyYWN0ZXJJbmRleEZvclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50KTsKICAgICBX
ZWJDb3JlOjpJbnRSZWN0IGZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlKGNvbnN0IEVkaXRpbmdS
YW5nZSYpOwogICAgIGJvb2wgZXhlY3V0ZUtleXByZXNzQ29tbWFuZHMoY29uc3QgVmVjdG9yPFdl
YkNvcmU6OktleXByZXNzQ29tbWFuZD4mKTsKQEAgLTU1MCw3ICs2NDUsMjAgQEAgcHVibGljOgog
ICAgIHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZ1Jvb3RMYXllcihMYXllck9yVmlldyop
OwogICAgIExheWVyT3JWaWV3KiBhY2NlbGVyYXRlZENvbXBvc2l0aW5nUm9vdExheWVyKCkgY29u
c3Q7CiAKLSNpZiBVU0UoQVBQS0lUKQorICAgIHZvaWQgaW5zZXJ0VGV4dEFzeW5jKGNvbnN0IFN0
cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVudFJhbmdlKTsKKyAgICB2
b2lkIGdldE1hcmtlZFJhbmdlQXN5bmMoUGFzc1JlZlB0cjxFZGl0aW5nUmFuZ2VDYWxsYmFjaz4p
OworICAgIHZvaWQgZ2V0U2VsZWN0ZWRSYW5nZUFzeW5jKFBhc3NSZWZQdHI8RWRpdGluZ1Jhbmdl
Q2FsbGJhY2s+KTsKKyAgICB2b2lkIGNoYXJhY3RlckluZGV4Rm9yUG9pbnRBc3luYyhjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYsIFBhc3NSZWZQdHI8VW5zaWduZWRDYWxsYmFjaz4pOworICAgIHZv
aWQgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhjb25zdCBFZGl0aW5nUmFuZ2UmLCBQ
YXNzUmVmUHRyPFJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrPik7CisgICAgdm9pZCBzZXRD
b21wb3NpdGlvbkFzeW5jKGNvbnN0IFN0cmluZyYgdGV4dCwgVmVjdG9yPFdlYkNvcmU6OkNvbXBv
c2l0aW9uVW5kZXJsaW5lPiB1bmRlcmxpbmVzLCBjb25zdCBFZGl0aW5nUmFuZ2UmIHNlbGVjdGlv
blJhbmdlLCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UpOworICAgIHZvaWQg
Y29uZmlybUNvbXBvc2l0aW9uQXN5bmMoKTsKKworI2lmIFBMQVRGT1JNKE1BQykKKyAgICBib29s
IGluc2VydERpY3RhdGVkVGV4dChjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5n
ZSYgcmVwbGFjZW1lbnRSYW5nZSwgY29uc3QgVmVjdG9yPFdlYkNvcmU6OlRleHRBbHRlcm5hdGl2
ZVdpdGhSYW5nZT4mIGRpY3RhdGlvbkFsdGVybmF0aXZlcyk7CisgICAgdm9pZCBpbnNlcnREaWN0
YXRlZFRleHRBc3luYyhjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVw
bGFjZW1lbnRSYW5nZSwgY29uc3QgVmVjdG9yPFdlYkNvcmU6OlRleHRBbHRlcm5hdGl2ZVdpdGhS
YW5nZT4mIGRpY3RhdGlvbkFsdGVybmF0aXZlcyk7CisgICAgdm9pZCBnZXRBdHRyaWJ1dGVkU3Vi
c3RyaW5nRnJvbVJhbmdlKGNvbnN0IEVkaXRpbmdSYW5nZSYsIEF0dHJpYnV0ZWRTdHJpbmcmKTsK
KyAgICB2b2lkIGF0dHJpYnV0ZWRTdWJzdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUFzeW5jKGNvbnN0
IEVkaXRpbmdSYW5nZSYsIFBhc3NSZWZQdHI8QXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJh
bmdlQ2FsbGJhY2s+KTsKKwogICAgIFdLVmlldyogd2tWaWV3KCkgY29uc3Q7CiAgICAgdm9pZCBp
bnRyaW5zaWNDb250ZW50U2l6ZURpZENoYW5nZShjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBpbnRy
aW5zaWNDb250ZW50U2l6ZSk7CiAjZW5kaWYKQEAgLTExNTUsNiArMTI2MywxMiBAQCBwcml2YXRl
OgogICAgIHZvaWQgc2NyaXB0VmFsdWVDYWxsYmFjayhjb25zdCBJUEM6OkRhdGFSZWZlcmVuY2Um
LCB1aW50NjRfdCk7CiAgICAgdm9pZCBjb21wdXRlZFBhZ2VzQ2FsbGJhY2soY29uc3QgVmVjdG9y
PFdlYkNvcmU6OkludFJlY3Q+JiwgZG91YmxlIHRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZywg
dWludDY0X3QpOwogICAgIHZvaWQgdmFsaWRhdGVDb21tYW5kQ2FsbGJhY2soY29uc3QgU3RyaW5n
JiwgYm9vbCwgaW50LCB1aW50NjRfdCk7CisgICAgdm9pZCB1bnNpZ25lZENhbGxiYWNrKHVpbnQ2
NF90LCB1aW50NjRfdCk7CisgICAgdm9pZCBlZGl0aW5nUmFuZ2VDYWxsYmFjayhjb25zdCBFZGl0
aW5nUmFuZ2UmLCB1aW50NjRfdCk7CisgICAgdm9pZCByZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxs
YmFjayhjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgY29uc3QgRWRpdGluZ1JhbmdlJiwgdWludDY0
X3QpOworI2lmIFBMQVRGT1JNKE1BQykKKyAgICB2b2lkIGF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFy
YWN0ZXJSYW5nZUNhbGxiYWNrKGNvbnN0IEF0dHJpYnV0ZWRTdHJpbmcmLCBjb25zdCBFZGl0aW5n
UmFuZ2UmLCB1aW50NjRfdCk7CisjZW5kaWYKICNpZiBQTEFURk9STShJT1MpCiAgICAgdm9pZCBn
ZXN0dXJlQ2FsbGJhY2soY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCB1aW50MzJfdCwgdWludDMy
X3QsIHVpbnQzMl90LCB1aW50NjRfdCk7CiAgICAgdm9pZCB0b3VjaGVzQ2FsbGJhY2soY29uc3Qg
V2ViQ29yZTo6SW50UG9pbnQmLCB1aW50MzJfdCwgdWludDY0X3QpOwpAQCAtMTI5Miw2ICsxNDA2
LDEyIEBAIHByaXZhdGU6CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFNjcmlwdFZhbHVl
Q2FsbGJhY2s+PiBtX3NjcmlwdFZhbHVlQ2FsbGJhY2tzOwogICAgIEhhc2hNYXA8dWludDY0X3Qs
IFJlZlB0cjxDb21wdXRlZFBhZ2VzQ2FsbGJhY2s+PiBtX2NvbXB1dGVkUGFnZXNDYWxsYmFja3M7
CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPFZhbGlkYXRlQ29tbWFuZENhbGxiYWNrPj4g
bV92YWxpZGF0ZUNvbW1hbmRDYWxsYmFja3M7CisgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRy
PFVuc2lnbmVkQ2FsbGJhY2s+PiBtX3Vuc2lnbmVkQ2FsbGJhY2tzOworICAgIEhhc2hNYXA8dWlu
dDY0X3QsIFJlZlB0cjxFZGl0aW5nUmFuZ2VDYWxsYmFjaz4+IG1fZWRpdGluZ1JhbmdlQ2FsbGJh
Y2tzOworICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0cjxSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VD
YWxsYmFjaz4+IG1fcmVjdEZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2tzOworI2lmIFBMQVRGT1JN
KE1BQykKKyAgICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8QXR0cmlidXRlZFN0cmluZ0ZvckNo
YXJhY3RlclJhbmdlQ2FsbGJhY2s+PiBtX2F0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5n
ZUNhbGxiYWNrczsKKyNlbmRpZgogI2lmIFBMQVRGT1JNKElPUykKICAgICBIYXNoTWFwPHVpbnQ2
NF90LCBSZWZQdHI8R2VzdHVyZUNhbGxiYWNrPj4gbV9nZXN0dXJlQ2FsbGJhY2tzOwogICAgIEhh
c2hNYXA8dWludDY0X3QsIFJlZlB0cjxUb3VjaGVzQ2FsbGJhY2s+PiBtX3RvdWNoZXNDYWxsYmFj
a3M7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2Vz
LmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHku
bWVzc2FnZXMuaW4JKHJldmlzaW9uIDE2NTkyOCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9XZWJQYWdlUHJveHkubWVzc2FnZXMuaW4JKHdvcmtpbmcgY29weSkKQEAgLTE1MSw2ICsxNTEs
MTIgQEAgbWVzc2FnZXMgLT4gV2ViUGFnZVByb3h5IHsKICAgICBTY3JpcHRWYWx1ZUNhbGxiYWNr
KElQQzo6RGF0YVJlZmVyZW5jZSByZXN1bHREYXRhLCB1aW50NjRfdCBjYWxsYmFja0lEKQogICAg
IENvbXB1dGVkUGFnZXNDYWxsYmFjayhWZWN0b3I8V2ViQ29yZTo6SW50UmVjdD4gcGFnZVJlY3Rz
LCBkb3VibGUgdG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nLCB1aW50NjRfdCBjYWxsYmFja0lE
KQogICAgIFZhbGlkYXRlQ29tbWFuZENhbGxiYWNrKFN0cmluZyBjb21tYW5kLCBib29sIGlzRW5h
YmxlZCwgaW50MzJfdCBzdGF0ZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKKyAgICBFZGl0aW5nUmFu
Z2VDYWxsYmFjayhXZWJLaXQ6OkVkaXRpbmdSYW5nZSByYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJ
RCkKKyAgICBVbnNpZ25lZENhbGxiYWNrKHVpbnQ2NF90IHJlc3VsdCwgdWludDY0X3QgY2FsbGJh
Y2tJRCkKKyAgICBSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhXZWJDb3JlOjpJbnRSZWN0
IHJlY3QsIFdlYktpdDo6RWRpdGluZ1JhbmdlIGFjdHVhbFJhbmdlLCB1aW50NjRfdCBjYWxsYmFj
a0lEKQorI2lmIFBMQVRGT1JNKE1BQykKKyAgICBBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVy
UmFuZ2VDYWxsYmFjayhXZWJLaXQ6OkF0dHJpYnV0ZWRTdHJpbmcgc3RyaW5nLCBXZWJLaXQ6OkVk
aXRpbmdSYW5nZSBhY3R1YWxSYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKKyNlbmRpZgogI2lm
IFBMQVRGT1JNKElPUykKICAgICBHZXN0dXJlQ2FsbGJhY2soV2ViQ29yZTo6SW50UG9pbnQgcG9p
bnQsIHVpbnQzMl90IGdlc3R1cmVUeXBlLCB1aW50MzJfdCBnZXN0dXJlU3RhdGUsIHVpbnQzMl90
IGZsYWdzLCB1aW50NjRfdCBjYWxsYmFja0lEKQogICAgIFRvdWNoZXNDYWxsYmFjayhXZWJDb3Jl
OjpJbnRQb2ludCBwb2ludCwgdWludDMyX3QgdG91Y2hlcywgdWludDY0X3QgY2FsbGJhY2tJRCkK
SW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXcubW0JKHJldmlz
aW9uIDE2NTkyOCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5t
bQkod29ya2luZyBjb3B5KQpAQCAtMTE1LDYgKzExNSwxNCBAQCAtIChOU1JlY3QpX2ludGVyc2Vj
dEJvdHRvbUNvcm5lcnNXaXRoUmVjCiAtICh2b2lkKV9tYXNrUm91bmRlZEJvdHRvbUNvcm5lcnM6
KE5TUmVjdCljbGlwUmVjdDsKIEBlbmQKIAorI2lmIFVTRShBU1lOQ19OU1RFWFRJTlBVVENMSUVO
VCkKK0BpbnRlcmZhY2UgTlNUZXh0SW5wdXRDb250ZXh0IChXS05TVGV4dElucHV0Q29udGV4dERl
dGFpbHMpCistICh2b2lkKWhhbmRsZUV2ZW50OihOU0V2ZW50ICopdGhlRXZlbnQgY29tcGxldGlv
bkhhbmRsZXI6KHZvaWQoXikoQk9PTCBoYW5kbGVkKSljb21wbGV0aW9uSGFuZGxlcjsKKy0gKHZv
aWQpaGFuZGxlRXZlbnRCeUlucHV0TWV0aG9kOihOU0V2ZW50ICopdGhlRXZlbnQgY29tcGxldGlv
bkhhbmRsZXI6KHZvaWQoXikoQk9PTCBoYW5kbGVkKSljb21wbGV0aW9uSGFuZGxlcjsKKy0gKEJP
T0wpaGFuZGxlRXZlbnRCeUtleWJvYXJkTGF5b3V0OihOU0V2ZW50ICopdGhlRXZlbnQ7CitAZW5k
CisjZW5kaWYKKwogI2lmIGRlZmluZWQoX19oYXNfaW5jbHVkZSkgJiYgX19oYXNfaW5jbHVkZSg8
Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljc1ByaXZhdGUuaD4pCiAjaW1wb3J0IDxDb3JlR3JhcGhp
Y3MvQ29yZUdyYXBoaWNzUHJpdmF0ZS5oPgogI2ltcG9ydCA8Q29yZUdyYXBoaWNzL0NHU0NhcHR1
cmUuaD4KQEAgLTEzOSwxMiArMTQ3LDE0IEBAIHR5cGVkZWYgSGFzaE1hcDxTdHJpbmcsIFZhbGlk
YXRpb25WZWN0b3IKIAogfQogCisjaWYgIVVTRShBU1lOQ19OU1RFWFRJTlBVVENMSUVOVCkKIHN0
cnVjdCBXS1ZpZXdJbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzIHsKICAgICBib29sIGV2ZW50
SW50ZXJwcmV0YXRpb25IYWRTaWRlRWZmZWN0czsKICAgICBib29sIGNvbnN1bWVkQnlJTTsKICAg
ICBib29sIGV4ZWN1dGluZ1NhdmVkS2V5cHJlc3NDb21tYW5kczsKICAgICBWZWN0b3I8S2V5cHJl
c3NDb21tYW5kPiogY29tbWFuZHM7CiB9OworI2VuZGlmCiAKIEBpbnRlcmZhY2UgV0tWaWV3RGF0
YSA6IE5TT2JqZWN0IHsKIEBwdWJsaWMKQEAgLTE3Myw3ICsxODMsMTEgQEAgQGludGVyZmFjZSBX
S1ZpZXdEYXRhIDogTlNPYmplY3QgewogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiB0byBkaXN0aW5n
dWlzaCB0aGUgY2FzZSBvZiBhIG5ldyBldmVudCBmcm9tIG9uZSAKICAgICAvLyB0aGF0IGhhcyBi
ZWVuIGFscmVhZHkgc2VudCB0byBXZWJDb3JlLgogICAgIFJldGFpblB0cjxOU0V2ZW50PiBfa2V5
RG93bkV2ZW50QmVpbmdSZXNlbnQ7CisjaWYgVVNFKEFTWU5DX05TVEVYVElOUFVUQ0xJRU5UKQor
ICAgIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+KiBfY29sbGVjdGVkS2V5cHJlc3NDb21tYW5kczsK
KyNlbHNlCiAgICAgV0tWaWV3SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycyogX2ludGVycHJl
dEtleUV2ZW50c1BhcmFtZXRlcnM7CisjZW5kaWYKIAogICAgIE5TU2l6ZSBfcmVzaXplU2Nyb2xs
T2Zmc2V0OwogCkBAIC0xMDgzLDYgKzEwOTcsMjYgQEAgLSAodm9pZClfc2V0TW91c2VEb3duRXZl
bnQ6KE5TRXZlbnQgKilldgogICAgIF9kYXRhLT5fbW91c2VEb3duRXZlbnQgPSBbZXZlbnQgcmV0
YWluXTsKIH0KIAorI2lmIFVTRShBU1lOQ19OU1RFWFRJTlBVVENMSUVOVCkKKyNkZWZpbmUgTkFU
SVZFX01PVVNFX0VWRU5UX0hBTkRMRVIoU2VsZWN0b3IpIFwKKyAgICAtICh2b2lkKVNlbGVjdG9y
OihOU0V2ZW50ICopdGhlRXZlbnQgXAorICAgIHsgXAorICAgICAgICBpZiAoW3NlbGYgc2hvdWxk
SWdub3JlTW91c2VFdmVudHNdKSBcCisgICAgICAgICAgICByZXR1cm47IFwKKyAgICAgICAgaWYg
KE5TVGV4dElucHV0Q29udGV4dCAqY29udGV4dCA9IFtzZWxmIGlucHV0Q29udGV4dF0pIHsgXAor
ICAgICAgICAgICAgW2NvbnRleHQgaGFuZGxlRXZlbnQ6dGhlRXZlbnQgY29tcGxldGlvbkhhbmRs
ZXI6XihCT09MIGhhbmRsZWQpIHsgXAorICAgICAgICAgICAgICAgIGlmIChoYW5kbGVkKSBcCisg
ICAgICAgICAgICAgICAgICAgIExPRyhUZXh0SW5wdXQsICIlcyB3YXMgaGFuZGxlZCBieSB0ZXh0
IGlucHV0IGNvbnRleHQiLCBTdHJpbmcoI1NlbGVjdG9yKS5zdWJzdHJpbmcoMCwgU3RyaW5nKCNT
ZWxlY3RvcikuZmluZCgiSW50ZXJuYWwiKSkuYXNjaWkoKS5kYXRhKCkpOyBcCisgICAgICAgICAg
ICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgTmF0aXZlV2ViTW91c2VFdmVudCB3
ZWJFdmVudCh0aGVFdmVudCwgc2VsZik7IFwKKyAgICAgICAgICAgICAgICAgICAgX2RhdGEtPl9w
YWdlLT5oYW5kbGVNb3VzZUV2ZW50KHdlYkV2ZW50KTsgXAorICAgICAgICAgICAgICAgIH0gXAor
ICAgICAgICAgICAgfV07IFwKKyAgICAgICAgfSBcCisgICAgICAgIE5hdGl2ZVdlYk1vdXNlRXZl
bnQgd2ViRXZlbnQodGhlRXZlbnQsIHNlbGYpOyBcCisgICAgICAgIF9kYXRhLT5fcGFnZS0+aGFu
ZGxlTW91c2VFdmVudCh3ZWJFdmVudCk7IFwKKyAgICB9CisjZWxzZQogI2RlZmluZSBOQVRJVkVf
TU9VU0VfRVZFTlRfSEFORExFUihTZWxlY3RvcikgXAogICAgIC0gKHZvaWQpU2VsZWN0b3I6KE5T
RXZlbnQgKil0aGVFdmVudCBcCiAgICAgeyBcCkBAIC0xMDk1LDYgKzExMjksNyBAQCAtICh2b2lk
KV9zZXRNb3VzZURvd25FdmVudDooTlNFdmVudCAqKWV2CiAgICAgICAgIE5hdGl2ZVdlYk1vdXNl
RXZlbnQgd2ViRXZlbnQodGhlRXZlbnQsIHNlbGYpOyBcCiAgICAgICAgIF9kYXRhLT5fcGFnZS0+
aGFuZGxlTW91c2VFdmVudCh3ZWJFdmVudCk7IFwKICAgICB9CisjZW5kaWYKIAogTkFUSVZFX01P
VVNFX0VWRU5UX0hBTkRMRVIobW91c2VFbnRlcmVkKQogTkFUSVZFX01PVVNFX0VWRU5UX0hBTkRM
RVIobW91c2VFeGl0ZWQpCkBAIC0xMjEzLDIwICsxMjQ4LDEyNiBAQCAtIChCT09MKXNob3VsZERl
bGF5V2luZG93T3JkZXJpbmdGb3JFdmVuCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorLSAodm9p
ZClfZGlzYWJsZUNvbXBsZXhUZXh0SW5wdXRJZk5lY2Vzc2FyeQoreworICAgIGlmICghX2RhdGEt
Pl9wbHVnaW5Db21wbGV4VGV4dElucHV0SWRlbnRpZmllcikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKF9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dFN0YXRlICE9IFBsdWdpbkNvbXBs
ZXhUZXh0SW5wdXRFbmFibGVkKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDaGVjayBpZiB0
aGUgdGV4dCBpbnB1dCB3aW5kb3cgaGFzIGJlZW4gZGlzbWlzc2VkLgorICAgIGlmICghW1tXS1Rl
eHRJbnB1dFdpbmRvd0NvbnRyb2xsZXIgc2hhcmVkVGV4dElucHV0V2luZG93Q29udHJvbGxlcl0g
aGFzTWFya2VkVGV4dF0pCisgICAgICAgIFtzZWxmIF9zZXRQbHVnaW5Db21wbGV4VGV4dElucHV0
U3RhdGU6UGx1Z2luQ29tcGxleFRleHRJbnB1dERpc2FibGVkXTsKK30KKworLSAoQk9PTClfaGFu
ZGxlUGx1Z2luQ29tcGxleFRleHRJbnB1dEtleURvd246KE5TRXZlbnQgKilldmVudAoreworICAg
IEFTU0VSVChfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRJZGVudGlmaWVyKTsKKyAgICBB
U1NFUlQoX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgIT0gUGx1Z2luQ29tcGxl
eFRleHRJbnB1dERpc2FibGVkKTsKKworICAgIEJPT0wgdXNpbmdMZWdhY3lDb2NvYVRleHRJbnB1
dCA9IF9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dFN0YXRlID09IFBsdWdpbkNvbXBsZXhU
ZXh0SW5wdXRFbmFibGVkTGVnYWN5OworCisgICAgTlNTdHJpbmcgKnN0cmluZyA9IG5pbDsKKyAg
ICBCT09MIGRpZEhhbmRsZUV2ZW50ID0gW1tXS1RleHRJbnB1dFdpbmRvd0NvbnRyb2xsZXIgc2hh
cmVkVGV4dElucHV0V2luZG93Q29udHJvbGxlcl0gaW50ZXJwcmV0S2V5RXZlbnQ6ZXZlbnQgdXNp
bmdMZWdhY3lDb2NvYVRleHRJbnB1dDp1c2luZ0xlZ2FjeUNvY29hVGV4dElucHV0IHN0cmluZzom
c3RyaW5nXTsKKworICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5zZW5k
Q29tcGxleFRleHRJbnB1dFRvUGx1Z2luKF9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dElk
ZW50aWZpZXIsIHN0cmluZyk7CisKKyAgICAgICAgaWYgKCF1c2luZ0xlZ2FjeUNvY29hVGV4dElu
cHV0KQorICAgICAgICAgICAgX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgPSBQ
bHVnaW5Db21wbGV4VGV4dElucHV0RGlzYWJsZWQ7CisgICAgfQorCisgICAgcmV0dXJuIGRpZEhh
bmRsZUV2ZW50OworfQorCistIChCT09MKV90cnlIYW5kbGVQbHVnaW5Db21wbGV4VGV4dElucHV0
S2V5RG93bjooTlNFdmVudCAqKWV2ZW50Cit7CisgICAgaWYgKCFfZGF0YS0+X3BsdWdpbkNvbXBs
ZXhUZXh0SW5wdXRJZGVudGlmaWVyIHx8IF9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dFN0
YXRlID09IFBsdWdpbkNvbXBsZXhUZXh0SW5wdXREaXNhYmxlZCkKKyAgICAgICAgcmV0dXJuIE5P
OworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHRleHQgaW5wdXQgd2luZG93IGhhcyBiZWVuIGRpc21p
c3NlZCBhbmQgbGV0IHRoZSBwbHVnLWluIHByb2Nlc3Mga25vdy4KKyAgICAvLyBUaGlzIGlzIG9u
bHkgdmFsaWQgd2l0aCB0aGUgdXBkYXRlZCBDb2NvYSB0ZXh0IGlucHV0IHNwZWMuCisgICAgW3Nl
bGYgX2Rpc2FibGVDb21wbGV4VGV4dElucHV0SWZOZWNlc3NhcnldOworCisgICAgLy8gVHJ5IGZl
ZWRpbmcgdGhlIGtleWJvYXJkIGV2ZW50IGRpcmVjdGx5IHRvIHRoZSBwbHVnLWluLgorICAgIGlm
IChfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSA9PSBQbHVnaW5Db21wbGV4VGV4
dElucHV0RW5hYmxlZExlZ2FjeSkKKyAgICAgICAgcmV0dXJuIFtzZWxmIF9oYW5kbGVQbHVnaW5D
b21wbGV4VGV4dElucHV0S2V5RG93bjpldmVudF07CisKKyAgICByZXR1cm4gTk87Cit9CisKK3N0
YXRpYyB2b2lkIGV4dHJhY3RVbmRlcmxpbmVzKE5TQXR0cmlidXRlZFN0cmluZyAqc3RyaW5nLCBW
ZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+JiByZXN1bHQpCit7CisgICAgaW50IGxlbmd0aCA9
IFtbc3RyaW5nIHN0cmluZ10gbGVuZ3RoXTsKKyAgICAKKyAgICBpbnQgaSA9IDA7CisgICAgd2hp
bGUgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgTlNSYW5nZSByYW5nZTsKKyAgICAgICAgTlNEaWN0
aW9uYXJ5ICphdHRycyA9IFtzdHJpbmcgYXR0cmlidXRlc0F0SW5kZXg6aSBsb25nZXN0RWZmZWN0
aXZlUmFuZ2U6JnJhbmdlIGluUmFuZ2U6TlNNYWtlUmFuZ2UoaSwgbGVuZ3RoIC0gaSldOworICAg
ICAgICAKKyAgICAgICAgaWYgKE5TTnVtYmVyICpzdHlsZSA9IFthdHRycyBvYmplY3RGb3JLZXk6
TlNVbmRlcmxpbmVTdHlsZUF0dHJpYnV0ZU5hbWVdKSB7CisgICAgICAgICAgICBDb2xvciBjb2xv
ciA9IENvbG9yOjpibGFjazsKKyAgICAgICAgICAgIGlmIChOU0NvbG9yICpjb2xvckF0dHIgPSBb
YXR0cnMgb2JqZWN0Rm9yS2V5Ok5TVW5kZXJsaW5lQ29sb3JBdHRyaWJ1dGVOYW1lXSkKKyAgICAg
ICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbU5TQ29sb3IoW2NvbG9yQXR0ciBjb2xvclVzaW5n
Q29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXSk7CisgICAgICAgICAgICByZXN1
bHQuYXBwZW5kKENvbXBvc2l0aW9uVW5kZXJsaW5lKHJhbmdlLmxvY2F0aW9uLCBOU01heFJhbmdl
KHJhbmdlKSwgY29sb3IsIFtzdHlsZSBpbnRWYWx1ZV0gPiAxKSk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIGkgPSByYW5nZS5sb2NhdGlvbiArIHJhbmdlLmxlbmd0aDsKKyAgICB9Cit9
CisKKyNpZiBVU0UoQVNZTkNfTlNURVhUSU5QVVRDTElFTlQpCisKKy0gKHZvaWQpX2NvbGxlY3RL
ZXlib2FyZExheW91dENvbW1hbmRzRm9yRXZlbnQ6KE5TRXZlbnQgKilldmVudCB0bzooVmVjdG9y
PEtleXByZXNzQ29tbWFuZD4mKWNvbW1hbmRzCit7CisgICAgaWYgKFtldmVudCB0eXBlXSAhPSBO
U0tleURvd24pCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVCghX2RhdGEtPl9jb2xsZWN0
ZWRLZXlwcmVzc0NvbW1hbmRzKTsKKyAgICBfZGF0YS0+X2NvbGxlY3RlZEtleXByZXNzQ29tbWFu
ZHMgPSAmY29tbWFuZHM7CisKKyAgICBpZiAoTlNUZXh0SW5wdXRDb250ZXh0ICpjb250ZXh0ID0g
W3NlbGYgaW5wdXRDb250ZXh0XSkKKyAgICAgICAgW2NvbnRleHQgaGFuZGxlRXZlbnRCeUtleWJv
YXJkTGF5b3V0OmV2ZW50XTsKKyAgICBlbHNlCisgICAgICAgIFtzZWxmIGludGVycHJldEtleUV2
ZW50czpbTlNBcnJheSBhcnJheVdpdGhPYmplY3Q6ZXZlbnRdXTsKKworICAgIF9kYXRhLT5fY29s
bGVjdGVkS2V5cHJlc3NDb21tYW5kcyA9IG51bGxwdHI7Cit9CisKKy0gKHZvaWQpX2ludGVycHJl
dEtleUV2ZW50OihOU0V2ZW50ICopZXZlbnQgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQoXikoQk9P
TCBoYW5kbGVkLCBjb25zdCBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiYgY29tbWFuZHMpKWNvbXBs
ZXRpb25IYW5kbGVyCit7CisgICAgaWYgKCFbc2VsZiBpbnB1dENvbnRleHRdKSB7CisgICAgICAg
IFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+IGNvbW1hbmRzOworICAgICAgICBbc2VsZiBfY29sbGVj
dEtleWJvYXJkTGF5b3V0Q29tbWFuZHNGb3JFdmVudDpldmVudCB0bzpjb21tYW5kc107CisgICAg
ICAgIGNvbXBsZXRpb25IYW5kbGVyKE5PLCBjb21tYW5kcyk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBMT0coVGV4dElucHV0LCAiLT4gaGFuZGxlRXZlbnRCeUlucHV0TWV0aG9kOiVw
ICVAIiwgZXZlbnQsIGV2ZW50KTsKKyAgICBbW3NlbGYgaW5wdXRDb250ZXh0XSBoYW5kbGVFdmVu
dEJ5SW5wdXRNZXRob2Q6ZXZlbnQgY29tcGxldGlvbkhhbmRsZXI6XihCT09MIGhhbmRsZWQpIHsK
KyAgICAgICAgCisgICAgICAgIExPRyhUZXh0SW5wdXQsICIuLi4gaGFuZGxlRXZlbnRCeUlucHV0
TWV0aG9kJXMgaGFuZGxlZCIsIGhhbmRsZWQgPyAiIiA6ICIgbm90Iik7CisgICAgICAgIGlmICho
YW5kbGVkKSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihZRVMsIFZlY3RvcjxLZXlw
cmVzc0NvbW1hbmQ+KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4gY29tbWFuZHM7CisgICAgICAgIFtzZWxmIF9jb2xs
ZWN0S2V5Ym9hcmRMYXlvdXRDb21tYW5kc0ZvckV2ZW50OmV2ZW50IHRvOmNvbW1hbmRzXTsKKyAg
ICAgICAgY29tcGxldGlvbkhhbmRsZXIoTk8sIGNvbW1hbmRzKTsKKyAgICB9XTsKK30KKwogLSAo
dm9pZClkb0NvbW1hbmRCeVNlbGVjdG9yOihTRUwpc2VsZWN0b3IKIHsKICAgICBMT0coVGV4dElu
cHV0LCAiZG9Db21tYW5kQnlTZWxlY3RvcjpcIiVzXCIiLCBzZWxfZ2V0TmFtZShzZWxlY3Rvcikp
OwogCi0gICAgV0tWaWV3SW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycyogcGFyYW1ldGVycyA9
IF9kYXRhLT5faW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVyczsKLSAgICBpZiAocGFyYW1ldGVy
cykKLSAgICAgICAgcGFyYW1ldGVycy0+Y29uc3VtZWRCeUlNID0gZmFsc2U7Ci0KLSAgICAvLyBB
cyBpbiBpbnNlcnRUZXh0OnJlcGxhY2VtZW50UmFuZ2U6LCB3ZSBhc3N1bWUgdGhhdCB0aGUgY2Fs
bCBjb21lcyBmcm9tIGFuIGlucHV0IG1ldGhvZCBpZiB0aGVyZSBpcyBtYXJrZWQgdGV4dC4KLSAg
ICBib29sIGlzRnJvbUlucHV0TWV0aG9kID0gX2RhdGEtPl9wYWdlLT5lZGl0b3JTdGF0ZSgpLmhh
c0NvbXBvc2l0aW9uOworICAgIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+KiBrZXlwcmVzc0NvbW1h
bmRzID0gX2RhdGEtPl9jb2xsZWN0ZWRLZXlwcmVzc0NvbW1hbmRzOwogCi0gICAgaWYgKHBhcmFt
ZXRlcnMgJiYgIWlzRnJvbUlucHV0TWV0aG9kKSB7CisgICAgaWYgKGtleXByZXNzQ29tbWFuZHMp
IHsKICAgICAgICAgS2V5cHJlc3NDb21tYW5kIGNvbW1hbmQoTlNTdHJpbmdGcm9tU2VsZWN0b3Io
c2VsZWN0b3IpKTsKLSAgICAgICAgcGFyYW1ldGVycy0+Y29tbWFuZHMtPmFwcGVuZChjb21tYW5k
KTsKKyAgICAgICAga2V5cHJlc3NDb21tYW5kcy0+YXBwZW5kKGNvbW1hbmQpOwogICAgICAgICBM
T0coVGV4dElucHV0LCAiLi4uc3RvcmVkIik7CiAgICAgICAgIF9kYXRhLT5fcGFnZS0+cmVnaXN0
ZXJLZXlwcmVzc0NvbW1hbmROYW1lKGNvbW1hbmQuY29tbWFuZE5hbWUpOwogICAgIH0gZWxzZSB7
CkBAIC0xMjM4LDcgKzEzNzksNyBAQCAtICh2b2lkKWRvQ29tbWFuZEJ5U2VsZWN0b3I6KFNFTClz
ZWxlY3RvCiAKIC0gKHZvaWQpaW5zZXJ0VGV4dDooaWQpc3RyaW5nCiB7Ci0gICAgLy8gVW5saWtl
IGFuZCBOU1RleHRJbnB1dENsaWVudCB2YXJpYW50IHdpdGggcmVwbGFjZW1lbnRSYW5nZSwgdGhp
cyBOU1Jlc3BvbmRlciBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gaW5wdXQgY29u
dGV4dCwKKyAgICAvLyBVbmxpa2UgYW4gTlNUZXh0SW5wdXRDbGllbnQgdmFyaWFudCB3aXRoIHJl
cGxhY2VtZW50UmFuZ2UsIHRoaXMgTlNSZXNwb25kZXIgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRo
ZXJlIGlzIG5vIGlucHV0IGNvbnRleHQsCiAgICAgLy8gc28gdGV4dCBpbnB1dCBwcm9jZXNzaW5n
IGlzbid0IHBlcmZvcm1lZC4gV2UgYXJlIG5vdCBnb2luZyB0byBhY3R1YWxseSBpbnNlcnQgYW55
IHRleHQgaW4gdGhhdCBjYXNlLCBidXQgc2F2aW5nIGFuIGluc2VydFRleHQKICAgICAvLyBjb21t
YW5kIGVuc3VyZXMgdGhhdCBhIGtleXByZXNzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYXMgYXBwcm9w
cmlhdGUuCiAgICAgW3NlbGYgaW5zZXJ0VGV4dDpzdHJpbmcgcmVwbGFjZW1lbnRSYW5nZTpOU01h
a2VSYW5nZShOU05vdEZvdW5kLCAwKV07CkBAIC0xMjUzLDEzICsxMzk0LDggQEAgLSAodm9pZClp
bnNlcnRUZXh0OihpZClzdHJpbmcgcmVwbGFjZW1lbgogICAgICAgICBMT0coVGV4dElucHV0LCAi
aW5zZXJ0VGV4dDpcIiVAXCIgcmVwbGFjZW1lbnRSYW5nZTooJXUsICV1KSIsIGlzQXR0cmlidXRl
ZFN0cmluZyA/IFtzdHJpbmcgc3RyaW5nXSA6IHN0cmluZywgcmVwbGFjZW1lbnRSYW5nZS5sb2Nh
dGlvbiwgcmVwbGFjZW1lbnRSYW5nZS5sZW5ndGgpOwogICAgIGVsc2UKICAgICAgICAgTE9HKFRl
eHRJbnB1dCwgImluc2VydFRleHQ6XCIlQFwiIiwgaXNBdHRyaWJ1dGVkU3RyaW5nID8gW3N0cmlu
ZyBzdHJpbmddIDogc3RyaW5nKTsKLSAgICBXS1ZpZXdJbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0
ZXJzKiBwYXJhbWV0ZXJzID0gX2RhdGEtPl9pbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzOwot
ICAgIGlmIChwYXJhbWV0ZXJzKQotICAgICAgICBwYXJhbWV0ZXJzLT5jb25zdW1lZEJ5SU0gPSBm
YWxzZTsKIAogICAgIE5TU3RyaW5nICp0ZXh0OwotICAgIGJvb2wgaXNGcm9tSW5wdXRNZXRob2Qg
PSBfZGF0YS0+X3BhZ2UtPmVkaXRvclN0YXRlKCkuaGFzQ29tcG9zaXRpb247Ci0KICAgICBWZWN0
b3I8VGV4dEFsdGVybmF0aXZlV2l0aFJhbmdlPiBkaWN0YXRpb25BbHRlcm5hdGl2ZXM7CiAKICAg
ICBpZiAoaXNBdHRyaWJ1dGVkU3RyaW5nKSB7CkBAIC0xMjcyLDEzNiArMTQwOCwzMDcgQEAgLSAo
dm9pZClpbnNlcnRUZXh0OihpZClzdHJpbmcgcmVwbGFjZW1lbgogICAgICAgICB0ZXh0ID0gc3Ry
aW5nOwogCiAgICAgLy8gaW5zZXJ0VGV4dCBjYW4gYmUgY2FsbGVkIGZvciBzZXZlcmFsIHJlYXNv
bnM6Ci0gICAgLy8gLSBJZiBpdCdzIGZyb20gbm9ybWFsIGtleSBldmVudCBwcm9jZXNzaW5nIChp
bmNsdWRpbmcga2V5IGJpbmRpbmdzKSwgd2UgbWF5IG5lZWQgdG8gc2F2ZSB0aGUgYWN0aW9uIHRv
IHBlcmZvcm0gaXQgbGF0ZXIuCi0gICAgLy8gLSBJZiBpdCdzIGZyb20gYW4gaW5wdXQgbWV0aG9k
LCB0aGVuIHdlIHNob3VsZCBnbyBhaGVhZCBhbmQgaW5zZXJ0IHRoZSB0ZXh0IG5vdy4gV2UgYXNz
dW1lIGl0J3MgZnJvbSB0aGUgaW5wdXQgbWV0aG9kIGlmIHdlIGhhdmUgbWFya2VkIHRleHQuCi0g
ICAgLy8gRklYTUU6IEluIHRoZW9yeSwgdGhpcyBjb3VsZCBiZSB3cm9uZyBmb3Igc29tZSBpbnB1
dCBtZXRob2RzLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGZpbmQgYW5vdGhlciB3YXkgdG8gZGV0ZXJt
aW5lIGlmIHRoZSBjYWxsIGlzIGZyb20gdGhlIGlucHV0IG1ldGhvZC4KKyAgICAvLyAtIElmIGl0
J3MgZnJvbSBub3JtYWwga2V5IGV2ZW50IHByb2Nlc3NpbmcgKGluY2x1ZGluZyBrZXkgYmluZGlu
Z3MpLCB3ZSBzYXZlIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSBpdCBsYXRlci4KKyAgICAvLyAtIElm
IGl0J3MgZnJvbSBhbiBpbnB1dCBtZXRob2QsIHRoZW4gd2Ugc2hvdWxkIGdvIGFoZWFkIGFuZCBp
bnNlcnQgdGhlIHRleHQgbm93LgogICAgIC8vIC0gSWYgaXQncyBzZW50IG91dHNpZGUgb2Yga2V5
Ym9hcmQgZXZlbnQgcHJvY2Vzc2luZyAoZS5nLiBmcm9tIENoYXJhY3RlciBWaWV3ZXIsIG9yIHdo
ZW4gY29uZmlybWluZyBhbiBpbmxpbmUgaW5wdXQgYXJlYSB3aXRoIGEgbW91c2UpLAogICAgIC8v
IHRoZW4gd2UgYWxzbyBleGVjdXRlIGl0IGltbWVkaWF0ZWx5LCBhcyB0aGVyZSB3aWxsIGJlIG5v
IG90aGVyIGNoYW5jZS4KLSAgICBpZiAocGFyYW1ldGVycyAmJiAhaXNGcm9tSW5wdXRNZXRob2Qp
IHsKLSAgICAgICAgLy8gRklYTUU6IEhhbmRsZSByZXBsYWNlbWVudFJhbmdlIGluIHRoaXMgY2Fz
ZSwgdG9vLiBJdCdzIGtub3duIHRvIG9jY3VyIGluIHByYWN0aWNlIHdoZW4gY2FuY2VsaW5nIFBy
ZXNzIGFuZCBIb2xkIChzZWUgPHJkYXI6Ly8xMTk0MDY3MD4pLgorICAgIFZlY3RvcjxLZXlwcmVz
c0NvbW1hbmQ+KiBrZXlwcmVzc0NvbW1hbmRzID0gX2RhdGEtPl9jb2xsZWN0ZWRLZXlwcmVzc0Nv
bW1hbmRzOworICAgIGlmIChrZXlwcmVzc0NvbW1hbmRzKSB7CiAgICAgICAgIEFTU0VSVChyZXBs
YWNlbWVudFJhbmdlLmxvY2F0aW9uID09IE5TTm90Rm91bmQpOwogICAgICAgICBLZXlwcmVzc0Nv
bW1hbmQgY29tbWFuZCgiaW5zZXJ0VGV4dDoiLCB0ZXh0KTsKLSAgICAgICAgcGFyYW1ldGVycy0+
Y29tbWFuZHMtPmFwcGVuZChjb21tYW5kKTsKKyAgICAgICAga2V5cHJlc3NDb21tYW5kcy0+YXBw
ZW5kKGNvbW1hbmQpOworICAgICAgICBMT0coVGV4dElucHV0LCAiLi4uc3RvcmVkIik7CiAgICAg
ICAgIF9kYXRhLT5fcGFnZS0+cmVnaXN0ZXJLZXlwcmVzc0NvbW1hbmROYW1lKGNvbW1hbmQuY29t
bWFuZE5hbWUpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgU3RyaW5nIGV2ZW50VGV4
dCA9IHRleHQ7CiAgICAgZXZlbnRUZXh0LnJlcGxhY2UoTlNCYWNrVGFiQ2hhcmFjdGVyLCBOU1Rh
YkNoYXJhY3Rlcik7IC8vIHNhbWUgdGhpbmcgaXMgZG9uZSBpbiBLZXlFdmVudE1hYy5tbSBpbiBX
ZWJDb3JlCi0gICAgYm9vbCBldmVudEhhbmRsZWQ7CiAgICAgaWYgKCFkaWN0YXRpb25BbHRlcm5h
dGl2ZXMuaXNFbXB0eSgpKQotICAgICAgICBldmVudEhhbmRsZWQgPSBfZGF0YS0+X3BhZ2UtPmlu
c2VydERpY3RhdGVkVGV4dChldmVudFRleHQsIHJlcGxhY2VtZW50UmFuZ2UsIGRpY3RhdGlvbkFs
dGVybmF0aXZlcyk7CisgICAgICAgIF9kYXRhLT5fcGFnZS0+aW5zZXJ0RGljdGF0ZWRUZXh0QXN5
bmMoZXZlbnRUZXh0LCByZXBsYWNlbWVudFJhbmdlLCBkaWN0YXRpb25BbHRlcm5hdGl2ZXMpOwog
ICAgIGVsc2UKLSAgICAgICAgZXZlbnRIYW5kbGVkID0gX2RhdGEtPl9wYWdlLT5pbnNlcnRUZXh0
KGV2ZW50VGV4dCwgcmVwbGFjZW1lbnRSYW5nZSk7Ci0KLSAgICBpZiAocGFyYW1ldGVycykKLSAg
ICAgICAgcGFyYW1ldGVycy0+ZXZlbnRJbnRlcnByZXRhdGlvbkhhZFNpZGVFZmZlY3RzIHw9IGV2
ZW50SGFuZGxlZDsKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5pbnNlcnRUZXh0QXN5bmMoZXZlbnRU
ZXh0LCByZXBsYWNlbWVudFJhbmdlKTsKIH0KIAotLSAoQk9PTClwZXJmb3JtS2V5RXF1aXZhbGVu
dDooTlNFdmVudCAqKWV2ZW50CistICh2b2lkKXNlbGVjdGVkUmFuZ2VXaXRoQ29tcGxldGlvbkhh
bmRsZXI6KHZvaWQoXikoTlNSYW5nZSBzZWxlY3RlZFJhbmdlKSljb21wbGV0aW9uSGFuZGxlclB0
cgogewotICAgIC8vIFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCByZXNwb25kaW5nIHRvIHRoaXMgZXZl
bnQgd2lsbCBydW4gYSBuZXN0ZWQgZXZlbnQgbG9vcCwgYW5kCi0gICAgLy8gZmV0Y2hpbmcgYSBu
ZXcgZXZlbnQgbWlnaHQgcmVsZWFzZSB0aGUgb2xkIG9uZS4gUmV0YWluaW5nIGFuZCB0aGVuIGF1
dG9yZWxlYXNpbmcKLSAgICAvLyB0aGUgY3VycmVudCBldmVudCBwcmV2ZW50cyB0aGF0IGZyb20g
Y2F1c2luZyBhIHByb2JsZW0gaW5zaWRlIFdlYktpdCBvciBBcHBLaXQgY29kZS4KLSAgICBbW2V2
ZW50IHJldGFpbl0gYXV0b3JlbGVhc2VdOworICAgIFJldGFpblB0cjxpZD4gY29tcGxldGlvbkhh
bmRsZXIgPSBhZG9wdE5TKFtjb21wbGV0aW9uSGFuZGxlclB0ciBjb3B5XSk7CiAKLSAgICAvLyBX
ZSBnZXQgRXNjIGtleSBoZXJlIGFmdGVyIHByb2Nlc3NpbmcgZWl0aGVyIEVzYyBvciBDbWQrcGVy
aW9kLiBUaGUgZm9ybWVyIHN0YXJ0cyBhcyBhIGtleURvd24sIGFuZCB0aGUgbGF0dGVyIHN0YXJ0
cyBhcyBhIGtleSBlcXVpdmFsZW50LAotICAgIC8vIGJ1dCBib3RoIGdldCB0cmFuc2Zvcm1lZCB0
byBhIGNhbmNlbE9wZXJhdGlvbjogY29tbWFuZCwgZXhlY3V0aW5nIHdoaWNoIHBhc3NlcyBhbiBF
c2Mga2V5IGV2ZW50IHRvIC1wZXJmb3JtS2V5RXF1aXZhbGVudDouCi0gICAgLy8gRG9uJ3QgaW50
ZXJwcmV0IHRoaXMgZXZlbnQgYWdhaW4sIGF2b2lkaW5nIHJlLWVudHJhbmN5IGFuZCBpbmZpbml0
ZSBsb29wcy4KLSAgICBpZiAoW1tldmVudCBjaGFyYWN0ZXJzSWdub3JpbmdNb2RpZmllcnNdIGlz
RXF1YWxUb1N0cmluZzpAIlxlIl0gJiYgIShbZXZlbnQgbW9kaWZpZXJGbGFnc10gJiBOU0Rldmlj
ZUluZGVwZW5kZW50TW9kaWZpZXJGbGFnc01hc2spKQotICAgICAgICByZXR1cm4gW3N1cGVyIHBl
cmZvcm1LZXlFcXVpdmFsZW50OmV2ZW50XTsKKyAgICBMT0coVGV4dElucHV0LCAic2VsZWN0ZWRS
YW5nZSIpOworICAgIF9kYXRhLT5fcGFnZS0+Z2V0U2VsZWN0ZWRSYW5nZUFzeW5jKEVkaXRpbmdS
YW5nZUNhbGxiYWNrOjpjcmVhdGUoW2NvbXBsZXRpb25IYW5kbGVyXShib29sIGVycm9yLCBjb25z
dCBFZGl0aW5nUmFuZ2UmIGVkaXRpbmdSYW5nZVJlc3VsdCkgeworICAgICAgICB2b2lkICheY29t
cGxldGlvbkhhbmRsZXJCbG9jaykoTlNSYW5nZSkgPSAodm9pZCAoXikoTlNSYW5nZSkpY29tcGxl
dGlvbkhhbmRsZXIuZ2V0KCk7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgTE9H
KFRleHRJbnB1dCwgIiAgICAuLi5zZWxlY3RlZFJhbmdlIGZhaWxlZC4iKTsKKyAgICAgICAgICAg
IGNvbXBsZXRpb25IYW5kbGVyQmxvY2soTlNNYWtlUmFuZ2UoTlNOb3RGb3VuZCwgMCkpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5TUmFuZ2UgcmVzdWx0ID0gZWRp
dGluZ1JhbmdlUmVzdWx0OworICAgICAgICBpZiAocmVzdWx0LmxvY2F0aW9uID09IE5TTm90Rm91
bmQpCisgICAgICAgICAgICBMT0coVGV4dElucHV0LCAiICAgIC0+IHNlbGVjdGVkUmFuZ2UgcmV0
dXJuZWQgKE5TTm90Rm91bmQsICVsbHUpIiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIExPRyhUZXh0SW5wdXQsICIgICAgLT4gc2VsZWN0ZWRSYW5nZSByZXR1cm5l
ZCAoJWxsdSwgJWxsdSkiLCByZXN1bHQubG9jYXRpb24sIHJlc3VsdC5sZW5ndGgpOworICAgICAg
ICBjb21wbGV0aW9uSGFuZGxlckJsb2NrKHJlc3VsdCk7CisgICAgfSkpOworfQogCi0gICAgLy8g
SWYgd2UgYXJlIGFscmVhZHkgcmUtc2VuZGluZyB0aGUgZXZlbnQsIHRoZW4gV2ViQ29yZSBoYXMg
YWxyZWFkeSBzZWVuIGl0LCBubyBuZWVkIGZvciBjdXN0b20gcHJvY2Vzc2luZy4KLSAgICBCT09M
IGV2ZW50V2FzU2VudFRvV2ViQ29yZSA9IChfZGF0YS0+X2tleURvd25FdmVudEJlaW5nUmVzZW50
ID09IGV2ZW50KTsKLSAgICBpZiAoZXZlbnRXYXNTZW50VG9XZWJDb3JlKQotICAgICAgICByZXR1
cm4gW3N1cGVyIHBlcmZvcm1LZXlFcXVpdmFsZW50OmV2ZW50XTsKKy0gKHZvaWQpbWFya2VkUmFu
Z2VXaXRoQ29tcGxldGlvbkhhbmRsZXI6KHZvaWQoXikoTlNSYW5nZSBtYXJrZWRSYW5nZSkpY29t
cGxldGlvbkhhbmRsZXJQdHIKK3sKKyAgICBSZXRhaW5QdHI8aWQ+IGNvbXBsZXRpb25IYW5kbGVy
ID0gYWRvcHROUyhbY29tcGxldGlvbkhhbmRsZXJQdHIgY29weV0pOwogCi0gICAgQVNTRVJUKGV2
ZW50ID09IFtOU0FwcCBjdXJyZW50RXZlbnRdKTsKKyAgICBMT0coVGV4dElucHV0LCAibWFya2Vk
UmFuZ2UiKTsKKyAgICBfZGF0YS0+X3BhZ2UtPmdldE1hcmtlZFJhbmdlQXN5bmMoRWRpdGluZ1Jh
bmdlQ2FsbGJhY2s6OmNyZWF0ZShbY29tcGxldGlvbkhhbmRsZXJdKGJvb2wgZXJyb3IsIGNvbnN0
IEVkaXRpbmdSYW5nZSYgZWRpdGluZ1JhbmdlUmVzdWx0KSB7CisgICAgICAgIHZvaWQgKF5jb21w
bGV0aW9uSGFuZGxlckJsb2NrKShOU1JhbmdlKSA9ICh2b2lkICheKShOU1JhbmdlKSljb21wbGV0
aW9uSGFuZGxlci5nZXQoKTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBMT0co
VGV4dElucHV0LCAiICAgIC4uLm1hcmtlZFJhbmdlIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGNv
bXBsZXRpb25IYW5kbGVyQmxvY2soTlNNYWtlUmFuZ2UoTlNOb3RGb3VuZCwgMCkpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5TUmFuZ2UgcmVzdWx0ID0gZWRpdGlu
Z1JhbmdlUmVzdWx0OworICAgICAgICBpZiAocmVzdWx0LmxvY2F0aW9uID09IE5TTm90Rm91bmQp
CisgICAgICAgICAgICBMT0coVGV4dElucHV0LCAiICAgIC0+IG1hcmtlZFJhbmdlIHJldHVybmVk
IChOU05vdEZvdW5kLCAlbGx1KSIsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBMT0coVGV4dElucHV0LCAiICAgIC0+IG1hcmtlZFJhbmdlIHJldHVybmVkICglbGx1
LCAlbGx1KSIsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGNvbXBs
ZXRpb25IYW5kbGVyQmxvY2socmVzdWx0KTsKKyAgICB9KSk7Cit9CiAKLSAgICBbc2VsZiBfZGlz
YWJsZUNvbXBsZXhUZXh0SW5wdXRJZk5lY2Vzc2FyeV07CistICh2b2lkKWhhc01hcmtlZFRleHRX
aXRoQ29tcGxldGlvbkhhbmRsZXI6KHZvaWQoXikoQk9PTCBoYXNNYXJrZWRUZXh0KSljb21wbGV0
aW9uSGFuZGxlclB0cgoreworICAgIFJldGFpblB0cjxpZD4gY29tcGxldGlvbkhhbmRsZXIgPSBh
ZG9wdE5TKFtjb21wbGV0aW9uSGFuZGxlclB0ciBjb3B5XSk7CiAKLSAgICAvLyBQYXNzIGtleSBj
b21ib3MgdGhyb3VnaCBXZWJDb3JlIGlmIHRoZXJlIGlzIGEga2V5IGJpbmRpbmcgYXZhaWxhYmxl
IGZvcgotICAgIC8vIHRoaXMgZXZlbnQuIFRoaXMgbGV0cyB3ZWIgcGFnZXMgaGF2ZSBhIGNyYWNr
IGF0IGludGVyY2VwdGluZyBrZXktbW9kaWZpZWQga2V5cHJlc3Nlcy4KLSAgICAvLyBGSVhNRTog
V2h5IGlzIHRoZSBmaXJzdFJlc3BvbmRlciBjaGVjayBuZWVkZWQ/Ci0gICAgaWYgKHNlbGYgPT0g
W1tzZWxmIHdpbmRvd10gZmlyc3RSZXNwb25kZXJdKSB7Ci0gICAgICAgIFZlY3RvcjxLZXlwcmVz
c0NvbW1hbmQ+IGNvbW1hbmRzOwotICAgICAgICBCT09MIGhhbmRsZWRCeUlucHV0TWV0aG9kID0g
W3NlbGYgX2ludGVycHJldEtleUV2ZW50OmV2ZW50IHNhdmluZ0NvbW1hbmRzVG86Y29tbWFuZHNd
OwotICAgICAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJkRXZlbnQoTmF0aXZlV2ViS2V5
Ym9hcmRFdmVudChldmVudCwgaGFuZGxlZEJ5SW5wdXRNZXRob2QsIGNvbW1hbmRzKSk7Ci0gICAg
ICAgIHJldHVybiBZRVM7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBbc3VwZXIgcGVyZm9ybUtl
eUVxdWl2YWxlbnQ6ZXZlbnRdOworICAgIExPRyhUZXh0SW5wdXQsICJoYXNNYXJrZWRUZXh0Iik7
CisgICAgX2RhdGEtPl9wYWdlLT5nZXRNYXJrZWRSYW5nZUFzeW5jKEVkaXRpbmdSYW5nZUNhbGxi
YWNrOjpjcmVhdGUoW2NvbXBsZXRpb25IYW5kbGVyXShib29sIGVycm9yLCBjb25zdCBFZGl0aW5n
UmFuZ2UmIGVkaXRpbmdSYW5nZVJlc3VsdCkgeworICAgICAgICB2b2lkICheY29tcGxldGlvbkhh
bmRsZXJCbG9jaykoQk9PTCkgPSAodm9pZCAoXikoQk9PTCkpY29tcGxldGlvbkhhbmRsZXIuZ2V0
KCk7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgTE9HKFRleHRJbnB1dCwgIiAg
ICAuLi5oYXNNYXJrZWRUZXh0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5k
bGVyQmxvY2soTk8pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEJP
T0wgaGFzTWFya2VkVGV4dCA9IGVkaXRpbmdSYW5nZVJlc3VsdC5sb2NhdGlvbiAhPSBub3RGb3Vu
ZDsKKyAgICAgICAgTE9HKFRleHRJbnB1dCwgIiAgICAtPiBoYXNNYXJrZWRUZXh0IHJldHVybmVk
ICV1IiwgaGFzTWFya2VkVGV4dCk7CisgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyQmxvY2soaGFz
TWFya2VkVGV4dCk7CisgICAgfSkpOwogfQogCi0tICh2b2lkKWtleVVwOihOU0V2ZW50ICopdGhl
RXZlbnQKKy0gKHZvaWQpYXR0cmlidXRlZFN1YnN0cmluZ0ZvclByb3Bvc2VkUmFuZ2U6KE5TUmFu
Z2UpbnNSYW5nZSBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCheKShOU0F0dHJpYnV0ZWRTdHJpbmcg
KmF0dHJTdHJpbmcsIE5TUmFuZ2UgYWN0dWFsUmFuZ2UpKWNvbXBsZXRpb25IYW5kbGVyUHRyCiB7
Ci0gICAgTE9HKFRleHRJbnB1dCwgImtleVVwOiVwICVAIiwgdGhlRXZlbnQsIHRoZUV2ZW50KTsK
LSAgICAvLyBXZSBkb24ndCBpbnRlcnByZXQgdGhlIGtleVVwIGV2ZW50LCBhcyB0aGlzIGJyZWFr
cyBrZXkgYmluZGluZ3MgKHNlZSA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTEzMDEwMD4pLgotICAgIF9kYXRhLT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRp
dmVXZWJLZXlib2FyZEV2ZW50KHRoZUV2ZW50LCBmYWxzZSwgVmVjdG9yPEtleXByZXNzQ29tbWFu
ZD4oKSkpOworICAgIFJldGFpblB0cjxpZD4gY29tcGxldGlvbkhhbmRsZXIgPSBhZG9wdE5TKFtj
b21wbGV0aW9uSGFuZGxlclB0ciBjb3B5XSk7CisKKyAgICBMT0coVGV4dElucHV0LCAiYXR0cmli
dXRlZFN1YnN0cmluZ0Zyb21SYW5nZTooJXUsICV1KSIsIG5zUmFuZ2UubG9jYXRpb24sIG5zUmFu
Z2UubGVuZ3RoKTsKKyAgICBfZGF0YS0+X3BhZ2UtPmF0dHJpYnV0ZWRTdWJzdHJpbmdGb3JDaGFy
YWN0ZXJSYW5nZUFzeW5jKG5zUmFuZ2UsIEF0dHJpYnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5n
ZUNhbGxiYWNrOjpjcmVhdGUoW2NvbXBsZXRpb25IYW5kbGVyXShib29sIGVycm9yLCBjb25zdCBB
dHRyaWJ1dGVkU3RyaW5nJiBzdHJpbmcsIGNvbnN0IEVkaXRpbmdSYW5nZSYgYWN0dWFsUmFuZ2Up
IHsKKyAgICAgICAgdm9pZCAoXmNvbXBsZXRpb25IYW5kbGVyQmxvY2spKE5TQXR0cmlidXRlZFN0
cmluZyAqLCBOU1JhbmdlKSA9ICh2b2lkICheKShOU0F0dHJpYnV0ZWRTdHJpbmcgKiwgTlNSYW5n
ZSkpY29tcGxldGlvbkhhbmRsZXIuZ2V0KCk7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAg
ICAgICAgTE9HKFRleHRJbnB1dCwgIiAgICAuLi5hdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdl
IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyQmxvY2soMCwgTlNNYWtl
UmFuZ2UoTlNOb3RGb3VuZCwgMCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICAgIExPRyhUZXh0SW5wdXQsICIgICAgLT4gYXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5n
ZSByZXR1cm5lZCAlQCIsIFtzdHJpbmcuc3RyaW5nLmdldCgpIHN0cmluZ10pOworICAgICAgICBj
b21wbGV0aW9uSGFuZGxlckJsb2NrKFtbc3RyaW5nLnN0cmluZy5nZXQoKSByZXRhaW5dIGF1dG9y
ZWxlYXNlXSwgYWN0dWFsUmFuZ2UpOworICAgIH0pKTsKIH0KIAotLSAodm9pZClfZGlzYWJsZUNv
bXBsZXhUZXh0SW5wdXRJZk5lY2Vzc2FyeQorLSAodm9pZClmaXJzdFJlY3RGb3JDaGFyYWN0ZXJS
YW5nZTooTlNSYW5nZSl0aGVSYW5nZSBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCheKShOU1JlY3Qg
Zmlyc3RSZWN0LCBOU1JhbmdlIGFjdHVhbFJhbmdlKSljb21wbGV0aW9uSGFuZGxlclB0cgogewot
ICAgIGlmICghX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0SWRlbnRpZmllcikKLSAgICAg
ICAgcmV0dXJuOworICAgIFJldGFpblB0cjxpZD4gY29tcGxldGlvbkhhbmRsZXIgPSBhZG9wdE5T
KFtjb21wbGV0aW9uSGFuZGxlclB0ciBjb3B5XSk7CiAKLSAgICBpZiAoX2RhdGEtPl9wbHVnaW5D
b21wbGV4VGV4dElucHV0U3RhdGUgIT0gUGx1Z2luQ29tcGxleFRleHRJbnB1dEVuYWJsZWQpCi0g
ICAgICAgIHJldHVybjsKKyAgICBMT0coVGV4dElucHV0LCAiZmlyc3RSZWN0Rm9yQ2hhcmFjdGVy
UmFuZ2U6KCV1LCAldSkiLCB0aGVSYW5nZS5sb2NhdGlvbiwgdGhlUmFuZ2UubGVuZ3RoKTsKIAot
ICAgIC8vIENoZWNrIGlmIHRoZSB0ZXh0IGlucHV0IHdpbmRvdyBoYXMgYmVlbiBkaXNtaXNzZWQu
Ci0gICAgaWYgKCFbW1dLVGV4dElucHV0V2luZG93Q29udHJvbGxlciBzaGFyZWRUZXh0SW5wdXRX
aW5kb3dDb250cm9sbGVyXSBoYXNNYXJrZWRUZXh0XSkKLSAgICAgICAgW3NlbGYgX3NldFBsdWdp
bkNvbXBsZXhUZXh0SW5wdXRTdGF0ZTpQbHVnaW5Db21wbGV4VGV4dElucHV0RGlzYWJsZWRdOwor
ICAgIC8vIEp1c3QgdG8gbWF0Y2ggTlNUZXh0VmlldydzIGJlaGF2aW9yLiBSZWdyZXNzaW9uIHRl
c3RzIGNhbm5vdCBkZXRlY3QgdGhpczsKKyAgICAvLyB0byByZXByb2R1Y2UsIHVzZSBhIHRlc3Qg
YXBwbGljYXRpb24gZnJvbSBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
NjgyCisgICAgLy8gKHR5cGUgc29tZXRoaW5nOyB0cnkgcmFuZ2VzICgxLCAtMSkgYW5kICgyLCAt
MSkuCisgICAgaWYgKCh0aGVSYW5nZS5sb2NhdGlvbiArIHRoZVJhbmdlLmxlbmd0aCA8IHRoZVJh
bmdlLmxvY2F0aW9uKSAmJiAodGhlUmFuZ2UubG9jYXRpb24gKyB0aGVSYW5nZS5sZW5ndGggIT0g
MCkpCisgICAgICAgIHRoZVJhbmdlLmxlbmd0aCA9IDA7CisKKyAgICBfZGF0YS0+X3BhZ2UtPmZp
cnN0UmVjdEZvckNoYXJhY3RlclJhbmdlQXN5bmModGhlUmFuZ2UsIFJlY3RGb3JDaGFyYWN0ZXJS
YW5nZUNhbGxiYWNrOjpjcmVhdGUoW3NlbGYsIGNvbXBsZXRpb25IYW5kbGVyXShib29sIGVycm9y
LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIGFjdHVhbFJhbmdlKSB7
CisgICAgICAgIHZvaWQgKF5jb21wbGV0aW9uSGFuZGxlckJsb2NrKShOU1JlY3QsIE5TUmFuZ2Up
ID0gKHZvaWQgKF4pKE5TUmVjdCwgTlNSYW5nZSkpY29tcGxldGlvbkhhbmRsZXIuZ2V0KCk7Cisg
ICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgTE9HKFRleHRJbnB1dCwgIiAgICAuLi5m
aXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZSBmYWlsZWQuIik7CisgICAgICAgICAgICBjb21wbGV0
aW9uSGFuZGxlckJsb2NrKE5TTWFrZVJlY3QoMCwgMCwgMCwgMCksIE5TTWFrZVJhbmdlKE5TTm90
Rm91bmQsIDApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5T
UmVjdCByZXN1bHRSZWN0ID0gW3NlbGYgY29udmVydFJlY3Q6cmVjdCB0b1ZpZXc6bmlsXTsKKyAg
ICAgICAgcmVzdWx0UmVjdCA9IFtzZWxmLndpbmRvdyBjb252ZXJ0UmVjdFRvU2NyZWVuOnJlc3Vs
dFJlY3RdOworCisgICAgICAgIExPRyhUZXh0SW5wdXQsICIgICAgLT4gZmlyc3RSZWN0Rm9yQ2hh
cmFjdGVyUmFuZ2UgcmV0dXJuZWQgKCVmLCAlZiwgJWYsICVmKSIsIHJlc3VsdFJlY3Qub3JpZ2lu
LngsIHJlc3VsdFJlY3Qub3JpZ2luLnksIHJlc3VsdFJlY3Quc2l6ZS53aWR0aCwgcmVzdWx0UmVj
dC5zaXplLmhlaWdodCk7CisgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyQmxvY2socmVzdWx0UmVj
dCwgYWN0dWFsUmFuZ2UpOworICAgIH0pKTsKIH0KIAotLSAoQk9PTClfaGFuZGxlUGx1Z2luQ29t
cGxleFRleHRJbnB1dEtleURvd246KE5TRXZlbnQgKilldmVudAorLSAodm9pZCljaGFyYWN0ZXJJ
bmRleEZvclBvaW50OihOU1BvaW50KXRoZVBvaW50IGNvbXBsZXRpb25IYW5kbGVyOih2b2lkKF4p
KE5TVUludGVnZXIpKWNvbXBsZXRpb25IYW5kbGVyUHRyCiB7Ci0gICAgQVNTRVJUKF9kYXRhLT5f
cGx1Z2luQ29tcGxleFRleHRJbnB1dElkZW50aWZpZXIpOwotICAgIEFTU0VSVChfZGF0YS0+X3Bs
dWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSAhPSBQbHVnaW5Db21wbGV4VGV4dElucHV0RGlzYWJs
ZWQpOworICAgIFJldGFpblB0cjxpZD4gY29tcGxldGlvbkhhbmRsZXIgPSBhZG9wdE5TKFtjb21w
bGV0aW9uSGFuZGxlclB0ciBjb3B5XSk7CiAKLSAgICBCT09MIHVzaW5nTGVnYWN5Q29jb2FUZXh0
SW5wdXQgPSBfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRTdGF0ZSA9PSBQbHVnaW5Db21w
bGV4VGV4dElucHV0RW5hYmxlZExlZ2FjeTsKLQotICAgIE5TU3RyaW5nICpzdHJpbmcgPSBuaWw7
Ci0gICAgQk9PTCBkaWRIYW5kbGVFdmVudCA9IFtbV0tUZXh0SW5wdXRXaW5kb3dDb250cm9sbGVy
IHNoYXJlZFRleHRJbnB1dFdpbmRvd0NvbnRyb2xsZXJdIGludGVycHJldEtleUV2ZW50OmV2ZW50
IHVzaW5nTGVnYWN5Q29jb2FUZXh0SW5wdXQ6dXNpbmdMZWdhY3lDb2NvYVRleHRJbnB1dCBzdHJp
bmc6JnN0cmluZ107CisgICAgTE9HKFRleHRJbnB1dCwgImNoYXJhY3RlckluZGV4Rm9yUG9pbnQ6
KCVmLCAlZikiLCB0aGVQb2ludC54LCB0aGVQb2ludC55KTsKIAotICAgIGlmIChzdHJpbmcpIHsK
LSAgICAgICAgX2RhdGEtPl9wYWdlLT5zZW5kQ29tcGxleFRleHRJbnB1dFRvUGx1Z2luKF9kYXRh
LT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dElkZW50aWZpZXIsIHN0cmluZyk7CisgICAgTlNXaW5k
b3cgKndpbmRvdyA9IFtzZWxmIHdpbmRvd107CiAKLSAgICAgICAgaWYgKCF1c2luZ0xlZ2FjeUNv
Y29hVGV4dElucHV0KQotICAgICAgICAgICAgX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0
U3RhdGUgPSBQbHVnaW5Db21wbGV4VGV4dElucHV0RGlzYWJsZWQ7Ci0gICAgfQorI3ByYWdtYSBj
bGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICIt
V2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgorICAgIGlmICh3aW5kb3cpCisgICAgICAgIHRoZVBv
aW50ID0gW3dpbmRvdyBjb252ZXJ0U2NyZWVuVG9CYXNlOnRoZVBvaW50XTsKKyNwcmFnbWEgY2xh
bmcgZGlhZ25vc3RpYyBwb3AKKyAgICB0aGVQb2ludCA9IFtzZWxmIGNvbnZlcnRQb2ludDp0aGVQ
b2ludCBmcm9tVmlldzpuaWxdOyAgLy8gdGhlIHBvaW50IGlzIHJlbGF0aXZlIHRvIHRoZSBtYWlu
IGZyYW1lCiAKLSAgICByZXR1cm4gZGlkSGFuZGxlRXZlbnQ7CisgICAgX2RhdGEtPl9wYWdlLT5j
aGFyYWN0ZXJJbmRleEZvclBvaW50QXN5bmMoSW50UG9pbnQodGhlUG9pbnQpLCBVbnNpZ25lZENh
bGxiYWNrOjpjcmVhdGUoW2NvbXBsZXRpb25IYW5kbGVyXShib29sIGVycm9yLCB1aW50NjRfdCBy
ZXN1bHQpIHsKKyAgICAgICAgdm9pZCAoXmNvbXBsZXRpb25IYW5kbGVyQmxvY2spKE5TVUludGVn
ZXIpID0gKHZvaWQgKF4pKE5TVUludGVnZXIpKWNvbXBsZXRpb25IYW5kbGVyLmdldCgpOworICAg
ICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIExPRyhUZXh0SW5wdXQsICIgICAgLi4uY2hh
cmFjdGVySW5kZXhGb3JQb2ludCBmYWlsZWQuIik7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFu
ZGxlckJsb2NrKDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlm
IChyZXN1bHQgPT0gbm90Rm91bmQpCisgICAgICAgICAgICByZXN1bHQgPSBOU05vdEZvdW5kOwor
ICAgICAgICBMT0coVGV4dElucHV0LCAiICAgIC0+IGNoYXJhY3RlckluZGV4Rm9yUG9pbnQgcmV0
dXJuZWQgJWx1IiwgcmVzdWx0KTsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXJCbG9jayhyZXN1
bHQpOworICAgIH0pKTsKIH0KIAotLSAoQk9PTClfdHJ5SGFuZGxlUGx1Z2luQ29tcGxleFRleHRJ
bnB1dEtleURvd246KE5TRXZlbnQgKilldmVudAorLSAoTlNUZXh0SW5wdXRDb250ZXh0ICopaW5w
dXRDb250ZXh0CiB7Ci0gICAgaWYgKCFfZGF0YS0+X3BsdWdpbkNvbXBsZXhUZXh0SW5wdXRJZGVu
dGlmaWVyIHx8IF9kYXRhLT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dFN0YXRlID09IFBsdWdpbkNv
bXBsZXhUZXh0SW5wdXREaXNhYmxlZCkKLSAgICAgICAgcmV0dXJuIE5POworICAgIGJvb2wgY29s
bGVjdGluZ0tleXByZXNzQ29tbWFuZHMgPSBfZGF0YS0+X2NvbGxlY3RlZEtleXByZXNzQ29tbWFu
ZHM7CiAKLSAgICAvLyBDaGVjayBpZiB0aGUgdGV4dCBpbnB1dCB3aW5kb3cgaGFzIGJlZW4gZGlz
bWlzc2VkIGFuZCBsZXQgdGhlIHBsdWctaW4gcHJvY2VzcyBrbm93LgotICAgIC8vIFRoaXMgaXMg
b25seSB2YWxpZCB3aXRoIHRoZSB1cGRhdGVkIENvY29hIHRleHQgaW5wdXQgc3BlYy4KLSAgICBb
c2VsZiBfZGlzYWJsZUNvbXBsZXhUZXh0SW5wdXRJZk5lY2Vzc2FyeV07CisgICAgaWYgKF9kYXRh
LT5fcGx1Z2luQ29tcGxleFRleHRJbnB1dElkZW50aWZpZXIgJiYgIWNvbGxlY3RpbmdLZXlwcmVz
c0NvbW1hbmRzKQorICAgICAgICByZXR1cm4gW1tXS1RleHRJbnB1dFdpbmRvd0NvbnRyb2xsZXIg
c2hhcmVkVGV4dElucHV0V2luZG93Q29udHJvbGxlcl0gaW5wdXRDb250ZXh0XTsKIAotICAgIC8v
IFRyeSBmZWVkaW5nIHRoZSBrZXlib2FyZCBldmVudCBkaXJlY3RseSB0byB0aGUgcGx1Zy1pbi4K
LSAgICBpZiAoX2RhdGEtPl9wbHVnaW5Db21wbGV4VGV4dElucHV0U3RhdGUgPT0gUGx1Z2luQ29t
cGxleFRleHRJbnB1dEVuYWJsZWRMZWdhY3kpCi0gICAgICAgIHJldHVybiBbc2VsZiBfaGFuZGxl
UGx1Z2luQ29tcGxleFRleHRJbnB1dEtleURvd246ZXZlbnRdOworICAgIC8vIERpc2FibGUgdGV4
dCBpbnB1dCBtYWNoaW5lcnkgd2hlbiBpbiBub24tZWRpdGFibGUgY29udGVudC4gQW4gaW52aXNp
YmxlIGlubGluZSBpbnB1dCBhcmVhIGFmZmVjdHMgcGVyZm9ybWFuY2UsIGFuZCBjYW4gcHJldmVu
dCBFeHBvc2UgZnJvbSB3b3JraW5nLgorICAgIGlmICghX2RhdGEtPl9wYWdlLT5lZGl0b3JTdGF0
ZSgpLmlzQ29udGVudEVkaXRhYmxlKQorICAgICAgICByZXR1cm4gbmlsOwogCi0gICAgcmV0dXJu
IE5POworICAgIHJldHVybiBbc3VwZXIgaW5wdXRDb250ZXh0XTsKIH0KIAotLSAodm9pZClrZXlE
b3duOihOU0V2ZW50ICopdGhlRXZlbnQKKy0gKHZvaWQpdW5tYXJrVGV4dAogewotICAgIExPRyhU
ZXh0SW5wdXQsICJrZXlEb3duOiVwICVAJXMiLCB0aGVFdmVudCwgdGhlRXZlbnQsICh0aGVFdmVu
dCA9PSBfZGF0YS0+X2tleURvd25FdmVudEJlaW5nUmVzZW50KSA/ICIgKHJlLXNlbnQpIiA6ICIi
KTsKKyAgICBMT0coVGV4dElucHV0LCAidW5tYXJrVGV4dCIpOwogCi0gICAgLy8gVGhlcmUncyBh
IGNoYW5jZSB0aGF0IHJlc3BvbmRpbmcgdG8gdGhpcyBldmVudCB3aWxsIHJ1biBhIG5lc3RlZCBl
dmVudCBsb29wLCBhbmQKLSAgICAvLyBmZXRjaGluZyBhIG5ldyBldmVudCBtaWdodCByZWxlYXNl
IHRoZSBvbGQgb25lLiBSZXRhaW5pbmcgYW5kIHRoZW4gYXV0b3JlbGVhc2luZwotICAgIC8vIHRo
ZSBjdXJyZW50IGV2ZW50IHByZXZlbnRzIHRoYXQgZnJvbSBjYXVzaW5nIGEgcHJvYmxlbSBpbnNp
ZGUgV2ViS2l0IG9yIEFwcEtpdCBjb2RlLgotICAgIFtbdGhlRXZlbnQgcmV0YWluXSBhdXRvcmVs
ZWFzZV07CisgICAgX2RhdGEtPl9wYWdlLT5jb25maXJtQ29tcG9zaXRpb25Bc3luYygpOworfQog
Ci0gICAgaWYgKFtzZWxmIF90cnlIYW5kbGVQbHVnaW5Db21wbGV4VGV4dElucHV0S2V5RG93bjp0
aGVFdmVudF0pIHsKLSAgICAgICAgTE9HKFRleHRJbnB1dCwgIi4uLmhhbmRsZWQgYnkgcGx1Zy1p
biIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorLSAodm9pZClzZXRNYXJrZWRUZXh0OihpZClz
dHJpbmcgc2VsZWN0ZWRSYW5nZTooTlNSYW5nZSlzZWxlY3RlZFJhbmdlIHJlcGxhY2VtZW50UmFu
Z2U6KE5TUmFuZ2UpcmVwbGFjZW1lbnRSYW5nZQoreworICAgIEJPT0wgaXNBdHRyaWJ1dGVkU3Ry
aW5nID0gW3N0cmluZyBpc0tpbmRPZkNsYXNzOltOU0F0dHJpYnV0ZWRTdHJpbmcgY2xhc3NdXTsK
KyAgICBBU1NFUlQoaXNBdHRyaWJ1dGVkU3RyaW5nIHx8IFtzdHJpbmcgaXNLaW5kT2ZDbGFzczpb
TlNTdHJpbmcgY2xhc3NdXSk7CisKKyAgICBMT0coVGV4dElucHV0LCAic2V0TWFya2VkVGV4dDpc
IiVAXCIgc2VsZWN0ZWRSYW5nZTooJXUsICV1KSByZXBsYWNlbWVudFJhbmdlOigldSwgJXUpIiwg
aXNBdHRyaWJ1dGVkU3RyaW5nID8gW3N0cmluZyBzdHJpbmddIDogc3RyaW5nLCBzZWxlY3RlZFJh
bmdlLmxvY2F0aW9uLCBzZWxlY3RlZFJhbmdlLmxlbmd0aCwgcmVwbGFjZW1lbnRSYW5nZS5sb2Nh
dGlvbiwgcmVwbGFjZW1lbnRSYW5nZS5sZW5ndGgpOworCisgICAgVmVjdG9yPENvbXBvc2l0aW9u
VW5kZXJsaW5lPiB1bmRlcmxpbmVzOworICAgIE5TU3RyaW5nICp0ZXh0OworCisgICAgaWYgKGlz
QXR0cmlidXRlZFN0cmluZykgeworICAgICAgICAvLyBGSVhNRTogV2UgaWdub3JlIG1vc3QgYXR0
cmlidXRlcyBmcm9tIHRoZSBzdHJpbmcsIHNvIGFuIGlucHV0IG1ldGhvZCBjYW5ub3Qgc3BlY2lm
eSBlLmcuIGEgZm9udCBvciBhIGdseXBoIHZhcmlhdGlvbi4KKyAgICAgICAgdGV4dCA9IFtzdHJp
bmcgc3RyaW5nXTsKKyAgICAgICAgZXh0cmFjdFVuZGVybGluZXMoc3RyaW5nLCB1bmRlcmxpbmVz
KTsKKyAgICB9IGVsc2UKKyAgICAgICAgdGV4dCA9IHN0cmluZzsKKworICAgIGlmIChfZGF0YS0+
X2luU2VjdXJlSW5wdXRTdGF0ZSkgeworICAgICAgICAvLyBJbiBwYXNzd29yZCBmaWVsZHMsIHdl
IG9ubHkgYWxsb3cgQVNDSUkgZGVhZCBrZXlzLCBhbmQgZG9uJ3QgYWxsb3cgaW5saW5lIGlucHV0
LCBtYXRjaGluZyBOU1NlY3VyZVRleHRJbnB1dEZpZWxkLgorICAgICAgICAvLyBBbGxvd2luZyBB
U0NJSSBkZWFkIGtleXMgaXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBmdWxsIFJvbWFuIGlucHV0IHdo
ZW4gdXNpbmcgYSBWaWV0bmFtZXNlIGtleWJvYXJkLgorICAgICAgICBBU1NFUlQoIV9kYXRhLT5f
cGFnZS0+ZWRpdG9yU3RhdGUoKS5oYXNDb21wb3NpdGlvbik7CisgICAgICAgIFtzZWxmIF9ub3Rp
ZnlJbnB1dENvbnRleHRBYm91dERpc2NhcmRlZENvbXBvc2l0aW9uXTsKKyAgICAgICAgLy8gRklY
TUU6IFdlIHNob3VsZCBzdG9yZSB0aGUgY29tbWFuZCB0byBoYW5kbGUgaXQgYWZ0ZXIgRE9NIGV2
ZW50IHByb2Nlc3NpbmcsIGFzIGl0J3MgcmVndWxhciBrZXlib2FyZCBpbnB1dCBub3csIG5vdCBh
IGNvbXBvc2l0aW9uLgorICAgICAgICBpZiAoW3RleHQgbGVuZ3RoXSA9PSAxICYmIGlzQVNDSUko
W3RleHQgY2hhcmFjdGVyQXRJbmRleDowXSkpCisgICAgICAgICAgICBfZGF0YS0+X3BhZ2UtPmlu
c2VydFRleHRBc3luYyh0ZXh0LCByZXBsYWNlbWVudFJhbmdlKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgTlNCZWVwKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfZGF0YS0+
X3BhZ2UtPnNldENvbXBvc2l0aW9uQXN5bmModGV4dCwgdW5kZXJsaW5lcywgc2VsZWN0ZWRSYW5n
ZSwgcmVwbGFjZW1lbnRSYW5nZSk7Cit9CisKKy8vIFN5bmNocm9ub3VzIE5TVGV4dElucHV0Q2xp
ZW50IGlzIHN0aWxsIGltcGxlbWVudGVkIHRvIGNhdGNoIHNwdXJpb3VzIHN5bmMgY2FsbHMuIFJl
bW92ZSB3aGVuIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKworLSAoTlNSYW5nZSlzZWxlY3Rl
ZFJhbmdlIE5PX1JFVFVSTl9EVUVfVE9fQVNTRVJUCit7CisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgcmV0dXJuIE5TTWFrZVJhbmdlKE5TTm90Rm91bmQsIDApOworfQorCistIChCT09M
KWhhc01hcmtlZFRleHQgTk9fUkVUVVJOX0RVRV9UT19BU1NFUlQKK3sKKyAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICByZXR1cm4gTk87Cit9CisKKy0gKE5TUmFuZ2UpbWFya2VkUmFuZ2Ug
Tk9fUkVUVVJOX0RVRV9UT19BU1NFUlQKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICByZXR1cm4gTlNNYWtlUmFuZ2UoTlNOb3RGb3VuZCwgMCk7Cit9CisKKy0gKE5TQXR0cmlidXRl
ZFN0cmluZyAqKWF0dHJpYnV0ZWRTdWJzdHJpbmdGb3JQcm9wb3NlZFJhbmdlOihOU1JhbmdlKW5z
UmFuZ2UgYWN0dWFsUmFuZ2U6KE5TUmFuZ2VQb2ludGVyKWFjdHVhbFJhbmdlIE5PX1JFVFVSTl9E
VUVfVE9fQVNTRVJUCit7CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIG5p
bDsKK30KKworLSAoTlNVSW50ZWdlciljaGFyYWN0ZXJJbmRleEZvclBvaW50OihOU1BvaW50KXRo
ZVBvaW50IE5PX1JFVFVSTl9EVUVfVE9fQVNTRVJUCit7CisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy0gKE5TUmVjdClmaXJzdFJlY3RGb3JDaGFyYWN0ZXJS
YW5nZTooTlNSYW5nZSl0aGVSYW5nZSBhY3R1YWxSYW5nZTooTlNSYW5nZVBvaW50ZXIpYWN0dWFs
UmFuZ2UgTk9fUkVUVVJOX0RVRV9UT19BU1NFUlQKK3sgCisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgcmV0dXJuIE5TTWFrZVJlY3QoMCwgMCwgMCwgMCk7Cit9CisKKy0gKEJPT0wpcGVy
Zm9ybUtleUVxdWl2YWxlbnQ6KE5TRXZlbnQgKilldmVudAoreworICAgIC8vIFRoZXJlJ3MgYSBj
aGFuY2UgdGhhdCByZXNwb25kaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBydW4gYSBuZXN0ZWQgZXZl
bnQgbG9vcCwgYW5kCisgICAgLy8gZmV0Y2hpbmcgYSBuZXcgZXZlbnQgbWlnaHQgcmVsZWFzZSB0
aGUgb2xkIG9uZS4gUmV0YWluaW5nIGFuZCB0aGVuIGF1dG9yZWxlYXNpbmcKKyAgICAvLyB0aGUg
Y3VycmVudCBldmVudCBwcmV2ZW50cyB0aGF0IGZyb20gY2F1c2luZyBhIHByb2JsZW0gaW5zaWRl
IFdlYktpdCBvciBBcHBLaXQgY29kZS4KKyAgICBbW2V2ZW50IHJldGFpbl0gYXV0b3JlbGVhc2Vd
OworCisgICAgLy8gV2UgZ2V0IEVzYyBrZXkgaGVyZSBhZnRlciBwcm9jZXNzaW5nIGVpdGhlciBF
c2Mgb3IgQ21kK3BlcmlvZC4gVGhlIGZvcm1lciBzdGFydHMgYXMgYSBrZXlEb3duLCBhbmQgdGhl
IGxhdHRlciBzdGFydHMgYXMgYSBrZXkgZXF1aXZhbGVudCwKKyAgICAvLyBidXQgYm90aCBnZXQg
dHJhbnNmb3JtZWQgdG8gYSBjYW5jZWxPcGVyYXRpb246IGNvbW1hbmQsIGV4ZWN1dGluZyB3aGlj
aCBwYXNzZXMgYW4gRXNjIGtleSBldmVudCB0byAtcGVyZm9ybUtleUVxdWl2YWxlbnQ6LgorICAg
IC8vIERvbid0IGludGVycHJldCB0aGlzIGV2ZW50IGFnYWluLCBhdm9pZGluZyByZS1lbnRyYW5j
eSBhbmQgaW5maW5pdGUgbG9vcHMuCisgICAgaWYgKFtbZXZlbnQgY2hhcmFjdGVyc0lnbm9yaW5n
TW9kaWZpZXJzXSBpc0VxdWFsVG9TdHJpbmc6QCJcZSJdICYmICEoW2V2ZW50IG1vZGlmaWVyRmxh
Z3NdICYgTlNEZXZpY2VJbmRlcGVuZGVudE1vZGlmaWVyRmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0
dXJuIFtzdXBlciBwZXJmb3JtS2V5RXF1aXZhbGVudDpldmVudF07CisKKyAgICAvLyBJZiB3ZSBh
cmUgYWxyZWFkeSByZS1zZW5kaW5nIHRoZSBldmVudCwgdGhlbiBXZWJDb3JlIGhhcyBhbHJlYWR5
IHNlZW4gaXQsIG5vIG5lZWQgZm9yIGN1c3RvbSBwcm9jZXNzaW5nLgorICAgIEJPT0wgZXZlbnRX
YXNTZW50VG9XZWJDb3JlID0gKF9kYXRhLT5fa2V5RG93bkV2ZW50QmVpbmdSZXNlbnQgPT0gZXZl
bnQpOworICAgIGlmIChldmVudFdhc1NlbnRUb1dlYkNvcmUpCisgICAgICAgIHJldHVybiBbc3Vw
ZXIgcGVyZm9ybUtleUVxdWl2YWxlbnQ6ZXZlbnRdOworCisgICAgQVNTRVJUKGV2ZW50ID09IFtO
U0FwcCBjdXJyZW50RXZlbnRdKTsKKworICAgIFtzZWxmIF9kaXNhYmxlQ29tcGxleFRleHRJbnB1
dElmTmVjZXNzYXJ5XTsKKworICAgIC8vIFBhc3Mga2V5IGNvbWJvcyB0aHJvdWdoIFdlYkNvcmUg
aWYgdGhlcmUgaXMgYSBrZXkgYmluZGluZyBhdmFpbGFibGUgZm9yCisgICAgLy8gdGhpcyBldmVu
dC4gVGhpcyBsZXRzIHdlYiBwYWdlcyBoYXZlIGEgY3JhY2sgYXQgaW50ZXJjZXB0aW5nIGtleS1t
b2RpZmllZCBrZXlwcmVzc2VzLgorICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhlIGZpcnN0UmVzcG9u
ZGVyIGNoZWNrIG5lZWRlZD8KKyAgICBpZiAoc2VsZiA9PSBbW3NlbGYgd2luZG93XSBmaXJzdFJl
c3BvbmRlcl0pIHsKKyAgICAgICAgW3NlbGYgX2ludGVycHJldEtleUV2ZW50OmV2ZW50IGNvbXBs
ZXRpb25IYW5kbGVyOl4oQk9PTCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29uc3QgVmVjdG9yPEtl
eXByZXNzQ29tbWFuZD4mIGNvbW1hbmRzKSB7CisgICAgICAgICAgICBfZGF0YS0+X3BhZ2UtPmhh
bmRsZUtleWJvYXJkRXZlbnQoTmF0aXZlV2ViS2V5Ym9hcmRFdmVudChldmVudCwgaGFuZGxlZEJ5
SW5wdXRNZXRob2QsIGNvbW1hbmRzKSk7CisgICAgICAgIH1dOworICAgICAgICByZXR1cm4gWUVT
OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gW3N1cGVyIHBlcmZvcm1LZXlFcXVpdmFsZW50OmV2
ZW50XTsKK30KKworLSAodm9pZClrZXlVcDooTlNFdmVudCAqKXRoZUV2ZW50Cit7CisgICAgTE9H
KFRleHRJbnB1dCwgImtleVVwOiVwICVAIiwgdGhlRXZlbnQsIHRoZUV2ZW50KTsKKworICAgIFtz
ZWxmIF9pbnRlcnByZXRLZXlFdmVudDp0aGVFdmVudCBjb21wbGV0aW9uSGFuZGxlcjpeKEJPT0wg
aGFuZGxlZEJ5SW5wdXRNZXRob2QsIGNvbnN0IFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+JiBjb21t
YW5kcykgeworICAgICAgICBBU1NFUlQoIWhhbmRsZWRCeUlucHV0TWV0aG9kIHx8IGNvbW1hbmRz
LmlzRW1wdHkoKSk7CisgICAgICAgIF9kYXRhLT5fcGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChO
YXRpdmVXZWJLZXlib2FyZEV2ZW50KHRoZUV2ZW50LCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29t
bWFuZHMpKTsKKyAgICB9XTsKK30KKworLSAodm9pZClrZXlEb3duOihOU0V2ZW50ICopdGhlRXZl
bnQKK3sKKyAgICBMT0coVGV4dElucHV0LCAia2V5RG93bjolcCAlQCVzIiwgdGhlRXZlbnQsIHRo
ZUV2ZW50LCAodGhlRXZlbnQgPT0gX2RhdGEtPl9rZXlEb3duRXZlbnRCZWluZ1Jlc2VudCkgPyAi
IChyZS1zZW50KSIgOiAiIik7CisKKyAgICBpZiAoW3NlbGYgX3RyeUhhbmRsZVBsdWdpbkNvbXBs
ZXhUZXh0SW5wdXRLZXlEb3duOnRoZUV2ZW50XSkgeworICAgICAgICBMT0coVGV4dElucHV0LCAi
Li4uaGFuZGxlZCBieSBwbHVnLWluIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICAv
LyBXZSBjb3VsZCBiZSByZWNlaXZpbmcgYSBrZXkgZG93biBmcm9tIEFwcEtpdCBpZiB3ZSBoYXZl
IHJlLXNlbnQgYW4gZXZlbnQKICAgICAvLyB0aGF0IG1hcHMgdG8gYW4gYWN0aW9uIHRoYXQgaXMg
Y3VycmVudGx5IHVuYXZhaWxhYmxlIChmb3IgZXhhbXBsZSBhIGNvcHkgd2hlbgpAQCAtMTQxMiwz
NCArMTcxOSw2MyBAQCAtICh2b2lkKWtleURvd246KE5TRXZlbnQgKil0aGVFdmVudAogICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4gY29tbWFuZHM7
Ci0gICAgQk9PTCBoYW5kbGVkQnlJbnB1dE1ldGhvZCA9IFtzZWxmIF9pbnRlcnByZXRLZXlFdmVu
dDp0aGVFdmVudCBzYXZpbmdDb21tYW5kc1RvOmNvbW1hbmRzXTsKLSAgICBpZiAoIWNvbW1hbmRz
LmlzRW1wdHkoKSkgewotICAgICAgICAvLyBBbiBpbnB1dCBtZXRob2QgbWF5IG1ha2Ugc2V2ZXJh
bCBhY3Rpb25zIHBlciBrZXlwcmVzcy4gRm9yIGV4YW1wbGUsIHByZXNzaW5nIFJldHVybiB3aXRo
IEtvcmVhbiBJTSBib3RoIGNvbmZpcm1zIGl0IGFuZCBzZW5kcyBhIG5ld2xpbmUuCi0gICAgICAg
IC8vIElNLWxpa2UgYWN0aW9ucyBhcmUgaGFuZGxlZCBpbW1lZGlhdGVseSAoc28gdGhlIHJldHVy
biB2YWx1ZSBmcm9tIFVJIHByb2Nlc3MgaXMgdHJ1ZSksIGJ1dCB0aGVyZSBhcmUgc2F2ZWQgY29t
bWFuZHMgdGhhdAotICAgICAgICAvLyBzaG91bGQgYmUgaGFuZGxlZCBsaWtlIG5vcm1hbCB0ZXh0
IGlucHV0IGFmdGVyIERPTSBldmVudCBkaXNwYXRjaC4KLSAgICAgICAgaGFuZGxlZEJ5SW5wdXRN
ZXRob2QgPSBOTzsKLSAgICB9Ci0KLSAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJkRXZl
bnQoTmF0aXZlV2ViS2V5Ym9hcmRFdmVudCh0aGVFdmVudCwgaGFuZGxlZEJ5SW5wdXRNZXRob2Qs
IGNvbW1hbmRzKSk7CisgICAgW3NlbGYgX2ludGVycHJldEtleUV2ZW50OnRoZUV2ZW50IGNvbXBs
ZXRpb25IYW5kbGVyOl4oQk9PTCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29uc3QgVmVjdG9yPEtl
eXByZXNzQ29tbWFuZD4mIGNvbW1hbmRzKSB7CisgICAgICAgIEFTU0VSVCghaGFuZGxlZEJ5SW5w
dXRNZXRob2QgfHwgY29tbWFuZHMuaXNFbXB0eSgpKTsKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5o
YW5kbGVLZXlib2FyZEV2ZW50KE5hdGl2ZVdlYktleWJvYXJkRXZlbnQodGhlRXZlbnQsIGhhbmRs
ZWRCeUlucHV0TWV0aG9kLCBjb21tYW5kcykpOworICAgIH1dOwogfQogCiAtICh2b2lkKWZsYWdz
Q2hhbmdlZDooTlNFdmVudCAqKXRoZUV2ZW50CiB7CiAgICAgTE9HKFRleHRJbnB1dCwgImZsYWdz
Q2hhbmdlZDolcCAlQCIsIHRoZUV2ZW50LCB0aGVFdmVudCk7CiAKLSAgICAvLyBUaGVyZSdzIGEg
Y2hhbmNlIHRoYXQgcmVzcG9uZGluZyB0byB0aGlzIGV2ZW50IHdpbGwgcnVuIGEgbmVzdGVkIGV2
ZW50IGxvb3AsIGFuZAotICAgIC8vIGZldGNoaW5nIGEgbmV3IGV2ZW50IG1pZ2h0IHJlbGVhc2Ug
dGhlIG9sZCBvbmUuIFJldGFpbmluZyBhbmQgdGhlbiBhdXRvcmVsZWFzaW5nCi0gICAgLy8gdGhl
IGN1cnJlbnQgZXZlbnQgcHJldmVudHMgdGhhdCBmcm9tIGNhdXNpbmcgYSBwcm9ibGVtIGluc2lk
ZSBXZWJLaXQgb3IgQXBwS2l0IGNvZGUuCi0gICAgW1t0aGVFdmVudCByZXRhaW5dIGF1dG9yZWxl
YXNlXTsKLQogICAgIHVuc2lnbmVkIHNob3J0IGtleUNvZGUgPSBbdGhlRXZlbnQga2V5Q29kZV07
CiAKICAgICAvLyBEb24ndCBtYWtlIGFuIGV2ZW50IGZyb20gdGhlIG51bSBsb2NrIGFuZCBmdW5j
dGlvbiBrZXlzCiAgICAgaWYgKCFrZXlDb2RlIHx8IGtleUNvZGUgPT0gMTAgfHwga2V5Q29kZSA9
PSA2MykKICAgICAgICAgcmV0dXJuOwogCi0gICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVLZXlib2Fy
ZEV2ZW50KE5hdGl2ZVdlYktleWJvYXJkRXZlbnQodGhlRXZlbnQsIGZhbHNlLCBWZWN0b3I8S2V5
cHJlc3NDb21tYW5kPigpKSk7CisgICAgW3NlbGYgX2ludGVycHJldEtleUV2ZW50OnRoZUV2ZW50
IGNvbXBsZXRpb25IYW5kbGVyOl4oQk9PTCBoYW5kbGVkQnlJbnB1dE1ldGhvZCwgY29uc3QgVmVj
dG9yPEtleXByZXNzQ29tbWFuZD4mIGNvbW1hbmRzKSB7CisgICAgICAgIF9kYXRhLT5fcGFnZS0+
aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRpdmVXZWJLZXlib2FyZEV2ZW50KHRoZUV2ZW50LCBoYW5k
bGVkQnlJbnB1dE1ldGhvZCwgY29tbWFuZHMpKTsKKyAgICB9XTsKK30KKworI2Vsc2UgLy8gVVNF
KEFTWU5DX05TVEVYVElOUFVUQ0xJRU5UKQorCistIChCT09MKV9pbnRlcnByZXRLZXlFdmVudDoo
TlNFdmVudCAqKWV2ZW50IHNhdmluZ0NvbW1hbmRzVG86KFZlY3RvcjxXZWJDb3JlOjpLZXlwcmVz
c0NvbW1hbmQ+Jiljb21tYW5kcworeworICAgIEFTU0VSVCghX2RhdGEtPl9pbnRlcnByZXRLZXlF
dmVudHNQYXJhbWV0ZXJzKTsKKyAgICBBU1NFUlQoY29tbWFuZHMuaXNFbXB0eSgpKTsKKworICAg
IGlmIChbZXZlbnQgdHlwZV0gPT0gTlNGbGFnc0NoYW5nZWQpCisgICAgICAgIHJldHVybiBOTzsK
KworICAgIFdLVmlld0ludGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAg
ICBwYXJhbWV0ZXJzLmV2ZW50SW50ZXJwcmV0YXRpb25IYWRTaWRlRWZmZWN0cyA9IGZhbHNlOwor
ICAgIHBhcmFtZXRlcnMuZXhlY3V0aW5nU2F2ZWRLZXlwcmVzc0NvbW1hbmRzID0gZmFsc2U7Cisg
ICAgLy8gV2UgYXNzdW1lIHRoYXQgYW4gaW5wdXQgbWV0aG9kIGhhcyBjb25zdW1lZCB0aGUgZXZl
bnQsIGFuZCBvbmx5IGNoYW5nZSB0aGlzIGFzc3VtcHRpb24gaWYgb25lIG9mIHRoZSBOU1RleHRJ
bnB1dCBtZXRob2RzIGlzIGNhbGxlZC4KKyAgICAvLyBXZSBhc3N1bWUgdGhlIElNIHdpbGwgKm5v
dCogY29uc3VtZSBob3RrZXkgc2VxdWVuY2VzLgorICAgIHBhcmFtZXRlcnMuY29uc3VtZWRCeUlN
ID0gIShbZXZlbnQgbW9kaWZpZXJGbGFnc10gJiBOU0NvbW1hbmRLZXlNYXNrKTsKKyAgICBwYXJh
bWV0ZXJzLmNvbW1hbmRzID0gJmNvbW1hbmRzOworICAgIF9kYXRhLT5faW50ZXJwcmV0S2V5RXZl
bnRzUGFyYW1ldGVycyA9ICZwYXJhbWV0ZXJzOworCisgICAgTE9HKFRleHRJbnB1dCwgIi0+IGlu
dGVycHJldEtleUV2ZW50czolcCAlQCIsIGV2ZW50LCBldmVudCk7CisgICAgW3NlbGYgaW50ZXJw
cmV0S2V5RXZlbnRzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpldmVudF1dOworCisgICAgX2Rh
dGEtPl9pbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzID0gbnVsbHB0cjsKKworICAgIC8vIEFu
IGlucHV0IG1ldGhvZCBtYXkgY29uc3VtZSBhbiBldmVudCBhbmQgbm90IHRlbGwgdXMgKGUuZy4g
d2hlbiBkaXNwbGF5aW5nIGEgY2FuZGlkYXRlIHdpbmRvdyksCisgICAgLy8gaW4gd2hpY2ggY2Fz
ZSB3ZSBzaG91bGQgbm90IGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIERPTS4KKyAgICBpZiAocGFy
YW1ldGVycy5jb25zdW1lZEJ5SU0pIHsKKyAgICAgICAgQVNTRVJUKGNvbW1hbmRzLmlzRW1wdHko
KSk7CisgICAgICAgIExPRyhUZXh0SW5wdXQsICIuLi5ldmVudCAlcCB3YXMgY29uc3VtZWQgYnkg
YW4gaW5wdXQgbWV0aG9kIiwgZXZlbnQpOworICAgICAgICByZXR1cm4gWUVTOworICAgIH0KKwor
ICAgIExPRyhUZXh0SW5wdXQsICIuLi5pbnRlcnByZXRLZXlFdmVudHMgZm9yIGV2ZW50ICVwIGRv
bmUsIHJldHVybnMgJWQiLCBldmVudCwgcGFyYW1ldGVycy5ldmVudEludGVycHJldGF0aW9uSGFk
U2lkZUVmZmVjdHMpOworCisgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGV4ZWN1dGVkIGFsbCBv
ciBzb21lIG9mIHRoZSBjb21tYW5kcywgdGhlIGV2ZW50IGlzICJoYW5kbGVkIi4gTm90ZSB0aGF0
IHRoZXJlIGFyZSBhZGRpdGlvbmFsIGNoZWNrcyBvbiB3ZWIgcHJvY2VzcyBzaWRlLgorICAgIHJl
dHVybiBwYXJhbWV0ZXJzLmV2ZW50SW50ZXJwcmV0YXRpb25IYWRTaWRlRWZmZWN0czsKIH0KIAog
LSAodm9pZClfZXhlY3V0ZVNhdmVkS2V5cHJlc3NDb21tYW5kcwpAQCAtMTQ2MywxOCArMTc5OSw4
OSBAQCAtICh2b2lkKV9leGVjdXRlU2F2ZWRLZXlwcmVzc0NvbW1hbmRzCiAgICAgTE9HKFRleHRJ
bnB1dCwgIi4uLmRvbmUgZXhlY3V0aW5nIHNhdmVkIGtleXByZXNzIGNvbW1hbmRzLiIpOwogfQog
Ci0tIChOU1RleHRJbnB1dENvbnRleHQgKilpbnB1dENvbnRleHQKKy0gKHZvaWQpZG9Db21tYW5k
QnlTZWxlY3RvcjooU0VMKXNlbGVjdG9yCiB7CisgICAgTE9HKFRleHRJbnB1dCwgImRvQ29tbWFu
ZEJ5U2VsZWN0b3I6XCIlc1wiIiwgc2VsX2dldE5hbWUoc2VsZWN0b3IpKTsKKwogICAgIFdLVmll
d0ludGVycHJldEtleUV2ZW50c1BhcmFtZXRlcnMqIHBhcmFtZXRlcnMgPSBfZGF0YS0+X2ludGVy
cHJldEtleUV2ZW50c1BhcmFtZXRlcnM7CisgICAgaWYgKHBhcmFtZXRlcnMpCisgICAgICAgIHBh
cmFtZXRlcnMtPmNvbnN1bWVkQnlJTSA9IGZhbHNlOwogCi0gICAgaWYgKF9kYXRhLT5fcGx1Z2lu
Q29tcGxleFRleHRJbnB1dElkZW50aWZpZXIgJiYgIXBhcmFtZXRlcnMpCi0gICAgICAgIHJldHVy
biBbW1dLVGV4dElucHV0V2luZG93Q29udHJvbGxlciBzaGFyZWRUZXh0SW5wdXRXaW5kb3dDb250
cm9sbGVyXSBpbnB1dENvbnRleHRdOworICAgIC8vIEFzIGluIGluc2VydFRleHQ6cmVwbGFjZW1l
bnRSYW5nZTosIHdlIGFzc3VtZSB0aGF0IHRoZSBjYWxsIGNvbWVzIGZyb20gYW4gaW5wdXQgbWV0
aG9kIGlmIHRoZXJlIGlzIG1hcmtlZCB0ZXh0LgorICAgIGJvb2wgaXNGcm9tSW5wdXRNZXRob2Qg
PSBfZGF0YS0+X3BhZ2UtPmVkaXRvclN0YXRlKCkuaGFzQ29tcG9zaXRpb247CiAKLSAgICAvLyBE
aXNhYmxlIHRleHQgaW5wdXQgbWFjaGluZXJ5IHdoZW4gaW4gbm9uLWVkaXRhYmxlIGNvbnRlbnQu
IEFuIGludmlzaWJsZSBpbmxpbmUgaW5wdXQgYXJlYSBhZmZlY3RzIHBlcmZvcm1hbmNlLCBhbmQg
Y2FuIHByZXZlbnQgRXhwb3NlIGZyb20gd29ya2luZy4KLSAgICBpZiAoIV9kYXRhLT5fcGFnZS0+
ZWRpdG9yU3RhdGUoKS5pc0NvbnRlbnRFZGl0YWJsZSkKLSAgICAgICAgcmV0dXJuIG5pbDsKKyAg
ICBpZiAocGFyYW1ldGVycyAmJiAhaXNGcm9tSW5wdXRNZXRob2QpIHsKKyAgICAgICAgS2V5cHJl
c3NDb21tYW5kIGNvbW1hbmQoTlNTdHJpbmdGcm9tU2VsZWN0b3Ioc2VsZWN0b3IpKTsKKyAgICAg
ICAgcGFyYW1ldGVycy0+Y29tbWFuZHMtPmFwcGVuZChjb21tYW5kKTsKKyAgICAgICAgTE9HKFRl
eHRJbnB1dCwgIi4uLnN0b3JlZCIpOworICAgICAgICBfZGF0YS0+X3BhZ2UtPnJlZ2lzdGVyS2V5
cHJlc3NDb21tYW5kTmFtZShjb21tYW5kLmNvbW1hbmROYW1lKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICAvLyBGSVhNRTogU2VuZCB0aGUgY29tbWFuZCB0byBFZGl0b3Igc3luY2hyb25vdXNseSBh
bmQgb25seSBzZW5kIGl0IGFsb25nIHRoZQorICAgICAgICAvLyByZXNwb25kZXIgY2hhaW4gaWYg
aXQncyBhIHNlbGVjdG9yIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbiBlZGl0aW5nIGNv
bW1hbmQuCisgICAgICAgIFtzdXBlciBkb0NvbW1hbmRCeVNlbGVjdG9yOnNlbGVjdG9yXTsKKyAg
ICB9Cit9CiAKLSAgICByZXR1cm4gW3N1cGVyIGlucHV0Q29udGV4dF07CistICh2b2lkKWluc2Vy
dFRleHQ6KGlkKXN0cmluZworeworICAgIC8vIFVubGlrZSBhbiBOU1RleHRJbnB1dENsaWVudCB2
YXJpYW50IHdpdGggcmVwbGFjZW1lbnRSYW5nZSwgdGhpcyBOU1Jlc3BvbmRlciBtZXRob2QgaXMg
Y2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gaW5wdXQgY29udGV4dCwKKyAgICAvLyBzbyB0ZXh0IGlu
cHV0IHByb2Nlc3NpbmcgaXNuJ3QgcGVyZm9ybWVkLiBXZSBhcmUgbm90IGdvaW5nIHRvIGFjdHVh
bGx5IGluc2VydCBhbnkgdGV4dCBpbiB0aGF0IGNhc2UsIGJ1dCBzYXZpbmcgYW4gaW5zZXJ0VGV4
dAorICAgIC8vIGNvbW1hbmQgZW5zdXJlcyB0aGF0IGEga2V5cHJlc3MgZXZlbnQgaXMgZGlzcGF0
Y2hlZCBhcyBhcHByb3ByaWF0ZS4KKyAgICBbc2VsZiBpbnNlcnRUZXh0OnN0cmluZyByZXBsYWNl
bWVudFJhbmdlOk5TTWFrZVJhbmdlKE5TTm90Rm91bmQsIDApXTsKK30KKworLSAodm9pZClpbnNl
cnRUZXh0OihpZClzdHJpbmcgcmVwbGFjZW1lbnRSYW5nZTooTlNSYW5nZSlyZXBsYWNlbWVudFJh
bmdlCit7CisgICAgQk9PTCBpc0F0dHJpYnV0ZWRTdHJpbmcgPSBbc3RyaW5nIGlzS2luZE9mQ2xh
c3M6W05TQXR0cmlidXRlZFN0cmluZyBjbGFzc11dOworICAgIEFTU0VSVChpc0F0dHJpYnV0ZWRT
dHJpbmcgfHwgW3N0cmluZyBpc0tpbmRPZkNsYXNzOltOU1N0cmluZyBjbGFzc11dKTsKKworICAg
IGlmIChyZXBsYWNlbWVudFJhbmdlLmxvY2F0aW9uICE9IE5TTm90Rm91bmQpCisgICAgICAgIExP
RyhUZXh0SW5wdXQsICJpbnNlcnRUZXh0OlwiJUBcIiByZXBsYWNlbWVudFJhbmdlOigldSwgJXUp
IiwgaXNBdHRyaWJ1dGVkU3RyaW5nID8gW3N0cmluZyBzdHJpbmddIDogc3RyaW5nLCByZXBsYWNl
bWVudFJhbmdlLmxvY2F0aW9uLCByZXBsYWNlbWVudFJhbmdlLmxlbmd0aCk7CisgICAgZWxzZQor
ICAgICAgICBMT0coVGV4dElucHV0LCAiaW5zZXJ0VGV4dDpcIiVAXCIiLCBpc0F0dHJpYnV0ZWRT
dHJpbmcgPyBbc3RyaW5nIHN0cmluZ10gOiBzdHJpbmcpOworICAgIFdLVmlld0ludGVycHJldEtl
eUV2ZW50c1BhcmFtZXRlcnMqIHBhcmFtZXRlcnMgPSBfZGF0YS0+X2ludGVycHJldEtleUV2ZW50
c1BhcmFtZXRlcnM7CisgICAgaWYgKHBhcmFtZXRlcnMpCisgICAgICAgIHBhcmFtZXRlcnMtPmNv
bnN1bWVkQnlJTSA9IGZhbHNlOworCisgICAgTlNTdHJpbmcgKnRleHQ7CisgICAgYm9vbCBpc0Zy
b21JbnB1dE1ldGhvZCA9IF9kYXRhLT5fcGFnZS0+ZWRpdG9yU3RhdGUoKS5oYXNDb21wb3NpdGlv
bjsKKworICAgIFZlY3RvcjxUZXh0QWx0ZXJuYXRpdmVXaXRoUmFuZ2U+IGRpY3RhdGlvbkFsdGVy
bmF0aXZlczsKKworICAgIGlmIChpc0F0dHJpYnV0ZWRTdHJpbmcpIHsKKyNpZiBVU0UoRElDVEFU
SU9OX0FMVEVSTkFUSVZFUykKKyAgICAgICAgY29sbGVjdERpY3RhdGlvblRleHRBbHRlcm5hdGl2
ZXMoc3RyaW5nLCBkaWN0YXRpb25BbHRlcm5hdGl2ZXMpOworI2VuZGlmCisgICAgICAgIC8vIEZJ
WE1FOiBXZSBpZ25vcmUgbW9zdCBhdHRyaWJ1dGVzIGZyb20gdGhlIHN0cmluZywgc28gZm9yIGV4
YW1wbGUgaW5zZXJ0aW5nIGZyb20gQ2hhcmFjdGVyIFBhbGV0dGUgbG9zZXMgZm9udCBhbmQgZ2x5
cGggdmFyaWF0aW9uIGRhdGEuCisgICAgICAgIHRleHQgPSBbc3RyaW5nIHN0cmluZ107CisgICAg
fSBlbHNlCisgICAgICAgIHRleHQgPSBzdHJpbmc7CisKKyAgICAvLyBpbnNlcnRUZXh0IGNhbiBi
ZSBjYWxsZWQgZm9yIHNldmVyYWwgcmVhc29uczoKKyAgICAvLyAtIElmIGl0J3MgZnJvbSBub3Jt
YWwga2V5IGV2ZW50IHByb2Nlc3NpbmcgKGluY2x1ZGluZyBrZXkgYmluZGluZ3MpLCB3ZSBtYXkg
bmVlZCB0byBzYXZlIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSBpdCBsYXRlci4KKyAgICAvLyAtIElm
IGl0J3MgZnJvbSBhbiBpbnB1dCBtZXRob2QsIHRoZW4gd2Ugc2hvdWxkIGdvIGFoZWFkIGFuZCBp
bnNlcnQgdGhlIHRleHQgbm93LiBXZSBhc3N1bWUgaXQncyBmcm9tIHRoZSBpbnB1dCBtZXRob2Qg
aWYgd2UgaGF2ZSBtYXJrZWQgdGV4dC4KKyAgICAvLyBGSVhNRTogSW4gdGhlb3J5LCB0aGlzIGNv
dWxkIGJlIHdyb25nIGZvciBzb21lIGlucHV0IG1ldGhvZHMsIHNvIHdlIHNob3VsZCB0cnkgdG8g
ZmluZCBhbm90aGVyIHdheSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhbGwgaXMgZnJvbSB0aGUgaW5w
dXQgbWV0aG9kLgorICAgIC8vIC0gSWYgaXQncyBzZW50IG91dHNpZGUgb2Yga2V5Ym9hcmQgZXZl
bnQgcHJvY2Vzc2luZyAoZS5nLiBmcm9tIENoYXJhY3RlciBWaWV3ZXIsIG9yIHdoZW4gY29uZmly
bWluZyBhbiBpbmxpbmUgaW5wdXQgYXJlYSB3aXRoIGEgbW91c2UpLAorICAgIC8vIHRoZW4gd2Ug
YWxzbyBleGVjdXRlIGl0IGltbWVkaWF0ZWx5LCBhcyB0aGVyZSB3aWxsIGJlIG5vIG90aGVyIGNo
YW5jZS4KKyAgICBpZiAocGFyYW1ldGVycyAmJiAhaXNGcm9tSW5wdXRNZXRob2QpIHsKKyAgICAg
ICAgLy8gRklYTUU6IEhhbmRsZSByZXBsYWNlbWVudFJhbmdlIGluIHRoaXMgY2FzZSwgdG9vLiBJ
dCdzIGtub3duIHRvIG9jY3VyIGluIHByYWN0aWNlIHdoZW4gY2FuY2VsaW5nIFByZXNzIGFuZCBI
b2xkIChzZWUgPHJkYXI6Ly8xMTk0MDY3MD4pLgorICAgICAgICBBU1NFUlQocmVwbGFjZW1lbnRS
YW5nZS5sb2NhdGlvbiA9PSBOU05vdEZvdW5kKTsKKyAgICAgICAgS2V5cHJlc3NDb21tYW5kIGNv
bW1hbmQoImluc2VydFRleHQ6IiwgdGV4dCk7CisgICAgICAgIHBhcmFtZXRlcnMtPmNvbW1hbmRz
LT5hcHBlbmQoY29tbWFuZCk7CisgICAgICAgIF9kYXRhLT5fcGFnZS0+cmVnaXN0ZXJLZXlwcmVz
c0NvbW1hbmROYW1lKGNvbW1hbmQuY29tbWFuZE5hbWUpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgU3RyaW5nIGV2ZW50VGV4dCA9IHRleHQ7CisgICAgZXZlbnRUZXh0LnJlcGxhY2Uo
TlNCYWNrVGFiQ2hhcmFjdGVyLCBOU1RhYkNoYXJhY3Rlcik7IC8vIHNhbWUgdGhpbmcgaXMgZG9u
ZSBpbiBLZXlFdmVudE1hYy5tbSBpbiBXZWJDb3JlCisgICAgYm9vbCBldmVudEhhbmRsZWQ7Cisg
ICAgaWYgKCFkaWN0YXRpb25BbHRlcm5hdGl2ZXMuaXNFbXB0eSgpKQorICAgICAgICBldmVudEhh
bmRsZWQgPSBfZGF0YS0+X3BhZ2UtPmluc2VydERpY3RhdGVkVGV4dChldmVudFRleHQsIHJlcGxh
Y2VtZW50UmFuZ2UubG9jYXRpb24sIHJlcGxhY2VtZW50UmFuZ2UubGVuZ3RoLCBkaWN0YXRpb25B
bHRlcm5hdGl2ZXMpOworICAgIGVsc2UKKyAgICAgICAgZXZlbnRIYW5kbGVkID0gX2RhdGEtPl9w
YWdlLT5pbnNlcnRUZXh0KGV2ZW50VGV4dCwgcmVwbGFjZW1lbnRSYW5nZS5sb2NhdGlvbiwgcmVw
bGFjZW1lbnRSYW5nZS5sZW5ndGgpOworCisgICAgaWYgKHBhcmFtZXRlcnMpCisgICAgICAgIHBh
cmFtZXRlcnMtPmV2ZW50SW50ZXJwcmV0YXRpb25IYWRTaWRlRWZmZWN0cyB8PSBldmVudEhhbmRs
ZWQ7CiB9CiAKIC0gKE5TUmFuZ2Upc2VsZWN0ZWRSYW5nZQpAQCAtMTUzMiw0OCArMTkzOSw2IEBA
IC0gKHZvaWQpdW5tYXJrVGV4dAogICAgIF9kYXRhLT5fcGFnZS0+Y29uZmlybUNvbXBvc2l0aW9u
KCk7CiB9CiAKLS0gKE5TQXJyYXkgKil2YWxpZEF0dHJpYnV0ZXNGb3JNYXJrZWRUZXh0Ci17Ci0g
ICAgc3RhdGljIE5TQXJyYXkgKnZhbGlkQXR0cmlidXRlczsKLSAgICBpZiAoIXZhbGlkQXR0cmli
dXRlcykgewotICAgICAgICB2YWxpZEF0dHJpYnV0ZXMgPSBbW05TQXJyYXkgYWxsb2NdIGluaXRX
aXRoT2JqZWN0czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TVW5kZXJsaW5lU3R5bGVB
dHRyaWJ1dGVOYW1lLCBOU1VuZGVybGluZUNvbG9yQXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgIE5TTWFya2VkQ2xhdXNlU2VnbWVudEF0dHJpYnV0ZU5hbWUsCi0jaWYg
VVNFKERJQ1RBVElPTl9BTFRFUk5BVElWRVMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBO
U1RleHRBbHRlcm5hdGl2ZXNBdHRyaWJ1dGVOYW1lLAotI2VuZGlmCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICBuaWxdOwotICAgICAgICAvLyBOU1RleHQgYWxzbyBzdXBwb3J0cyB0aGUgZm9s
bG93aW5nIGF0dHJpYnV0ZXMsIGJ1dCBpdCdzCi0gICAgICAgIC8vIGhhcmQgdG8gdGVsbCB3aGlj
aCBhcmUgcmVhbGx5IHJlcXVpcmVkIGZvciB0ZXh0IGlucHV0IHRvCi0gICAgICAgIC8vIHdvcmsg
d2VsbDsgSSBoYXZlIG5vdCBzZWVuIGFueSBpbnB1dCBtZXRob2QgbWFrZSB1c2Ugb2YgdGhlbSB5
ZXQuCi0gICAgICAgIC8vICAgICBOU0ZvbnRBdHRyaWJ1dGVOYW1lLCBOU0ZvcmVncm91bmRDb2xv
ckF0dHJpYnV0ZU5hbWUsCi0gICAgICAgIC8vICAgICBOU0JhY2tncm91bmRDb2xvckF0dHJpYnV0
ZU5hbWUsIE5TTGFuZ3VhZ2VBdHRyaWJ1dGVOYW1lLgotICAgICAgICBDRlJldGFpbih2YWxpZEF0
dHJpYnV0ZXMpOwotICAgIH0KLSAgICBMT0coVGV4dElucHV0LCAidmFsaWRBdHRyaWJ1dGVzRm9y
TWFya2VkVGV4dCAtPiAoLi4uKSIpOwotICAgIHJldHVybiB2YWxpZEF0dHJpYnV0ZXM7Ci19Ci0K
LXN0YXRpYyB2b2lkIGV4dHJhY3RVbmRlcmxpbmVzKE5TQXR0cmlidXRlZFN0cmluZyAqc3RyaW5n
LCBWZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+JiByZXN1bHQpCi17Ci0gICAgaW50IGxlbmd0
aCA9IFtbc3RyaW5nIHN0cmluZ10gbGVuZ3RoXTsKLSAgICAKLSAgICBpbnQgaSA9IDA7Ci0gICAg
d2hpbGUgKGkgPCBsZW5ndGgpIHsKLSAgICAgICAgTlNSYW5nZSByYW5nZTsKLSAgICAgICAgTlNE
aWN0aW9uYXJ5ICphdHRycyA9IFtzdHJpbmcgYXR0cmlidXRlc0F0SW5kZXg6aSBsb25nZXN0RWZm
ZWN0aXZlUmFuZ2U6JnJhbmdlIGluUmFuZ2U6TlNNYWtlUmFuZ2UoaSwgbGVuZ3RoIC0gaSldOwot
ICAgICAgICAKLSAgICAgICAgaWYgKE5TTnVtYmVyICpzdHlsZSA9IFthdHRycyBvYmplY3RGb3JL
ZXk6TlNVbmRlcmxpbmVTdHlsZUF0dHJpYnV0ZU5hbWVdKSB7Ci0gICAgICAgICAgICBDb2xvciBj
b2xvciA9IENvbG9yOjpibGFjazsKLSAgICAgICAgICAgIGlmIChOU0NvbG9yICpjb2xvckF0dHIg
PSBbYXR0cnMgb2JqZWN0Rm9yS2V5Ok5TVW5kZXJsaW5lQ29sb3JBdHRyaWJ1dGVOYW1lXSkKLSAg
ICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbU5TQ29sb3IoW2NvbG9yQXR0ciBjb2xvclVz
aW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXSk7Ci0gICAgICAgICAgICBy
ZXN1bHQuYXBwZW5kKENvbXBvc2l0aW9uVW5kZXJsaW5lKHJhbmdlLmxvY2F0aW9uLCBOU01heFJh
bmdlKHJhbmdlKSwgY29sb3IsIFtzdHlsZSBpbnRWYWx1ZV0gPiAxKSk7Ci0gICAgICAgIH0KLSAg
ICAgICAgCi0gICAgICAgIGkgPSByYW5nZS5sb2NhdGlvbiArIHJhbmdlLmxlbmd0aDsKLSAgICB9
Ci19Ci0KIC0gKHZvaWQpc2V0TWFya2VkVGV4dDooaWQpc3RyaW5nIHNlbGVjdGVkUmFuZ2U6KE5T
UmFuZ2UpbmV3U2VsZWN0ZWRSYW5nZSByZXBsYWNlbWVudFJhbmdlOihOU1JhbmdlKXJlcGxhY2Vt
ZW50UmFuZ2UKIHsKICAgICBbc2VsZiBfZXhlY3V0ZVNhdmVkS2V5cHJlc3NDb21tYW5kc107CkBA
IC0xNjk5LDYgKzIwNjQsMTI1IEBAIC0gKE5TUmVjdClmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5n
ZTooTlMKICAgICByZXR1cm4gcmVzdWx0UmVjdDsKIH0KIAorLSAoQk9PTClwZXJmb3JtS2V5RXF1
aXZhbGVudDooTlNFdmVudCAqKWV2ZW50Cit7CisgICAgLy8gVGhlcmUncyBhIGNoYW5jZSB0aGF0
IHJlc3BvbmRpbmcgdG8gdGhpcyBldmVudCB3aWxsIHJ1biBhIG5lc3RlZCBldmVudCBsb29wLCBh
bmQKKyAgICAvLyBmZXRjaGluZyBhIG5ldyBldmVudCBtaWdodCByZWxlYXNlIHRoZSBvbGQgb25l
LiBSZXRhaW5pbmcgYW5kIHRoZW4gYXV0b3JlbGVhc2luZworICAgIC8vIHRoZSBjdXJyZW50IGV2
ZW50IHByZXZlbnRzIHRoYXQgZnJvbSBjYXVzaW5nIGEgcHJvYmxlbSBpbnNpZGUgV2ViS2l0IG9y
IEFwcEtpdCBjb2RlLgorICAgIFtbZXZlbnQgcmV0YWluXSBhdXRvcmVsZWFzZV07CisKKyAgICAv
LyBXZSBnZXQgRXNjIGtleSBoZXJlIGFmdGVyIHByb2Nlc3NpbmcgZWl0aGVyIEVzYyBvciBDbWQr
cGVyaW9kLiBUaGUgZm9ybWVyIHN0YXJ0cyBhcyBhIGtleURvd24sIGFuZCB0aGUgbGF0dGVyIHN0
YXJ0cyBhcyBhIGtleSBlcXVpdmFsZW50LAorICAgIC8vIGJ1dCBib3RoIGdldCB0cmFuc2Zvcm1l
ZCB0byBhIGNhbmNlbE9wZXJhdGlvbjogY29tbWFuZCwgZXhlY3V0aW5nIHdoaWNoIHBhc3NlcyBh
biBFc2Mga2V5IGV2ZW50IHRvIC1wZXJmb3JtS2V5RXF1aXZhbGVudDouCisgICAgLy8gRG9uJ3Qg
aW50ZXJwcmV0IHRoaXMgZXZlbnQgYWdhaW4sIGF2b2lkaW5nIHJlLWVudHJhbmN5IGFuZCBpbmZp
bml0ZSBsb29wcy4KKyAgICBpZiAoW1tldmVudCBjaGFyYWN0ZXJzSWdub3JpbmdNb2RpZmllcnNd
IGlzRXF1YWxUb1N0cmluZzpAIlxlIl0gJiYgIShbZXZlbnQgbW9kaWZpZXJGbGFnc10gJiBOU0Rl
dmljZUluZGVwZW5kZW50TW9kaWZpZXJGbGFnc01hc2spKQorICAgICAgICByZXR1cm4gW3N1cGVy
IHBlcmZvcm1LZXlFcXVpdmFsZW50OmV2ZW50XTsKKworICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5
IHJlLXNlbmRpbmcgdGhlIGV2ZW50LCB0aGVuIFdlYkNvcmUgaGFzIGFscmVhZHkgc2VlbiBpdCwg
bm8gbmVlZCBmb3IgY3VzdG9tIHByb2Nlc3NpbmcuCisgICAgQk9PTCBldmVudFdhc1NlbnRUb1dl
YkNvcmUgPSAoX2RhdGEtPl9rZXlEb3duRXZlbnRCZWluZ1Jlc2VudCA9PSBldmVudCk7CisgICAg
aWYgKGV2ZW50V2FzU2VudFRvV2ViQ29yZSkKKyAgICAgICAgcmV0dXJuIFtzdXBlciBwZXJmb3Jt
S2V5RXF1aXZhbGVudDpldmVudF07CisKKyAgICBBU1NFUlQoZXZlbnQgPT0gW05TQXBwIGN1cnJl
bnRFdmVudF0pOworCisgICAgW3NlbGYgX2Rpc2FibGVDb21wbGV4VGV4dElucHV0SWZOZWNlc3Nh
cnldOworCisgICAgLy8gUGFzcyBrZXkgY29tYm9zIHRocm91Z2ggV2ViQ29yZSBpZiB0aGVyZSBp
cyBhIGtleSBiaW5kaW5nIGF2YWlsYWJsZSBmb3IKKyAgICAvLyB0aGlzIGV2ZW50LiBUaGlzIGxl
dHMgd2ViIHBhZ2VzIGhhdmUgYSBjcmFjayBhdCBpbnRlcmNlcHRpbmcga2V5LW1vZGlmaWVkIGtl
eXByZXNzZXMuCisgICAgLy8gRklYTUU6IFdoeSBpcyB0aGUgZmlyc3RSZXNwb25kZXIgY2hlY2sg
bmVlZGVkPworICAgIGlmIChzZWxmID09IFtbc2VsZiB3aW5kb3ddIGZpcnN0UmVzcG9uZGVyXSkg
eworICAgICAgICBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiBjb21tYW5kczsKKyAgICAgICAgQk9P
TCBoYW5kbGVkQnlJbnB1dE1ldGhvZCA9IFtzZWxmIF9pbnRlcnByZXRLZXlFdmVudDpldmVudCBz
YXZpbmdDb21tYW5kc1RvOmNvbW1hbmRzXTsKKyAgICAgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGVL
ZXlib2FyZEV2ZW50KE5hdGl2ZVdlYktleWJvYXJkRXZlbnQoZXZlbnQsIGhhbmRsZWRCeUlucHV0
TWV0aG9kLCBjb21tYW5kcykpOworICAgICAgICByZXR1cm4gWUVTOworICAgIH0KKyAgICAKKyAg
ICByZXR1cm4gW3N1cGVyIHBlcmZvcm1LZXlFcXVpdmFsZW50OmV2ZW50XTsKK30KKworLSAodm9p
ZClrZXlVcDooTlNFdmVudCAqKXRoZUV2ZW50Cit7CisgICAgTE9HKFRleHRJbnB1dCwgImtleVVw
OiVwICVAIiwgdGhlRXZlbnQsIHRoZUV2ZW50KTsKKyAgICAvLyBXZSBkb24ndCBpbnRlcnByZXQg
dGhlIGtleVVwIGV2ZW50LCBhcyB0aGlzIGJyZWFrcyBrZXkgYmluZGluZ3MgKHNlZSA8aHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzMDEwMD4pLgorICAgIF9kYXRhLT5f
cGFnZS0+aGFuZGxlS2V5Ym9hcmRFdmVudChOYXRpdmVXZWJLZXlib2FyZEV2ZW50KHRoZUV2ZW50
LCBmYWxzZSwgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4oKSkpOworfQorCistICh2b2lkKWtleURv
d246KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIExPRyhUZXh0SW5wdXQsICJrZXlEb3duOiVw
ICVAJXMiLCB0aGVFdmVudCwgdGhlRXZlbnQsICh0aGVFdmVudCA9PSBfZGF0YS0+X2tleURvd25F
dmVudEJlaW5nUmVzZW50KSA/ICIgKHJlLXNlbnQpIiA6ICIiKTsKKworICAgIC8vIFRoZXJlJ3Mg
YSBjaGFuY2UgdGhhdCByZXNwb25kaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBydW4gYSBuZXN0ZWQg
ZXZlbnQgbG9vcCwgYW5kCisgICAgLy8gZmV0Y2hpbmcgYSBuZXcgZXZlbnQgbWlnaHQgcmVsZWFz
ZSB0aGUgb2xkIG9uZS4gUmV0YWluaW5nIGFuZCB0aGVuIGF1dG9yZWxlYXNpbmcKKyAgICAvLyB0
aGUgY3VycmVudCBldmVudCBwcmV2ZW50cyB0aGF0IGZyb20gY2F1c2luZyBhIHByb2JsZW0gaW5z
aWRlIFdlYktpdCBvciBBcHBLaXQgY29kZS4KKyAgICBbW3RoZUV2ZW50IHJldGFpbl0gYXV0b3Jl
bGVhc2VdOworCisgICAgaWYgKFtzZWxmIF90cnlIYW5kbGVQbHVnaW5Db21wbGV4VGV4dElucHV0
S2V5RG93bjp0aGVFdmVudF0pIHsKKyAgICAgICAgTE9HKFRleHRJbnB1dCwgIi4uLmhhbmRsZWQg
YnkgcGx1Zy1pbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgY291bGQg
YmUgcmVjZWl2aW5nIGEga2V5IGRvd24gZnJvbSBBcHBLaXQgaWYgd2UgaGF2ZSByZS1zZW50IGFu
IGV2ZW50CisgICAgLy8gdGhhdCBtYXBzIHRvIGFuIGFjdGlvbiB0aGF0IGlzIGN1cnJlbnRseSB1
bmF2YWlsYWJsZSAoZm9yIGV4YW1wbGUgYSBjb3B5IHdoZW4KKyAgICAvLyB0aGVyZSBpcyBubyBy
YW5nZSBzZWxlY3Rpb24pLgorICAgIC8vIElmIHRoaXMgaXMgdGhlIGNhc2Ugd2Ugc2hvdWxkIGln
bm9yZSB0aGUga2V5IGRvd24uCisgICAgaWYgKF9kYXRhLT5fa2V5RG93bkV2ZW50QmVpbmdSZXNl
bnQgPT0gdGhlRXZlbnQpIHsKKyAgICAgICAgW3N1cGVyIGtleURvd246dGhlRXZlbnRdOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgVmVjdG9yPEtleXByZXNzQ29tbWFuZD4gY29tbWFu
ZHM7CisgICAgQk9PTCBoYW5kbGVkQnlJbnB1dE1ldGhvZCA9IFtzZWxmIF9pbnRlcnByZXRLZXlF
dmVudDp0aGVFdmVudCBzYXZpbmdDb21tYW5kc1RvOmNvbW1hbmRzXTsKKyAgICBpZiAoIWNvbW1h
bmRzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBBbiBpbnB1dCBtZXRob2QgbWF5IG1ha2Ugc2V2
ZXJhbCBhY3Rpb25zIHBlciBrZXlwcmVzcy4gRm9yIGV4YW1wbGUsIHByZXNzaW5nIFJldHVybiB3
aXRoIEtvcmVhbiBJTSBib3RoIGNvbmZpcm1zIGl0IGFuZCBzZW5kcyBhIG5ld2xpbmUuCisgICAg
ICAgIC8vIElNLWxpa2UgYWN0aW9ucyBhcmUgaGFuZGxlZCBpbW1lZGlhdGVseSAoc28gdGhlIHJl
dHVybiB2YWx1ZSBmcm9tIFVJIHByb2Nlc3MgaXMgdHJ1ZSksIGJ1dCB0aGVyZSBhcmUgc2F2ZWQg
Y29tbWFuZHMgdGhhdAorICAgICAgICAvLyBzaG91bGQgYmUgaGFuZGxlZCBsaWtlIG5vcm1hbCB0
ZXh0IGlucHV0IGFmdGVyIERPTSBldmVudCBkaXNwYXRjaC4KKyAgICAgICAgaGFuZGxlZEJ5SW5w
dXRNZXRob2QgPSBOTzsKKyAgICB9CisKKyAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJk
RXZlbnQoTmF0aXZlV2ViS2V5Ym9hcmRFdmVudCh0aGVFdmVudCwgaGFuZGxlZEJ5SW5wdXRNZXRo
b2QsIGNvbW1hbmRzKSk7Cit9CisKKy0gKHZvaWQpZmxhZ3NDaGFuZ2VkOihOU0V2ZW50ICopdGhl
RXZlbnQKK3sKKyAgICBMT0coVGV4dElucHV0LCAiZmxhZ3NDaGFuZ2VkOiVwICVAIiwgdGhlRXZl
bnQsIHRoZUV2ZW50KTsKKworICAgIC8vIFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCByZXNwb25kaW5n
IHRvIHRoaXMgZXZlbnQgd2lsbCBydW4gYSBuZXN0ZWQgZXZlbnQgbG9vcCwgYW5kCisgICAgLy8g
ZmV0Y2hpbmcgYSBuZXcgZXZlbnQgbWlnaHQgcmVsZWFzZSB0aGUgb2xkIG9uZS4gUmV0YWluaW5n
IGFuZCB0aGVuIGF1dG9yZWxlYXNpbmcKKyAgICAvLyB0aGUgY3VycmVudCBldmVudCBwcmV2ZW50
cyB0aGF0IGZyb20gY2F1c2luZyBhIHByb2JsZW0gaW5zaWRlIFdlYktpdCBvciBBcHBLaXQgY29k
ZS4KKyAgICBbW3RoZUV2ZW50IHJldGFpbl0gYXV0b3JlbGVhc2VdOworCisgICAgdW5zaWduZWQg
c2hvcnQga2V5Q29kZSA9IFt0aGVFdmVudCBrZXlDb2RlXTsKKworICAgIC8vIERvbid0IG1ha2Ug
YW4gZXZlbnQgZnJvbSB0aGUgbnVtIGxvY2sgYW5kIGZ1bmN0aW9uIGtleXMKKyAgICBpZiAoIWtl
eUNvZGUgfHwga2V5Q29kZSA9PSAxMCB8fCBrZXlDb2RlID09IDYzKQorICAgICAgICByZXR1cm47
CisKKyAgICBfZGF0YS0+X3BhZ2UtPmhhbmRsZUtleWJvYXJkRXZlbnQoTmF0aXZlV2ViS2V5Ym9h
cmRFdmVudCh0aGVFdmVudCwgZmFsc2UsIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+KCkpKTsKK30K
KworI2VuZGlmIC8vIFVTRShBU1lOQ19OU1RFWFRJTlBVVENMSUVOVCkKKworLSAoTlNBcnJheSAq
KXZhbGlkQXR0cmlidXRlc0Zvck1hcmtlZFRleHQKK3sKKyAgICBzdGF0aWMgTlNBcnJheSAqdmFs
aWRBdHRyaWJ1dGVzOworICAgIGlmICghdmFsaWRBdHRyaWJ1dGVzKSB7CisgICAgICAgIHZhbGlk
QXR0cmlidXRlcyA9IFtbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgTlNVbmRlcmxpbmVTdHlsZUF0dHJpYnV0ZU5hbWUsIE5TVW5kZXJs
aW5lQ29sb3JBdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNNYXJr
ZWRDbGF1c2VTZWdtZW50QXR0cmlidXRlTmFtZSwKKyNpZiBVU0UoRElDVEFUSU9OX0FMVEVSTkFU
SVZFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TVGV4dEFsdGVybmF0aXZlc0F0dHJp
YnV0ZU5hbWUsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbF07CisgICAg
ICAgIC8vIE5TVGV4dCBhbHNvIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcywgYnV0
IGl0J3MKKyAgICAgICAgLy8gaGFyZCB0byB0ZWxsIHdoaWNoIGFyZSByZWFsbHkgcmVxdWlyZWQg
Zm9yIHRleHQgaW5wdXQgdG8KKyAgICAgICAgLy8gd29yayB3ZWxsOyBJIGhhdmUgbm90IHNlZW4g
YW55IGlucHV0IG1ldGhvZCBtYWtlIHVzZSBvZiB0aGVtIHlldC4KKyAgICAgICAgLy8gICAgIE5T
Rm9udEF0dHJpYnV0ZU5hbWUsIE5TRm9yZWdyb3VuZENvbG9yQXR0cmlidXRlTmFtZSwKKyAgICAg
ICAgLy8gICAgIE5TQmFja2dyb3VuZENvbG9yQXR0cmlidXRlTmFtZSwgTlNMYW5ndWFnZUF0dHJp
YnV0ZU5hbWUuCisgICAgICAgIENGUmV0YWluKHZhbGlkQXR0cmlidXRlcyk7CisgICAgfQorICAg
IExPRyhUZXh0SW5wdXQsICJ2YWxpZEF0dHJpYnV0ZXNGb3JNYXJrZWRUZXh0IC0+ICguLi4pIik7
CisgICAgcmV0dXJuIHZhbGlkQXR0cmlidXRlczsKK30KKwogI2lmIEVOQUJMRShEUkFHX1NVUFBP
UlQpCiAtICh2b2lkKWRyYWdnZWRJbWFnZTooTlNJbWFnZSAqKWFuSW1hZ2UgZW5kZWRBdDooTlNQ
b2ludClhUG9pbnQgb3BlcmF0aW9uOihOU0RyYWdPcGVyYXRpb24pb3BlcmF0aW9uCiB7CkBAIC0y
MzE5LDQyICsyODAzLDYgQEAgLSAodm9pZClfZG9uZVdpdGhLZXlFdmVudDooTlNFdmVudCAqKWV2
ZQogICAgIF9kYXRhLT5fa2V5RG93bkV2ZW50QmVpbmdSZXNlbnQgPSBudWxscHRyOwogfQogCi0t
IChCT09MKV9pbnRlcnByZXRLZXlFdmVudDooTlNFdmVudCAqKWV2ZW50IHNhdmluZ0NvbW1hbmRz
VG86KFZlY3RvcjxXZWJDb3JlOjpLZXlwcmVzc0NvbW1hbmQ+Jiljb21tYW5kcwotewotICAgIEFT
U0VSVCghX2RhdGEtPl9pbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0ZXJzKTsKLSAgICBBU1NFUlQo
Y29tbWFuZHMuaXNFbXB0eSgpKTsKLQotICAgIGlmIChbZXZlbnQgdHlwZV0gPT0gTlNGbGFnc0No
YW5nZWQpCi0gICAgICAgIHJldHVybiBOTzsKLQotICAgIFdLVmlld0ludGVycHJldEtleUV2ZW50
c1BhcmFtZXRlcnMgcGFyYW1ldGVyczsKLSAgICBwYXJhbWV0ZXJzLmV2ZW50SW50ZXJwcmV0YXRp
b25IYWRTaWRlRWZmZWN0cyA9IGZhbHNlOwotICAgIHBhcmFtZXRlcnMuZXhlY3V0aW5nU2F2ZWRL
ZXlwcmVzc0NvbW1hbmRzID0gZmFsc2U7Ci0gICAgLy8gV2UgYXNzdW1lIHRoYXQgYW4gaW5wdXQg
bWV0aG9kIGhhcyBjb25zdW1lZCB0aGUgZXZlbnQsIGFuZCBvbmx5IGNoYW5nZSB0aGlzIGFzc3Vt
cHRpb24gaWYgb25lIG9mIHRoZSBOU1RleHRJbnB1dCBtZXRob2RzIGlzIGNhbGxlZC4KLSAgICAv
LyBXZSBhc3N1bWUgdGhlIElNIHdpbGwgKm5vdCogY29uc3VtZSBob3RrZXkgc2VxdWVuY2VzLgot
ICAgIHBhcmFtZXRlcnMuY29uc3VtZWRCeUlNID0gIShbZXZlbnQgbW9kaWZpZXJGbGFnc10gJiBO
U0NvbW1hbmRLZXlNYXNrKTsKLSAgICBwYXJhbWV0ZXJzLmNvbW1hbmRzID0gJmNvbW1hbmRzOwot
ICAgIF9kYXRhLT5faW50ZXJwcmV0S2V5RXZlbnRzUGFyYW1ldGVycyA9ICZwYXJhbWV0ZXJzOwot
Ci0gICAgTE9HKFRleHRJbnB1dCwgIi0+IGludGVycHJldEtleUV2ZW50czolcCAlQCIsIGV2ZW50
LCBldmVudCk7Ci0gICAgW3NlbGYgaW50ZXJwcmV0S2V5RXZlbnRzOltOU0FycmF5IGFycmF5V2l0
aE9iamVjdDpldmVudF1dOwotCi0gICAgX2RhdGEtPl9pbnRlcnByZXRLZXlFdmVudHNQYXJhbWV0
ZXJzID0gbnVsbHB0cjsKLQotICAgIC8vIEFuIGlucHV0IG1ldGhvZCBtYXkgY29uc3VtZSBhbiBl
dmVudCBhbmQgbm90IHRlbGwgdXMgKGUuZy4gd2hlbiBkaXNwbGF5aW5nIGEgY2FuZGlkYXRlIHdp
bmRvdyksCi0gICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgbm90IGJ1YmJsZSB0aGUgZXZl
bnQgdXAgdGhlIERPTS4KLSAgICBpZiAocGFyYW1ldGVycy5jb25zdW1lZEJ5SU0pIHsKLSAgICAg
ICAgQVNTRVJUKGNvbW1hbmRzLmlzRW1wdHkoKSk7Ci0gICAgICAgIExPRyhUZXh0SW5wdXQsICIu
Li5ldmVudCAlcCB3YXMgY29uc3VtZWQgYnkgYW4gaW5wdXQgbWV0aG9kIiwgZXZlbnQpOwotICAg
ICAgICByZXR1cm4gWUVTOwotICAgIH0KLQotICAgIExPRyhUZXh0SW5wdXQsICIuLi5pbnRlcnBy
ZXRLZXlFdmVudHMgZm9yIGV2ZW50ICVwIGRvbmUsIHJldHVybnMgJWQiLCBldmVudCwgcGFyYW1l
dGVycy5ldmVudEludGVycHJldGF0aW9uSGFkU2lkZUVmZmVjdHMpOwotCi0gICAgLy8gSWYgd2Ug
aGF2ZSBhbHJlYWR5IGV4ZWN1dGVkIGFsbCBvciBzb21lIG9mIHRoZSBjb21tYW5kcywgdGhlIGV2
ZW50IGlzICJoYW5kbGVkIi4gTm90ZSB0aGF0IHRoZXJlIGFyZSBhZGRpdGlvbmFsIGNoZWNrcyBv
biB3ZWIgcHJvY2VzcyBzaWRlLgotICAgIHJldHVybiBwYXJhbWV0ZXJzLmV2ZW50SW50ZXJwcmV0
YXRpb25IYWRTaWRlRWZmZWN0czsKLX0KLQogLSAoTlNSZWN0KV9jb252ZXJ0VG9EZXZpY2VTcGFj
ZTooTlNSZWN0KXJlY3QKIHsKICAgICByZXR1cm4gdG9EZXZpY2VTcGFjZShyZWN0LCBbc2VsZiB3
aW5kb3ddKTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlld0lu
dGVybmFsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMv
V0tWaWV3SW50ZXJuYWwuaAkocmV2aXNpb24gMTY1OTI4KQorKysgU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9tYWMvV0tWaWV3SW50ZXJuYWwuaAkod29ya2luZyBjb3B5KQpAQCAtNzIsNyAr
NzIsNiBAQCBAaW50ZXJmYWNlIFdLVmlldyAoKQogLSAodm9pZClfdG9vbFRpcENoYW5nZWRGcm9t
OihOU1N0cmluZyAqKW9sZFRvb2xUaXAgdG86KE5TU3RyaW5nICopbmV3VG9vbFRpcDsKIC0gKHZv
aWQpX3NldEN1cnNvcjooTlNDdXJzb3IgKiljdXJzb3I7CiAtICh2b2lkKV9zZXRVc2VySW50ZXJm
YWNlSXRlbVN0YXRlOihOU1N0cmluZyAqKWNvbW1hbmROYW1lIGVuYWJsZWQ6KEJPT0wpaXNFbmFi
bGVkIHN0YXRlOihpbnQpbmV3U3RhdGU7Ci0tIChCT09MKV9pbnRlcnByZXRLZXlFdmVudDooTlNF
dmVudCAqKXRoZUV2ZW50IHNhdmluZ0NvbW1hbmRzVG86KFZlY3RvcjxXZWJDb3JlOjpLZXlwcmVz
c0NvbW1hbmQ+Jiljb21tYW5kczsKIC0gKHZvaWQpX2RvbmVXaXRoS2V5RXZlbnQ6KE5TRXZlbnQg
KilldmVudCBldmVudFdhc0hhbmRsZWQ6KEJPT0wpZXZlbnRXYXNIYW5kbGVkOwogLSAoYm9vbClf
ZXhlY3V0ZVNhdmVkQ29tbWFuZEJ5U2VsZWN0b3I6KFNFTClzZWxlY3RvcjsKIC0gKHZvaWQpX3Nl
dEludHJpbnNpY0NvbnRlbnRTaXplOihOU1NpemUpaW50cmluc2ljQ29udGVudFNpemU7CkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dlYlBhZ2VQcm94eUlPUy5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dlYlBhZ2VQcm94eUlPUy5tbQko
cmV2aXNpb24gMTY1OTI4KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9XZWJQYWdl
UHJveHlJT1MubW0JKHdvcmtpbmcgY29weSkKQEAgLTEzMCwxMiArMTMwLDYgQEAgYm9vbCBXZWJQ
YWdlUHJveHk6Omluc2VydFRleHQoY29uc3QgU3RyaQogICAgIHJldHVybiB0cnVlOwogfQogCi1i
b29sIFdlYlBhZ2VQcm94eTo6aW5zZXJ0RGljdGF0ZWRUZXh0KGNvbnN0IFN0cmluZyYsIGNvbnN0
IEVkaXRpbmdSYW5nZSYsIGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpUZXh0QWx0ZXJuYXRpdmVXaXRo
UmFuZ2U+JikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiBmYWxzZTsKLX0K
LQogdm9pZCBXZWJQYWdlUHJveHk6OmdldE1hcmtlZFJhbmdlKEVkaXRpbmdSYW5nZSYpCiB7CiAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTE0NiwxMSArMTQwLDYgQEAgdm9pZCBXZWJQYWdlUHJv
eHk6OmdldFNlbGVjdGVkUmFuZ2UoRWRpdAogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZv
aWQgV2ViUGFnZVByb3h5OjpnZXRBdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlKGNvbnN0IEVk
aXRpbmdSYW5nZSYsIEF0dHJpYnV0ZWRTdHJpbmcmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci19Ci0KIHVpbnQ2NF90IFdlYlBhZ2VQcm94eTo6Y2hhcmFjdGVySW5kZXhGb3JQb2ludChjb25z
dCBJbnRQb2ludCkKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwpJbmRleDogU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL21hYy9XZWJQYWdlUHJveHlNYWMubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL21hYy9XZWJQYWdlUHJveHlNYWMubW0JKHJldmlzaW9uIDE2NTky
OCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9tYWMvV2ViUGFnZVByb3h5TWFjLm1tCSh3
b3JraW5nIGNvcHkpCkBAIC0yMjAsNiArMjIwLDMxIEBAIGJvb2wgV2ViUGFnZVByb3h5OjppbnNl
cnREaWN0YXRlZFRleHQoY28KICNlbmRpZgogfQogCit2b2lkIFdlYlBhZ2VQcm94eTo6aW5zZXJ0
RGljdGF0ZWRUZXh0QXN5bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2Um
IHJlcGxhY2VtZW50UmFuZ2UsIGNvbnN0IFZlY3RvcjxUZXh0QWx0ZXJuYXRpdmVXaXRoUmFuZ2U+
JiBkaWN0YXRpb25BbHRlcm5hdGl2ZXNXaXRoUmFuZ2UpCit7CisjaWYgVVNFKERJQ1RBVElPTl9B
TFRFUk5BVElWRVMpCisgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IFZlY3RvcjxEaWN0YXRpb25BbHRlcm5hdGl2ZT4gZGljdGF0aW9uQWx0ZXJuYXRpdmVzOworCisg
ICAgZm9yIChjb25zdCBUZXh0QWx0ZXJuYXRpdmVXaXRoUmFuZ2UmIGFsdGVybmF0aXZlV2l0aFJh
bmdlIDogZGljdGF0aW9uQWx0ZXJuYXRpdmVzV2l0aFJhbmdlKSB7CisgICAgICAgIHVpbnQ2NF90
IGRpY3RhdGlvbkNvbnRleHQgPSBtX3BhZ2VDbGllbnQuYWRkRGljdGF0aW9uQWx0ZXJuYXRpdmVz
KGFsdGVybmF0aXZlV2l0aFJhbmdlLmFsdGVybmF0aXZlcyk7CisgICAgICAgIGlmIChkaWN0YXRp
b25Db250ZXh0KQorICAgICAgICAgICAgZGljdGF0aW9uQWx0ZXJuYXRpdmVzLmFwcGVuZChEaWN0
YXRpb25BbHRlcm5hdGl2ZShhbHRlcm5hdGl2ZVdpdGhSYW5nZS5yYW5nZS5sb2NhdGlvbiwgYWx0
ZXJuYXRpdmVXaXRoUmFuZ2UucmFuZ2UubGVuZ3RoLCBkaWN0YXRpb25Db250ZXh0KSk7CisgICAg
fQorCisgICAgaWYgKGRpY3RhdGlvbkFsdGVybmF0aXZlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
aW5zZXJ0VGV4dEFzeW5jKHRleHQsIHJlcGxhY2VtZW50UmFuZ2UpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgcHJvY2VzcygpLnNlbmQoTWVzc2FnZXM6OldlYlBhZ2U6Okluc2VydERp
Y3RhdGVkVGV4dEFzeW5jKHRleHQsIHJlcGxhY2VtZW50UmFuZ2UsIGRpY3RhdGlvbkFsdGVybmF0
aXZlcyksIG1fcGFnZUlEKTsKKyNlbHNlCisgICAgaW5zZXJ0VGV4dEFzeW5jKHRleHQsIHJlcGxh
Y2VtZW50UmFuZ2UpOworI2VuZGlmCit9CisKIHZvaWQgV2ViUGFnZVByb3h5OjpnZXRNYXJrZWRS
YW5nZShFZGl0aW5nUmFuZ2UmIHJlc3VsdCkKIHsKICAgICByZXN1bHQgPSBFZGl0aW5nUmFuZ2Uo
KTsKQEAgLTI0OSw2ICsyNzQsMzMgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmdldEF0dHJpYnV0ZWRT
dWJzdHJpbgogICAgIHByb2Nlc3MoKS5zZW5kU3luYyhNZXNzYWdlczo6V2ViUGFnZTo6R2V0QXR0
cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5nZShyYW5nZSksIE1lc3NhZ2VzOjpXZWJQYWdlOjpHZXRB
dHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlOjpSZXBseShyZXN1bHQpLCBtX3BhZ2VJRCk7CiB9
CiAKK3ZvaWQgV2ViUGFnZVByb3h5OjphdHRyaWJ1dGVkU3Vic3RyaW5nRm9yQ2hhcmFjdGVyUmFu
Z2VBc3luYyhjb25zdCBFZGl0aW5nUmFuZ2UmIHJhbmdlLCBQYXNzUmVmUHRyPEF0dHJpYnV0ZWRT
dHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrPiBjYWxsYmFjaykKK3sKKyAgICBpZiAoIWlz
VmFsaWQoKSkgeworICAgICAgICBjYWxsYmFjay0+aW52YWxpZGF0ZSgpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFj
a0lEKCk7CisgICAgbV9hdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFja3Mu
c2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKKworICAgIHByb2Nlc3MoKS5zZW5kKE1lc3NhZ2Vz
OjpXZWJQYWdlOjpBdHRyaWJ1dGVkU3Vic3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhyYW5n
ZSwgY2FsbGJhY2tJRCksIG1fcGFnZUlEKTsKK30KKwordm9pZCBXZWJQYWdlUHJveHk6OmF0dHJp
YnV0ZWRTdHJpbmdGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKGNvbnN0IEF0dHJpYnV0ZWRTdHJp
bmcmIHN0cmluZywgY29uc3QgRWRpdGluZ1JhbmdlJiBhY3R1YWxSYW5nZSwgdWludDY0X3QgY2Fs
bGJhY2tJRCkKK3sKKyAgICBNRVNTQUdFX0NIRUNLKGFjdHVhbFJhbmdlLmlzVmFsaWQoKSk7CisK
KyAgICBSZWZQdHI8QXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2s+IGNh
bGxiYWNrID0gbV9hdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFja3MudGFr
ZShjYWxsYmFja0lEKTsKKyAgICBpZiAoIWNhbGxiYWNrKSB7CisgICAgICAgIC8vIEZJWE1FOiBM
b2cgZXJyb3Igb3IgYXNzZXJ0LgorICAgICAgICAvLyB0aGlzIGNhbiB2YWxpZGx5IGhhcHBlbiBp
ZiBhIGxvYWQgaW52YWxpZGF0ZWQgdGhlIGNhbGxiYWNrLCB0aG91Z2gKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGNhbGxiYWNrLT5wZXJmb3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUo
c3RyaW5nLCBhY3R1YWxSYW5nZSk7Cit9CisKIHVpbnQ2NF90IFdlYlBhZ2VQcm94eTo6Y2hhcmFj
dGVySW5kZXhGb3JQb2ludChjb25zdCBJbnRQb2ludCBwb2ludCkKIHsKICAgICBpZiAoIWlzVmFs
aWQoKSkKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFn
ZS5jcHAJKHJldmlzaW9uIDE2NTkyOCkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2Vi
UGFnZS9XZWJQYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzg5Niw2ICszODk2LDExNyBAQCBi
b29sIFdlYlBhZ2U6OnNob3VsZFVzZUN1c3RvbUNvbnRlbnRQcm92CiAgICAgcmV0dXJuIG1fbWlt
ZVR5cGVzV2l0aEN1c3RvbUNvbnRlbnRQcm92aWRlcnMuY29udGFpbnMocmVzcG9uc2UubWltZVR5
cGUoKSkgJiYgIWNhblBsdWdpbkhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKIH0KIAorI2lmIFBM
QVRGT1JNKENPQ09BKQorCit2b2lkIFdlYlBhZ2U6Omluc2VydFRleHRBc3luYyhjb25zdCBTdHJp
bmcmIHRleHQsIGNvbnN0IEVkaXRpbmdSYW5nZSYgcmVwbGFjZW1lbnRFZGl0aW5nUmFuZ2UpCit7
CisgICAgRnJhbWUmIGZyYW1lID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS5mb2N1c2VkT3JN
YWluRnJhbWUoKTsKKworICAgIGlmIChyZXBsYWNlbWVudEVkaXRpbmdSYW5nZS5sb2NhdGlvbiAh
PSBub3RGb3VuZCkgeworICAgICAgICBSZWZQdHI8UmFuZ2U+IHJlcGxhY2VtZW50UmFuZ2UgPSBy
YW5nZUZyb21FZGl0aW5nUmFuZ2UoZnJhbWUsIHJlcGxhY2VtZW50RWRpdGluZ1JhbmdlKTsKKyAg
ICAgICAgaWYgKHJlcGxhY2VtZW50UmFuZ2UpCisgICAgICAgICAgICBmcmFtZS5zZWxlY3Rpb24o
KS5zZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihyZXBsYWNlbWVudFJhbmdlLmdldCgpLCBT
RUxfREVGQVVMVF9BRkZJTklUWSkpOworICAgIH0KKworICAgIGlmICghZnJhbWUuZWRpdG9yKCku
aGFzQ29tcG9zaXRpb24oKSkgeworICAgICAgICAvLyBBbiBpbnNlcnRUZXh0OiBtaWdodCBiZSBo
YW5kbGVkIGJ5IG90aGVyIHJlc3BvbmRlcnMgaW4gdGhlIGNoYWluIGlmIHdlIGRvbid0IGhhbmRs
ZSBpdC4KKyAgICAgICAgLy8gT25lIGV4YW1wbGUgaXMgc3BhY2UgYmFyIHRoYXQgcmVzdWx0cyBp
biBzY3JvbGxpbmcgZG93biB0aGUgcGFnZS4KKyAgICAgICAgZnJhbWUuZWRpdG9yKCkuaW5zZXJ0
VGV4dCh0ZXh0LCBudWxscHRyKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZnJhbWUuZWRpdG9yKCku
Y29uZmlybUNvbXBvc2l0aW9uKHRleHQpOworfQorCit2b2lkIFdlYlBhZ2U6OmdldE1hcmtlZFJh
bmdlQXN5bmModWludDY0X3QgY2FsbGJhY2tJRCkKK3sKKyAgICBGcmFtZSYgZnJhbWUgPSBtX3Bh
Z2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAgUmVmUHRy
PFJhbmdlPiByYW5nZSA9IGZyYW1lLmVkaXRvcigpLmNvbXBvc2l0aW9uUmFuZ2UoKTsKKyAgICBz
aXplX3QgbG9jYXRpb247CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBpZiAoIXJhbmdlIHx8ICFU
ZXh0SXRlcmF0b3I6OmdldExvY2F0aW9uQW5kTGVuZ3RoRnJvbVJhbmdlKGZyYW1lLnNlbGVjdGlv
bigpLnJvb3RFZGl0YWJsZUVsZW1lbnRPckRvY3VtZW50RWxlbWVudCgpLCByYW5nZS5nZXQoKSwg
bG9jYXRpb24sIGxlbmd0aCkpIHsKKyAgICAgICAgbG9jYXRpb24gPSBub3RGb3VuZDsKKyAgICAg
ICAgbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBzZW5kKE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6
OkVkaXRpbmdSYW5nZUNhbGxiYWNrKEVkaXRpbmdSYW5nZShsb2NhdGlvbiwgbGVuZ3RoKSwgY2Fs
bGJhY2tJRCkpOworfQorCit2b2lkIFdlYlBhZ2U6OmdldFNlbGVjdGVkUmFuZ2VBc3luYyh1aW50
NjRfdCBjYWxsYmFja0lEKQoreworICAgIEZyYW1lJiBmcmFtZSA9IG1fcGFnZS0+Zm9jdXNDb250
cm9sbGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7CisKKyAgICBzaXplX3QgbG9jYXRpb247Cisg
ICAgc2l6ZV90IGxlbmd0aDsKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gZnJhbWUuc2VsZWN0
aW9uKCkudG9Ob3JtYWxpemVkUmFuZ2UoKTsKKyAgICBpZiAoIXJhbmdlIHx8ICFUZXh0SXRlcmF0
b3I6OmdldExvY2F0aW9uQW5kTGVuZ3RoRnJvbVJhbmdlKGZyYW1lLnNlbGVjdGlvbigpLnJvb3RF
ZGl0YWJsZUVsZW1lbnRPckRvY3VtZW50RWxlbWVudCgpLCByYW5nZS5nZXQoKSwgbG9jYXRpb24s
IGxlbmd0aCkpIHsKKyAgICAgICAgbG9jYXRpb24gPSBub3RGb3VuZDsKKyAgICAgICAgbGVuZ3Ro
ID0gMDsKKyAgICB9CisKKyAgICBzZW5kKE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OkVkaXRpbmdS
YW5nZUNhbGxiYWNrKEVkaXRpbmdSYW5nZShsb2NhdGlvbiwgbGVuZ3RoKSwgY2FsbGJhY2tJRCkp
OworfQorCit2b2lkIFdlYlBhZ2U6OmNoYXJhY3RlckluZGV4Rm9yUG9pbnRBc3luYyhjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYgcG9pbnQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCit7CisgICAgdWlu
dDY0X3QgaW5kZXggPSBub3RGb3VuZDsKKworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gbV9w
YWdlLT5tYWluRnJhbWUoKS5ldmVudEhhbmRsZXIoKS5oaXRUZXN0UmVzdWx0QXRQb2ludChwb2lu
dCk7CisgICAgRnJhbWUqIGZyYW1lID0gcmVzdWx0LmlubmVyTm9uU2hhcmVkTm9kZSgpID8gcmVz
dWx0LmlubmVyTm9kZUZyYW1lKCkgOiAmbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS5mb2N1c2Vk
T3JNYWluRnJhbWUoKTsKKyAgICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gZnJhbWUtPnJh
bmdlRm9yUG9pbnQocmVzdWx0LnJvdW5kZWRQb2ludEluSW5uZXJOb2RlRnJhbWUoKSk7CisgICAg
aWYgKHJhbmdlKSB7CisgICAgICAgIHNpemVfdCBsb2NhdGlvbjsKKyAgICAgICAgc2l6ZV90IGxl
bmd0aDsKKyAgICAgICAgaWYgKFRleHRJdGVyYXRvcjo6Z2V0TG9jYXRpb25BbmRMZW5ndGhGcm9t
UmFuZ2UoZnJhbWUtPnNlbGVjdGlvbigpLnJvb3RFZGl0YWJsZUVsZW1lbnRPckRvY3VtZW50RWxl
bWVudCgpLCByYW5nZS5nZXQoKSwgbG9jYXRpb24sIGxlbmd0aCkpCisgICAgICAgICAgICBpbmRl
eCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihsb2NhdGlvbik7CisgICAgfQorCisgICAgc2VuZChN
ZXNzYWdlczo6V2ViUGFnZVByb3h5OjpVbnNpZ25lZENhbGxiYWNrKGluZGV4LCBjYWxsYmFja0lE
KSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Zmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VBc3luYyhj
b25zdCBFZGl0aW5nUmFuZ2UmIGVkaXRpbmdSYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKK3sK
KyAgICBGcmFtZSYgZnJhbWUgPSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1h
aW5GcmFtZSgpOworICAgIEludFJlY3QgcmVzdWx0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDAs
IDApKTsKKyAgICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gcmFuZ2VGcm9tRWRpdGluZ1Jh
bmdlKGZyYW1lLCBlZGl0aW5nUmFuZ2UpOworICAgIGlmICghcmFuZ2UpIHsKKyAgICAgICAgc2Vu
ZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhy
ZXN1bHQsIEVkaXRpbmdSYW5nZShub3RGb3VuZCwgMCksIGNhbGxiYWNrSUQpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChyYW5nZS0+c3RhcnRDb250YWluZXIoKSk7Cisg
ICAgQVNTRVJUKHJhbmdlLT5lbmRDb250YWluZXIoKSk7CisgICAgIAorICAgIHJlc3VsdCA9IGZy
YW1lLnZpZXcoKS0+Y29udGVudHNUb1dpbmRvdyhmcmFtZS5lZGl0b3IoKS5maXJzdFJlY3RGb3JS
YW5nZShyYW5nZS5nZXQoKSkpOworCisgICAgLy8gRklYTUU6IFVwZGF0ZSBhY3R1YWxSYW5nZSB0
byBtYXRjaCB0aGUgcmFuZ2Ugb2YgZmlyc3QgcmVjdC4KKyAgICBzZW5kKE1lc3NhZ2VzOjpXZWJQ
YWdlUHJveHk6OlJlY3RGb3JDaGFyYWN0ZXJSYW5nZUNhbGxiYWNrKHJlc3VsdCwgZWRpdGluZ1Jh
bmdlLCBjYWxsYmFja0lEKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Q29tcG9zaXRpb25Bc3lu
Yyhjb25zdCBTdHJpbmcmIHRleHQsIFZlY3RvcjxDb21wb3NpdGlvblVuZGVybGluZT4gdW5kZXJs
aW5lcywgY29uc3QgRWRpdGluZ1JhbmdlJiBzZWxlY3Rpb24sIGNvbnN0IEVkaXRpbmdSYW5nZSYg
cmVwbGFjZW1lbnRFZGl0aW5nUmFuZ2UpCit7CisgICAgRnJhbWUmIGZyYW1lID0gbV9wYWdlLT5m
b2N1c0NvbnRyb2xsZXIoKS5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKworICAgIGlmIChmcmFtZS5z
ZWxlY3Rpb24oKS5zZWxlY3Rpb24oKS5pc0NvbnRlbnRFZGl0YWJsZSgpKSB7CisgICAgICAgIFJl
ZlB0cjxSYW5nZT4gcmVwbGFjZW1lbnRSYW5nZTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50RWRp
dGluZ1JhbmdlLmxvY2F0aW9uICE9IG5vdEZvdW5kKSB7CisgICAgICAgICAgICByZXBsYWNlbWVu
dFJhbmdlID0gcmFuZ2VGcm9tRWRpdGluZ1JhbmdlKGZyYW1lLCByZXBsYWNlbWVudEVkaXRpbmdS
YW5nZSk7CisgICAgICAgICAgICBmcmFtZS5zZWxlY3Rpb24oKS5zZXRTZWxlY3Rpb24oVmlzaWJs
ZVNlbGVjdGlvbihyZXBsYWNlbWVudFJhbmdlLmdldCgpLCBTRUxfREVGQVVMVF9BRkZJTklUWSkp
OworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUuZWRpdG9yKCkuc2V0Q29tcG9zaXRpb24odGV4
dCwgdW5kZXJsaW5lcywgc2VsZWN0aW9uLmxvY2F0aW9uLCBzZWxlY3Rpb24ubG9jYXRpb24gKyBz
ZWxlY3Rpb24ubGVuZ3RoKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y29uZmlybUNvbXBv
c2l0aW9uQXN5bmMoKQoreworICAgIEZyYW1lJiBmcmFtZSA9IG1fcGFnZS0+Zm9jdXNDb250cm9s
bGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgZnJhbWUuZWRpdG9yKCkuY29uZmlybUNv
bXBvc2l0aW9uKCk7Cit9CisKKyNlbmRpZiAvLyBQTEFURk9STShDT0NPQSkKKwogI2lmIFBMQVRG
T1JNKEdUSykKIHN0YXRpYyBGcmFtZSogdGFyZ2V0RnJhbWVGb3JFZGl0aW5nKFdlYlBhZ2UqIHBh
Z2UpCiB7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdl
LmgJKHJldmlzaW9uIDE2NTkyOCkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFn
ZS9XZWJQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzOCwxNSArNTM4LDI3IEBAIHB1YmxpYzoK
ICAgICAKICAgICB2b2lkIHNlbmRDb21wbGV4VGV4dElucHV0VG9QbHVnaW4odWludDY0X3QgcGx1
Z2luQ29tcGxleFRleHRJbnB1dElkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgdGV4dElucHV0KTsK
IAotICAgIHZvaWQgY2FuY2VsQ29tcG9zaXRpb24oRWRpdG9yU3RhdGUmIG5ld1N0YXRlKTsKLSNp
ZiAhUExBVEZPUk0oSU9TKQorI2lmIFBMQVRGT1JNKE1BQykKICAgICB2b2lkIGluc2VydFRleHQo
Y29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2Us
IGJvb2wmIGhhbmRsZWQsIEVkaXRvclN0YXRlJiBuZXdTdGF0ZSk7CiAgICAgdm9pZCBzZXRDb21w
b3NpdGlvbihjb25zdCBTdHJpbmcmIHRleHQsIFZlY3RvcjxXZWJDb3JlOjpDb21wb3NpdGlvblVu
ZGVybGluZT4gdW5kZXJsaW5lcywgY29uc3QgRWRpdGluZ1JhbmdlJiBzZWxlY3Rpb25SYW5nZSwg
Y29uc3QgRWRpdGluZ1JhbmdlJiByZXBsYWNlbWVudFJhbmdlLCBFZGl0b3JTdGF0ZSYgbmV3U3Rh
dGUpOwogICAgIHZvaWQgY29uZmlybUNvbXBvc2l0aW9uKEVkaXRvclN0YXRlJiBuZXdTdGF0ZSk7
CisgICAgdm9pZCBpbnNlcnREaWN0YXRlZFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBF
ZGl0aW5nUmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UsIGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpEaWN0
YXRpb25BbHRlcm5hdGl2ZT4mIGRpY3RhdGlvbkFsdGVybmF0aXZlTG9jYXRpb25zLCBib29sJiBo
YW5kbGVkLCBFZGl0b3JTdGF0ZSYgbmV3U3RhdGUpOworICAgIHZvaWQgaW5zZXJ0RGljdGF0ZWRU
ZXh0QXN5bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2Vt
ZW50UmFuZ2UsIGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpEaWN0YXRpb25BbHRlcm5hdGl2ZT4mIGRp
Y3RhdGlvbkFsdGVybmF0aXZlTG9jYXRpb25zKTsKKyAgICB2b2lkIGdldEF0dHJpYnV0ZWRTdWJz
dHJpbmdGcm9tUmFuZ2UoY29uc3QgRWRpdGluZ1JhbmdlJiwgQXR0cmlidXRlZFN0cmluZyYpOwor
ICAgIHZvaWQgYXR0cmlidXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQXN5bmMoY29uc3Qg
RWRpdGluZ1JhbmdlJiwgdWludDY0X3QgY2FsbGJhY2tJRCk7CiAjZW5kaWYKKworICAgIHZvaWQg
aW5zZXJ0VGV4dEFzeW5jKGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgRWRpdGluZ1JhbmdlJiBy
ZXBsYWNlbWVudFJhbmdlKTsKKyAgICB2b2lkIGdldE1hcmtlZFJhbmdlQXN5bmModWludDY0X3Qg
Y2FsbGJhY2tJRCk7CisgICAgdm9pZCBnZXRTZWxlY3RlZFJhbmdlQXN5bmModWludDY0X3QgY2Fs
bGJhY2tJRCk7CisgICAgdm9pZCBjaGFyYWN0ZXJJbmRleEZvclBvaW50QXN5bmMoY29uc3QgV2Vi
Q29yZTo6SW50UG9pbnQmLCB1aW50NjRfdCBjYWxsYmFja0lEKTsKKyAgICB2b2lkIGZpcnN0UmVj
dEZvckNoYXJhY3RlclJhbmdlQXN5bmMoY29uc3QgRWRpdGluZ1JhbmdlJiwgdWludDY0X3QgY2Fs
bGJhY2tJRCk7CisgICAgdm9pZCBzZXRDb21wb3NpdGlvbkFzeW5jKGNvbnN0IFN0cmluZyYgdGV4
dCwgVmVjdG9yPFdlYkNvcmU6OkNvbXBvc2l0aW9uVW5kZXJsaW5lPiB1bmRlcmxpbmVzLCBjb25z
dCBFZGl0aW5nUmFuZ2UmIHNlbGVjdGlvblJhbmdlLCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxh
Y2VtZW50UmFuZ2UpOworICAgIHZvaWQgY29uZmlybUNvbXBvc2l0aW9uQXN5bmMoKTsKKworICAg
IHZvaWQgY2FuY2VsQ29tcG9zaXRpb24oRWRpdG9yU3RhdGUmIG5ld1N0YXRlKTsKICAgICB2b2lk
IGdldE1hcmtlZFJhbmdlKEVkaXRpbmdSYW5nZSYpOwogICAgIHZvaWQgZ2V0U2VsZWN0ZWRSYW5n
ZShFZGl0aW5nUmFuZ2UmKTsKLSAgICB2b2lkIGdldEF0dHJpYnV0ZWRTdWJzdHJpbmdGcm9tUmFu
Z2UoY29uc3QgRWRpdGluZ1JhbmdlJiwgQXR0cmlidXRlZFN0cmluZyYpOwogICAgIHZvaWQgY2hh
cmFjdGVySW5kZXhGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCBwb2ludCwgdWludDY0
X3QmIHJlc3VsdCk7CiAgICAgdm9pZCBmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZShjb25zdCBF
ZGl0aW5nUmFuZ2UmLCBXZWJDb3JlOjpJbnRSZWN0JiByZXN1bHRSZWN0KTsKICAgICB2b2lkIGV4
ZWN1dGVLZXlwcmVzc0NvbW1hbmRzKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpLZXlwcmVzc0NvbW1h
bmQ+JiwgYm9vbCYgaGFuZGxlZCwgRWRpdG9yU3RhdGUmIG5ld1N0YXRlKTsKQEAgLTU1Niw3ICs1
NjgsNiBAQCBwdWJsaWM6CiAgICAgdm9pZCBzaG91bGREZWxheVdpbmRvd09yZGVyaW5nRXZlbnQo
Y29uc3QgV2ViS2l0OjpXZWJNb3VzZUV2ZW50JiwgYm9vbCYgcmVzdWx0KTsKICAgICB2b2lkIGFj
Y2VwdHNGaXJzdE1vdXNlKGludCBldmVudE51bWJlciwgY29uc3QgV2ViS2l0OjpXZWJNb3VzZUV2
ZW50JiwgYm9vbCYgcmVzdWx0KTsKICAgICBib29sIHBlcmZvcm1Ob25FZGl0aW5nQmVoYXZpb3JG
b3JTZWxlY3Rvcihjb25zdCBTdHJpbmcmLCBXZWJDb3JlOjpLZXlib2FyZEV2ZW50Kik7Ci0gICAg
dm9pZCBpbnNlcnREaWN0YXRlZFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5n
UmFuZ2UmIHJlcGxhY2VtZW50UmFuZ2UsIGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpEaWN0YXRpb25B
bHRlcm5hdGl2ZT4mIGRpY3RhdGlvbkFsdGVybmF0aXZlTG9jYXRpb25zLCBib29sJiBoYW5kbGVk
LCBFZGl0b3JTdGF0ZSYgbmV3U3RhdGUpOwogI2VsaWYgUExBVEZPUk0oRUZMKQogICAgIHZvaWQg
Y29uZmlybUNvbXBvc2l0aW9uKGNvbnN0IFN0cmluZyYgY29tcG9zaXRpb25TdHJpbmcpOwogICAg
IHZvaWQgc2V0Q29tcG9zaXRpb24oY29uc3QgV1RGOjpTdHJpbmcmIGNvbXBvc2l0aW9uU3RyaW5n
LCBjb25zdCBXVEY6OlZlY3RvcjxXZWJDb3JlOjpDb21wb3NpdGlvblVuZGVybGluZT4mIHVuZGVy
bGluZXMsIHVpbnQ2NF90IGN1cnNvclBvc2l0aW9uKTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dl
YlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCShyZXZpc2lv
biAxNjU5MjgpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5t
ZXNzYWdlcy5pbgkod29ya2luZyBjb3B5KQpAQCAtNTYsNiArNTYsNyBAQCBtZXNzYWdlcyAtPiBX
ZWJQYWdlIExlZ2FjeVJlY2VpdmVyIHsKICAgICBTeW5jQXBwbHlBdXRvY29ycmVjdGlvbihTdHJp
bmcgY29ycmVjdGlvbiwgU3RyaW5nIG9yaWdpbmFsVGV4dCkgLT4gKGJvb2wgYXV0b2NvcnJlY3Rp
b25BcHBsaWVkKQogICAgIFJlcXVlc3RBdXRvY29ycmVjdGlvbkNvbnRleHQodWludDY0X3QgY2Fs
bGJhY2tJRCkKICAgICBHZXRBdXRvY29ycmVjdGlvbkNvbnRleHQoKSAtPiAoU3RyaW5nIGJlZm9y
ZUNvbnRleHQsIFN0cmluZyBtYXJrZWRUZXh0LCBTdHJpbmcgc2VsZWN0ZWRUZXh0LCBTdHJpbmcg
YWZ0ZXJDb250ZXh0LCB1aW50NjRfdCBsb2NhdGlvbiwgdWludDY0X3QgbGVuZ3RoKSAKKyAgICAj
IEZJWE1FOiBVc2Ugc2hhcmVkIENPQ09BIHRleHQgaW5wdXQgbWV0aG9kcyBsaWtlIGluc2VydFRl
eHRBc3luYy4KICAgICBJbnNlcnRUZXh0KFN0cmluZyB0ZXh0LCBXZWJLaXQ6OkVkaXRpbmdSYW5n
ZSByZXBsYWNlbWVudFJhbmdlKQogICAgIFNldENvbXBvc2l0aW9uKFN0cmluZyB0ZXh0LCBWZWN0
b3I8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+IHVuZGVybGluZXMsIFdlYktpdDo6RWRp
dGluZ1JhbmdlIHNlbGVjdGlvblJhbmdlKQogICAgIENvbmZpcm1Db21wb3NpdGlvbigpCkBAIC0y
OTgsMTggKzI5OSwyOCBAQCBtZXNzYWdlcyAtPiBXZWJQYWdlIExlZ2FjeVJlY2VpdmVyIHsKICAg
ICBDYW5jZWxDb21wb3NpdGlvbigpIC0+IChXZWJLaXQ6OkVkaXRvclN0YXRlIG5ld1N0YXRlKQog
ICAgIEdldE1hcmtlZFJhbmdlKCkgLT4gKFdlYktpdDo6RWRpdGluZ1JhbmdlIHJhbmdlKQogICAg
IEdldFNlbGVjdGVkUmFuZ2UoKSAtPiAoV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmFuZ2UpCi0gICAg
R2V0QXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5nZShXZWJLaXQ6OkVkaXRpbmdSYW5nZSByYW5n
ZSkgLT4gKFdlYktpdDo6QXR0cmlidXRlZFN0cmluZyByZXN1bHQpCiAgICAgQ2hhcmFjdGVySW5k
ZXhGb3JQb2ludChXZWJDb3JlOjpJbnRQb2ludCBwb2ludCkgLT4gKHVpbnQ2NF90IHJlc3VsdCkK
ICAgICBGaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZShXZWJLaXQ6OkVkaXRpbmdSYW5nZSByYW5n
ZSkgLT4gKFdlYkNvcmU6OkludFJlY3QgcmVzdWx0UmVjdCkKICAgICBFeGVjdXRlS2V5cHJlc3ND
b21tYW5kcyhWZWN0b3I8V2ViQ29yZTo6S2V5cHJlc3NDb21tYW5kPiBzYXZlZENvbW1hbmRzKSAt
PiAoYm9vbCBoYW5kbGVkLCBXZWJLaXQ6OkVkaXRvclN0YXRlIG5ld1N0YXRlKQogICAgIFNob3Vs
ZERlbGF5V2luZG93T3JkZXJpbmdFdmVudChXZWJLaXQ6OldlYk1vdXNlRXZlbnQgZXZlbnQpIC0+
IChib29sIHJlc3VsdCkKICAgICBBY2NlcHRzRmlyc3RNb3VzZShpbnQgZXZlbnROdW1iZXIsIFdl
YktpdDo6V2ViTW91c2VFdmVudCBldmVudCkgLT4gKGJvb2wgcmVzdWx0KQotICAgIEluc2VydERp
Y3RhdGVkVGV4dChTdHJpbmcgdGV4dCwgV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmVwbGFjZW1lbnRS
YW5nZSwgVmVjdG9yPFdlYkNvcmU6OkRpY3RhdGlvbkFsdGVybmF0aXZlPiBkaWN0YXRpb25BbHRl
cm5hdGl2ZXMpIC0+IChib29sIGhhbmRsZWQsIFdlYktpdDo6RWRpdG9yU3RhdGUgbmV3U3RhdGUp
CisKKyAgICBJbnNlcnRUZXh0QXN5bmMoU3RyaW5nIHRleHQsIFdlYktpdDo6RWRpdGluZ1Jhbmdl
IHJlcGxhY2VtZW50UmFuZ2UpCisgICAgR2V0TWFya2VkUmFuZ2VBc3luYyh1aW50NjRfdCBjYWxs
YmFja0lEKQorICAgIEdldFNlbGVjdGVkUmFuZ2VBc3luYyh1aW50NjRfdCBjYWxsYmFja0lEKQor
ICAgIENoYXJhY3RlckluZGV4Rm9yUG9pbnRBc3luYyhXZWJDb3JlOjpJbnRQb2ludCBwb2ludCwg
dWludDY0X3QgY2FsbGJhY2tJRCk7CisgICAgRmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2VBc3lu
YyhXZWJLaXQ6OkVkaXRpbmdSYW5nZSByYW5nZSwgdWludDY0X3QgY2FsbGJhY2tJRCk7CisgICAg
U2V0Q29tcG9zaXRpb25Bc3luYyhTdHJpbmcgdGV4dCwgVmVjdG9yPFdlYkNvcmU6OkNvbXBvc2l0
aW9uVW5kZXJsaW5lPiB1bmRlcmxpbmVzLCBXZWJLaXQ6OkVkaXRpbmdSYW5nZSBzZWxlY3Rpb25S
YW5nZSwgV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmVwbGFjZW1lbnRSYW5nZSkKKyAgICBDb25maXJt
Q29tcG9zaXRpb25Bc3luYygpCiAjZW5kaWYKICNpZiBQTEFURk9STShNQUMpCiAgICAgSW5zZXJ0
VGV4dChTdHJpbmcgdGV4dCwgV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmVwbGFjZW1lbnRSYW5nZSkg
LT4gKGJvb2wgaGFuZGxlZCwgV2ViS2l0OjpFZGl0b3JTdGF0ZSBuZXdTdGF0ZSkKICAgICBTZXRD
b21wb3NpdGlvbihTdHJpbmcgdGV4dCwgVmVjdG9yPFdlYkNvcmU6OkNvbXBvc2l0aW9uVW5kZXJs
aW5lPiB1bmRlcmxpbmVzLCBXZWJLaXQ6OkVkaXRpbmdSYW5nZSBzZWxlY3Rpb25SYW5nZSwgV2Vi
S2l0OjpFZGl0aW5nUmFuZ2UgcmVwbGFjZW1lbnRSYW5nZSkgLT4gKFdlYktpdDo6RWRpdG9yU3Rh
dGUgbmV3U3RhdGUpCiAgICAgQ29uZmlybUNvbXBvc2l0aW9uKCkgLT4gKFdlYktpdDo6RWRpdG9y
U3RhdGUgbmV3U3RhdGUpCisgICAgSW5zZXJ0RGljdGF0ZWRUZXh0KFN0cmluZyB0ZXh0LCBXZWJL
aXQ6OkVkaXRpbmdSYW5nZSByZXBsYWNlbWVudFJhbmdlLCBWZWN0b3I8V2ViQ29yZTo6RGljdGF0
aW9uQWx0ZXJuYXRpdmU+IGRpY3RhdGlvbkFsdGVybmF0aXZlcykgLT4gKGJvb2wgaGFuZGxlZCwg
V2ViS2l0OjpFZGl0b3JTdGF0ZSBuZXdTdGF0ZSkKKyAgICBJbnNlcnREaWN0YXRlZFRleHRBc3lu
YyhTdHJpbmcgdGV4dCwgV2ViS2l0OjpFZGl0aW5nUmFuZ2UgcmVwbGFjZW1lbnRSYW5nZSwgVmVj
dG9yPFdlYkNvcmU6OkRpY3RhdGlvbkFsdGVybmF0aXZlPiBkaWN0YXRpb25BbHRlcm5hdGl2ZXMp
CisgICAgR2V0QXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5nZShXZWJLaXQ6OkVkaXRpbmdSYW5n
ZSByYW5nZSkgLT4gKFdlYktpdDo6QXR0cmlidXRlZFN0cmluZyByZXN1bHQpCisgICAgQXR0cmli
dXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQXN5bmMoV2ViS2l0OjpFZGl0aW5nUmFuZ2Ug
cmFuZ2UsIHVpbnQ2NF90IGNhbGxiYWNrSUQpOwogI2VuZGlmCiAgICAgU2V0TWluaW11bUxheW91
dFNpemUoV2ViQ29yZTo6SW50U2l6ZSBtaW5pbXVtTGF5b3V0U2l6ZSkKICAgICBTZXRBdXRvU2l6
aW5nU2hvdWxkRXhwYW5kVG9WaWV3SGVpZ2h0KGJvb2wgc2hvdWxkRXhwYW5kKQpJbmRleDogU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5t
bQkocmV2aXNpb24gMTY1OTI4KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdl
L2lvcy9XZWJQYWdlSU9TLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yMDQsMTEgKzIwNCw2IEBAIHZv
aWQgV2ViUGFnZTo6aW5zZXJ0VGV4dChjb25zdCBTdHJpbmcmIHQKICAgICAgICAgZnJhbWUuZWRp
dG9yKCkuY29uZmlybUNvbXBvc2l0aW9uKHRleHQpOwogfQogCi12b2lkIFdlYlBhZ2U6Omluc2Vy
dERpY3RhdGVkVGV4dChjb25zdCBTdHJpbmcmLCBjb25zdCBFZGl0aW5nUmFuZ2UmLCBjb25zdCBW
ZWN0b3I8V2ViQ29yZTo6RGljdGF0aW9uQWx0ZXJuYXRpdmU+JiwgYm9vbCYsIEVkaXRvclN0YXRl
JikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCiB2b2lkIFdlYlBhZ2U6OmdldE1hcmtl
ZFJhbmdlKEVkaXRpbmdSYW5nZSYpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKQEAgLTIxOSwx
MSArMjE0LDYgQEAgdm9pZCBXZWJQYWdlOjpnZXRTZWxlY3RlZFJhbmdlKEVkaXRpbmdSYQogICAg
IG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLXZvaWQgV2ViUGFnZTo6Z2V0QXR0cmlidXRlZFN1YnN0
cmluZ0Zyb21SYW5nZShjb25zdCBFZGl0aW5nUmFuZ2UmLCBBdHRyaWJ1dGVkU3RyaW5nJikKLXsK
LSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCiB2b2lkIFdlYlBhZ2U6OmNoYXJhY3RlckluZGV4
Rm9yUG9pbnQoSW50UG9pbnQsIHVpbnQ2NF90JikKIHsKICAgICBub3RJbXBsZW1lbnRlZCgpOwpJ
bmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9XZWJQYWdlTWFjLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV2Vi
UGFnZU1hYy5tbQkocmV2aXNpb24gMTY1OTI4KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vz
cy9XZWJQYWdlL21hYy9XZWJQYWdlTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMTQsNiArMzE0
LDIwIEBAIHZvaWQgV2ViUGFnZTo6aW5zZXJ0RGljdGF0ZWRUZXh0KGNvbnN0IFMKICAgICBuZXdT
dGF0ZSA9IGVkaXRvclN0YXRlKCk7CiB9CiAKK3ZvaWQgV2ViUGFnZTo6aW5zZXJ0RGljdGF0ZWRU
ZXh0QXN5bmMoY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBFZGl0aW5nUmFuZ2UmIHJlcGxhY2Vt
ZW50RWRpdGluZ1JhbmdlLCBjb25zdCBWZWN0b3I8V2ViQ29yZTo6RGljdGF0aW9uQWx0ZXJuYXRp
dmU+JiBkaWN0YXRpb25BbHRlcm5hdGl2ZUxvY2F0aW9ucykKK3sKKyAgICBGcmFtZSYgZnJhbWUg
PSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAg
aWYgKHJlcGxhY2VtZW50RWRpdGluZ1JhbmdlLmxvY2F0aW9uICE9IG5vdEZvdW5kKSB7CisgICAg
ICAgIFJlZlB0cjxSYW5nZT4gcmVwbGFjZW1lbnRSYW5nZSA9IHJhbmdlRnJvbUVkaXRpbmdSYW5n
ZShmcmFtZSwgcmVwbGFjZW1lbnRFZGl0aW5nUmFuZ2UpOworICAgICAgICBpZiAocmVwbGFjZW1l
bnRSYW5nZSkKKyAgICAgICAgICAgIGZyYW1lLnNlbGVjdGlvbigpLnNldFNlbGVjdGlvbihWaXNp
YmxlU2VsZWN0aW9uKHJlcGxhY2VtZW50UmFuZ2UuZ2V0KCksIFNFTF9ERUZBVUxUX0FGRklOSVRZ
KSk7CisgICAgfQorCisgICAgQVNTRVJUKCFmcmFtZS5lZGl0b3IoKS5oYXNDb21wb3NpdGlvbigp
KTsKKyAgICBmcmFtZS5lZGl0b3IoKS5pbnNlcnREaWN0YXRlZFRleHQodGV4dCwgZGljdGF0aW9u
QWx0ZXJuYXRpdmVMb2NhdGlvbnMsIG51bGxwdHIpOworfQorCiB2b2lkIFdlYlBhZ2U6OmdldE1h
cmtlZFJhbmdlKEVkaXRpbmdSYW5nZSYgcmVzdWx0KQogewogICAgIEZyYW1lJiBmcmFtZSA9IG1f
cGFnZS0+Zm9jdXNDb250cm9sbGVyKCkuZm9jdXNlZE9yTWFpbkZyYW1lKCk7CkBAIC0zNjUsNiAr
Mzc5LDM5IEBAIHZvaWQgV2ViUGFnZTo6Z2V0QXR0cmlidXRlZFN1YnN0cmluZ0Zyb20KICAgICB9
CiB9CiAKK3ZvaWQgV2ViUGFnZTo6YXR0cmlidXRlZFN1YnN0cmluZ0ZvckNoYXJhY3RlclJhbmdl
QXN5bmMoY29uc3QgRWRpdGluZ1JhbmdlJiBlZGl0aW5nUmFuZ2UsIHVpbnQ2NF90IGNhbGxiYWNr
SUQpCit7CisgICAgQXR0cmlidXRlZFN0cmluZyByZXN1bHQ7CisKKyAgICBGcmFtZSYgZnJhbWUg
PSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFtZSgpOworCisgICAg
Y29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgc2VsZWN0aW9uID0gZnJhbWUuc2VsZWN0aW9uKCkuc2Vs
ZWN0aW9uKCk7CisgICAgaWYgKHNlbGVjdGlvbi5pc05vbmUoKSB8fCAhc2VsZWN0aW9uLmlzQ29u
dGVudEVkaXRhYmxlKCkgfHwgc2VsZWN0aW9uLmlzSW5QYXNzd29yZEZpZWxkKCkpIHsKKyAgICAg
ICAgc2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpBdHRyaWJ1dGVkU3RyaW5nRm9yQ2hhcmFj
dGVyUmFuZ2VDYWxsYmFjayhyZXN1bHQsIEVkaXRpbmdSYW5nZSgpLCBjYWxsYmFja0lEKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gcmFuZ2VG
cm9tRWRpdGluZ1JhbmdlKGZyYW1lLCBlZGl0aW5nUmFuZ2UpOworICAgIGlmICghcmFuZ2UpIHsK
KyAgICAgICAgc2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpBdHRyaWJ1dGVkU3RyaW5nRm9y
Q2hhcmFjdGVyUmFuZ2VDYWxsYmFjayhyZXN1bHQsIEVkaXRpbmdSYW5nZSgpLCBjYWxsYmFja0lE
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXN1bHQuc3RyaW5nID0gW1dlYkhU
TUxDb252ZXJ0ZXIgZWRpdGluZ0F0dHJpYnV0ZWRTdHJpbmdGcm9tUmFuZ2U6cmFuZ2UuZ2V0KCld
OworICAgIE5TQXR0cmlidXRlZFN0cmluZyogYXR0cmlidXRlZFN0cmluZyA9IHJlc3VsdC5zdHJp
bmcuZ2V0KCk7CisgICAgCisgICAgLy8gW1dlYkhUTUxDb252ZXJ0ZXIgZWRpdGluZ0F0dHJpYnV0
ZWRTdHJpbmdGcm9tUmFuZ2U6XSBpbnNpc3RzIG9uIGluc2VydGluZyBhIHRyYWlsaW5nIAorICAg
IC8vIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdoaWNoIGJyZWFrcyB0aGUg
QVRPSyBpbnB1dCBtZXRob2QuICA8cmRhcjovL3Byb2JsZW0vNTQwMDU1MT4KKyAgICAvLyBUbyB3
b3JrIGFyb3VuZCB0aGlzIHdlIHRydW5jYXRlIHRoZSByZXN1bHRhbnQgc3RyaW5nIHRvIHRoZSBj
b3JyZWN0IGxlbmd0aC4KKyAgICBpZiAoW2F0dHJpYnV0ZWRTdHJpbmcgbGVuZ3RoXSA+IGVkaXRp
bmdSYW5nZS5sZW5ndGgpIHsKKyAgICAgICAgQVNTRVJUKFthdHRyaWJ1dGVkU3RyaW5nIGxlbmd0
aF0gPT0gZWRpdGluZ1JhbmdlLmxlbmd0aCArIDEpOworICAgICAgICBBU1NFUlQoW1thdHRyaWJ1
dGVkU3RyaW5nIHN0cmluZ10gY2hhcmFjdGVyQXRJbmRleDplZGl0aW5nUmFuZ2UubGVuZ3RoXSA9
PSAnXG4nIHx8IFtbYXR0cmlidXRlZFN0cmluZyBzdHJpbmddIGNoYXJhY3RlckF0SW5kZXg6ZWRp
dGluZ1JhbmdlLmxlbmd0aF0gPT0gJyAnKTsKKyAgICAgICAgcmVzdWx0LnN0cmluZyA9IFthdHRy
aWJ1dGVkU3RyaW5nIGF0dHJpYnV0ZWRTdWJzdHJpbmdGcm9tUmFuZ2U6TlNNYWtlUmFuZ2UoMCwg
ZWRpdGluZ1JhbmdlLmxlbmd0aCldOworICAgIH0KKworICAgIHNlbmQoTWVzc2FnZXM6OldlYlBh
Z2VQcm94eTo6QXR0cmlidXRlZFN0cmluZ0ZvckNoYXJhY3RlclJhbmdlQ2FsbGJhY2socmVzdWx0
LCBFZGl0aW5nUmFuZ2UoZWRpdGluZ1JhbmdlLmxvY2F0aW9uLCBbcmVzdWx0LnN0cmluZyBsZW5n
dGhdKSwgY2FsbGJhY2tJRCkpOworfQorCiB2b2lkIFdlYlBhZ2U6OmNoYXJhY3RlckluZGV4Rm9y
UG9pbnQoSW50UG9pbnQgcG9pbnQsIHVpbnQ2NF90JiBpbmRleCkKIHsKICAgICBpbmRleCA9IG5v
dEZvdW5kOwo=
</data>
<flag name="review"
          id="251469"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
      

    </bug>

</bugzilla>