<?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>35859</bug_id>
          
          <creation_ts>2010-03-08 03:03:52 -0800</creation_ts>
          <short_desc>[DRT/Chromium] Add EventSendingController</short_desc>
          <delta_ts>2010-03-09 03:56:01 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>All</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>
          
          <blocked>35902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>hamaji</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>197105</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 03:03:52 -0800</bug_when>
    <thetext>[DRT/Chromium] Add EventSendingController</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197106</commentid>
    <comment_count>1</comment_count>
      <attachid>50200</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 03:05:41 -0800</bug_when>
    <thetext>Created attachment 50200
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197107</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-08 03:10:34 -0800</bug_when>
    <thetext>Attachment 50200 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKitTools/DumpRenderTree/chromium/EventSendingController.cpp:782:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebKitTools/DumpRenderTree/chromium/EventSendingController.cpp:784:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 2 in 3 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>197109</commentid>
    <comment_count>3</comment_count>
      <attachid>50202</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 03:11:57 -0800</bug_when>
    <thetext>Created attachment 50202
Proposed patch rev.2 (style fix)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197110</commentid>
    <comment_count>4</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 03:12:34 -0800</bug_when>
    <thetext>Some notes for the patch:
 - I left ScopedRunnableMethodFactory.  It&apos;s defined in task.h and task.h is needed for MessageLoop::current()-&gt;postTask().
 - gfx::Point was replaced with WebKit::WebPoint.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197111</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-08 03:16:50 -0800</bug_when>
    <thetext>Attachment 50202 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKitTools/DumpRenderTree/chromium/EventSendingController.cpp:782:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebKitTools/DumpRenderTree/chromium/EventSendingController.cpp:784:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 2 in 3 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>197118</commentid>
    <comment_count>6</comment_count>
      <attachid>50206</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 04:21:21 -0800</bug_when>
    <thetext>Created attachment 50206
Proposed patch rev.3 (style fix)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197439</commentid>
    <comment_count>7</comment_count>
      <attachid>50206</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-08 20:51:15 -0800</bug_when>
    <thetext>Comment on attachment 50206
Proposed patch rev.3 (style fix)

ok, except let&apos;s rename the file to EventSender.h/cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197467</commentid>
    <comment_count>8</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 22:49:37 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 50206 [details])
&gt; ok, except let&apos;s rename the file to EventSender.h/cpp

Ok, I renamed files, the class name, updated ChangeLog, did check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197468</commentid>
    <comment_count>9</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-08 22:52:44 -0800</bug_when>
    <thetext>Landed as r55713.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50200</attachid>
            <date>2010-03-08 03:05:41 -0800</date>
            <delta_ts>2010-03-08 03:11:51 -0800</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-35859-20100308200539.patch</filename>
            <type>text/plain</type>
            <size>37609</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA4Y2FlNzA1Li44NGUzYjI5IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDMt
MDggIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBFdmVudFNl
bmRpbmdDb250cm9sbGVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTg1OQorCisgICAgICAgIEFkZCBFdm5ldFNlbmRpbmdDb250cm9sbGVyIGNsYXNz
ZXMsIHdoaWNoIGFyZSBnb2luZyB0byBiZSB1c2VkIGJ5CisgICAgICAgIER1bXBSZW5kZXJUcmVl
IENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoKKyAgICAgICAgLSBzcmMv
d2Via2l0L3Rvb2xzL3Rlc3Rfc2hlbGwvZXZlbnRfc2VuZGluZ19jb250cm9sbGVyLmNjCisgICAg
ICAgIC0gc3JjL3dlYmtpdC90b29scy90ZXN0X3NoZWxsL2V2ZW50X3NlbmRpbmdfY29udHJvbGxl
ci5oCisgICAgICAgIG9mIENocm9taXVtIHJldi40MDQ5Mi4KKworICAgICAgICAqIER1bXBSZW5k
ZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmg6IEFk
ZGVkLgorCiAyMDEwLTAzLTA3ICBLZW50IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBEaW1pdHJpIEdsYXprb3YuCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmNwcCBi
L1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xs
ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTU2MzMKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNl
bmRpbmdDb250cm9sbGVyLmNwcApAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIFRoaXMgZmlsZSBjb250YWlu
cyB0aGUgZGVmaW5pdGlvbiBmb3IgRXZlbnRTZW5kaW5nQ29udHJvbGxlci4KKy8vCisvLyBTb21l
IG5vdGVzIGFib3V0IGRyYWcgYW5kIGRyb3AgaGFuZGxpbmc6CisvLyBXaW5kb3dzIGRyYWcgYW5k
IGRyb3AgZ29lcyB0aHJvdWdoIGEgc3lzdGVtIGNhbGwgdG8gZG9EcmFnRHJvcC4gIEF0IHRoYXQK
Ky8vIHBvaW50LCBwcm9ncmFtIGNvbnRyb2wgaXMgZ2l2ZW4gdG8gV2luZG93cyB3aGljaCB0aGVu
IHBlcmlvZGljYWxseSBtYWtlcworLy8gY2FsbGJhY2tzIGludG8gdGhlIHdlYnZpZXcuICBUaGlz
IHdvbid0IHdvcmsgZm9yIGxheW91dCB0ZXN0cywgc28gaW5zdGVhZCwKKy8vIHdlIHF1ZXVlIHVw
IGFsbCB0aGUgbW91c2UgbW92ZSBhbmQgbW91c2UgdXAgZXZlbnRzLiAgV2hlbiB0aGUgdGVzdCB0
cmllcyB0bworLy8gc3RhcnQgYSBkcmFnIChieSBjYWxsaW5nIEV2ZW5TZW5kaW5nQ29udHJvbGxl
cjo6ZG9EcmFnRHJvcCksIHdlIHRha2UgdGhlCisvLyBldmVudHMgaW4gdGhlIHF1ZXVlIGFuZCBy
ZXBsYXkgdGhlbS4KKy8vIFRoZSBiZWhhdmlvciBvZiBxdWV1aW5nIGV2ZW50cyBhbmQgcmVwbGF5
aW5nIHRoZW0gY2FuIGJlIGRpc2FibGVkIGJ5IGEKKy8vIGxheW91dCB0ZXN0IGJ5IHNldHRpbmcg
ZXZlbnRTZW5kZXIuZHJhZ01vZGUgdG8gZmFsc2UuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJFdmVudFNlbmRpbmdDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlICJUZXN0U2hlbGwu
aCIKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAiYmFzZS9m
aWxlX3BhdGguaCIKKyNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgorI2luY2x1ZGUgImJhc2Uv
a2V5Ym9hcmRfY29kZXMuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorI2luY2x1
ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL3N5c19zdHJpbmdfY29udmVy
c2lvbnMuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRHJh
Z0RhdGEuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRHJhZ09wZXJhdGlvbi5oIgorI2luY2x1ZGUg
InB1YmxpYy9XZWJQb2ludC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJTdHJpbmcuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViVmlldy5oIgorI2luY2x1ZGUgPHd0Zi9EZXF1ZS5oPgorCisjaWYgT1Mo
V0lORE9XUykKKyNpbmNsdWRlICJwdWJsaWMvd2luL1dlYklucHV0RXZlbnRGYWN0b3J5LmgiCisj
ZW5kaWYKKworLy8gRklYTUU6IGxheW91dCBiZWZvcmUgZWFjaCBldmVudD8KKwordXNpbmcgbmFt
ZXNwYWNlIGJhc2U7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdlYktp
dDsKKworVGVzdFNoZWxsKiBFdmVudFNlbmRpbmdDb250cm9sbGVyOjp0ZXN0U2hlbGwgPSAwOwor
V2ViUG9pbnQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bGFzdE1vdXNlUG9zOworV2ViTW91c2VF
dmVudDo6QnV0dG9uIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnByZXNzZWRCdXR0b24gPSBXZWJN
b3VzZUV2ZW50OjpCdXR0b25Ob25lOworV2ViTW91c2VFdmVudDo6QnV0dG9uIEV2ZW50U2VuZGlu
Z0NvbnRyb2xsZXI6Omxhc3RCdXR0b25UeXBlID0gV2ViTW91c2VFdmVudDo6QnV0dG9uTm9uZTsK
Kworc3RydWN0IFNhdmVkRXZlbnQgeworICAgIGVudW0gU2F2ZWRFdmVudFR5cGUgeworICAgICAg
ICBVbnNwZWNpZmllZCwKKyAgICAgICAgTW91c2VVcCwKKyAgICAgICAgTW91c2VNb3ZlLAorICAg
ICAgICBMZWFwRm9yd2FyZAorICAgIH07CisKKyAgICBTYXZlZEV2ZW50VHlwZSB0eXBlOworICAg
IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBidXR0b25UeXBlOyAvLyBGb3IgTW91c2VVcC4KKyAgICBX
ZWJQb2ludCBwb3M7IC8vIEZvciBNb3VzZU1vdmUuCisgICAgaW50IG1pbGxpc2Vjb25kczsgLy8g
Rm9yIExlYXBGb3J3YXJkLgorCisgICAgU2F2ZWRFdmVudCgpCisgICAgICAgIDogdHlwZShVbnNw
ZWNpZmllZCkKKyAgICAgICAgLCBidXR0b25UeXBlKFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmUp
CisgICAgICAgICwgbWlsbGlzZWNvbmRzKDApIHt9Cit9OworCitzdGF0aWMgV2ViRHJhZ0RhdGEg
Y3VycmVudERyYWdEYXRhOworc3RhdGljIFdlYkRyYWdPcGVyYXRpb24gY3VycmVudERyYWdFZmZl
Y3Q7CitzdGF0aWMgV2ViRHJhZ09wZXJhdGlvbnNNYXNrIGN1cnJlbnREcmFnRWZmZWN0c0FsbG93
ZWQ7CitzdGF0aWMgYm9vbCByZXBsYXlpbmdTYXZlZEV2ZW50cyA9IGZhbHNlOworc3RhdGljIERl
cXVlPFNhdmVkRXZlbnQ+IG1vdXNlRXZlbnRRdWV1ZTsKKworLy8gVGltZSBhbmQgcGxhY2Ugb2Yg
dGhlIGxhc3QgbW91c2UgdXAgZXZlbnQuCitzdGF0aWMgZG91YmxlIGxhc3RDbGlja1RpbWVTZWMg
PSAwOworc3RhdGljIFdlYlBvaW50IGxhc3RDbGlja1BvczsKK3N0YXRpYyBpbnQgY2xpY2tDb3Vu
dCA9IDA7CisKKy8vIG1heGltdW0gZGlzdGFuY2UgKGluIHNwYWNlIGFuZCB0aW1lKSBmb3IgYSBt
b3VzZSBjbGljaworLy8gdG8gcmVnaXN0ZXIgYXMgYSBkb3VibGUgb3IgdHJpcGxlIGNsaWNrCitz
dGF0aWMgY29uc3QgZG91YmxlIG11bHRpcGxlQ2xpY2tUaW1lU2VjID0gMTsKK3N0YXRpYyBjb25z
dCBpbnQgbXVsdGlwbGVDbGlja1JhZGl1c1BpeGVscyA9IDU7CisKKy8vIEhvdyBtdWNoIHdlIHNo
b3VsZCBzY3JvbGwgcGVyIGV2ZW50IC0gdGhlIHZhbHVlIGhlcmUgaXMgY2hvc2VuIHRvCisvLyBt
YXRjaCB0aGUgV2ViS2l0IGltcGwgYW5kIGxheW91dCB0ZXN0IHJlc3VsdHMuCitzdGF0aWMgY29u
c3QgZmxvYXQgc2Nyb2xsYmFyUGl4ZWxzUGVyVGljayA9IDQwLjBmOworCitpbmxpbmUgYm9vbCBv
dXRzaWRlTXVsdGlDbGlja1JhZGl1cyhjb25zdCBXZWJQb2ludCYgYSwgY29uc3QgV2ViUG9pbnQm
IGIpCit7CisgICAgcmV0dXJuICgoYS54IC0gYi54KSAqIChhLnggLSBiLngpICsgKGEueSAtIGIu
eSkgKiAoYS55IC0gYi55KSkgPgorICAgICAgICBtdWx0aXBsZUNsaWNrUmFkaXVzUGl4ZWxzICog
bXVsdGlwbGVDbGlja1JhZGl1c1BpeGVsczsKK30KKworLy8gVXNlZCB0byBvZmZzZXQgdGhlIHRp
bWUgdGhlIGV2ZW50IGhhbmRlciB0aGluZ3MgYW4gZXZlbnQgaGFwcGVuZWQuICBUaGlzIGlzCisv
LyBkb25lIHNvIHRlc3RzIGNhbiBydW4gd2l0aG91dCBhIGRlbGF5LCBidXQgYnlwYXNzIGNoZWNr
cyB0aGF0IGFyZSB0aW1lCisvLyBkZXBlbmRlbnQgKGUuZy4sIGRyYWdnaW5nIGhhcyBhIHRpbWVv
dXQgdnMgc2VsZWN0aW9uKS4KK3N0YXRpYyB1aW50MzIgdGltZU9mZnNldE1zID0gMDsKKworc3Rh
dGljIGRvdWJsZSBnZXRDdXJyZW50RXZlbnRUaW1lU2VjKCkKK3sKKyAgICByZXR1cm4gKFRpbWVU
aWNrczo6Tm93KCkuVG9JbnRlcm5hbFZhbHVlKCkgLyBUaW1lOjprTWljcm9zZWNvbmRzUGVyTWls
bGlzZWNvbmQgKyB0aW1lT2Zmc2V0TXMpIC8gMTAwMC4wOworfQorCitzdGF0aWMgdm9pZCBhZHZh
bmNlRXZlbnRUaW1lKGludDMyX3QgZGVsdGFNcykKK3sKKyAgICB0aW1lT2Zmc2V0TXMgKz0gZGVs
dGFNczsKK30KKworc3RhdGljIHZvaWQgaW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6VHlw
ZSB0LCBXZWJNb3VzZUV2ZW50OjpCdXR0b24gYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGdmeDo6UG9pbnQmIHBvcywgV2ViTW91c2VFdmVudCogZSkKK3sKKyAgICBlLT50eXBl
ID0gdDsKKyAgICBlLT5idXR0b24gPSBiOworICAgIGUtPm1vZGlmaWVycyA9IDA7CisgICAgZS0+
eCA9IHBvcy54KCk7CisgICAgZS0+eSA9IHBvcy55KCk7CisgICAgZS0+Z2xvYmFsWCA9IHBvcy54
KCk7CisgICAgZS0+Z2xvYmFsWSA9IHBvcy55KCk7CisgICAgZS0+dGltZVN0YW1wU2Vjb25kcyA9
IGdldEN1cnJlbnRFdmVudFRpbWVTZWMoKTsKKyAgICBlLT5jbGlja0NvdW50ID0gY2xpY2tDb3Vu
dDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIHRoZSBzeXN0
ZW0ga2V5Lgorc3RhdGljIGJvb2wgYXBwbHlLZXlNb2RpZmllcihjb25zdCBzdHJpbmcmIG1vZGlm
aWVyTmFtZSwgV2ViSW5wdXRFdmVudCogZXZlbnQpCit7CisgICAgYm9vbCBpc1N5c3RlbUtleSA9
IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIGNoYXJhY3RlcnMgPSBtb2RpZmllck5hbWUuY19zdHIo
KTsKKyAgICBpZiAoIXN0cmNtcChjaGFyYWN0ZXJzLCAiY3RybEtleSIpCisjaWYgIU9TKE1BQ19P
U19YKQorICAgICAgICB8fCAhc3RyY21wKGNoYXJhY3RlcnMsICJhZGRTZWxlY3Rpb25LZXkiKQor
I2VuZGlmCisgICAgICAgICkgeworICAgICAgICBldmVudC0+bW9kaWZpZXJzIHw9IFdlYklucHV0
RXZlbnQ6OkNvbnRyb2xLZXk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGNoYXJhY3RlcnMsICJz
aGlmdEtleSIpIHx8ICFzdHJjbXAoY2hhcmFjdGVycywgInJhbmdlU2VsZWN0aW9uS2V5IikpCisg
ICAgICAgIGV2ZW50LT5tb2RpZmllcnMgfD0gV2ViSW5wdXRFdmVudDo6U2hpZnRLZXk7CisgICAg
ZWxzZSBpZiAoIXN0cmNtcChjaGFyYWN0ZXJzLCAiYWx0S2V5IikpIHsKKyAgICAgICAgZXZlbnQt
Pm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50OjpBbHRLZXk7CisjaWYgIU9TKE1BQ19PU19YKQor
ICAgICAgICAvLyBPbiBXaW5kb3dzIGFsbCBrZXlzIHdpdGggQWx0IG1vZGlmaWVyIHdpbGwgYmUg
bWFya2VkIGFzIHN5c3RlbSBrZXkuCisgICAgICAgIC8vIFdlIGtlZXAgdGhlIHNhbWUgYmVoYXZp
b3Igb24gTGludXgsIHNlZToKKyAgICAgICAgLy8gV2ViS2l0L2Nocm9taXVtL3NyYy9ndGsvV2Vi
SW5wdXRFdmVudEZhY3RvcnkuY3BwCisgICAgICAgIC8vIElmIHdlIHdhbnQgdG8gY2hhbmdlIHRo
aXMgYmVoYXZpb3Igb24gTGludXgsIHRoaXMgcGllY2Ugb2YgY29kZSBtdXN0IGJlCisgICAgICAg
IC8vIGtlcHQgaW4gc3luYyB3aXRoIHRoZSByZWxhdGVkIGNvZGUgaW4gYWJvdmUgZmlsZS4KKyAg
ICAgICAgaXNTeXN0ZW1LZXkgPSB0cnVlOworI2VuZGlmCisjaWYgT1MoTUFDX09TX1gpCisgICAg
fSBlbHNlIGlmICghc3RyY21wKGNoYXJhY3RlcnMsICJtZXRhS2V5IikgfHwgIXN0cmNtcChjaGFy
YWN0ZXJzLCAiYWRkU2VsZWN0aW9uS2V5IikpIHsKKyAgICAgICAgZXZlbnQtPm1vZGlmaWVycyB8
PSBXZWJJbnB1dEV2ZW50OjpNZXRhS2V5OworICAgICAgICAvLyBPbiBNYWMgb25seSBjb21tYW5k
IGtleSBwcmVzc2VzIGFyZSBtYXJrZWQgYXMgc3lzdGVtIGtleS4KKyAgICAgICAgLy8gU2VlIHRo
ZSByZWxhdGVkIGNvZGUgaW46IFdlYktpdC9jaHJvbWl1bS9zcmMvbWFjL1dlYklucHV0RXZlbnRG
YWN0b3J5LmNwcAorICAgICAgICAvLyBJdCBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBy
ZWxhdGVkIGNvZGUgaW4gYWJvdmUgZmlsZS4KKyAgICAgICAgaXNTeXN0ZW1LZXkgPSB0cnVlOwor
I2Vsc2UKKyAgICB9IGVsc2UgaWYgKCF3Y3NjbXAoY2hhcmFjdGVycywgTCJtZXRhS2V5IikpIHsK
KyAgICAgICAgZXZlbnQtPm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50OjpNZXRhS2V5OworI2Vu
ZGlmCisgICAgfQorICAgIHJldHVybiBpc1N5c3RlbUtleTsKK30KKworc3RhdGljIGJvb2wgYXBw
bHlLZXlNb2RpZmllcnMoY29uc3QgQ3BwVmFyaWFudCogYXJndW1lbnQsIFdlYklucHV0RXZlbnQq
IGV2ZW50KQoreworICAgIGJvb2wgaXNTeXN0ZW1LZXkgPSBmYWxzZTsKKyAgICBpZiAoYXJndW1l
bnQtPmlzT2JqZWN0KCkpIHsKKyAgICAgICAgVmVjdG9yPHN0cmluZz4gbW9kaWZpZXJzID0gYXJn
dW1lbnQtPnRvU3RyaW5nVmVjdG9yKCk7CisgICAgICAgIGZvciAoVmVjdG9yPHN0cmluZz46OmNv
bnN0X2l0ZXJhdG9yIGkgPSBtb2RpZmllcnMuYmVnaW4oKTsgaSAhPSBtb2RpZmllcnMuZW5kKCk7
ICsraSkKKyAgICAgICAgICAgIGlzU3lzdGVtS2V5IHw9IGFwcGx5S2V5TW9kaWZpZXIoKmksIGV2
ZW50KTsKKyAgICB9IGVsc2UgaWYgKGFyZ3VtZW50LT5pc1N0cmluZygpKQorICAgICAgICBpc1N5
c3RlbUtleSA9IGFwcGx5S2V5TW9kaWZpZXIoYXJndW1lbnQtPnRvU3RyaW5nKCksIGV2ZW50KTsK
KyAgICByZXR1cm4gaXNTeXN0ZW1LZXk7Cit9CisKKy8vIEdldCB0aGUgZWRpdCBjb21tYW5kIGNv
cnJlc3BvbmRpbmcgdG8gYSBrZXlib2FyZCBldmVudC4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUg
c3BlY2lmaWVkIGV2ZW50IGNvcnJlc3BvbmRzIHRvIGFuIGVkaXQgY29tbWFuZCwgdGhlIG5hbWUK
Ky8vIG9mIHRoZSBlZGl0IGNvbW1hbmQgd2lsbCBiZSBzdG9yZWQgaW4gfCpuYW1lfC4KK2Jvb2wg
Z2V0RWRpdENvbW1hbmQoY29uc3QgV2ViS2V5Ym9hcmRFdmVudCYgZXZlbnQsIHN0cmluZyogbmFt
ZSkKK3sKKyNpZiBPUyhNQUNfT1NfWCkKKyAgICAvLyBXZSBvbmx5IGNhcmVzIGFib3V0IExlZnQs
UmlnaHQsVXAsRG93biBrZXlzIHdpdGggQ29tbWFuZCBvciBDb21tYW5kK1NoaWZ0CisgICAgLy8g
bW9kaWZpZXJzLiBUaGVzZSBrZXkgZXZlbnRzIGNvcnJlc3BvbmQgdG8gc29tZSBzcGVjaWFsIG1v
dmVtZW50IGFuZAorICAgIC8vIHNlbGVjdGlvbiBlZGl0b3IgY29tbWFuZHMsIGFuZCB3YXMgc3Vw
cG9zZWQgdG8gYmUgaGFuZGxlZCBpbgorICAgIC8vIFdlYktpdC9jaHJvbWl1bS9zcmMvRWRpdG9y
Q2xpZW50SW1wbC5jcHAuIEJ1dCB0aGVzZSBrZXlzIHdpbGwgYmUgbWFya2VkCisgICAgLy8gYXMg
c3lzdGVtIGtleSwgd2hpY2ggcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIGhhbmRsZWQuIFRodXMg
dGhleSBtdXN0IGJlCisgICAgLy8gaGFuZGxlZCBzcGVjaWFsbHkuCisgICAgaWYgKChldmVudC5t
b2RpZmllcnMgJiB+V2ViS2V5Ym9hcmRFdmVudDo6U2hpZnRLZXkpICE9IFdlYktleWJvYXJkRXZl
bnQ6Ok1ldGFLZXkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAoZXZlbnQu
d2luZG93c0tleUNvZGUpIHsKKyAgICBjYXNlIGJhc2U6OlZLRVlfTEVGVDoKKyAgICAgICAgKm5h
bWUgPSAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBi
YXNlOjpWS0VZX1JJR0hUOgorICAgICAgICAqbmFtZSA9ICJNb3ZlVG9FbmRPZkxpbmUiOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIGJhc2U6OlZLRVlfVVA6CisgICAgICAgICpuYW1lID0gIk1v
dmVUb0JlZ2lubmluZ09mRG9jdW1lbnQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGJhc2U6
OlZLRVlfRE9XTjoKKyAgICAgICAgKm5hbWUgPSAiTW92ZVRvRW5kT2ZEb2N1bWVudCI7CisgICAg
ICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBpZiAoZXZlbnQubW9kaWZpZXJzICYgV2ViS2V5Ym9hcmRFdmVudDo6U2hpZnRLZXkpCisg
ICAgICAgIG5hbWUtPmFwcGVuZCgiQW5kTW9kaWZ5U2VsZWN0aW9uIik7CisKKyAgICByZXR1cm4g
dHJ1ZTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8vIEtleSBldmVu
dCBsb2NhdGlvbiBjb2RlIGludHJvZHVjZWQgaW4gRE9NIExldmVsIDMuCisvLyBTZWUgYWxzbzog
aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMta2V5Ym9hcmRl
dmVudHMKK2VudW0gS2V5TG9jYXRpb25Db2RlIHsKKyAgICBET01LZXlMb2NhdGlvblN0YW5kYXJk
ICAgICAgPSAweDAwLAorICAgIERPTUtleUxvY2F0aW9uTGVmdCAgICAgICAgICA9IDB4MDEsCisg
ICAgRE9NS2V5TG9jYXRpb25SaWdodCAgICAgICAgID0gMHgwMiwKKyAgICBET01LZXlMb2NhdGlv
bk51bXBhZCAgICAgICAgPSAweDAzCit9OworCitFdmVudFNlbmRpbmdDb250cm9sbGVyOjpFdmVu
dFNlbmRpbmdDb250cm9sbGVyKFRlc3RTaGVsbCogc2hlbGwpCisgICAgOiBBTExPV19USElTX0lO
X0lOSVRJQUxJWkVSX0xJU1QobV9tZXRob2RGYWN0b3J5KHRoaXMpKQoreworICAgIC8vIFNldCBz
dGF0aWMgdGVzdFNoZWxsIHZhcmlhYmxlIHNpbmNlIHdlIGNhbid0IGRvIGl0IGluIGFuIGluaXRp
YWxpemVyIGxpc3QuCisgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgbm90IHRvIGFz
c2lnbiB0ZXN0U2hlbGwgdG8gbmV3IHdpbmRvd3Mgd2hpY2ggYXJlCisgICAgLy8gdGVtcG9yYXJ5
LgorICAgIGlmICghdGVzdFNoZWxsKQorICAgICAgICB0ZXN0U2hlbGwgPSBzaGVsbDsKKworICAg
IC8vIEluaXRpYWxpemUgdGhlIG1hcCB0aGF0IGFzc29jaWF0ZXMgbWV0aG9kcyBvZiB0aGlzIGNs
YXNzIHdpdGggdGhlIG5hbWVzCisgICAgLy8gdGhleSB3aWxsIHVzZSB3aGVuIGNhbGxlZCBieSBK
YXZhU2NyaXB0LiAgVGhlIGFjdHVhbCBiaW5kaW5nIG9mIHRob3NlCisgICAgLy8gbmFtZXMgdG8g
dGhlaXIgbWV0aG9kcyB3aWxsIGJlIGRvbmUgYnkgY2FsbGluZyBiaW5kVG9KYXZhU2NyaXB0KCkg
KGRlZmluZWQKKyAgICAvLyBieSBDcHBCb3VuZENsYXNzLCB0aGUgcGFyZW50IHRvIEV2ZW50U2Vu
ZGluZ0NvbnRyb2xsZXIpLgorICAgIGJpbmRNZXRob2QoIm1vdXNlRG93biIsICZFdmVudFNlbmRp
bmdDb250cm9sbGVyOjptb3VzZURvd24pOworICAgIGJpbmRNZXRob2QoIm1vdXNlVXAiLCAmRXZl
bnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VVcCk7CisgICAgYmluZE1ldGhvZCgiY29udGV4dENs
aWNrIiwgJkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmNvbnRleHRDbGljayk7CisgICAgYmluZE1l
dGhvZCgibW91c2VNb3ZlVG8iLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VNb3ZlVG8p
OworICAgIGJpbmRNZXRob2QoIm1vdXNlV2hlZWxUbyIsICZFdmVudFNlbmRpbmdDb250cm9sbGVy
Ojptb3VzZVdoZWVsVG8pOworICAgIGJpbmRNZXRob2QoImxlYXBGb3J3YXJkIiwgJkV2ZW50U2Vu
ZGluZ0NvbnRyb2xsZXI6OmxlYXBGb3J3YXJkKTsKKyAgICBiaW5kTWV0aG9kKCJrZXlEb3duIiwg
JkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmtleURvd24pOworICAgIGJpbmRNZXRob2QoImRpc3Bh
dGNoTWVzc2FnZSIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpkaXNwYXRjaE1lc3NhZ2UpOwor
ICAgIGJpbmRNZXRob2QoImVuYWJsZURPTVVJRXZlbnRMb2dnaW5nIiwKKyAgICAgICAgICAgICAg
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjplbmFibGVET01VSUV2ZW50TG9nZ2luZyk7CisgICAg
YmluZE1ldGhvZCgiZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50IiwKKyAgICAgICAgICAgICAg
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQpOwor
ICAgIGJpbmRNZXRob2QoImNsZWFyS2lsbFJpbmciLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6
Y2xlYXJLaWxsUmluZyk7CisgICAgYmluZE1ldGhvZCgidGV4dFpvb21JbiIsICZFdmVudFNlbmRp
bmdDb250cm9sbGVyOjp0ZXh0Wm9vbUluKTsKKyAgICBiaW5kTWV0aG9kKCJ0ZXh0Wm9vbU91dCIs
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjp0ZXh0Wm9vbU91dCk7CisgICAgYmluZE1ldGhvZCgi
em9vbVBhZ2VJbiIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjp6b29tUGFnZUluKTsKKyAgICBi
aW5kTWV0aG9kKCJ6b29tUGFnZU91dCIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjp6b29tUGFn
ZU91dCk7CisgICAgYmluZE1ldGhvZCgic2NoZWR1bGVBc3luY2hyb25vdXNDbGljayIsCisgICAg
ICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6c2NoZWR1bGVBc3luY2hyb25vdXND
bGljayk7CisgICAgYmluZE1ldGhvZCgiYmVnaW5EcmFnV2l0aEZpbGVzIiwKKyAgICAgICAgICAg
ICAgICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpiZWdpbkRyYWdXaXRoRmlsZXMpOworCisgICAg
Ly8gV2hlbiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQgdmFsdWUpLCB3ZSBiYXRjaCBtb3VzZSBt
b3ZlIGFuZCBtb3VzZSB1cAorICAgIC8vIGV2ZW50cyBzbyB3ZSBjYW4gc2ltdWxhdGUgZHJhZyAm
IGRyb3AuCisgICAgYmluZFByb3BlcnR5KCJkcmFnTW9kZSIsICZkcmFnTW9kZSk7CisjaWYgT1Mo
V0lORE9XUykKKyAgICBiaW5kUHJvcGVydHkoIldNX0tFWURPV04iLCAmd21LZXlEb3duKTsKKyAg
ICBiaW5kUHJvcGVydHkoIldNX0tFWVVQIiwgJndtS2V5VXApOworICAgIGJpbmRQcm9wZXJ0eSgi
V01fQ0hBUiIsICZ3bUNoYXIpOworICAgIGJpbmRQcm9wZXJ0eSgiV01fREVBRENIQVIiLCAmd21E
ZWFkQ2hhcik7CisgICAgYmluZFByb3BlcnR5KCJXTV9TWVNLRVlET1dOIiwgJndtU3lzS2V5RG93
bik7CisgICAgYmluZFByb3BlcnR5KCJXTV9TWVNLRVlVUCIsICZ3bVN5c0tleVVwKTsKKyAgICBi
aW5kUHJvcGVydHkoIldNX1NZU0NIQVIiLCAmd21TeXNDaGFyKTsKKyAgICBiaW5kUHJvcGVydHko
IldNX1NZU0RFQURDSEFSIiwgJndtU3lzRGVhZENoYXIpOworI2VuZGlmCit9CisKK3ZvaWQgRXZl
bnRTZW5kaW5nQ29udHJvbGxlcjo6cmVzZXQoKQoreworICAgIC8vIFRoZSB0ZXN0IHNob3VsZCBo
YXZlIGZpbmlzaGVkIGEgZHJhZyBhbmQgdGhlIG1vdXNlIGJ1dHRvbiBzdGF0ZS4KKyAgICBBU1NF
UlQoY3VycmVudERyYWdEYXRhLmlzTnVsbCgpKTsKKyAgICBjdXJyZW50RHJhZ0RhdGEucmVzZXQo
KTsKKyAgICBjdXJyZW50RHJhZ0VmZmVjdCA9IFdlYktpdDo6V2ViRHJhZ09wZXJhdGlvbk5vbmU7
CisgICAgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCA9IFdlYktpdDo6V2ViRHJhZ09wZXJhdGlv
bk5vbmU7CisgICAgcHJlc3NlZEJ1dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7Cisg
ICAgZHJhZ01vZGUuc2V0KHRydWUpOworI2lmIE9TKFdJTkRPV1MpCisgICAgd21LZXlEb3duLlNl
dChXTV9LRVlET1dOKTsKKyAgICB3bUtleVVwLlNldChXTV9LRVlVUCk7CisgICAgd21DaGFyLlNl
dChXTV9DSEFSKTsKKyAgICB3bURlYWRDaGFyLlNldChXTV9ERUFEQ0hBUik7CisgICAgd21TeXNL
ZXlEb3duLlNldChXTV9TWVNLRVlET1dOKTsKKyAgICB3bVN5c0tleVVwLlNldChXTV9TWVNLRVlV
UCk7CisgICAgd21TeXNDaGFyLlNldChXTV9TWVNDSEFSKTsKKyAgICB3bVN5c0RlYWRDaGFyLlNl
dChXTV9TWVNERUFEQ0hBUik7CisjZW5kaWYKKyAgICBsYXN0TW91c2VQb3MgPSBXZWJQb2ludCgw
LCAwKTsKKyAgICBsYXN0Q2xpY2tUaW1lU2VjID0gMDsKKyAgICBsYXN0Q2xpY2tQb3MgPSBXZWJQ
b2ludCgwLCAwKTsKKyAgICBjbGlja0NvdW50ID0gMDsKKyAgICBsYXN0QnV0dG9uVHlwZSA9IFdl
Yk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7CisgICAgdGltZU9mZnNldE1zID0gMDsKK30KKworV2Vi
VmlldyogRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6d2VidmlldygpCit7CisgICAgcmV0dXJuIHRl
c3RTaGVsbC0+d2ViVmlldygpOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmRv
RHJhZ0Ryb3AoY29uc3QgV2ViS2l0OjpXZWJQb2ludCYgZXZlbnRQb3MsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViRHJhZ0RhdGEmIGRyYWdEYXRhLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkRyYWdPcGVyYXRpb25z
TWFzayBtYXNrKQoreworICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7CisgICAgaW5pdE1vdXNlRXZl
bnQoV2ViSW5wdXRFdmVudDo6TW91c2VEb3duLCBwcmVzc2VkQnV0dG9uLCBsYXN0TW91c2VQb3Ms
ICZldmVudCk7CisgICAgV2ViUG9pbnQgY2xpZW50UG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Cisg
ICAgV2ViUG9pbnQgc2NyZWVuUG9pbnQoZXZlbnQuZ2xvYmFsWCwgZXZlbnQuZ2xvYmFsWSk7Cisg
ICAgY3VycmVudERyYWdEYXRhID0gZHJhZ0RhdGE7CisgICAgY3VycmVudERyYWdFZmZlY3RzQWxs
b3dlZCA9IG1hc2s7CisgICAgY3VycmVudERyYWdFZmZlY3QgPSB3ZWJ2aWV3KCktPmRyYWdUYXJn
ZXREcmFnRW50ZXIoZHJhZ0RhdGEsIDAsIGNsaWVudFBvaW50LCBzY3JlZW5Qb2ludCwgY3VycmVu
dERyYWdFZmZlY3RzQWxsb3dlZCk7CisKKyAgICAvLyBGaW5pc2ggcHJvY2Vzc2luZyBldmVudHMu
CisgICAgcmVwbGF5U2F2ZWRFdmVudHMoKTsKK30KKworV2ViTW91c2VFdmVudDo6QnV0dG9uIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmdldEJ1dHRvblR5cGVGcm9tQnV0dG9uTnVtYmVyKGludCBi
dXR0b25Db2RlKQoreworICAgIGlmICghYnV0dG9uQ29kZSkKKyAgICAgICAgcmV0dXJuIFdlYk1v
dXNlRXZlbnQ6OkJ1dHRvbkxlZnQ7CisgICAgaWYgKGJ1dHRvbkNvZGUgPT0gMikKKyAgICAgICAg
cmV0dXJuIFdlYk1vdXNlRXZlbnQ6OkJ1dHRvblJpZ2h0OworICAgIHJldHVybiBXZWJNb3VzZUV2
ZW50OjpCdXR0b25NaWRkbGU7Cit9CisKK2ludCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjpnZXRC
dXR0b25OdW1iZXJGcm9tU2luZ2xlQXJnKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRz
KQoreworICAgIGludCBidXR0b25Db2RlID0gMDsKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+
IDAgJiYgYXJndW1lbnRzWzBdLmlzTnVtYmVyKCkpCisgICAgICAgIGJ1dHRvbkNvZGUgPSBhcmd1
bWVudHNbMF0udG9JbnQzMigpOworICAgIHJldHVybiBidXR0b25Db2RlOworfQorCit2b2lkIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnVwZGF0ZUNsaWNrQ291bnRGb3JCdXR0b24oV2ViTW91c2VF
dmVudDo6QnV0dG9uIGJ1dHRvblR5cGUpCit7CisgICAgaWYgKChnZXRDdXJyZW50RXZlbnRUaW1l
U2VjKCkgLSBsYXN0Q2xpY2tUaW1lU2VjIDwgbXVsdGlwbGVDbGlja1RpbWVTZWMpCisgICAgICAg
ICYmICghb3V0c2lkZU11bHRpQ2xpY2tSYWRpdXMobGFzdE1vdXNlUG9zLCBsYXN0Q2xpY2tQb3Mp
KQorICAgICAgICAmJiAoYnV0dG9uVHlwZSA9PSBsYXN0QnV0dG9uVHlwZSkpCisgICAgICAgICsr
Y2xpY2tDb3VudDsKKyAgICBlbHNlIHsKKyAgICAgICAgY2xpY2tDb3VudCA9IDE7CisgICAgICAg
IGxhc3RCdXR0b25UeXBlID0gYnV0dG9uVHlwZTsKKyAgICB9Cit9CisKKy8vCisvLyBJbXBsZW1l
bnRlZCBqYXZhc2NyaXB0IG1ldGhvZHMuCisvLworCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xs
ZXI6Om1vdXNlRG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIGlmIChyZXN1bHQpIC8vIENvdWxkIGJlIDAgaWYgaW52b2tlZCBh
c3luY2hyb25vdXNseS4KKyAgICAgICAgcmVzdWx0LT5zZXROdWxsKCk7CisKKyAgICB3ZWJ2aWV3
KCktPmxheW91dCgpOworCisgICAgaW50IGJ1dHRvbk51bWJlciA9IGdldEJ1dHRvbk51bWJlckZy
b21TaW5nbGVBcmcoYXJndW1lbnRzKTsKKyAgICBBU1NFUlQoYnV0dG9uTnVtYmVyICE9IC0xKTsK
KworICAgIFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBidXR0b25UeXBlID0gZ2V0QnV0dG9uVHlwZUZy
b21CdXR0b25OdW1iZXIoYnV0dG9uTnVtYmVyKTsKKworICAgIHVwZGF0ZUNsaWNrQ291bnRGb3JC
dXR0b24oYnV0dG9uVHlwZSk7CisKKyAgICBXZWJNb3VzZUV2ZW50IGV2ZW50OworICAgIHByZXNz
ZWRCdXR0b24gPSBidXR0b25UeXBlOworICAgIGluaXRNb3VzZUV2ZW50KFdlYklucHV0RXZlbnQ6
Ok1vdXNlRG93biwgYnV0dG9uVHlwZSwgbGFzdE1vdXNlUG9zLCAmZXZlbnQpOworICAgIGlmIChh
cmd1bWVudHMuc2l6ZSgpID49IDIgJiYgKGFyZ3VtZW50c1sxXS5pc09iamVjdCgpIHx8IGFyZ3Vt
ZW50c1sxXS5pc1N0cmluZygpKSkKKyAgICAgICAgYXBwbHlLZXlNb2RpZmllcnMoJihhcmd1bWVu
dHNbMV0pLCAmZXZlbnQpOworICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5wdXRFdmVudChldmVudCk7
Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VVcChjb25zdCBDcHBBcmd1
bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChyZXN1
bHQpIC8vIENvdWxkIGJlIDAgaWYgaW52b2tlZCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgcmVz
dWx0LT5zZXROdWxsKCk7CisKKyAgICB3ZWJ2aWV3KCktPmxheW91dCgpOworCisgICAgaW50IGJ1
dHRvbk51bWJlciA9IGdldEJ1dHRvbk51bWJlckZyb21TaW5nbGVBcmcoYXJndW1lbnRzKTsKKyAg
ICBBU1NFUlQoYnV0dG9uTnVtYmVyICE9IC0xKTsKKworICAgIFdlYk1vdXNlRXZlbnQ6OkJ1dHRv
biBidXR0b25UeXBlID0gZ2V0QnV0dG9uVHlwZUZyb21CdXR0b25OdW1iZXIoYnV0dG9uTnVtYmVy
KTsKKworICAgIGlmIChpc0RyYWdNb2RlKCkgJiYgIXJlcGxheWluZ1NhdmVkRXZlbnRzKSB7Cisg
ICAgICAgIFNhdmVkRXZlbnQgc2F2ZWRFdmVudDsKKyAgICAgICAgc2F2ZWRFdmVudC50eXBlID0g
U2F2ZWRFdmVudDo6TW91c2VVcDsKKyAgICAgICAgc2F2ZWRFdmVudC5idXR0b25UeXBlID0gYnV0
dG9uVHlwZTsKKyAgICAgICAgbW91c2VFdmVudFF1ZXVlLmFwcGVuZChzYXZlZEV2ZW50KTsKKyAg
ICAgICAgcmVwbGF5U2F2ZWRFdmVudHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBXZWJNb3Vz
ZUV2ZW50IGV2ZW50OworICAgICAgICBpbml0TW91c2VFdmVudChXZWJJbnB1dEV2ZW50OjpNb3Vz
ZVVwLCBidXR0b25UeXBlLCBsYXN0TW91c2VQb3MsICZldmVudCk7CisgICAgICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpID49IDIgJiYgKGFyZ3VtZW50c1sxXS5pc09iamVjdCgpIHx8IGFyZ3VtZW50
c1sxXS5pc1N0cmluZygpKSkKKyAgICAgICAgICAgIGFwcGx5S2V5TW9kaWZpZXJzKCYoYXJndW1l
bnRzWzFdKSwgJmV2ZW50KTsKKyAgICAgICAgZG9Nb3VzZVVwKGV2ZW50KTsKKyAgICB9Cit9CisK
K3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZG9Nb3VzZVVwKGNvbnN0IFdlYk1vdXNlRXZl
bnQmIGUpCit7CisgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGUpOworCisgICAgcHJl
c3NlZEJ1dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7CisgICAgbGFzdENsaWNrVGlt
ZVNlYyA9IGUudGltZVN0YW1wU2Vjb25kczsKKyAgICBsYXN0Q2xpY2tQb3MgPSBsYXN0TW91c2VQ
b3M7CisKKyAgICAvLyBJZiB3ZSdyZSBpbiBhIGRyYWcgb3BlcmF0aW9uLCBjb21wbGV0ZSBpdC4K
KyAgICBpZiAoY3VycmVudERyYWdEYXRhLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisgICAg
V2ViUG9pbnQgY2xpZW50UG9pbnQoZS54LCBlLnkpOworICAgIFdlYlBvaW50IHNjcmVlblBvaW50
KGUuZ2xvYmFsWCwgZS5nbG9iYWxZKTsKKworICAgIGN1cnJlbnREcmFnRWZmZWN0ID0gd2Vidmll
dygpLT5kcmFnVGFyZ2V0RHJhZ092ZXIoY2xpZW50UG9pbnQsIHNjcmVlblBvaW50LCBjdXJyZW50
RHJhZ0VmZmVjdHNBbGxvd2VkKTsKKyAgICBpZiAoY3VycmVudERyYWdFZmZlY3QpCisgICAgICAg
IHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyb3AoY2xpZW50UG9pbnQsIHNjcmVlblBvaW50KTsKKyAg
ICBlbHNlCisgICAgICAgIHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyYWdMZWF2ZSgpOworICAgIHdl
YnZpZXcoKS0+ZHJhZ1NvdXJjZUVuZGVkQXQoY2xpZW50UG9pbnQsIHNjcmVlblBvaW50LCBjdXJy
ZW50RHJhZ0VmZmVjdCk7CisgICAgd2VidmlldygpLT5kcmFnU291cmNlU3lzdGVtRHJhZ0VuZGVk
KCk7CisKKyAgICBjdXJyZW50RHJhZ0RhdGEucmVzZXQoKTsKK30KKwordm9pZCBFdmVudFNlbmRp
bmdDb250cm9sbGVyOjptb3VzZU1vdmVUbyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPCAyIHx8ICFhcmd1bWVudHNbMF0uaXNOdW1iZXIoKSB8fCAh
YXJndW1lbnRzWzFdLmlzTnVtYmVyKCkpCisgICAgICAgIHJldHVybjsKKyAgICB3ZWJ2aWV3KCkt
PmxheW91dCgpOworCisgICAgV2ViUG9pbnQgbW91c2VQb3MoYXJndW1lbnRzWzBdLnRvSW50MzIo
KSwgYXJndW1lbnRzWzFdLnRvSW50MzIoKSk7CisKKyAgICBpZiAoaXNEcmFnTW9kZSgpICYmIHBy
ZXNzZWRCdXR0b24gPT0gV2ViTW91c2VFdmVudDo6QnV0dG9uTGVmdCAmJiAhcmVwbGF5aW5nU2F2
ZWRFdmVudHMpIHsKKyAgICAgICAgU2F2ZWRFdmVudCBzYXZlZEV2ZW50OworICAgICAgICBzYXZl
ZEV2ZW50LnR5cGUgPSBTYXZlZEV2ZW50OjpNb3VzZU1vdmU7CisgICAgICAgIHNhdmVkRXZlbnQu
cG9zID0gbW91c2VQb3M7CisgICAgICAgIG1vdXNlRXZlbnRRdWV1ZS5hcHBlbmQoc2F2ZWRFdmVu
dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV2ViTW91c2VFdmVudCBldmVudDsKKyAgICAgICAg
aW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6TW91c2VNb3ZlLCBwcmVzc2VkQnV0dG9uLCBt
b3VzZVBvcywgJmV2ZW50KTsKKyAgICAgICAgZG9Nb3VzZU1vdmUoZXZlbnQpOworICAgIH0KK30K
Kwordm9pZCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjptb3VzZVdoZWVsVG8oY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQt
PnNldE51bGwoKTsKKworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMiB8fCAhYXJndW1lbnRz
WzBdLmlzTnVtYmVyKCkgfHwgIWFyZ3VtZW50c1sxXS5pc051bWJlcigpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBGb3JjZSBhIGxheW91dCBoZXJlIGp1c3QgdG8gbWFrZSBzdXJlIGV2ZXJ5
IHBvc2l0aW9uIGhhcyBiZWVuCisgICAgLy8gZGV0ZXJtaW5lZCBiZWZvcmUgd2Ugc2VuZCBldmVu
dHMgKGFzIHdlbGwgYXMgYWxsIHRoZSBvdGhlciBtZXRob2RzCisgICAgLy8gdGhhdCBzZW5kIGFu
IGV2ZW50IGRvKS4gVGhlIGxheW91dCB0ZXN0IGNhbGxpbmcgdGhpcworICAgIC8vIChzY3JvbGxi
YXJzL292ZXJmbG93LXNjcm9sbGJhci1ob3Jpem9udGFsLXdoZWVsLXNjcm9sbC5odG1sLCBvbmx5
IG9uZQorICAgIC8vIGZvciBub3cpIGRvZXMgbm90IHJlbHkgb24gdGhpcyB0aG91Z2guCisgICAg
d2VidmlldygpLT5sYXlvdXQoKTsKKworICAgIGludCBob3Jpem9udGFsID0gYXJndW1lbnRzWzBd
LnRvSW50MzIoKTsKKyAgICBpbnQgdmVydGljYWwgPSBhcmd1bWVudHNbMV0udG9JbnQzMigpOwor
CisgICAgV2ViTW91c2VXaGVlbEV2ZW50IGV2ZW50OworICAgIGluaXRNb3VzZUV2ZW50KFdlYklu
cHV0RXZlbnQ6Ok1vdXNlV2hlZWwsIHByZXNzZWRCdXR0b24sIGxhc3RNb3VzZVBvcywgJmV2ZW50
KTsKKyAgICBldmVudC53aGVlbFRpY2tzWCA9IHN0YXRpY19jYXN0PGZsb2F0Pihob3Jpem9udGFs
KTsKKyAgICBldmVudC53aGVlbFRpY2tzWSA9IHN0YXRpY19jYXN0PGZsb2F0Pih2ZXJ0aWNhbCk7
CisgICAgZXZlbnQuZGVsdGFYID0gLWhvcml6b250YWwgKiBzY3JvbGxiYXJQaXhlbHNQZXJUaWNr
OworICAgIGV2ZW50LmRlbHRhWSA9IC12ZXJ0aWNhbCAqIHNjcm9sbGJhclBpeGVsc1BlclRpY2s7
CisgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBFdmVu
dFNlbmRpbmdDb250cm9sbGVyOjpkb01vdXNlTW92ZShjb25zdCBXZWJNb3VzZUV2ZW50JiBlKQor
eworICAgIGxhc3RNb3VzZVBvcyA9IFdlYlBvaW50KGUueCwgZS55KTsKKworICAgIHdlYnZpZXco
KS0+aGFuZGxlSW5wdXRFdmVudChlKTsKKworICAgIGlmIChwcmVzc2VkQnV0dG9uID09IFdlYk1v
dXNlRXZlbnQ6OkJ1dHRvbk5vbmUgfHwgY3VycmVudERyYWdEYXRhLmlzTnVsbCgpKQorICAgICAg
ICByZXR1cm47CisgICAgV2ViUG9pbnQgY2xpZW50UG9pbnQoZS54LCBlLnkpOworICAgIFdlYlBv
aW50IHNjcmVlblBvaW50KGUuZ2xvYmFsWCwgZS5nbG9iYWxZKTsKKyAgICBjdXJyZW50RHJhZ0Vm
ZmVjdCA9IHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyYWdPdmVyKGNsaWVudFBvaW50LCBzY3JlZW5Q
b2ludCwgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6a2V5RG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpIDwgMSB8fCAhYXJndW1lbnRzWzBdLmlzU3RyaW5nKCkpCisgICAgICAgIHJl
dHVybjsKKyAgICBib29sIGdlbmVyYXRlQ2hhciA9IGZhbHNlOworCisgICAgLy8gRklYTUU6IEkn
bSBub3QgZXhhY3RseSBzdXJlIGhvdyB3ZSBzaG91bGQgY29udmVydCB0aGUgc3RyaW5nIHRvIGEg
a2V5CisgICAgLy8gZXZlbnQuIFRoaXMgc2VlbXMgdG8gd29yayBpbiB0aGUgY2FzZXMgSSB0ZXN0
ZWQuCisgICAgLy8gRklYTUU6IFNob3VsZCB3ZSBhbHNvIGdlbmVyYXRlIGEgS0VZX1VQPworICAg
IHdzdHJpbmcgY29kZVN0ciA9IFVURjhUb1dpZGUoYXJndW1lbnRzWzBdLnRvU3RyaW5nKCkpOwor
CisgICAgLy8gQ29udmVydCBcbiAtPiBWS19SRVRVUk4uICBTb21lIGxheW91dCB0ZXN0cyB1c2Ug
XG4gdG8gbWVhbiAiRW50ZXIiLCB3aGVuCisgICAgLy8gV2luZG93cyB1c2VzIFxyIGZvciAiRW50
ZXIiLgorICAgIGludCBjb2RlID0gMDsKKyAgICBpbnQgdGV4dCA9IDA7CisgICAgYm9vbCBuZWVk
c1NoaWZ0S2V5TW9kaWZpZXIgPSBmYWxzZTsKKyAgICBpZiAoTCJcbiIgPT0gY29kZVN0cikgewor
ICAgICAgICBnZW5lcmF0ZUNoYXIgPSB0cnVlOworICAgICAgICB0ZXh0ID0gY29kZSA9IGJhc2U6
OlZLRVlfUkVUVVJOOworICAgIH0gZWxzZSBpZiAoTCJyaWdodEFycm93IiA9PSBjb2RlU3RyKQor
ICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9SSUdIVDsKKyAgICBlbHNlIGlmIChMImRvd25BcnJv
dyIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlfRE9XTjsKKyAgICBlbHNl
IGlmIChMImxlZnRBcnJvdyIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlf
TEVGVDsKKyAgICBlbHNlIGlmIChMInVwQXJyb3ciID09IGNvZGVTdHIpCisgICAgICAgIGNvZGUg
PSBiYXNlOjpWS0VZX1VQOworICAgIGVsc2UgaWYgKEwiZGVsZXRlIiA9PSBjb2RlU3RyKQorICAg
ICAgICBjb2RlID0gYmFzZTo6VktFWV9CQUNLOworICAgIGVsc2UgaWYgKEwicGFnZVVwIiA9PSBj
b2RlU3RyKQorICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9QUklPUjsKKyAgICBlbHNlIGlmIChM
InBhZ2VEb3duIiA9PSBjb2RlU3RyKQorICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9ORVhUOwor
ICAgIGVsc2UgaWYgKEwiaG9tZSIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZL
RVlfSE9NRTsKKyAgICBlbHNlIGlmIChMImVuZCIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9
IGJhc2U6OlZLRVlfRU5EOworICAgIGVsc2UgeworICAgICAgICAvLyBDb21wYXJlIHRoZSBpbnB1
dCBzdHJpbmcgd2l0aCB0aGUgZnVuY3Rpb24ta2V5IG5hbWVzIGRlZmluZWQgYnkgdGhlCisgICAg
ICAgIC8vIERPTSBzcGVjIChpLmUuICJGMSIsLi4uLCJGMjQiKS4gSWYgdGhlIGlucHV0IHN0cmlu
ZyBpcyBhIGZ1bmN0aW9uLWtleQorICAgICAgICAvLyBuYW1lLCBzZXQgaXRzIGtleSBjb2RlLgor
ICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAyNDsgKytpKSB7CisgICAgICAgICAgICB3c3Ry
aW5nIGZ1bmN0aW9uS2V5TmFtZTsKKyAgICAgICAgICAgIGZ1bmN0aW9uS2V5TmFtZSArPSBMIkYi
OworICAgICAgICAgICAgZnVuY3Rpb25LZXlOYW1lICs9IEludFRvV1N0cmluZyhpKTsKKyAgICAg
ICAgICAgIGlmIChmdW5jdGlvbktleU5hbWUgPT0gY29kZVN0cikgeworICAgICAgICAgICAgICAg
IGNvZGUgPSBiYXNlOjpWS0VZX0YxICsgKGkgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvZGUpIHsKKyAgICAgICAg
ICAgIEFTU0VSVChjb2RlU3RyLmxlbmd0aCgpID09IDEpOworICAgICAgICAgICAgdGV4dCA9IGNv
ZGUgPSBjb2RlU3RyWzBdOworICAgICAgICAgICAgbmVlZHNTaGlmdEtleU1vZGlmaWVyID0gbmVl
ZHNTaGlmdE1vZGlmaWVyKGNvZGUpOworICAgICAgICAgICAgaWYgKChjb2RlICYgMHhGRikgPj0g
J2EnICYmIChjb2RlICYgMHhGRikgPD0gJ3onKQorICAgICAgICAgICAgICAgIGNvZGUgLT0gJ2En
IC0gJ0EnOworICAgICAgICAgICAgZ2VuZXJhdGVDaGFyID0gdHJ1ZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIEZvciBvbmUgZ2VuZXJhdGVkIGtleWJvYXJkIGV2ZW50LCB3ZSBuZWVkIHRv
IGdlbmVyYXRlIGEga2V5RG93bi9rZXlVcAorICAgIC8vIHBhaXI7IHJlZmVyIHRvIEV2ZW50U2Vu
ZGVyLmNwcCBpbiBXZWJLaXQvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvd2luLgorICAgIC8v
IE9uIFdpbmRvd3MsIHdlIG1pZ2h0IGFsc28gbmVlZCB0byBnZW5lcmF0ZSBhIGNoYXIgZXZlbnQg
dG8gbWltaWMgdGhlCisgICAgLy8gV2luZG93cyBldmVudCBmbG93OyBvbiBvdGhlciBwbGF0Zm9y
bXMgd2UgY3JlYXRlIGEgbWVyZ2VkIGV2ZW50IGFuZCB0ZXN0CisgICAgLy8gdGhlIGV2ZW50IGZs
b3cgdGhhdCB0aGF0IHBsYXRmb3JtIHByb3ZpZGVzLgorICAgIFdlYktleWJvYXJkRXZlbnQgZXZl
bnREb3duLCBldmVudENoYXIsIGV2ZW50VXA7CisgICAgZXZlbnREb3duLnR5cGUgPSBXZWJJbnB1
dEV2ZW50OjpSYXdLZXlEb3duOworICAgIGV2ZW50RG93bi5tb2RpZmllcnMgPSAwOworICAgIGV2
ZW50RG93bi53aW5kb3dzS2V5Q29kZSA9IGNvZGU7CisgICAgaWYgKGdlbmVyYXRlQ2hhcikgewor
ICAgICAgICBldmVudERvd24udGV4dFswXSA9IHRleHQ7CisgICAgICAgIGV2ZW50RG93bi51bm1v
ZGlmaWVkVGV4dFswXSA9IHRleHQ7CisgICAgfQorICAgIGV2ZW50RG93bi5zZXRLZXlJZGVudGlm
aWVyRnJvbVdpbmRvd3NLZXlDb2RlKCk7CisKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAy
ICYmIChhcmd1bWVudHNbMV0uaXNPYmplY3QoKSB8fCBhcmd1bWVudHNbMV0uaXNTdHJpbmcoKSkp
CisgICAgICAgIGV2ZW50RG93bi5pc1N5c3RlbUtleSA9IGFwcGx5S2V5TW9kaWZpZXJzKCYoYXJn
dW1lbnRzWzFdKSwgJmV2ZW50RG93bik7CisKKyAgICBpZiAobmVlZHNTaGlmdEtleU1vZGlmaWVy
KQorICAgICAgICBldmVudERvd24ubW9kaWZpZXJzIHw9IFdlYklucHV0RXZlbnQ6OlNoaWZ0S2V5
OworCisgICAgLy8gU2VlIGlmIEtleUxvY2F0aW9uIGFyZ3VtZW50IGlzIGdpdmVuLgorICAgIGlm
IChhcmd1bWVudHMuc2l6ZSgpID49IDMgJiYgYXJndW1lbnRzWzJdLmlzTnVtYmVyKCkpIHsKKyAg
ICAgICAgaW50IGxvY2F0aW9uID0gYXJndW1lbnRzWzJdLnRvSW50MzIoKTsKKyAgICAgICAgaWYg
KGxvY2F0aW9uID09IERPTUtleUxvY2F0aW9uTnVtcGFkKQorICAgICAgICAgICAgZXZlbnREb3du
Lm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50OjpJc0tleVBhZDsKKyAgICB9CisKKyAgICBldmVu
dENoYXIgPSBldmVudFVwID0gZXZlbnREb3duOworICAgIGV2ZW50VXAudHlwZSA9IFdlYklucHV0
RXZlbnQ6OktleVVwOworICAgIC8vIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXIubSBmb3JjZXMgYSBs
YXlvdXQgaGVyZSwgd2l0aCBhdCBsZWFzdCBvbmUKKyAgICAvLyB0ZXN0IChmYXN0L2Zvcm1zL2Zv
Y3VzLWNvbnRyb2wtdG8tcGFnZS5odG1sKSByZWx5aW5nIG9uIHRoaXMuCisgICAgd2Vidmlldygp
LT5sYXlvdXQoKTsKKworICAgIC8vIEluIHRoZSBicm93c2VyLCBpZiBhIGtleWJvYXJkIGV2ZW50
IGNvcnJlc3BvbmRzIHRvIGFuIGVkaXRvciBjb21tYW5kLAorICAgIC8vIHRoZSBjb21tYW5kIHdp
bGwgYmUgZGlzcGF0Y2hlZCB0byB0aGUgcmVuZGVyZXIganVzdCBiZWZvcmUgZGlzcGF0Y2hpbmcK
KyAgICAvLyB0aGUga2V5Ym9hcmQgZXZlbnQsIGFuZCB0aGVuIGl0IHdpbGwgYmUgZXhlY3V0ZWQg
aW4gdGhlCisgICAgLy8gUmVuZGVyVmlldzo6aGFuZGxlQ3VycmVudEtleWJvYXJkRXZlbnQoKSBt
ZXRob2QsIHdoaWNoIGlzIGNhbGxlZCBmcm9tCisgICAgLy8gdGhpcmRfcGFydHkvV2ViS2l0L1dl
YktpdC9jaHJvbWl1bS9zcmMvRWRpdG9yQ2xpZW50SW1wbC5jcHAuCisgICAgLy8gV2UganVzdCBz
aW11bGF0ZSB0aGUgc2FtZSBiZWhhdmlvciBoZXJlLgorICAgIHN0cmluZyBlZGl0Q29tbWFuZDsK
KyAgICBpZiAoZ2V0RWRpdENvbW1hbmQoZXZlbnREb3duLCAmZWRpdENvbW1hbmQpKQorICAgICAg
ICB0ZXN0U2hlbGwtPmRlbGVnYXRlKCktPnNldEVkaXRDb21tYW5kKGVkaXRDb21tYW5kLCAiIik7
CisKKyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlucHV0RXZlbnQoZXZlbnREb3duKTsKKworICAgIHRl
c3RTaGVsbC0+ZGVsZWdhdGUoKS0+Y2xlYXJFZGl0Q29tbWFuZCgpOworCisgICAgaWYgKGdlbmVy
YXRlQ2hhcikgeworICAgICAgICBldmVudENoYXIudHlwZSA9IFdlYklucHV0RXZlbnQ6OkNoYXI7
CisgICAgICAgIGV2ZW50Q2hhci5rZXlJZGVudGlmaWVyWzBdID0gJ1wwJzsKKyAgICAgICAgd2Vi
dmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50Q2hhcik7CisgICAgfQorCisgICAgd2Vidmll
dygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50VXApOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0Nv
bnRyb2xsZXI6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisjaWYg
T1MoV0lORE9XUykKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA9PSAzKSB7CisgICAgICAgIC8v
IEdyYWIgdGhlIG1lc3NhZ2UgaWQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZGlzcGF0Y2ggaXQuCisg
ICAgICAgIGludCBtc2cgPSBhcmd1bWVudHNbMF0uVG9JbnQzMigpOworCisgICAgICAgIC8vIFdl
YktpdCdzIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBzdHVmZnMgYSBNU0cgc3RydWN0IGFuZCB1
c2VzCisgICAgICAgIC8vIFRyYW5zbGF0ZU1lc3NhZ2UgYW5kIERpc3BhdGNoTWVzc2FnZS4gV2Ug
dXNlIGEgV2ViS2V5Ym9hcmRFdmVudCwgd2hpY2gKKyAgICAgICAgLy8gZG9lc24ndCBuZWVkIHRv
IHJlY2VpdmUgdGhlIERlYWRDaGFyIGFuZCBTeXNEZWFkQ2hhciBtZXNzYWdlcy4KKyAgICAgICAg
aWYgKG1zZyA9PSBXTV9ERUFEQ0hBUiB8fCBtc2cgPT0gV01fU1lTREVBRENIQVIpCisgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgd2VidmlldygpLT5sYXlvdXQoKTsKKworICAgICAgICB1
bnNpZ25lZCBsb25nIGxwYXJhbSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGFyZ3VtZW50
c1syXS5Ub0RvdWJsZSgpKTsKKyAgICAgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KFdl
YklucHV0RXZlbnRGYWN0b3J5OjprZXlib2FyZEV2ZW50KDAsIG1zZywgYXJndW1lbnRzWzFdLlRv
SW50MzIoKSwgbHBhcmFtKSk7CisgICAgfSBlbHNlCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworI2VuZGlmCit9CisKK2Jvb2wgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bmVlZHNTaGlm
dE1vZGlmaWVyKGludCBrZXlDb2RlKQoreworICAgIC8vIElmIGNvZGUgaXMgYW4gdXBwZXJjYXNl
IGxldHRlciwgYXNzaWduIGEgU0hJRlQga2V5IHRvCisgICAgLy8gZXZlbnREb3duLm1vZGlmaWVy
LCB0aGlzIGxvZ2ljIGNvbWVzIGZyb20KKyAgICAvLyBXZWJLaXQvV2ViS2l0VG9vbHMvRHVtcFJl
bmRlclRyZWUvV2luL0V2ZW50U2VuZGVyLmNwcAorICAgIHJldHVybiAoa2V5Q29kZSAmIDB4RkYp
ID49ICdBJyAmJiAoa2V5Q29kZSAmIDB4RkYpIDw9ICdaJzsKK30KKwordm9pZCBFdmVudFNlbmRp
bmdDb250cm9sbGVyOjpsZWFwRm9yd2FyZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPCAxIHx8ICFhcmd1bWVudHNbMF0uaXNOdW1iZXIoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaW50IG1pbGxpc2Vjb25kcyA9IGFyZ3VtZW50c1swXS50b0lu
dDMyKCk7CisgICAgaWYgKGlzRHJhZ01vZGUoKSAmJiBwcmVzc2VkQnV0dG9uID09IFdlYk1vdXNl
RXZlbnQ6OkJ1dHRvbkxlZnQgJiYgIXJlcGxheWluZ1NhdmVkRXZlbnRzKSB7CisgICAgICAgIFNh
dmVkRXZlbnQgc2F2ZWRFdmVudDsKKyAgICAgICAgc2F2ZWRFdmVudC50eXBlID0gU2F2ZWRFdmVu
dDo6TGVhcEZvcndhcmQ7CisgICAgICAgIHNhdmVkRXZlbnQubWlsbGlzZWNvbmRzID0gbWlsbGlz
ZWNvbmRzOworICAgICAgICBtb3VzZUV2ZW50UXVldWUuYXBwZW5kKHNhdmVkRXZlbnQpOworICAg
IH0gZWxzZQorICAgICAgICBkb0xlYXBGb3J3YXJkKG1pbGxpc2Vjb25kcyk7Cit9CisKK3ZvaWQg
RXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZG9MZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKQor
eworICAgIGFkdmFuY2VFdmVudFRpbWUobWlsbGlzZWNvbmRzKTsKK30KKworLy8gQXBwbGUncyBw
b3J0IG9mIFdlYktpdCB6b29tcyBieSBhIGZhY3RvciBvZiAxLjIgKHNlZQorLy8gV2ViS2l0L1dl
YlZpZXcvV2ViVmlldy5tbSkKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6dGV4dFpvb21J
bihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgd2Vi
dmlldygpLT5zZXRab29tTGV2ZWwodHJ1ZSwgd2VidmlldygpLT56b29tTGV2ZWwoKSArIDEpOwor
ICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6
OnRleHRab29tT3V0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICB3ZWJ2aWV3KCktPnNldFpvb21MZXZlbCh0cnVlLCB3ZWJ2aWV3KCktPnpvb21MZXZl
bCgpIC0gMSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6em9vbVBhZ2VJbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
KiByZXN1bHQpCit7CisgICAgd2VidmlldygpLT5zZXRab29tTGV2ZWwoZmFsc2UsIHdlYnZpZXco
KS0+em9vbUxldmVsKCkgKyAxKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBF
dmVudFNlbmRpbmdDb250cm9sbGVyOjp6b29tUGFnZU91dChjb25zdCBDcHBBcmd1bWVudExpc3Qm
LCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgd2VidmlldygpLT5zZXRab29tTGV2ZWwoZmFs
c2UsIHdlYnZpZXcoKS0+em9vbUxldmVsKCkgLSAxKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsK
K30KKwordm9pZCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjpyZXBsYXlTYXZlZEV2ZW50cygpCit7
CisgICAgcmVwbGF5aW5nU2F2ZWRFdmVudHMgPSB0cnVlOworICAgIHdoaWxlICghbW91c2VFdmVu
dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBTYXZlZEV2ZW50IGUgPSBtb3VzZUV2ZW50UXVl
dWUuZmlyc3QoKTsKKyAgICAgICAgbW91c2VFdmVudFF1ZXVlLnJlbW92ZUZpcnN0KCk7CisKKyAg
ICAgICAgc3dpdGNoIChlLnR5cGUpIHsKKyAgICAgICAgY2FzZSBTYXZlZEV2ZW50OjpNb3VzZU1v
dmU6IHsKKyAgICAgICAgICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7CisgICAgICAgICAgICBpbml0
TW91c2VFdmVudChXZWJJbnB1dEV2ZW50OjpNb3VzZU1vdmUsIHByZXNzZWRCdXR0b24sIGUucG9z
LCAmZXZlbnQpOworICAgICAgICAgICAgZG9Nb3VzZU1vdmUoZXZlbnQpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTYXZlZEV2ZW50OjpMZWFwRm9yd2FyZDoK
KyAgICAgICAgICAgIGRvTGVhcEZvcndhcmQoZS5taWxsaXNlY29uZHMpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU2F2ZWRFdmVudDo6TW91c2VVcDogeworICAgICAgICAgICAg
V2ViTW91c2VFdmVudCBldmVudDsKKyAgICAgICAgICAgIGluaXRNb3VzZUV2ZW50KFdlYklucHV0
RXZlbnQ6Ok1vdXNlVXAsIGUuYnV0dG9uVHlwZSwgbGFzdE1vdXNlUG9zLCAmZXZlbnQpOworICAg
ICAgICAgICAgZG9Nb3VzZVVwKGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJlcGxheWluZ1NhdmVkRXZlbnRzID0gZmFsc2U7Cit9CisK
K3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6Y29udGV4dENsaWNrKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7CisKKyAgICB3ZWJ2aWV3KCktPmxheW91dCgpOworCisgICAgdXBkYXRlQ2xpY2tD
b3VudEZvckJ1dHRvbihXZWJNb3VzZUV2ZW50OjpCdXR0b25SaWdodCk7CisKKyAgICAvLyBHZW5l
cmF0ZSByaWdodCBtb3VzZSBkb3duIGFuZCB1cC4KKworICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7
CisgICAgcHJlc3NlZEJ1dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvblJpZ2h0OworICAgIGlu
aXRNb3VzZUV2ZW50KFdlYklucHV0RXZlbnQ6Ok1vdXNlRG93biwgV2ViTW91c2VFdmVudDo6QnV0
dG9uUmlnaHQsIGxhc3RNb3VzZVBvcywgJmV2ZW50KTsKKyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlu
cHV0RXZlbnQoZXZlbnQpOworCisgICAgaW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6TW91
c2VVcCwgV2ViTW91c2VFdmVudDo6QnV0dG9uUmlnaHQsIGxhc3RNb3VzZVBvcywgJmV2ZW50KTsK
KyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlucHV0RXZlbnQoZXZlbnQpOworCisgICAgcHJlc3NlZEJ1
dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6c2NoZWR1bGVBc3luY2hyb25vdXNDbGljayhjb25zdCBDcHBBcmd1bWVudExp
c3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVs
bCgpOworCisgICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soCisgICAgICAgIEZS
T01fSEVSRSwgbV9tZXRob2RGYWN0b3J5Lk5ld1J1bm5hYmxlTWV0aG9kKAorICAgICAgICAgICAg
JkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Om1vdXNlRG93biwgYXJndW1lbnRzLCBzdGF0aWNfY2Fz
dDxDcHBWYXJpYW50Kj4oMCkpKTsKKyAgICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0VGFz
aygKKyAgICAgICAgRlJPTV9IRVJFLCBtX21ldGhvZEZhY3RvcnkuTmV3UnVubmFibGVNZXRob2Qo
CisgICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VVcCwgYXJndW1lbnRz
LCBzdGF0aWNfY2FzdDxDcHBWYXJpYW50Kj4oMCkpKTsKK30KKworc3RhdGljIFdlYlN0cmluZyBm
aWxlUGF0aFN0cmluZ1RvV2ViU3RyaW5nKGNvbnN0IEZpbGVQYXRoOjpTdHJpbmdUeXBlJiBwYXRo
U3RyaW5nKQoreworI2lmIE9TKFVOSVgpCisgIHJldHVybiBXaWRlVG9VVEYxNkhhY2soU3lzTmF0
aXZlTUJUb1dpZGUocGF0aFN0cmluZykpOworI2VsaWYgT1MoV0lORE9XUykKKyAgcmV0dXJuIFdl
YlN0cmluZyhwYXRoU3RyaW5nKTsKKyNlbmRpZgorfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRy
b2xsZXI6OmJlZ2luRHJhZ1dpdGhGaWxlcyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGN1cnJlbnREcmFnRGF0YS5pbml0aWFsaXpl
KCk7CisgICAgVmVjdG9yPHN0cmluZz4gZmlsZXMgPSBhcmd1bWVudHNbMF0udG9TdHJpbmdWZWN0
b3IoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIEZpbGVQYXRoIHBhdGgoZmlsZXNbaV0pOworICAgICAgICBmaWxlX3V0aWw6OkFic29s
dXRlUGF0aCgmcGF0aCk7CisgICAgICAgIGN1cnJlbnREcmFnRGF0YS5hcHBlbmRUb0ZpbGVOYW1l
cyhmaWxlUGF0aFN0cmluZ1RvV2ViU3RyaW5nKHBhdGgudmFsdWUoKSkpOworICAgIH0KKyAgICBj
dXJyZW50RHJhZ0VmZmVjdHNBbGxvd2VkID0gV2ViS2l0OjpXZWJEcmFnT3BlcmF0aW9uQ29weTsK
KworICAgIC8vIFByb3ZpZGUgYSBkcmFnIHNvdXJjZS4KKyAgICB3ZWJ2aWV3KCktPmRyYWdUYXJn
ZXREcmFnRW50ZXIoY3VycmVudERyYWdEYXRhLCAwLCBsYXN0TW91c2VQb3MsIGxhc3RNb3VzZVBv
cywgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCk7CisKKyAgICAvLyBkcmFnTW9kZSBzYXZlcyBl
dmVudHMgYW5kIHRoZW4gcmVwbGF5cyB0aGVtIGxhdGVyLiBXZSBkb24ndCBuZWVkL3dhbnQgdGhh
dC4KKyAgICBkcmFnTW9kZS5zZXQoZmFsc2UpOworCisgICAgLy8gTWFrZSB0aGUgcmVzdCBvZiBl
dmVudFNlbmRlciB0aGluayBhIGRyYWcgaXMgaW4gcHJvZ3Jlc3MuCisgICAgcHJlc3NlZEJ1dHRv
biA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbkxlZnQ7CisKKyAgICByZXN1bHQtPnNldE51bGwoKTsK
K30KKworLy8KKy8vIFVuaW1wbGVtZW50ZWQgc3R1YnMKKy8vCisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6ZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2
b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChj
b25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6Y2xlYXJLaWxs
UmluZyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
cmVzdWx0LT5zZXROdWxsKCk7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9EdW1wUmVuZGVy
VHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmggYi9XZWJLaXRUb29scy9EdW1w
UmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyZmM1YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktp
dFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIuaApA
QCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
ICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKy8qCisgIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXIgY2xhc3M6CisgIEJv
dW5kIHRvIGEgSmF2YVNjcmlwdCB3aW5kb3cuZXZlbnRTZW5kZXIgb2JqZWN0IHVzaW5nCisgIENw
cEJvdW5kQ2xhc3M6OmJpbmRUb0phdmFzY3JpcHQoKSwgdGhpcyBhbGxvd3MgbGF5b3V0IHRlc3Rz
IHRvIGZpcmUgRE9NIGV2ZW50cy4KKyovCisKKyNpZm5kZWYgRXZlbnRTZW5kaW5nQ29udHJvbGxl
cl9oCisjZGVmaW5lIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXJfaAorCisjaW5jbHVkZSAiQ3BwQm91
bmRDbGFzcy5oIgorI2luY2x1ZGUgImJhc2UvdGFzay5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJE
cmFnT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAicHVibGljL1dlYklucHV0RXZlbnQuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViUG9pbnQuaCIKKworY2xhc3MgVGVzdFNoZWxsOworCituYW1lc3BhY2Ug
V2ViS2l0IHsKK2NsYXNzIFdlYkRyYWdEYXRhOworY2xhc3MgV2ViVmlldzsKK30KKworY2xhc3Mg
RXZlbnRTZW5kaW5nQ29udHJvbGxlciA6IHB1YmxpYyBDcHBCb3VuZENsYXNzIHsKK3B1YmxpYzoK
KyAgICAvLyBCdWlsZHMgdGhlIHByb3BlcnR5IGFuZCBtZXRob2QgbGlzdHMgbmVlZGVkIHRvIGJp
bmQgdGhpcyBjbGFzcyB0byBhIEpTCisgICAgLy8gb2JqZWN0LgorICAgIEV2ZW50U2VuZGluZ0Nv
bnRyb2xsZXIoVGVzdFNoZWxsKik7CisKKyAgICAvLyBSZXNldHMgc29tZSBzdGF0aWMgdmFyaWFi
bGUgc3RhdGUuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gU2ltdWxhdGUgZHJhZyZkcm9w
IHN5c3RlbSBjYWxsLgorICAgIHN0YXRpYyB2b2lkIGRvRHJhZ0Ryb3AoY29uc3QgV2ViS2l0OjpX
ZWJQb2ludCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJLaXQ6OldlYkRy
YWdEYXRhJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYktpdDo6V2ViRHJhZ09wZXJh
dGlvbnNNYXNrKTsKKworICAgIC8vIEpTIGNhbGxiYWNrIG1ldGhvZHMuCisgICAgdm9pZCBtb3Vz
ZURvd24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgbW91
c2VVcChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBtb3Vz
ZU1vdmVUbyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBt
b3VzZVdoZWVsVG8oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZv
aWQgbGVhcEZvcndhcmQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAg
IHZvaWQga2V5RG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAg
dm9pZCBkaXNwYXRjaE1lc3NhZ2UoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworICAgIHZvaWQgdGV4dFpvb21Jbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
Kik7CisgICAgdm9pZCB0ZXh0Wm9vbU91dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJp
YW50Kik7CisgICAgdm9pZCB6b29tUGFnZUluKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKyAgICB2b2lkIHpvb21QYWdlT3V0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENw
cFZhcmlhbnQqKTsKKyAgICB2b2lkIHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2soY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgYmVnaW5EcmFnV2l0aEZpbGVz
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICBDcHBWYXJpYW50IGRy
YWdNb2RlOworCisgICAgLy8gVW5pbXBsZW1lbnRlZCBzdHVicworICAgIHZvaWQgY29udGV4dENs
aWNrKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGVuYWJs
ZURPTVVJRXZlbnRMb2dnaW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsK
KyAgICB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChjb25zdCBDcHBBcmd1bWVudExp
c3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBjbGVhcktpbGxSaW5nKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFByb3BlcnRpZXMgdXNlZCBpbiBsYXlv
dXQgdGVzdHMuCisjaWYgZGVmaW5lZChPU19XSU4pCisgICAgQ3BwVmFyaWFudCB3bUtleURvd247
CisgICAgQ3BwVmFyaWFudCB3bUtleVVwOworICAgIENwcFZhcmlhbnQgd21DaGFyOworICAgIENw
cFZhcmlhbnQgd21EZWFkQ2hhcjsKKyAgICBDcHBWYXJpYW50IHdtU3lzS2V5RG93bjsKKyAgICBD
cHBWYXJpYW50IHdtU3lzS2V5VXA7CisgICAgQ3BwVmFyaWFudCB3bVN5c0NoYXI7CisgICAgQ3Bw
VmFyaWFudCB3bVN5c0RlYWRDaGFyOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgLy8gUmV0dXJu
cyB0aGUgdGVzdCBzaGVsbCdzIHdlYnZpZXcuCisgICAgc3RhdGljIFdlYktpdDo6V2ViVmlldyog
d2VidmlldygpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGRyYWdNb2RlIGlzIHRydWUuCisg
ICAgYm9vbCBpc0RyYWdNb2RlKCkgeyByZXR1cm4gZHJhZ01vZGUuaXNCb29sKCkgJiYgZHJhZ01v
ZGUudG9Cb29sZWFuKCk7IH0KKworICAgIC8vIFNvbWV0aW1lcyB3ZSBxdWV1ZSB1cCBtb3VzZSBt
b3ZlIGFuZCBtb3VzZSB1cCBldmVudHMgZm9yIGRyYWcgZHJvcAorICAgIC8vIGhhbmRsaW5nIHB1
cnBvc2VzLiAgVGhlc2UgbWV0aG9kcyBkaXNwYXRjaCB0aGUgZXZlbnQuCisgICAgc3RhdGljIHZv
aWQgZG9Nb3VzZU1vdmUoY29uc3QgV2ViS2l0OjpXZWJNb3VzZUV2ZW50Jik7CisgICAgc3RhdGlj
IHZvaWQgZG9Nb3VzZVVwKGNvbnN0IFdlYktpdDo6V2ViTW91c2VFdmVudCYpOworICAgIHN0YXRp
YyB2b2lkIGRvTGVhcEZvcndhcmQoaW50IG1pbGxpc2Vjb25kcyk7CisgICAgc3RhdGljIHZvaWQg
cmVwbGF5U2F2ZWRFdmVudHMoKTsKKworICAgIC8vIEhlbHBlciB0byByZXR1cm4gdGhlIGJ1dHRv
biB0eXBlIGdpdmVuIGEgYnV0dG9uIGNvZGUKKyAgICBzdGF0aWMgV2ViS2l0OjpXZWJNb3VzZUV2
ZW50OjpCdXR0b24gZ2V0QnV0dG9uVHlwZUZyb21CdXR0b25OdW1iZXIoaW50KTsKKworICAgIC8v
IEhlbHBlciB0byBleHRyYWN0IHRoZSBidXR0b24gbnVtYmVyIGZyb20gdGhlIG9wdGlvbmFsIGFy
Z3VtZW50IGluCisgICAgLy8gbW91c2VEb3duIGFuZCBtb3VzZVVwCisgICAgc3RhdGljIGludCBn
ZXRCdXR0b25OdW1iZXJGcm9tU2luZ2xlQXJnKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYpOworCisg
ICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgcGFzc2VkIGluIG5l
ZWRzIGEgc2hpZnQga2V5CisgICAgLy8gbW9kaWZpZXIgdG8gYmUgcGFzc2VkIGludG8gdGhlIGdl
bmVyYXRlZCBldmVudC4KKyAgICBib29sIG5lZWRzU2hpZnRNb2RpZmllcihpbnQpOworCisgICAg
dm9pZCB1cGRhdGVDbGlja0NvdW50Rm9yQnV0dG9uKFdlYktpdDo6V2ViTW91c2VFdmVudDo6QnV0
dG9uKTsKKworICAgIFNjb3BlZFJ1bm5hYmxlTWV0aG9kRmFjdG9yeTxFdmVudFNlbmRpbmdDb250
cm9sbGVyPiBtX21ldGhvZEZhY3Rvcnk7CisKKyAgICAvLyBOb24tb3duaW5nIHBvaW50ZXIuICBU
aGUgRXZlbnRTZW5kaW5nQ29udHJvbGxlciBpcyBvd25lZCBieSB0aGUgVGVzdFNoZWxsLgorICAg
IHN0YXRpYyBUZXN0U2hlbGwqIHRlc3RTaGVsbDsKKworICAgIC8vIExvY2F0aW9uIG9mIGxhc3Qg
bW91c2VNb3ZlVG8gZXZlbnQuCisgICAgc3RhdGljIFdlYktpdDo6V2ViUG9pbnQgbGFzdE1vdXNl
UG9zOworCisgICAgLy8gQ3VycmVudGx5IHByZXNzZWQgbW91c2UgYnV0dG9uIChMZWZ0L1JpZ2h0
L01pZGRsZSBvciBOb25lKQorICAgIHN0YXRpYyBXZWJLaXQ6OldlYk1vdXNlRXZlbnQ6OkJ1dHRv
biBwcmVzc2VkQnV0dG9uOworCisgICAgLy8gVGhlIGxhc3QgYnV0dG9uIG51bWJlciBwYXNzZWQg
dG8gbW91c2VEb3duIGFuZCBtb3VzZVVwLgorICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRo
ZXIgdGhlIGNsaWNrIGNvdW50IGNvbnRpbnVlcyB0bworICAgIC8vIGluY3JlbWVudCBvciBub3Qu
CisgICAgc3RhdGljIFdlYktpdDo6V2ViTW91c2VFdmVudDo6QnV0dG9uIGxhc3RCdXR0b25UeXBl
OworfTsKKworI2VuZGlmIC8vIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXJfaAorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50202</attachid>
            <date>2010-03-08 03:11:57 -0800</date>
            <delta_ts>2010-03-08 04:21:15 -0800</delta_ts>
            <desc>Proposed patch rev.2 (style fix)</desc>
            <filename>bug-35859-20100308201155.patch</filename>
            <type>text/plain</type>
            <size>37609</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA4Y2FlNzA1Li44NGUzYjI5IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDMt
MDggIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBFdmVudFNl
bmRpbmdDb250cm9sbGVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTg1OQorCisgICAgICAgIEFkZCBFdm5ldFNlbmRpbmdDb250cm9sbGVyIGNsYXNz
ZXMsIHdoaWNoIGFyZSBnb2luZyB0byBiZSB1c2VkIGJ5CisgICAgICAgIER1bXBSZW5kZXJUcmVl
IENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoKKyAgICAgICAgLSBzcmMv
d2Via2l0L3Rvb2xzL3Rlc3Rfc2hlbGwvZXZlbnRfc2VuZGluZ19jb250cm9sbGVyLmNjCisgICAg
ICAgIC0gc3JjL3dlYmtpdC90b29scy90ZXN0X3NoZWxsL2V2ZW50X3NlbmRpbmdfY29udHJvbGxl
ci5oCisgICAgICAgIG9mIENocm9taXVtIHJldi40MDQ5Mi4KKworICAgICAgICAqIER1bXBSZW5k
ZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmg6IEFk
ZGVkLgorCiAyMDEwLTAzLTA3ICBLZW50IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBEaW1pdHJpIEdsYXprb3YuCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmNwcCBi
L1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xs
ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTU2MzMKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNl
bmRpbmdDb250cm9sbGVyLmNwcApAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIFRoaXMgZmlsZSBjb250YWlu
cyB0aGUgZGVmaW5pdGlvbiBmb3IgRXZlbnRTZW5kaW5nQ29udHJvbGxlci4KKy8vCisvLyBTb21l
IG5vdGVzIGFib3V0IGRyYWcgYW5kIGRyb3AgaGFuZGxpbmc6CisvLyBXaW5kb3dzIGRyYWcgYW5k
IGRyb3AgZ29lcyB0aHJvdWdoIGEgc3lzdGVtIGNhbGwgdG8gZG9EcmFnRHJvcC4gIEF0IHRoYXQK
Ky8vIHBvaW50LCBwcm9ncmFtIGNvbnRyb2wgaXMgZ2l2ZW4gdG8gV2luZG93cyB3aGljaCB0aGVu
IHBlcmlvZGljYWxseSBtYWtlcworLy8gY2FsbGJhY2tzIGludG8gdGhlIHdlYnZpZXcuICBUaGlz
IHdvbid0IHdvcmsgZm9yIGxheW91dCB0ZXN0cywgc28gaW5zdGVhZCwKKy8vIHdlIHF1ZXVlIHVw
IGFsbCB0aGUgbW91c2UgbW92ZSBhbmQgbW91c2UgdXAgZXZlbnRzLiAgV2hlbiB0aGUgdGVzdCB0
cmllcyB0bworLy8gc3RhcnQgYSBkcmFnIChieSBjYWxsaW5nIEV2ZW5TZW5kaW5nQ29udHJvbGxl
cjo6ZG9EcmFnRHJvcCksIHdlIHRha2UgdGhlCisvLyBldmVudHMgaW4gdGhlIHF1ZXVlIGFuZCBy
ZXBsYXkgdGhlbS4KKy8vIFRoZSBiZWhhdmlvciBvZiBxdWV1aW5nIGV2ZW50cyBhbmQgcmVwbGF5
aW5nIHRoZW0gY2FuIGJlIGRpc2FibGVkIGJ5IGEKKy8vIGxheW91dCB0ZXN0IGJ5IHNldHRpbmcg
ZXZlbnRTZW5kZXIuZHJhZ01vZGUgdG8gZmFsc2UuCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJFdmVudFNlbmRpbmdDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlICJUZXN0U2hlbGwu
aCIKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAiYmFzZS9m
aWxlX3BhdGguaCIKKyNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgorI2luY2x1ZGUgImJhc2Uv
a2V5Ym9hcmRfY29kZXMuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorI2luY2x1
ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL3N5c19zdHJpbmdfY29udmVy
c2lvbnMuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRHJh
Z0RhdGEuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViRHJhZ09wZXJhdGlvbi5oIgorI2luY2x1ZGUg
InB1YmxpYy9XZWJQb2ludC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJTdHJpbmcuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViVmlldy5oIgorI2luY2x1ZGUgPHd0Zi9EZXF1ZS5oPgorCisjaWYgT1Mo
V0lORE9XUykKKyNpbmNsdWRlICJwdWJsaWMvd2luL1dlYklucHV0RXZlbnRGYWN0b3J5LmgiCisj
ZW5kaWYKKworLy8gRklYTUU6IGxheW91dCBiZWZvcmUgZWFjaCBldmVudD8KKwordXNpbmcgbmFt
ZXNwYWNlIGJhc2U7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdlYktp
dDsKKworVGVzdFNoZWxsKiBFdmVudFNlbmRpbmdDb250cm9sbGVyOjp0ZXN0U2hlbGwgPSAwOwor
V2ViUG9pbnQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bGFzdE1vdXNlUG9zOworV2ViTW91c2VF
dmVudDo6QnV0dG9uIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnByZXNzZWRCdXR0b24gPSBXZWJN
b3VzZUV2ZW50OjpCdXR0b25Ob25lOworV2ViTW91c2VFdmVudDo6QnV0dG9uIEV2ZW50U2VuZGlu
Z0NvbnRyb2xsZXI6Omxhc3RCdXR0b25UeXBlID0gV2ViTW91c2VFdmVudDo6QnV0dG9uTm9uZTsK
Kworc3RydWN0IFNhdmVkRXZlbnQgeworICAgIGVudW0gU2F2ZWRFdmVudFR5cGUgeworICAgICAg
ICBVbnNwZWNpZmllZCwKKyAgICAgICAgTW91c2VVcCwKKyAgICAgICAgTW91c2VNb3ZlLAorICAg
ICAgICBMZWFwRm9yd2FyZAorICAgIH07CisKKyAgICBTYXZlZEV2ZW50VHlwZSB0eXBlOworICAg
IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBidXR0b25UeXBlOyAvLyBGb3IgTW91c2VVcC4KKyAgICBX
ZWJQb2ludCBwb3M7IC8vIEZvciBNb3VzZU1vdmUuCisgICAgaW50IG1pbGxpc2Vjb25kczsgLy8g
Rm9yIExlYXBGb3J3YXJkLgorCisgICAgU2F2ZWRFdmVudCgpCisgICAgICAgIDogdHlwZShVbnNw
ZWNpZmllZCkKKyAgICAgICAgLCBidXR0b25UeXBlKFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmUp
CisgICAgICAgICwgbWlsbGlzZWNvbmRzKDApIHt9Cit9OworCitzdGF0aWMgV2ViRHJhZ0RhdGEg
Y3VycmVudERyYWdEYXRhOworc3RhdGljIFdlYkRyYWdPcGVyYXRpb24gY3VycmVudERyYWdFZmZl
Y3Q7CitzdGF0aWMgV2ViRHJhZ09wZXJhdGlvbnNNYXNrIGN1cnJlbnREcmFnRWZmZWN0c0FsbG93
ZWQ7CitzdGF0aWMgYm9vbCByZXBsYXlpbmdTYXZlZEV2ZW50cyA9IGZhbHNlOworc3RhdGljIERl
cXVlPFNhdmVkRXZlbnQ+IG1vdXNlRXZlbnRRdWV1ZTsKKworLy8gVGltZSBhbmQgcGxhY2Ugb2Yg
dGhlIGxhc3QgbW91c2UgdXAgZXZlbnQuCitzdGF0aWMgZG91YmxlIGxhc3RDbGlja1RpbWVTZWMg
PSAwOworc3RhdGljIFdlYlBvaW50IGxhc3RDbGlja1BvczsKK3N0YXRpYyBpbnQgY2xpY2tDb3Vu
dCA9IDA7CisKKy8vIG1heGltdW0gZGlzdGFuY2UgKGluIHNwYWNlIGFuZCB0aW1lKSBmb3IgYSBt
b3VzZSBjbGljaworLy8gdG8gcmVnaXN0ZXIgYXMgYSBkb3VibGUgb3IgdHJpcGxlIGNsaWNrCitz
dGF0aWMgY29uc3QgZG91YmxlIG11bHRpcGxlQ2xpY2tUaW1lU2VjID0gMTsKK3N0YXRpYyBjb25z
dCBpbnQgbXVsdGlwbGVDbGlja1JhZGl1c1BpeGVscyA9IDU7CisKKy8vIEhvdyBtdWNoIHdlIHNo
b3VsZCBzY3JvbGwgcGVyIGV2ZW50IC0gdGhlIHZhbHVlIGhlcmUgaXMgY2hvc2VuIHRvCisvLyBt
YXRjaCB0aGUgV2ViS2l0IGltcGwgYW5kIGxheW91dCB0ZXN0IHJlc3VsdHMuCitzdGF0aWMgY29u
c3QgZmxvYXQgc2Nyb2xsYmFyUGl4ZWxzUGVyVGljayA9IDQwLjBmOworCitpbmxpbmUgYm9vbCBv
dXRzaWRlTXVsdGlDbGlja1JhZGl1cyhjb25zdCBXZWJQb2ludCYgYSwgY29uc3QgV2ViUG9pbnQm
IGIpCit7CisgICAgcmV0dXJuICgoYS54IC0gYi54KSAqIChhLnggLSBiLngpICsgKGEueSAtIGIu
eSkgKiAoYS55IC0gYi55KSkgPgorICAgICAgICBtdWx0aXBsZUNsaWNrUmFkaXVzUGl4ZWxzICog
bXVsdGlwbGVDbGlja1JhZGl1c1BpeGVsczsKK30KKworLy8gVXNlZCB0byBvZmZzZXQgdGhlIHRp
bWUgdGhlIGV2ZW50IGhhbmRlciB0aGluZ3MgYW4gZXZlbnQgaGFwcGVuZWQuICBUaGlzIGlzCisv
LyBkb25lIHNvIHRlc3RzIGNhbiBydW4gd2l0aG91dCBhIGRlbGF5LCBidXQgYnlwYXNzIGNoZWNr
cyB0aGF0IGFyZSB0aW1lCisvLyBkZXBlbmRlbnQgKGUuZy4sIGRyYWdnaW5nIGhhcyBhIHRpbWVv
dXQgdnMgc2VsZWN0aW9uKS4KK3N0YXRpYyB1aW50MzIgdGltZU9mZnNldE1zID0gMDsKKworc3Rh
dGljIGRvdWJsZSBnZXRDdXJyZW50RXZlbnRUaW1lU2VjKCkKK3sKKyAgICByZXR1cm4gKFRpbWVU
aWNrczo6Tm93KCkuVG9JbnRlcm5hbFZhbHVlKCkgLyBUaW1lOjprTWljcm9zZWNvbmRzUGVyTWls
bGlzZWNvbmQgKyB0aW1lT2Zmc2V0TXMpIC8gMTAwMC4wOworfQorCitzdGF0aWMgdm9pZCBhZHZh
bmNlRXZlbnRUaW1lKGludDMyX3QgZGVsdGFNcykKK3sKKyAgICB0aW1lT2Zmc2V0TXMgKz0gZGVs
dGFNczsKK30KKworc3RhdGljIHZvaWQgaW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6VHlw
ZSB0LCBXZWJNb3VzZUV2ZW50OjpCdXR0b24gYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IGdmeDo6UG9pbnQmIHBvcywgV2ViTW91c2VFdmVudCogZSkKK3sKKyAgICBlLT50eXBl
ID0gdDsKKyAgICBlLT5idXR0b24gPSBiOworICAgIGUtPm1vZGlmaWVycyA9IDA7CisgICAgZS0+
eCA9IHBvcy54KCk7CisgICAgZS0+eSA9IHBvcy55KCk7CisgICAgZS0+Z2xvYmFsWCA9IHBvcy54
KCk7CisgICAgZS0+Z2xvYmFsWSA9IHBvcy55KCk7CisgICAgZS0+dGltZVN0YW1wU2Vjb25kcyA9
IGdldEN1cnJlbnRFdmVudFRpbWVTZWMoKTsKKyAgICBlLT5jbGlja0NvdW50ID0gY2xpY2tDb3Vu
dDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIHRoZSBzeXN0
ZW0ga2V5Lgorc3RhdGljIGJvb2wgYXBwbHlLZXlNb2RpZmllcihjb25zdCBzdHJpbmcmIG1vZGlm
aWVyTmFtZSwgV2ViSW5wdXRFdmVudCogZXZlbnQpCit7CisgICAgYm9vbCBpc1N5c3RlbUtleSA9
IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIGNoYXJhY3RlcnMgPSBtb2RpZmllck5hbWUuY19zdHIo
KTsKKyAgICBpZiAoIXN0cmNtcChjaGFyYWN0ZXJzLCAiY3RybEtleSIpCisjaWYgIU9TKE1BQ19P
U19YKQorICAgICAgICB8fCAhc3RyY21wKGNoYXJhY3RlcnMsICJhZGRTZWxlY3Rpb25LZXkiKQor
I2VuZGlmCisgICAgICAgICkgeworICAgICAgICBldmVudC0+bW9kaWZpZXJzIHw9IFdlYklucHV0
RXZlbnQ6OkNvbnRyb2xLZXk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGNoYXJhY3RlcnMsICJz
aGlmdEtleSIpIHx8ICFzdHJjbXAoY2hhcmFjdGVycywgInJhbmdlU2VsZWN0aW9uS2V5IikpCisg
ICAgICAgIGV2ZW50LT5tb2RpZmllcnMgfD0gV2ViSW5wdXRFdmVudDo6U2hpZnRLZXk7CisgICAg
ZWxzZSBpZiAoIXN0cmNtcChjaGFyYWN0ZXJzLCAiYWx0S2V5IikpIHsKKyAgICAgICAgZXZlbnQt
Pm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50OjpBbHRLZXk7CisjaWYgIU9TKE1BQ19PU19YKQor
ICAgICAgICAvLyBPbiBXaW5kb3dzIGFsbCBrZXlzIHdpdGggQWx0IG1vZGlmaWVyIHdpbGwgYmUg
bWFya2VkIGFzIHN5c3RlbSBrZXkuCisgICAgICAgIC8vIFdlIGtlZXAgdGhlIHNhbWUgYmVoYXZp
b3Igb24gTGludXgsIHNlZToKKyAgICAgICAgLy8gV2ViS2l0L2Nocm9taXVtL3NyYy9ndGsvV2Vi
SW5wdXRFdmVudEZhY3RvcnkuY3BwCisgICAgICAgIC8vIElmIHdlIHdhbnQgdG8gY2hhbmdlIHRo
aXMgYmVoYXZpb3Igb24gTGludXgsIHRoaXMgcGllY2Ugb2YgY29kZSBtdXN0IGJlCisgICAgICAg
IC8vIGtlcHQgaW4gc3luYyB3aXRoIHRoZSByZWxhdGVkIGNvZGUgaW4gYWJvdmUgZmlsZS4KKyAg
ICAgICAgaXNTeXN0ZW1LZXkgPSB0cnVlOworI2VuZGlmCisjaWYgT1MoTUFDX09TX1gpCisgICAg
fSBlbHNlIGlmICghc3RyY21wKGNoYXJhY3RlcnMsICJtZXRhS2V5IikgfHwgIXN0cmNtcChjaGFy
YWN0ZXJzLCAiYWRkU2VsZWN0aW9uS2V5IikpIHsKKyAgICAgICAgZXZlbnQtPm1vZGlmaWVycyB8
PSBXZWJJbnB1dEV2ZW50OjpNZXRhS2V5OworICAgICAgICAvLyBPbiBNYWMgb25seSBjb21tYW5k
IGtleSBwcmVzc2VzIGFyZSBtYXJrZWQgYXMgc3lzdGVtIGtleS4KKyAgICAgICAgLy8gU2VlIHRo
ZSByZWxhdGVkIGNvZGUgaW46IFdlYktpdC9jaHJvbWl1bS9zcmMvbWFjL1dlYklucHV0RXZlbnRG
YWN0b3J5LmNwcAorICAgICAgICAvLyBJdCBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBy
ZWxhdGVkIGNvZGUgaW4gYWJvdmUgZmlsZS4KKyAgICAgICAgaXNTeXN0ZW1LZXkgPSB0cnVlOwor
I2Vsc2UKKyAgICB9IGVsc2UgaWYgKCF3Y3NjbXAoY2hhcmFjdGVycywgTCJtZXRhS2V5IikpIHsK
KyAgICAgICAgZXZlbnQtPm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50OjpNZXRhS2V5OworI2Vu
ZGlmCisgICAgfQorICAgIHJldHVybiBpc1N5c3RlbUtleTsKK30KKworc3RhdGljIGJvb2wgYXBw
bHlLZXlNb2RpZmllcnMoY29uc3QgQ3BwVmFyaWFudCogYXJndW1lbnQsIFdlYklucHV0RXZlbnQq
IGV2ZW50KQoreworICAgIGJvb2wgaXNTeXN0ZW1LZXkgPSBmYWxzZTsKKyAgICBpZiAoYXJndW1l
bnQtPmlzT2JqZWN0KCkpIHsKKyAgICAgICAgVmVjdG9yPHN0cmluZz4gbW9kaWZpZXJzID0gYXJn
dW1lbnQtPnRvU3RyaW5nVmVjdG9yKCk7CisgICAgICAgIGZvciAoVmVjdG9yPHN0cmluZz46OmNv
bnN0X2l0ZXJhdG9yIGkgPSBtb2RpZmllcnMuYmVnaW4oKTsgaSAhPSBtb2RpZmllcnMuZW5kKCk7
ICsraSkKKyAgICAgICAgICAgIGlzU3lzdGVtS2V5IHw9IGFwcGx5S2V5TW9kaWZpZXIoKmksIGV2
ZW50KTsKKyAgICB9IGVsc2UgaWYgKGFyZ3VtZW50LT5pc1N0cmluZygpKQorICAgICAgICBpc1N5
c3RlbUtleSA9IGFwcGx5S2V5TW9kaWZpZXIoYXJndW1lbnQtPnRvU3RyaW5nKCksIGV2ZW50KTsK
KyAgICByZXR1cm4gaXNTeXN0ZW1LZXk7Cit9CisKKy8vIEdldCB0aGUgZWRpdCBjb21tYW5kIGNv
cnJlc3BvbmRpbmcgdG8gYSBrZXlib2FyZCBldmVudC4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUg
c3BlY2lmaWVkIGV2ZW50IGNvcnJlc3BvbmRzIHRvIGFuIGVkaXQgY29tbWFuZCwgdGhlIG5hbWUK
Ky8vIG9mIHRoZSBlZGl0IGNvbW1hbmQgd2lsbCBiZSBzdG9yZWQgaW4gfCpuYW1lfC4KK2Jvb2wg
Z2V0RWRpdENvbW1hbmQoY29uc3QgV2ViS2V5Ym9hcmRFdmVudCYgZXZlbnQsIHN0cmluZyogbmFt
ZSkKK3sKKyNpZiBPUyhNQUNfT1NfWCkKKyAgICAvLyBXZSBvbmx5IGNhcmVzIGFib3V0IExlZnQs
UmlnaHQsVXAsRG93biBrZXlzIHdpdGggQ29tbWFuZCBvciBDb21tYW5kK1NoaWZ0CisgICAgLy8g
bW9kaWZpZXJzLiBUaGVzZSBrZXkgZXZlbnRzIGNvcnJlc3BvbmQgdG8gc29tZSBzcGVjaWFsIG1v
dmVtZW50IGFuZAorICAgIC8vIHNlbGVjdGlvbiBlZGl0b3IgY29tbWFuZHMsIGFuZCB3YXMgc3Vw
cG9zZWQgdG8gYmUgaGFuZGxlZCBpbgorICAgIC8vIFdlYktpdC9jaHJvbWl1bS9zcmMvRWRpdG9y
Q2xpZW50SW1wbC5jcHAuIEJ1dCB0aGVzZSBrZXlzIHdpbGwgYmUgbWFya2VkCisgICAgLy8gYXMg
c3lzdGVtIGtleSwgd2hpY2ggcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIGhhbmRsZWQuIFRodXMg
dGhleSBtdXN0IGJlCisgICAgLy8gaGFuZGxlZCBzcGVjaWFsbHkuCisgICAgaWYgKChldmVudC5t
b2RpZmllcnMgJiB+V2ViS2V5Ym9hcmRFdmVudDo6U2hpZnRLZXkpICE9IFdlYktleWJvYXJkRXZl
bnQ6Ok1ldGFLZXkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAoZXZlbnQu
d2luZG93c0tleUNvZGUpIHsKKyAgICBjYXNlIGJhc2U6OlZLRVlfTEVGVDoKKyAgICAgICAgKm5h
bWUgPSAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBi
YXNlOjpWS0VZX1JJR0hUOgorICAgICAgICAqbmFtZSA9ICJNb3ZlVG9FbmRPZkxpbmUiOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIGJhc2U6OlZLRVlfVVA6CisgICAgICAgICpuYW1lID0gIk1v
dmVUb0JlZ2lubmluZ09mRG9jdW1lbnQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGJhc2U6
OlZLRVlfRE9XTjoKKyAgICAgICAgKm5hbWUgPSAiTW92ZVRvRW5kT2ZEb2N1bWVudCI7CisgICAg
ICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBpZiAoZXZlbnQubW9kaWZpZXJzICYgV2ViS2V5Ym9hcmRFdmVudDo6U2hpZnRLZXkpCisg
ICAgICAgIG5hbWUtPmFwcGVuZCgiQW5kTW9kaWZ5U2VsZWN0aW9uIik7CisKKyAgICByZXR1cm4g
dHJ1ZTsKKyNlbHNlCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8vIEtleSBldmVu
dCBsb2NhdGlvbiBjb2RlIGludHJvZHVjZWQgaW4gRE9NIExldmVsIDMuCisvLyBTZWUgYWxzbzog
aHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMta2V5Ym9hcmRl
dmVudHMKK2VudW0gS2V5TG9jYXRpb25Db2RlIHsKKyAgICBET01LZXlMb2NhdGlvblN0YW5kYXJk
ICAgICAgPSAweDAwLAorICAgIERPTUtleUxvY2F0aW9uTGVmdCAgICAgICAgICA9IDB4MDEsCisg
ICAgRE9NS2V5TG9jYXRpb25SaWdodCAgICAgICAgID0gMHgwMiwKKyAgICBET01LZXlMb2NhdGlv
bk51bXBhZCAgICAgICAgPSAweDAzCit9OworCitFdmVudFNlbmRpbmdDb250cm9sbGVyOjpFdmVu
dFNlbmRpbmdDb250cm9sbGVyKFRlc3RTaGVsbCogc2hlbGwpCisgICAgOiBBTExPV19USElTX0lO
X0lOSVRJQUxJWkVSX0xJU1QobV9tZXRob2RGYWN0b3J5KHRoaXMpKQoreworICAgIC8vIFNldCBz
dGF0aWMgdGVzdFNoZWxsIHZhcmlhYmxlIHNpbmNlIHdlIGNhbid0IGRvIGl0IGluIGFuIGluaXRp
YWxpemVyIGxpc3QuCisgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgbm90IHRvIGFz
c2lnbiB0ZXN0U2hlbGwgdG8gbmV3IHdpbmRvd3Mgd2hpY2ggYXJlCisgICAgLy8gdGVtcG9yYXJ5
LgorICAgIGlmICghdGVzdFNoZWxsKQorICAgICAgICB0ZXN0U2hlbGwgPSBzaGVsbDsKKworICAg
IC8vIEluaXRpYWxpemUgdGhlIG1hcCB0aGF0IGFzc29jaWF0ZXMgbWV0aG9kcyBvZiB0aGlzIGNs
YXNzIHdpdGggdGhlIG5hbWVzCisgICAgLy8gdGhleSB3aWxsIHVzZSB3aGVuIGNhbGxlZCBieSBK
YXZhU2NyaXB0LiAgVGhlIGFjdHVhbCBiaW5kaW5nIG9mIHRob3NlCisgICAgLy8gbmFtZXMgdG8g
dGhlaXIgbWV0aG9kcyB3aWxsIGJlIGRvbmUgYnkgY2FsbGluZyBiaW5kVG9KYXZhU2NyaXB0KCkg
KGRlZmluZWQKKyAgICAvLyBieSBDcHBCb3VuZENsYXNzLCB0aGUgcGFyZW50IHRvIEV2ZW50U2Vu
ZGluZ0NvbnRyb2xsZXIpLgorICAgIGJpbmRNZXRob2QoIm1vdXNlRG93biIsICZFdmVudFNlbmRp
bmdDb250cm9sbGVyOjptb3VzZURvd24pOworICAgIGJpbmRNZXRob2QoIm1vdXNlVXAiLCAmRXZl
bnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VVcCk7CisgICAgYmluZE1ldGhvZCgiY29udGV4dENs
aWNrIiwgJkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmNvbnRleHRDbGljayk7CisgICAgYmluZE1l
dGhvZCgibW91c2VNb3ZlVG8iLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VNb3ZlVG8p
OworICAgIGJpbmRNZXRob2QoIm1vdXNlV2hlZWxUbyIsICZFdmVudFNlbmRpbmdDb250cm9sbGVy
Ojptb3VzZVdoZWVsVG8pOworICAgIGJpbmRNZXRob2QoImxlYXBGb3J3YXJkIiwgJkV2ZW50U2Vu
ZGluZ0NvbnRyb2xsZXI6OmxlYXBGb3J3YXJkKTsKKyAgICBiaW5kTWV0aG9kKCJrZXlEb3duIiwg
JkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmtleURvd24pOworICAgIGJpbmRNZXRob2QoImRpc3Bh
dGNoTWVzc2FnZSIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpkaXNwYXRjaE1lc3NhZ2UpOwor
ICAgIGJpbmRNZXRob2QoImVuYWJsZURPTVVJRXZlbnRMb2dnaW5nIiwKKyAgICAgICAgICAgICAg
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjplbmFibGVET01VSUV2ZW50TG9nZ2luZyk7CisgICAg
YmluZE1ldGhvZCgiZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50IiwKKyAgICAgICAgICAgICAg
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQpOwor
ICAgIGJpbmRNZXRob2QoImNsZWFyS2lsbFJpbmciLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6
Y2xlYXJLaWxsUmluZyk7CisgICAgYmluZE1ldGhvZCgidGV4dFpvb21JbiIsICZFdmVudFNlbmRp
bmdDb250cm9sbGVyOjp0ZXh0Wm9vbUluKTsKKyAgICBiaW5kTWV0aG9kKCJ0ZXh0Wm9vbU91dCIs
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjp0ZXh0Wm9vbU91dCk7CisgICAgYmluZE1ldGhvZCgi
em9vbVBhZ2VJbiIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjp6b29tUGFnZUluKTsKKyAgICBi
aW5kTWV0aG9kKCJ6b29tUGFnZU91dCIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjp6b29tUGFn
ZU91dCk7CisgICAgYmluZE1ldGhvZCgic2NoZWR1bGVBc3luY2hyb25vdXNDbGljayIsCisgICAg
ICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6c2NoZWR1bGVBc3luY2hyb25vdXND
bGljayk7CisgICAgYmluZE1ldGhvZCgiYmVnaW5EcmFnV2l0aEZpbGVzIiwKKyAgICAgICAgICAg
ICAgICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpiZWdpbkRyYWdXaXRoRmlsZXMpOworCisgICAg
Ly8gV2hlbiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQgdmFsdWUpLCB3ZSBiYXRjaCBtb3VzZSBt
b3ZlIGFuZCBtb3VzZSB1cAorICAgIC8vIGV2ZW50cyBzbyB3ZSBjYW4gc2ltdWxhdGUgZHJhZyAm
IGRyb3AuCisgICAgYmluZFByb3BlcnR5KCJkcmFnTW9kZSIsICZkcmFnTW9kZSk7CisjaWYgT1Mo
V0lORE9XUykKKyAgICBiaW5kUHJvcGVydHkoIldNX0tFWURPV04iLCAmd21LZXlEb3duKTsKKyAg
ICBiaW5kUHJvcGVydHkoIldNX0tFWVVQIiwgJndtS2V5VXApOworICAgIGJpbmRQcm9wZXJ0eSgi
V01fQ0hBUiIsICZ3bUNoYXIpOworICAgIGJpbmRQcm9wZXJ0eSgiV01fREVBRENIQVIiLCAmd21E
ZWFkQ2hhcik7CisgICAgYmluZFByb3BlcnR5KCJXTV9TWVNLRVlET1dOIiwgJndtU3lzS2V5RG93
bik7CisgICAgYmluZFByb3BlcnR5KCJXTV9TWVNLRVlVUCIsICZ3bVN5c0tleVVwKTsKKyAgICBi
aW5kUHJvcGVydHkoIldNX1NZU0NIQVIiLCAmd21TeXNDaGFyKTsKKyAgICBiaW5kUHJvcGVydHko
IldNX1NZU0RFQURDSEFSIiwgJndtU3lzRGVhZENoYXIpOworI2VuZGlmCit9CisKK3ZvaWQgRXZl
bnRTZW5kaW5nQ29udHJvbGxlcjo6cmVzZXQoKQoreworICAgIC8vIFRoZSB0ZXN0IHNob3VsZCBo
YXZlIGZpbmlzaGVkIGEgZHJhZyBhbmQgdGhlIG1vdXNlIGJ1dHRvbiBzdGF0ZS4KKyAgICBBU1NF
UlQoY3VycmVudERyYWdEYXRhLmlzTnVsbCgpKTsKKyAgICBjdXJyZW50RHJhZ0RhdGEucmVzZXQo
KTsKKyAgICBjdXJyZW50RHJhZ0VmZmVjdCA9IFdlYktpdDo6V2ViRHJhZ09wZXJhdGlvbk5vbmU7
CisgICAgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCA9IFdlYktpdDo6V2ViRHJhZ09wZXJhdGlv
bk5vbmU7CisgICAgcHJlc3NlZEJ1dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7Cisg
ICAgZHJhZ01vZGUuc2V0KHRydWUpOworI2lmIE9TKFdJTkRPV1MpCisgICAgd21LZXlEb3duLlNl
dChXTV9LRVlET1dOKTsKKyAgICB3bUtleVVwLlNldChXTV9LRVlVUCk7CisgICAgd21DaGFyLlNl
dChXTV9DSEFSKTsKKyAgICB3bURlYWRDaGFyLlNldChXTV9ERUFEQ0hBUik7CisgICAgd21TeXNL
ZXlEb3duLlNldChXTV9TWVNLRVlET1dOKTsKKyAgICB3bVN5c0tleVVwLlNldChXTV9TWVNLRVlV
UCk7CisgICAgd21TeXNDaGFyLlNldChXTV9TWVNDSEFSKTsKKyAgICB3bVN5c0RlYWRDaGFyLlNl
dChXTV9TWVNERUFEQ0hBUik7CisjZW5kaWYKKyAgICBsYXN0TW91c2VQb3MgPSBXZWJQb2ludCgw
LCAwKTsKKyAgICBsYXN0Q2xpY2tUaW1lU2VjID0gMDsKKyAgICBsYXN0Q2xpY2tQb3MgPSBXZWJQ
b2ludCgwLCAwKTsKKyAgICBjbGlja0NvdW50ID0gMDsKKyAgICBsYXN0QnV0dG9uVHlwZSA9IFdl
Yk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7CisgICAgdGltZU9mZnNldE1zID0gMDsKK30KKworV2Vi
VmlldyogRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6d2VidmlldygpCit7CisgICAgcmV0dXJuIHRl
c3RTaGVsbC0+d2ViVmlldygpOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmRv
RHJhZ0Ryb3AoY29uc3QgV2ViS2l0OjpXZWJQb2ludCYgZXZlbnRQb3MsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViRHJhZ0RhdGEmIGRyYWdEYXRhLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkRyYWdPcGVyYXRpb25z
TWFzayBtYXNrKQoreworICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7CisgICAgaW5pdE1vdXNlRXZl
bnQoV2ViSW5wdXRFdmVudDo6TW91c2VEb3duLCBwcmVzc2VkQnV0dG9uLCBsYXN0TW91c2VQb3Ms
ICZldmVudCk7CisgICAgV2ViUG9pbnQgY2xpZW50UG9pbnQoZXZlbnQueCwgZXZlbnQueSk7Cisg
ICAgV2ViUG9pbnQgc2NyZWVuUG9pbnQoZXZlbnQuZ2xvYmFsWCwgZXZlbnQuZ2xvYmFsWSk7Cisg
ICAgY3VycmVudERyYWdEYXRhID0gZHJhZ0RhdGE7CisgICAgY3VycmVudERyYWdFZmZlY3RzQWxs
b3dlZCA9IG1hc2s7CisgICAgY3VycmVudERyYWdFZmZlY3QgPSB3ZWJ2aWV3KCktPmRyYWdUYXJn
ZXREcmFnRW50ZXIoZHJhZ0RhdGEsIDAsIGNsaWVudFBvaW50LCBzY3JlZW5Qb2ludCwgY3VycmVu
dERyYWdFZmZlY3RzQWxsb3dlZCk7CisKKyAgICAvLyBGaW5pc2ggcHJvY2Vzc2luZyBldmVudHMu
CisgICAgcmVwbGF5U2F2ZWRFdmVudHMoKTsKK30KKworV2ViTW91c2VFdmVudDo6QnV0dG9uIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmdldEJ1dHRvblR5cGVGcm9tQnV0dG9uTnVtYmVyKGludCBi
dXR0b25Db2RlKQoreworICAgIGlmICghYnV0dG9uQ29kZSkKKyAgICAgICAgcmV0dXJuIFdlYk1v
dXNlRXZlbnQ6OkJ1dHRvbkxlZnQ7CisgICAgaWYgKGJ1dHRvbkNvZGUgPT0gMikKKyAgICAgICAg
cmV0dXJuIFdlYk1vdXNlRXZlbnQ6OkJ1dHRvblJpZ2h0OworICAgIHJldHVybiBXZWJNb3VzZUV2
ZW50OjpCdXR0b25NaWRkbGU7Cit9CisKK2ludCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjpnZXRC
dXR0b25OdW1iZXJGcm9tU2luZ2xlQXJnKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRz
KQoreworICAgIGludCBidXR0b25Db2RlID0gMDsKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+
IDAgJiYgYXJndW1lbnRzWzBdLmlzTnVtYmVyKCkpCisgICAgICAgIGJ1dHRvbkNvZGUgPSBhcmd1
bWVudHNbMF0udG9JbnQzMigpOworICAgIHJldHVybiBidXR0b25Db2RlOworfQorCit2b2lkIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnVwZGF0ZUNsaWNrQ291bnRGb3JCdXR0b24oV2ViTW91c2VF
dmVudDo6QnV0dG9uIGJ1dHRvblR5cGUpCit7CisgICAgaWYgKChnZXRDdXJyZW50RXZlbnRUaW1l
U2VjKCkgLSBsYXN0Q2xpY2tUaW1lU2VjIDwgbXVsdGlwbGVDbGlja1RpbWVTZWMpCisgICAgICAg
ICYmICghb3V0c2lkZU11bHRpQ2xpY2tSYWRpdXMobGFzdE1vdXNlUG9zLCBsYXN0Q2xpY2tQb3Mp
KQorICAgICAgICAmJiAoYnV0dG9uVHlwZSA9PSBsYXN0QnV0dG9uVHlwZSkpCisgICAgICAgICsr
Y2xpY2tDb3VudDsKKyAgICBlbHNlIHsKKyAgICAgICAgY2xpY2tDb3VudCA9IDE7CisgICAgICAg
IGxhc3RCdXR0b25UeXBlID0gYnV0dG9uVHlwZTsKKyAgICB9Cit9CisKKy8vCisvLyBJbXBsZW1l
bnRlZCBqYXZhc2NyaXB0IG1ldGhvZHMuCisvLworCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xs
ZXI6Om1vdXNlRG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIGlmIChyZXN1bHQpIC8vIENvdWxkIGJlIDAgaWYgaW52b2tlZCBh
c3luY2hyb25vdXNseS4KKyAgICAgICAgcmVzdWx0LT5zZXROdWxsKCk7CisKKyAgICB3ZWJ2aWV3
KCktPmxheW91dCgpOworCisgICAgaW50IGJ1dHRvbk51bWJlciA9IGdldEJ1dHRvbk51bWJlckZy
b21TaW5nbGVBcmcoYXJndW1lbnRzKTsKKyAgICBBU1NFUlQoYnV0dG9uTnVtYmVyICE9IC0xKTsK
KworICAgIFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBidXR0b25UeXBlID0gZ2V0QnV0dG9uVHlwZUZy
b21CdXR0b25OdW1iZXIoYnV0dG9uTnVtYmVyKTsKKworICAgIHVwZGF0ZUNsaWNrQ291bnRGb3JC
dXR0b24oYnV0dG9uVHlwZSk7CisKKyAgICBXZWJNb3VzZUV2ZW50IGV2ZW50OworICAgIHByZXNz
ZWRCdXR0b24gPSBidXR0b25UeXBlOworICAgIGluaXRNb3VzZUV2ZW50KFdlYklucHV0RXZlbnQ6
Ok1vdXNlRG93biwgYnV0dG9uVHlwZSwgbGFzdE1vdXNlUG9zLCAmZXZlbnQpOworICAgIGlmIChh
cmd1bWVudHMuc2l6ZSgpID49IDIgJiYgKGFyZ3VtZW50c1sxXS5pc09iamVjdCgpIHx8IGFyZ3Vt
ZW50c1sxXS5pc1N0cmluZygpKSkKKyAgICAgICAgYXBwbHlLZXlNb2RpZmllcnMoJihhcmd1bWVu
dHNbMV0pLCAmZXZlbnQpOworICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5wdXRFdmVudChldmVudCk7
Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VVcChjb25zdCBDcHBBcmd1
bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChyZXN1
bHQpIC8vIENvdWxkIGJlIDAgaWYgaW52b2tlZCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgcmVz
dWx0LT5zZXROdWxsKCk7CisKKyAgICB3ZWJ2aWV3KCktPmxheW91dCgpOworCisgICAgaW50IGJ1
dHRvbk51bWJlciA9IGdldEJ1dHRvbk51bWJlckZyb21TaW5nbGVBcmcoYXJndW1lbnRzKTsKKyAg
ICBBU1NFUlQoYnV0dG9uTnVtYmVyICE9IC0xKTsKKworICAgIFdlYk1vdXNlRXZlbnQ6OkJ1dHRv
biBidXR0b25UeXBlID0gZ2V0QnV0dG9uVHlwZUZyb21CdXR0b25OdW1iZXIoYnV0dG9uTnVtYmVy
KTsKKworICAgIGlmIChpc0RyYWdNb2RlKCkgJiYgIXJlcGxheWluZ1NhdmVkRXZlbnRzKSB7Cisg
ICAgICAgIFNhdmVkRXZlbnQgc2F2ZWRFdmVudDsKKyAgICAgICAgc2F2ZWRFdmVudC50eXBlID0g
U2F2ZWRFdmVudDo6TW91c2VVcDsKKyAgICAgICAgc2F2ZWRFdmVudC5idXR0b25UeXBlID0gYnV0
dG9uVHlwZTsKKyAgICAgICAgbW91c2VFdmVudFF1ZXVlLmFwcGVuZChzYXZlZEV2ZW50KTsKKyAg
ICAgICAgcmVwbGF5U2F2ZWRFdmVudHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBXZWJNb3Vz
ZUV2ZW50IGV2ZW50OworICAgICAgICBpbml0TW91c2VFdmVudChXZWJJbnB1dEV2ZW50OjpNb3Vz
ZVVwLCBidXR0b25UeXBlLCBsYXN0TW91c2VQb3MsICZldmVudCk7CisgICAgICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpID49IDIgJiYgKGFyZ3VtZW50c1sxXS5pc09iamVjdCgpIHx8IGFyZ3VtZW50
c1sxXS5pc1N0cmluZygpKSkKKyAgICAgICAgICAgIGFwcGx5S2V5TW9kaWZpZXJzKCYoYXJndW1l
bnRzWzFdKSwgJmV2ZW50KTsKKyAgICAgICAgZG9Nb3VzZVVwKGV2ZW50KTsKKyAgICB9Cit9CisK
K3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZG9Nb3VzZVVwKGNvbnN0IFdlYk1vdXNlRXZl
bnQmIGUpCit7CisgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGUpOworCisgICAgcHJl
c3NlZEJ1dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7CisgICAgbGFzdENsaWNrVGlt
ZVNlYyA9IGUudGltZVN0YW1wU2Vjb25kczsKKyAgICBsYXN0Q2xpY2tQb3MgPSBsYXN0TW91c2VQ
b3M7CisKKyAgICAvLyBJZiB3ZSdyZSBpbiBhIGRyYWcgb3BlcmF0aW9uLCBjb21wbGV0ZSBpdC4K
KyAgICBpZiAoY3VycmVudERyYWdEYXRhLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisgICAg
V2ViUG9pbnQgY2xpZW50UG9pbnQoZS54LCBlLnkpOworICAgIFdlYlBvaW50IHNjcmVlblBvaW50
KGUuZ2xvYmFsWCwgZS5nbG9iYWxZKTsKKworICAgIGN1cnJlbnREcmFnRWZmZWN0ID0gd2Vidmll
dygpLT5kcmFnVGFyZ2V0RHJhZ092ZXIoY2xpZW50UG9pbnQsIHNjcmVlblBvaW50LCBjdXJyZW50
RHJhZ0VmZmVjdHNBbGxvd2VkKTsKKyAgICBpZiAoY3VycmVudERyYWdFZmZlY3QpCisgICAgICAg
IHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyb3AoY2xpZW50UG9pbnQsIHNjcmVlblBvaW50KTsKKyAg
ICBlbHNlCisgICAgICAgIHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyYWdMZWF2ZSgpOworICAgIHdl
YnZpZXcoKS0+ZHJhZ1NvdXJjZUVuZGVkQXQoY2xpZW50UG9pbnQsIHNjcmVlblBvaW50LCBjdXJy
ZW50RHJhZ0VmZmVjdCk7CisgICAgd2VidmlldygpLT5kcmFnU291cmNlU3lzdGVtRHJhZ0VuZGVk
KCk7CisKKyAgICBjdXJyZW50RHJhZ0RhdGEucmVzZXQoKTsKK30KKwordm9pZCBFdmVudFNlbmRp
bmdDb250cm9sbGVyOjptb3VzZU1vdmVUbyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPCAyIHx8ICFhcmd1bWVudHNbMF0uaXNOdW1iZXIoKSB8fCAh
YXJndW1lbnRzWzFdLmlzTnVtYmVyKCkpCisgICAgICAgIHJldHVybjsKKyAgICB3ZWJ2aWV3KCkt
PmxheW91dCgpOworCisgICAgV2ViUG9pbnQgbW91c2VQb3MoYXJndW1lbnRzWzBdLnRvSW50MzIo
KSwgYXJndW1lbnRzWzFdLnRvSW50MzIoKSk7CisKKyAgICBpZiAoaXNEcmFnTW9kZSgpICYmIHBy
ZXNzZWRCdXR0b24gPT0gV2ViTW91c2VFdmVudDo6QnV0dG9uTGVmdCAmJiAhcmVwbGF5aW5nU2F2
ZWRFdmVudHMpIHsKKyAgICAgICAgU2F2ZWRFdmVudCBzYXZlZEV2ZW50OworICAgICAgICBzYXZl
ZEV2ZW50LnR5cGUgPSBTYXZlZEV2ZW50OjpNb3VzZU1vdmU7CisgICAgICAgIHNhdmVkRXZlbnQu
cG9zID0gbW91c2VQb3M7CisgICAgICAgIG1vdXNlRXZlbnRRdWV1ZS5hcHBlbmQoc2F2ZWRFdmVu
dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV2ViTW91c2VFdmVudCBldmVudDsKKyAgICAgICAg
aW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6TW91c2VNb3ZlLCBwcmVzc2VkQnV0dG9uLCBt
b3VzZVBvcywgJmV2ZW50KTsKKyAgICAgICAgZG9Nb3VzZU1vdmUoZXZlbnQpOworICAgIH0KK30K
Kwordm9pZCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjptb3VzZVdoZWVsVG8oY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQt
PnNldE51bGwoKTsKKworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMiB8fCAhYXJndW1lbnRz
WzBdLmlzTnVtYmVyKCkgfHwgIWFyZ3VtZW50c1sxXS5pc051bWJlcigpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBGb3JjZSBhIGxheW91dCBoZXJlIGp1c3QgdG8gbWFrZSBzdXJlIGV2ZXJ5
IHBvc2l0aW9uIGhhcyBiZWVuCisgICAgLy8gZGV0ZXJtaW5lZCBiZWZvcmUgd2Ugc2VuZCBldmVu
dHMgKGFzIHdlbGwgYXMgYWxsIHRoZSBvdGhlciBtZXRob2RzCisgICAgLy8gdGhhdCBzZW5kIGFu
IGV2ZW50IGRvKS4gVGhlIGxheW91dCB0ZXN0IGNhbGxpbmcgdGhpcworICAgIC8vIChzY3JvbGxi
YXJzL292ZXJmbG93LXNjcm9sbGJhci1ob3Jpem9udGFsLXdoZWVsLXNjcm9sbC5odG1sLCBvbmx5
IG9uZQorICAgIC8vIGZvciBub3cpIGRvZXMgbm90IHJlbHkgb24gdGhpcyB0aG91Z2guCisgICAg
d2VidmlldygpLT5sYXlvdXQoKTsKKworICAgIGludCBob3Jpem9udGFsID0gYXJndW1lbnRzWzBd
LnRvSW50MzIoKTsKKyAgICBpbnQgdmVydGljYWwgPSBhcmd1bWVudHNbMV0udG9JbnQzMigpOwor
CisgICAgV2ViTW91c2VXaGVlbEV2ZW50IGV2ZW50OworICAgIGluaXRNb3VzZUV2ZW50KFdlYklu
cHV0RXZlbnQ6Ok1vdXNlV2hlZWwsIHByZXNzZWRCdXR0b24sIGxhc3RNb3VzZVBvcywgJmV2ZW50
KTsKKyAgICBldmVudC53aGVlbFRpY2tzWCA9IHN0YXRpY19jYXN0PGZsb2F0Pihob3Jpem9udGFs
KTsKKyAgICBldmVudC53aGVlbFRpY2tzWSA9IHN0YXRpY19jYXN0PGZsb2F0Pih2ZXJ0aWNhbCk7
CisgICAgZXZlbnQuZGVsdGFYID0gLWhvcml6b250YWwgKiBzY3JvbGxiYXJQaXhlbHNQZXJUaWNr
OworICAgIGV2ZW50LmRlbHRhWSA9IC12ZXJ0aWNhbCAqIHNjcm9sbGJhclBpeGVsc1BlclRpY2s7
CisgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBFdmVu
dFNlbmRpbmdDb250cm9sbGVyOjpkb01vdXNlTW92ZShjb25zdCBXZWJNb3VzZUV2ZW50JiBlKQor
eworICAgIGxhc3RNb3VzZVBvcyA9IFdlYlBvaW50KGUueCwgZS55KTsKKworICAgIHdlYnZpZXco
KS0+aGFuZGxlSW5wdXRFdmVudChlKTsKKworICAgIGlmIChwcmVzc2VkQnV0dG9uID09IFdlYk1v
dXNlRXZlbnQ6OkJ1dHRvbk5vbmUgfHwgY3VycmVudERyYWdEYXRhLmlzTnVsbCgpKQorICAgICAg
ICByZXR1cm47CisgICAgV2ViUG9pbnQgY2xpZW50UG9pbnQoZS54LCBlLnkpOworICAgIFdlYlBv
aW50IHNjcmVlblBvaW50KGUuZ2xvYmFsWCwgZS5nbG9iYWxZKTsKKyAgICBjdXJyZW50RHJhZ0Vm
ZmVjdCA9IHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyYWdPdmVyKGNsaWVudFBvaW50LCBzY3JlZW5Q
b2ludCwgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6a2V5RG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpIDwgMSB8fCAhYXJndW1lbnRzWzBdLmlzU3RyaW5nKCkpCisgICAgICAgIHJl
dHVybjsKKyAgICBib29sIGdlbmVyYXRlQ2hhciA9IGZhbHNlOworCisgICAgLy8gRklYTUU6IEkn
bSBub3QgZXhhY3RseSBzdXJlIGhvdyB3ZSBzaG91bGQgY29udmVydCB0aGUgc3RyaW5nIHRvIGEg
a2V5CisgICAgLy8gZXZlbnQuIFRoaXMgc2VlbXMgdG8gd29yayBpbiB0aGUgY2FzZXMgSSB0ZXN0
ZWQuCisgICAgLy8gRklYTUU6IFNob3VsZCB3ZSBhbHNvIGdlbmVyYXRlIGEgS0VZX1VQPworICAg
IHdzdHJpbmcgY29kZVN0ciA9IFVURjhUb1dpZGUoYXJndW1lbnRzWzBdLnRvU3RyaW5nKCkpOwor
CisgICAgLy8gQ29udmVydCBcbiAtPiBWS19SRVRVUk4uICBTb21lIGxheW91dCB0ZXN0cyB1c2Ug
XG4gdG8gbWVhbiAiRW50ZXIiLCB3aGVuCisgICAgLy8gV2luZG93cyB1c2VzIFxyIGZvciAiRW50
ZXIiLgorICAgIGludCBjb2RlID0gMDsKKyAgICBpbnQgdGV4dCA9IDA7CisgICAgYm9vbCBuZWVk
c1NoaWZ0S2V5TW9kaWZpZXIgPSBmYWxzZTsKKyAgICBpZiAoTCJcbiIgPT0gY29kZVN0cikgewor
ICAgICAgICBnZW5lcmF0ZUNoYXIgPSB0cnVlOworICAgICAgICB0ZXh0ID0gY29kZSA9IGJhc2U6
OlZLRVlfUkVUVVJOOworICAgIH0gZWxzZSBpZiAoTCJyaWdodEFycm93IiA9PSBjb2RlU3RyKQor
ICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9SSUdIVDsKKyAgICBlbHNlIGlmIChMImRvd25BcnJv
dyIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlfRE9XTjsKKyAgICBlbHNl
IGlmIChMImxlZnRBcnJvdyIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlf
TEVGVDsKKyAgICBlbHNlIGlmIChMInVwQXJyb3ciID09IGNvZGVTdHIpCisgICAgICAgIGNvZGUg
PSBiYXNlOjpWS0VZX1VQOworICAgIGVsc2UgaWYgKEwiZGVsZXRlIiA9PSBjb2RlU3RyKQorICAg
ICAgICBjb2RlID0gYmFzZTo6VktFWV9CQUNLOworICAgIGVsc2UgaWYgKEwicGFnZVVwIiA9PSBj
b2RlU3RyKQorICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9QUklPUjsKKyAgICBlbHNlIGlmIChM
InBhZ2VEb3duIiA9PSBjb2RlU3RyKQorICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9ORVhUOwor
ICAgIGVsc2UgaWYgKEwiaG9tZSIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZL
RVlfSE9NRTsKKyAgICBlbHNlIGlmIChMImVuZCIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9
IGJhc2U6OlZLRVlfRU5EOworICAgIGVsc2UgeworICAgICAgICAvLyBDb21wYXJlIHRoZSBpbnB1
dCBzdHJpbmcgd2l0aCB0aGUgZnVuY3Rpb24ta2V5IG5hbWVzIGRlZmluZWQgYnkgdGhlCisgICAg
ICAgIC8vIERPTSBzcGVjIChpLmUuICJGMSIsLi4uLCJGMjQiKS4gSWYgdGhlIGlucHV0IHN0cmlu
ZyBpcyBhIGZ1bmN0aW9uLWtleQorICAgICAgICAvLyBuYW1lLCBzZXQgaXRzIGtleSBjb2RlLgor
ICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAyNDsgKytpKSB7CisgICAgICAgICAgICB3c3Ry
aW5nIGZ1bmN0aW9uS2V5TmFtZTsKKyAgICAgICAgICAgIGZ1bmN0aW9uS2V5TmFtZSArPSBMIkYi
OworICAgICAgICAgICAgZnVuY3Rpb25LZXlOYW1lICs9IEludFRvV1N0cmluZyhpKTsKKyAgICAg
ICAgICAgIGlmIChmdW5jdGlvbktleU5hbWUgPT0gY29kZVN0cikgeworICAgICAgICAgICAgICAg
IGNvZGUgPSBiYXNlOjpWS0VZX0YxICsgKGkgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvZGUpIHsKKyAgICAgICAg
ICAgIEFTU0VSVChjb2RlU3RyLmxlbmd0aCgpID09IDEpOworICAgICAgICAgICAgdGV4dCA9IGNv
ZGUgPSBjb2RlU3RyWzBdOworICAgICAgICAgICAgbmVlZHNTaGlmdEtleU1vZGlmaWVyID0gbmVl
ZHNTaGlmdE1vZGlmaWVyKGNvZGUpOworICAgICAgICAgICAgaWYgKChjb2RlICYgMHhGRikgPj0g
J2EnICYmIChjb2RlICYgMHhGRikgPD0gJ3onKQorICAgICAgICAgICAgICAgIGNvZGUgLT0gJ2En
IC0gJ0EnOworICAgICAgICAgICAgZ2VuZXJhdGVDaGFyID0gdHJ1ZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIEZvciBvbmUgZ2VuZXJhdGVkIGtleWJvYXJkIGV2ZW50LCB3ZSBuZWVkIHRv
IGdlbmVyYXRlIGEga2V5RG93bi9rZXlVcAorICAgIC8vIHBhaXI7IHJlZmVyIHRvIEV2ZW50U2Vu
ZGVyLmNwcCBpbiBXZWJLaXQvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvd2luLgorICAgIC8v
IE9uIFdpbmRvd3MsIHdlIG1pZ2h0IGFsc28gbmVlZCB0byBnZW5lcmF0ZSBhIGNoYXIgZXZlbnQg
dG8gbWltaWMgdGhlCisgICAgLy8gV2luZG93cyBldmVudCBmbG93OyBvbiBvdGhlciBwbGF0Zm9y
bXMgd2UgY3JlYXRlIGEgbWVyZ2VkIGV2ZW50IGFuZCB0ZXN0CisgICAgLy8gdGhlIGV2ZW50IGZs
b3cgdGhhdCB0aGF0IHBsYXRmb3JtIHByb3ZpZGVzLgorICAgIFdlYktleWJvYXJkRXZlbnQgZXZl
bnREb3duLCBldmVudENoYXIsIGV2ZW50VXA7CisgICAgZXZlbnREb3duLnR5cGUgPSBXZWJJbnB1
dEV2ZW50OjpSYXdLZXlEb3duOworICAgIGV2ZW50RG93bi5tb2RpZmllcnMgPSAwOworICAgIGV2
ZW50RG93bi53aW5kb3dzS2V5Q29kZSA9IGNvZGU7CisgICAgaWYgKGdlbmVyYXRlQ2hhcikgewor
ICAgICAgICBldmVudERvd24udGV4dFswXSA9IHRleHQ7CisgICAgICAgIGV2ZW50RG93bi51bm1v
ZGlmaWVkVGV4dFswXSA9IHRleHQ7CisgICAgfQorICAgIGV2ZW50RG93bi5zZXRLZXlJZGVudGlm
aWVyRnJvbVdpbmRvd3NLZXlDb2RlKCk7CisKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAy
ICYmIChhcmd1bWVudHNbMV0uaXNPYmplY3QoKSB8fCBhcmd1bWVudHNbMV0uaXNTdHJpbmcoKSkp
CisgICAgICAgIGV2ZW50RG93bi5pc1N5c3RlbUtleSA9IGFwcGx5S2V5TW9kaWZpZXJzKCYoYXJn
dW1lbnRzWzFdKSwgJmV2ZW50RG93bik7CisKKyAgICBpZiAobmVlZHNTaGlmdEtleU1vZGlmaWVy
KQorICAgICAgICBldmVudERvd24ubW9kaWZpZXJzIHw9IFdlYklucHV0RXZlbnQ6OlNoaWZ0S2V5
OworCisgICAgLy8gU2VlIGlmIEtleUxvY2F0aW9uIGFyZ3VtZW50IGlzIGdpdmVuLgorICAgIGlm
IChhcmd1bWVudHMuc2l6ZSgpID49IDMgJiYgYXJndW1lbnRzWzJdLmlzTnVtYmVyKCkpIHsKKyAg
ICAgICAgaW50IGxvY2F0aW9uID0gYXJndW1lbnRzWzJdLnRvSW50MzIoKTsKKyAgICAgICAgaWYg
KGxvY2F0aW9uID09IERPTUtleUxvY2F0aW9uTnVtcGFkKQorICAgICAgICAgICAgZXZlbnREb3du
Lm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50OjpJc0tleVBhZDsKKyAgICB9CisKKyAgICBldmVu
dENoYXIgPSBldmVudFVwID0gZXZlbnREb3duOworICAgIGV2ZW50VXAudHlwZSA9IFdlYklucHV0
RXZlbnQ6OktleVVwOworICAgIC8vIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXIubSBmb3JjZXMgYSBs
YXlvdXQgaGVyZSwgd2l0aCBhdCBsZWFzdCBvbmUKKyAgICAvLyB0ZXN0IChmYXN0L2Zvcm1zL2Zv
Y3VzLWNvbnRyb2wtdG8tcGFnZS5odG1sKSByZWx5aW5nIG9uIHRoaXMuCisgICAgd2Vidmlldygp
LT5sYXlvdXQoKTsKKworICAgIC8vIEluIHRoZSBicm93c2VyLCBpZiBhIGtleWJvYXJkIGV2ZW50
IGNvcnJlc3BvbmRzIHRvIGFuIGVkaXRvciBjb21tYW5kLAorICAgIC8vIHRoZSBjb21tYW5kIHdp
bGwgYmUgZGlzcGF0Y2hlZCB0byB0aGUgcmVuZGVyZXIganVzdCBiZWZvcmUgZGlzcGF0Y2hpbmcK
KyAgICAvLyB0aGUga2V5Ym9hcmQgZXZlbnQsIGFuZCB0aGVuIGl0IHdpbGwgYmUgZXhlY3V0ZWQg
aW4gdGhlCisgICAgLy8gUmVuZGVyVmlldzo6aGFuZGxlQ3VycmVudEtleWJvYXJkRXZlbnQoKSBt
ZXRob2QsIHdoaWNoIGlzIGNhbGxlZCBmcm9tCisgICAgLy8gdGhpcmRfcGFydHkvV2ViS2l0L1dl
YktpdC9jaHJvbWl1bS9zcmMvRWRpdG9yQ2xpZW50SW1wbC5jcHAuCisgICAgLy8gV2UganVzdCBz
aW11bGF0ZSB0aGUgc2FtZSBiZWhhdmlvciBoZXJlLgorICAgIHN0cmluZyBlZGl0Q29tbWFuZDsK
KyAgICBpZiAoZ2V0RWRpdENvbW1hbmQoZXZlbnREb3duLCAmZWRpdENvbW1hbmQpKQorICAgICAg
ICB0ZXN0U2hlbGwtPmRlbGVnYXRlKCktPnNldEVkaXRDb21tYW5kKGVkaXRDb21tYW5kLCAiIik7
CisKKyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlucHV0RXZlbnQoZXZlbnREb3duKTsKKworICAgIHRl
c3RTaGVsbC0+ZGVsZWdhdGUoKS0+Y2xlYXJFZGl0Q29tbWFuZCgpOworCisgICAgaWYgKGdlbmVy
YXRlQ2hhcikgeworICAgICAgICBldmVudENoYXIudHlwZSA9IFdlYklucHV0RXZlbnQ6OkNoYXI7
CisgICAgICAgIGV2ZW50Q2hhci5rZXlJZGVudGlmaWVyWzBdID0gJ1wwJzsKKyAgICAgICAgd2Vi
dmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50Q2hhcik7CisgICAgfQorCisgICAgd2Vidmll
dygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50VXApOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0Nv
bnRyb2xsZXI6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisjaWYg
T1MoV0lORE9XUykKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA9PSAzKSB7CisgICAgICAgIC8v
IEdyYWIgdGhlIG1lc3NhZ2UgaWQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZGlzcGF0Y2ggaXQuCisg
ICAgICAgIGludCBtc2cgPSBhcmd1bWVudHNbMF0uVG9JbnQzMigpOworCisgICAgICAgIC8vIFdl
YktpdCdzIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBzdHVmZnMgYSBNU0cgc3RydWN0IGFuZCB1
c2VzCisgICAgICAgIC8vIFRyYW5zbGF0ZU1lc3NhZ2UgYW5kIERpc3BhdGNoTWVzc2FnZS4gV2Ug
dXNlIGEgV2ViS2V5Ym9hcmRFdmVudCwgd2hpY2gKKyAgICAgICAgLy8gZG9lc24ndCBuZWVkIHRv
IHJlY2VpdmUgdGhlIERlYWRDaGFyIGFuZCBTeXNEZWFkQ2hhciBtZXNzYWdlcy4KKyAgICAgICAg
aWYgKG1zZyA9PSBXTV9ERUFEQ0hBUiB8fCBtc2cgPT0gV01fU1lTREVBRENIQVIpCisgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgd2VidmlldygpLT5sYXlvdXQoKTsKKworICAgICAgICB1
bnNpZ25lZCBsb25nIGxwYXJhbSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGFyZ3VtZW50
c1syXS5Ub0RvdWJsZSgpKTsKKyAgICAgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KFdl
YklucHV0RXZlbnRGYWN0b3J5OjprZXlib2FyZEV2ZW50KDAsIG1zZywgYXJndW1lbnRzWzFdLlRv
SW50MzIoKSwgbHBhcmFtKSk7CisgICAgfSBlbHNlCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworI2VuZGlmCit9CisKK2Jvb2wgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bmVlZHNTaGlm
dE1vZGlmaWVyKGludCBrZXlDb2RlKQoreworICAgIC8vIElmIGNvZGUgaXMgYW4gdXBwZXJjYXNl
IGxldHRlciwgYXNzaWduIGEgU0hJRlQga2V5IHRvCisgICAgLy8gZXZlbnREb3duLm1vZGlmaWVy
LCB0aGlzIGxvZ2ljIGNvbWVzIGZyb20KKyAgICAvLyBXZWJLaXQvV2ViS2l0VG9vbHMvRHVtcFJl
bmRlclRyZWUvV2luL0V2ZW50U2VuZGVyLmNwcAorICAgIHJldHVybiAoa2V5Q29kZSAmIDB4RkYp
ID49ICdBJyAmJiAoa2V5Q29kZSAmIDB4RkYpIDw9ICdaJzsKK30KKwordm9pZCBFdmVudFNlbmRp
bmdDb250cm9sbGVyOjpsZWFwRm9yd2FyZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPCAxIHx8ICFhcmd1bWVudHNbMF0uaXNOdW1iZXIoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaW50IG1pbGxpc2Vjb25kcyA9IGFyZ3VtZW50c1swXS50b0lu
dDMyKCk7CisgICAgaWYgKGlzRHJhZ01vZGUoKSAmJiBwcmVzc2VkQnV0dG9uID09IFdlYk1vdXNl
RXZlbnQ6OkJ1dHRvbkxlZnQgJiYgIXJlcGxheWluZ1NhdmVkRXZlbnRzKSB7CisgICAgICAgIFNh
dmVkRXZlbnQgc2F2ZWRFdmVudDsKKyAgICAgICAgc2F2ZWRFdmVudC50eXBlID0gU2F2ZWRFdmVu
dDo6TGVhcEZvcndhcmQ7CisgICAgICAgIHNhdmVkRXZlbnQubWlsbGlzZWNvbmRzID0gbWlsbGlz
ZWNvbmRzOworICAgICAgICBtb3VzZUV2ZW50UXVldWUuYXBwZW5kKHNhdmVkRXZlbnQpOworICAg
IH0gZWxzZQorICAgICAgICBkb0xlYXBGb3J3YXJkKG1pbGxpc2Vjb25kcyk7Cit9CisKK3ZvaWQg
RXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZG9MZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKQor
eworICAgIGFkdmFuY2VFdmVudFRpbWUobWlsbGlzZWNvbmRzKTsKK30KKworLy8gQXBwbGUncyBw
b3J0IG9mIFdlYktpdCB6b29tcyBieSBhIGZhY3RvciBvZiAxLjIgKHNlZQorLy8gV2ViS2l0L1dl
YlZpZXcvV2ViVmlldy5tbSkKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6dGV4dFpvb21J
bihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgd2Vi
dmlldygpLT5zZXRab29tTGV2ZWwodHJ1ZSwgd2VidmlldygpLT56b29tTGV2ZWwoKSArIDEpOwor
ICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6
OnRleHRab29tT3V0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICB3ZWJ2aWV3KCktPnNldFpvb21MZXZlbCh0cnVlLCB3ZWJ2aWV3KCktPnpvb21MZXZl
bCgpIC0gMSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6em9vbVBhZ2VJbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
KiByZXN1bHQpCit7CisgICAgd2VidmlldygpLT5zZXRab29tTGV2ZWwoZmFsc2UsIHdlYnZpZXco
KS0+em9vbUxldmVsKCkgKyAxKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBF
dmVudFNlbmRpbmdDb250cm9sbGVyOjp6b29tUGFnZU91dChjb25zdCBDcHBBcmd1bWVudExpc3Qm
LCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgd2VidmlldygpLT5zZXRab29tTGV2ZWwoZmFs
c2UsIHdlYnZpZXcoKS0+em9vbUxldmVsKCkgLSAxKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsK
K30KKwordm9pZCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjpyZXBsYXlTYXZlZEV2ZW50cygpCit7
CisgICAgcmVwbGF5aW5nU2F2ZWRFdmVudHMgPSB0cnVlOworICAgIHdoaWxlICghbW91c2VFdmVu
dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBTYXZlZEV2ZW50IGUgPSBtb3VzZUV2ZW50UXVl
dWUuZmlyc3QoKTsKKyAgICAgICAgbW91c2VFdmVudFF1ZXVlLnJlbW92ZUZpcnN0KCk7CisKKyAg
ICAgICAgc3dpdGNoIChlLnR5cGUpIHsKKyAgICAgICAgY2FzZSBTYXZlZEV2ZW50OjpNb3VzZU1v
dmU6IHsKKyAgICAgICAgICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7CisgICAgICAgICAgICBpbml0
TW91c2VFdmVudChXZWJJbnB1dEV2ZW50OjpNb3VzZU1vdmUsIHByZXNzZWRCdXR0b24sIGUucG9z
LCAmZXZlbnQpOworICAgICAgICAgICAgZG9Nb3VzZU1vdmUoZXZlbnQpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTYXZlZEV2ZW50OjpMZWFwRm9yd2FyZDoK
KyAgICAgICAgICAgIGRvTGVhcEZvcndhcmQoZS5taWxsaXNlY29uZHMpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU2F2ZWRFdmVudDo6TW91c2VVcDogeworICAgICAgICAgICAg
V2ViTW91c2VFdmVudCBldmVudDsKKyAgICAgICAgICAgIGluaXRNb3VzZUV2ZW50KFdlYklucHV0
RXZlbnQ6Ok1vdXNlVXAsIGUuYnV0dG9uVHlwZSwgbGFzdE1vdXNlUG9zLCAmZXZlbnQpOworICAg
ICAgICAgICAgZG9Nb3VzZVVwKGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJlcGxheWluZ1NhdmVkRXZlbnRzID0gZmFsc2U7Cit9CisK
K3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6Y29udGV4dENsaWNrKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7CisKKyAgICB3ZWJ2aWV3KCktPmxheW91dCgpOworCisgICAgdXBkYXRlQ2xpY2tD
b3VudEZvckJ1dHRvbihXZWJNb3VzZUV2ZW50OjpCdXR0b25SaWdodCk7CisKKyAgICAvLyBHZW5l
cmF0ZSByaWdodCBtb3VzZSBkb3duIGFuZCB1cC4KKworICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7
CisgICAgcHJlc3NlZEJ1dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvblJpZ2h0OworICAgIGlu
aXRNb3VzZUV2ZW50KFdlYklucHV0RXZlbnQ6Ok1vdXNlRG93biwgV2ViTW91c2VFdmVudDo6QnV0
dG9uUmlnaHQsIGxhc3RNb3VzZVBvcywgJmV2ZW50KTsKKyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlu
cHV0RXZlbnQoZXZlbnQpOworCisgICAgaW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6TW91
c2VVcCwgV2ViTW91c2VFdmVudDo6QnV0dG9uUmlnaHQsIGxhc3RNb3VzZVBvcywgJmV2ZW50KTsK
KyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlucHV0RXZlbnQoZXZlbnQpOworCisgICAgcHJlc3NlZEJ1
dHRvbiA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbk5vbmU7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6c2NoZWR1bGVBc3luY2hyb25vdXNDbGljayhjb25zdCBDcHBBcmd1bWVudExp
c3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVs
bCgpOworCisgICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soCisgICAgICAgIEZS
T01fSEVSRSwgbV9tZXRob2RGYWN0b3J5Lk5ld1J1bm5hYmxlTWV0aG9kKAorICAgICAgICAgICAg
JkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Om1vdXNlRG93biwgYXJndW1lbnRzLCBzdGF0aWNfY2Fz
dDxDcHBWYXJpYW50Kj4oMCkpKTsKKyAgICBNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5Qb3N0VGFz
aygKKyAgICAgICAgRlJPTV9IRVJFLCBtX21ldGhvZEZhY3RvcnkuTmV3UnVubmFibGVNZXRob2Qo
CisgICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VVcCwgYXJndW1lbnRz
LCBzdGF0aWNfY2FzdDxDcHBWYXJpYW50Kj4oMCkpKTsKK30KKworc3RhdGljIFdlYlN0cmluZyBm
aWxlUGF0aFN0cmluZ1RvV2ViU3RyaW5nKGNvbnN0IEZpbGVQYXRoOjpTdHJpbmdUeXBlJiBwYXRo
U3RyaW5nKQoreworI2lmIE9TKFVOSVgpCisgIHJldHVybiBXaWRlVG9VVEYxNkhhY2soU3lzTmF0
aXZlTUJUb1dpZGUocGF0aFN0cmluZykpOworI2VsaWYgT1MoV0lORE9XUykKKyAgcmV0dXJuIFdl
YlN0cmluZyhwYXRoU3RyaW5nKTsKKyNlbmRpZgorfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRy
b2xsZXI6OmJlZ2luRHJhZ1dpdGhGaWxlcyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGN1cnJlbnREcmFnRGF0YS5pbml0aWFsaXpl
KCk7CisgICAgVmVjdG9yPHN0cmluZz4gZmlsZXMgPSBhcmd1bWVudHNbMF0udG9TdHJpbmdWZWN0
b3IoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIEZpbGVQYXRoIHBhdGgoZmlsZXNbaV0pOworICAgICAgICBmaWxlX3V0aWw6OkFic29s
dXRlUGF0aCgmcGF0aCk7CisgICAgICAgIGN1cnJlbnREcmFnRGF0YS5hcHBlbmRUb0ZpbGVOYW1l
cyhmaWxlUGF0aFN0cmluZ1RvV2ViU3RyaW5nKHBhdGgudmFsdWUoKSkpOworICAgIH0KKyAgICBj
dXJyZW50RHJhZ0VmZmVjdHNBbGxvd2VkID0gV2ViS2l0OjpXZWJEcmFnT3BlcmF0aW9uQ29weTsK
KworICAgIC8vIFByb3ZpZGUgYSBkcmFnIHNvdXJjZS4KKyAgICB3ZWJ2aWV3KCktPmRyYWdUYXJn
ZXREcmFnRW50ZXIoY3VycmVudERyYWdEYXRhLCAwLCBsYXN0TW91c2VQb3MsIGxhc3RNb3VzZVBv
cywgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCk7CisKKyAgICAvLyBkcmFnTW9kZSBzYXZlcyBl
dmVudHMgYW5kIHRoZW4gcmVwbGF5cyB0aGVtIGxhdGVyLiBXZSBkb24ndCBuZWVkL3dhbnQgdGhh
dC4KKyAgICBkcmFnTW9kZS5zZXQoZmFsc2UpOworCisgICAgLy8gTWFrZSB0aGUgcmVzdCBvZiBl
dmVudFNlbmRlciB0aGluayBhIGRyYWcgaXMgaW4gcHJvZ3Jlc3MuCisgICAgcHJlc3NlZEJ1dHRv
biA9IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbkxlZnQ7CisKKyAgICByZXN1bHQtPnNldE51bGwoKTsK
K30KKworLy8KKy8vIFVuaW1wbGVtZW50ZWQgc3R1YnMKKy8vCisKK3ZvaWQgRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6ZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2
b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChj
b25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6Y2xlYXJLaWxs
UmluZyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
cmVzdWx0LT5zZXROdWxsKCk7Cit9CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9EdW1wUmVuZGVy
VHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmggYi9XZWJLaXRUb29scy9EdW1w
UmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyZmM1YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktp
dFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIuaApA
QCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
ICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKy8qCisgIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXIgY2xhc3M6CisgIEJv
dW5kIHRvIGEgSmF2YVNjcmlwdCB3aW5kb3cuZXZlbnRTZW5kZXIgb2JqZWN0IHVzaW5nCisgIENw
cEJvdW5kQ2xhc3M6OmJpbmRUb0phdmFzY3JpcHQoKSwgdGhpcyBhbGxvd3MgbGF5b3V0IHRlc3Rz
IHRvIGZpcmUgRE9NIGV2ZW50cy4KKyovCisKKyNpZm5kZWYgRXZlbnRTZW5kaW5nQ29udHJvbGxl
cl9oCisjZGVmaW5lIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXJfaAorCisjaW5jbHVkZSAiQ3BwQm91
bmRDbGFzcy5oIgorI2luY2x1ZGUgImJhc2UvdGFzay5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJE
cmFnT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAicHVibGljL1dlYklucHV0RXZlbnQuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViUG9pbnQuaCIKKworY2xhc3MgVGVzdFNoZWxsOworCituYW1lc3BhY2Ug
V2ViS2l0IHsKK2NsYXNzIFdlYkRyYWdEYXRhOworY2xhc3MgV2ViVmlldzsKK30KKworY2xhc3Mg
RXZlbnRTZW5kaW5nQ29udHJvbGxlciA6IHB1YmxpYyBDcHBCb3VuZENsYXNzIHsKK3B1YmxpYzoK
KyAgICAvLyBCdWlsZHMgdGhlIHByb3BlcnR5IGFuZCBtZXRob2QgbGlzdHMgbmVlZGVkIHRvIGJp
bmQgdGhpcyBjbGFzcyB0byBhIEpTCisgICAgLy8gb2JqZWN0LgorICAgIEV2ZW50U2VuZGluZ0Nv
bnRyb2xsZXIoVGVzdFNoZWxsKik7CisKKyAgICAvLyBSZXNldHMgc29tZSBzdGF0aWMgdmFyaWFi
bGUgc3RhdGUuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gU2ltdWxhdGUgZHJhZyZkcm9w
IHN5c3RlbSBjYWxsLgorICAgIHN0YXRpYyB2b2lkIGRvRHJhZ0Ryb3AoY29uc3QgV2ViS2l0OjpX
ZWJQb2ludCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJLaXQ6OldlYkRy
YWdEYXRhJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYktpdDo6V2ViRHJhZ09wZXJh
dGlvbnNNYXNrKTsKKworICAgIC8vIEpTIGNhbGxiYWNrIG1ldGhvZHMuCisgICAgdm9pZCBtb3Vz
ZURvd24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgbW91
c2VVcChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBtb3Vz
ZU1vdmVUbyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBt
b3VzZVdoZWVsVG8oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZv
aWQgbGVhcEZvcndhcmQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAg
IHZvaWQga2V5RG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAg
dm9pZCBkaXNwYXRjaE1lc3NhZ2UoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworICAgIHZvaWQgdGV4dFpvb21Jbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
Kik7CisgICAgdm9pZCB0ZXh0Wm9vbU91dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJp
YW50Kik7CisgICAgdm9pZCB6b29tUGFnZUluKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKyAgICB2b2lkIHpvb21QYWdlT3V0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENw
cFZhcmlhbnQqKTsKKyAgICB2b2lkIHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2soY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgYmVnaW5EcmFnV2l0aEZpbGVz
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICBDcHBWYXJpYW50IGRy
YWdNb2RlOworCisgICAgLy8gVW5pbXBsZW1lbnRlZCBzdHVicworICAgIHZvaWQgY29udGV4dENs
aWNrKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGVuYWJs
ZURPTVVJRXZlbnRMb2dnaW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsK
KyAgICB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChjb25zdCBDcHBBcmd1bWVudExp
c3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBjbGVhcktpbGxSaW5nKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFByb3BlcnRpZXMgdXNlZCBpbiBsYXlv
dXQgdGVzdHMuCisjaWYgZGVmaW5lZChPU19XSU4pCisgICAgQ3BwVmFyaWFudCB3bUtleURvd247
CisgICAgQ3BwVmFyaWFudCB3bUtleVVwOworICAgIENwcFZhcmlhbnQgd21DaGFyOworICAgIENw
cFZhcmlhbnQgd21EZWFkQ2hhcjsKKyAgICBDcHBWYXJpYW50IHdtU3lzS2V5RG93bjsKKyAgICBD
cHBWYXJpYW50IHdtU3lzS2V5VXA7CisgICAgQ3BwVmFyaWFudCB3bVN5c0NoYXI7CisgICAgQ3Bw
VmFyaWFudCB3bVN5c0RlYWRDaGFyOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgLy8gUmV0dXJu
cyB0aGUgdGVzdCBzaGVsbCdzIHdlYnZpZXcuCisgICAgc3RhdGljIFdlYktpdDo6V2ViVmlldyog
d2VidmlldygpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGRyYWdNb2RlIGlzIHRydWUuCisg
ICAgYm9vbCBpc0RyYWdNb2RlKCkgeyByZXR1cm4gZHJhZ01vZGUuaXNCb29sKCkgJiYgZHJhZ01v
ZGUudG9Cb29sZWFuKCk7IH0KKworICAgIC8vIFNvbWV0aW1lcyB3ZSBxdWV1ZSB1cCBtb3VzZSBt
b3ZlIGFuZCBtb3VzZSB1cCBldmVudHMgZm9yIGRyYWcgZHJvcAorICAgIC8vIGhhbmRsaW5nIHB1
cnBvc2VzLiAgVGhlc2UgbWV0aG9kcyBkaXNwYXRjaCB0aGUgZXZlbnQuCisgICAgc3RhdGljIHZv
aWQgZG9Nb3VzZU1vdmUoY29uc3QgV2ViS2l0OjpXZWJNb3VzZUV2ZW50Jik7CisgICAgc3RhdGlj
IHZvaWQgZG9Nb3VzZVVwKGNvbnN0IFdlYktpdDo6V2ViTW91c2VFdmVudCYpOworICAgIHN0YXRp
YyB2b2lkIGRvTGVhcEZvcndhcmQoaW50IG1pbGxpc2Vjb25kcyk7CisgICAgc3RhdGljIHZvaWQg
cmVwbGF5U2F2ZWRFdmVudHMoKTsKKworICAgIC8vIEhlbHBlciB0byByZXR1cm4gdGhlIGJ1dHRv
biB0eXBlIGdpdmVuIGEgYnV0dG9uIGNvZGUKKyAgICBzdGF0aWMgV2ViS2l0OjpXZWJNb3VzZUV2
ZW50OjpCdXR0b24gZ2V0QnV0dG9uVHlwZUZyb21CdXR0b25OdW1iZXIoaW50KTsKKworICAgIC8v
IEhlbHBlciB0byBleHRyYWN0IHRoZSBidXR0b24gbnVtYmVyIGZyb20gdGhlIG9wdGlvbmFsIGFy
Z3VtZW50IGluCisgICAgLy8gbW91c2VEb3duIGFuZCBtb3VzZVVwCisgICAgc3RhdGljIGludCBn
ZXRCdXR0b25OdW1iZXJGcm9tU2luZ2xlQXJnKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYpOworCisg
ICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgcGFzc2VkIGluIG5l
ZWRzIGEgc2hpZnQga2V5CisgICAgLy8gbW9kaWZpZXIgdG8gYmUgcGFzc2VkIGludG8gdGhlIGdl
bmVyYXRlZCBldmVudC4KKyAgICBib29sIG5lZWRzU2hpZnRNb2RpZmllcihpbnQpOworCisgICAg
dm9pZCB1cGRhdGVDbGlja0NvdW50Rm9yQnV0dG9uKFdlYktpdDo6V2ViTW91c2VFdmVudDo6QnV0
dG9uKTsKKworICAgIFNjb3BlZFJ1bm5hYmxlTWV0aG9kRmFjdG9yeTxFdmVudFNlbmRpbmdDb250
cm9sbGVyPiBtX21ldGhvZEZhY3Rvcnk7CisKKyAgICAvLyBOb24tb3duaW5nIHBvaW50ZXIuICBU
aGUgRXZlbnRTZW5kaW5nQ29udHJvbGxlciBpcyBvd25lZCBieSB0aGUgVGVzdFNoZWxsLgorICAg
IHN0YXRpYyBUZXN0U2hlbGwqIHRlc3RTaGVsbDsKKworICAgIC8vIExvY2F0aW9uIG9mIGxhc3Qg
bW91c2VNb3ZlVG8gZXZlbnQuCisgICAgc3RhdGljIFdlYktpdDo6V2ViUG9pbnQgbGFzdE1vdXNl
UG9zOworCisgICAgLy8gQ3VycmVudGx5IHByZXNzZWQgbW91c2UgYnV0dG9uIChMZWZ0L1JpZ2h0
L01pZGRsZSBvciBOb25lKQorICAgIHN0YXRpYyBXZWJLaXQ6OldlYk1vdXNlRXZlbnQ6OkJ1dHRv
biBwcmVzc2VkQnV0dG9uOworCisgICAgLy8gVGhlIGxhc3QgYnV0dG9uIG51bWJlciBwYXNzZWQg
dG8gbW91c2VEb3duIGFuZCBtb3VzZVVwLgorICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRo
ZXIgdGhlIGNsaWNrIGNvdW50IGNvbnRpbnVlcyB0bworICAgIC8vIGluY3JlbWVudCBvciBub3Qu
CisgICAgc3RhdGljIFdlYktpdDo6V2ViTW91c2VFdmVudDo6QnV0dG9uIGxhc3RCdXR0b25UeXBl
OworfTsKKworI2VuZGlmIC8vIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXJfaAorCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50206</attachid>
            <date>2010-03-08 04:21:21 -0800</date>
            <delta_ts>2010-03-08 20:51:15 -0800</delta_ts>
            <desc>Proposed patch rev.3 (style fix)</desc>
            <filename>bug-35859-20100308212119.patch</filename>
            <type>text/plain</type>
            <size>37623</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAzZGM0NzAwLi43YmExOTZlIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDMt
MDggIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBFdmVudFNl
bmRpbmdDb250cm9sbGVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNTg1OQorCisgICAgICAgIEFkZCBFdm5ldFNlbmRpbmdDb250cm9sbGVyIGNsYXNz
ZXMsIHdoaWNoIGFyZSBnb2luZyB0byBiZSB1c2VkIGJ5CisgICAgICAgIER1bXBSZW5kZXJUcmVl
IENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoKKyAgICAgICAgLSBzcmMv
d2Via2l0L3Rvb2xzL3Rlc3Rfc2hlbGwvZXZlbnRfc2VuZGluZ19jb250cm9sbGVyLmNjCisgICAg
ICAgIC0gc3JjL3dlYmtpdC90b29scy90ZXN0X3NoZWxsL2V2ZW50X3NlbmRpbmdfY29udHJvbGxl
ci5oCisgICAgICAgIG9mIENocm9taXVtIHJldi40MDQ5Mi4KKworICAgICAgICAqIER1bXBSZW5k
ZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRpbmdDb250cm9sbGVyLmg6IEFk
ZGVkLgorCiAyMDEwLTAzLTA4ICBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciAgPHplY2tlQHNl
bGZpc2gub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vRXZlbnRTZW5kaW5nQ29udHJv
bGxlci5jcHAgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9FdmVudFNlbmRp
bmdDb250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUy
M2ViCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21p
dW0vRXZlbnRTZW5kaW5nQ29udHJvbGxlci5jcHAKQEAgLTAsMCArMSw4MjggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBUaGlzIGZp
bGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gZm9yIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXIuCisv
LworLy8gU29tZSBub3RlcyBhYm91dCBkcmFnIGFuZCBkcm9wIGhhbmRsaW5nOgorLy8gV2luZG93
cyBkcmFnIGFuZCBkcm9wIGdvZXMgdGhyb3VnaCBhIHN5c3RlbSBjYWxsIHRvIGRvRHJhZ0Ryb3Au
ICBBdCB0aGF0CisvLyBwb2ludCwgcHJvZ3JhbSBjb250cm9sIGlzIGdpdmVuIHRvIFdpbmRvd3Mg
d2hpY2ggdGhlbiBwZXJpb2RpY2FsbHkgbWFrZXMKKy8vIGNhbGxiYWNrcyBpbnRvIHRoZSB3ZWJ2
aWV3LiAgVGhpcyB3b24ndCB3b3JrIGZvciBsYXlvdXQgdGVzdHMsIHNvIGluc3RlYWQsCisvLyB3
ZSBxdWV1ZSB1cCBhbGwgdGhlIG1vdXNlIG1vdmUgYW5kIG1vdXNlIHVwIGV2ZW50cy4gIFdoZW4g
dGhlIHRlc3QgdHJpZXMgdG8KKy8vIHN0YXJ0IGEgZHJhZyAoYnkgY2FsbGluZyBFdmVuU2VuZGlu
Z0NvbnRyb2xsZXI6OmRvRHJhZ0Ryb3ApLCB3ZSB0YWtlIHRoZQorLy8gZXZlbnRzIGluIHRoZSBx
dWV1ZSBhbmQgcmVwbGF5IHRoZW0uCisvLyBUaGUgYmVoYXZpb3Igb2YgcXVldWluZyBldmVudHMg
YW5kIHJlcGxheWluZyB0aGVtIGNhbiBiZSBkaXNhYmxlZCBieSBhCisvLyBsYXlvdXQgdGVzdCBi
eSBzZXR0aW5nIGV2ZW50U2VuZGVyLmRyYWdNb2RlIHRvIGZhbHNlLgorCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRXZlbnRTZW5kaW5nQ29udHJvbGxlci5oIgorCisjaW5jbHVkZSAi
VGVzdFNoZWxsLmgiCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1
ZGUgImJhc2UvZmlsZV9wYXRoLmgiCisjaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKKyNpbmNs
dWRlICJiYXNlL2tleWJvYXJkX2NvZGVzLmgiCisjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3Au
aCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCisjaW5jbHVkZSAiYmFzZS9zeXNfc3Ry
aW5nX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAicHVi
bGljL1dlYkRyYWdEYXRhLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkRyYWdPcGVyYXRpb24uaCIK
KyNpbmNsdWRlICJwdWJsaWMvV2ViUG9pbnQuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViU3RyaW5n
LmgiCisjaW5jbHVkZSAicHVibGljL1dlYlZpZXcuaCIKKyNpbmNsdWRlIDx3dGYvRGVxdWUuaD4K
KworI2lmIE9TKFdJTkRPV1MpCisjaW5jbHVkZSAicHVibGljL3dpbi9XZWJJbnB1dEV2ZW50RmFj
dG9yeS5oIgorI2VuZGlmCisKKy8vIEZJWE1FOiBsYXlvdXQgYmVmb3JlIGVhY2ggZXZlbnQ/CisK
K3VzaW5nIG5hbWVzcGFjZSBiYXNlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVz
cGFjZSBXZWJLaXQ7CisKK1Rlc3RTaGVsbCogRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6dGVzdFNo
ZWxsID0gMDsKK1dlYlBvaW50IEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Omxhc3RNb3VzZVBvczsK
K1dlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBFdmVudFNlbmRpbmdDb250cm9sbGVyOjpwcmVzc2VkQnV0
dG9uID0gV2ViTW91c2VFdmVudDo6QnV0dG9uTm9uZTsKK1dlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBF
dmVudFNlbmRpbmdDb250cm9sbGVyOjpsYXN0QnV0dG9uVHlwZSA9IFdlYk1vdXNlRXZlbnQ6OkJ1
dHRvbk5vbmU7CisKK3N0cnVjdCBTYXZlZEV2ZW50IHsKKyAgICBlbnVtIFNhdmVkRXZlbnRUeXBl
IHsKKyAgICAgICAgVW5zcGVjaWZpZWQsCisgICAgICAgIE1vdXNlVXAsCisgICAgICAgIE1vdXNl
TW92ZSwKKyAgICAgICAgTGVhcEZvcndhcmQKKyAgICB9OworCisgICAgU2F2ZWRFdmVudFR5cGUg
dHlwZTsKKyAgICBXZWJNb3VzZUV2ZW50OjpCdXR0b24gYnV0dG9uVHlwZTsgLy8gRm9yIE1vdXNl
VXAuCisgICAgV2ViUG9pbnQgcG9zOyAvLyBGb3IgTW91c2VNb3ZlLgorICAgIGludCBtaWxsaXNl
Y29uZHM7IC8vIEZvciBMZWFwRm9yd2FyZC4KKworICAgIFNhdmVkRXZlbnQoKQorICAgICAgICA6
IHR5cGUoVW5zcGVjaWZpZWQpCisgICAgICAgICwgYnV0dG9uVHlwZShXZWJNb3VzZUV2ZW50OjpC
dXR0b25Ob25lKQorICAgICAgICAsIG1pbGxpc2Vjb25kcygwKSB7fQorfTsKKworc3RhdGljIFdl
YkRyYWdEYXRhIGN1cnJlbnREcmFnRGF0YTsKK3N0YXRpYyBXZWJEcmFnT3BlcmF0aW9uIGN1cnJl
bnREcmFnRWZmZWN0Oworc3RhdGljIFdlYkRyYWdPcGVyYXRpb25zTWFzayBjdXJyZW50RHJhZ0Vm
ZmVjdHNBbGxvd2VkOworc3RhdGljIGJvb2wgcmVwbGF5aW5nU2F2ZWRFdmVudHMgPSBmYWxzZTsK
K3N0YXRpYyBEZXF1ZTxTYXZlZEV2ZW50PiBtb3VzZUV2ZW50UXVldWU7CisKKy8vIFRpbWUgYW5k
IHBsYWNlIG9mIHRoZSBsYXN0IG1vdXNlIHVwIGV2ZW50Lgorc3RhdGljIGRvdWJsZSBsYXN0Q2xp
Y2tUaW1lU2VjID0gMDsKK3N0YXRpYyBXZWJQb2ludCBsYXN0Q2xpY2tQb3M7CitzdGF0aWMgaW50
IGNsaWNrQ291bnQgPSAwOworCisvLyBtYXhpbXVtIGRpc3RhbmNlIChpbiBzcGFjZSBhbmQgdGlt
ZSkgZm9yIGEgbW91c2UgY2xpY2sKKy8vIHRvIHJlZ2lzdGVyIGFzIGEgZG91YmxlIG9yIHRyaXBs
ZSBjbGljaworc3RhdGljIGNvbnN0IGRvdWJsZSBtdWx0aXBsZUNsaWNrVGltZVNlYyA9IDE7Citz
dGF0aWMgY29uc3QgaW50IG11bHRpcGxlQ2xpY2tSYWRpdXNQaXhlbHMgPSA1OworCisvLyBIb3cg
bXVjaCB3ZSBzaG91bGQgc2Nyb2xsIHBlciBldmVudCAtIHRoZSB2YWx1ZSBoZXJlIGlzIGNob3Nl
biB0bworLy8gbWF0Y2ggdGhlIFdlYktpdCBpbXBsIGFuZCBsYXlvdXQgdGVzdCByZXN1bHRzLgor
c3RhdGljIGNvbnN0IGZsb2F0IHNjcm9sbGJhclBpeGVsc1BlclRpY2sgPSA0MC4wZjsKKworaW5s
aW5lIGJvb2wgb3V0c2lkZU11bHRpQ2xpY2tSYWRpdXMoY29uc3QgV2ViUG9pbnQmIGEsIGNvbnN0
IFdlYlBvaW50JiBiKQoreworICAgIHJldHVybiAoKGEueCAtIGIueCkgKiAoYS54IC0gYi54KSAr
IChhLnkgLSBiLnkpICogKGEueSAtIGIueSkpID4KKyAgICAgICAgbXVsdGlwbGVDbGlja1JhZGl1
c1BpeGVscyAqIG11bHRpcGxlQ2xpY2tSYWRpdXNQaXhlbHM7Cit9CisKKy8vIFVzZWQgdG8gb2Zm
c2V0IHRoZSB0aW1lIHRoZSBldmVudCBoYW5kZXIgdGhpbmdzIGFuIGV2ZW50IGhhcHBlbmVkLiAg
VGhpcyBpcworLy8gZG9uZSBzbyB0ZXN0cyBjYW4gcnVuIHdpdGhvdXQgYSBkZWxheSwgYnV0IGJ5
cGFzcyBjaGVja3MgdGhhdCBhcmUgdGltZQorLy8gZGVwZW5kZW50IChlLmcuLCBkcmFnZ2luZyBo
YXMgYSB0aW1lb3V0IHZzIHNlbGVjdGlvbikuCitzdGF0aWMgdWludDMyIHRpbWVPZmZzZXRNcyA9
IDA7CisKK3N0YXRpYyBkb3VibGUgZ2V0Q3VycmVudEV2ZW50VGltZVNlYygpCit7CisgICAgcmV0
dXJuIChUaW1lVGlja3M6Ok5vdygpLlRvSW50ZXJuYWxWYWx1ZSgpIC8gVGltZTo6a01pY3Jvc2Vj
b25kc1Blck1pbGxpc2Vjb25kICsgdGltZU9mZnNldE1zKSAvIDEwMDAuMDsKK30KKworc3RhdGlj
IHZvaWQgYWR2YW5jZUV2ZW50VGltZShpbnQzMl90IGRlbHRhTXMpCit7CisgICAgdGltZU9mZnNl
dE1zICs9IGRlbHRhTXM7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRNb3VzZUV2ZW50KFdlYklucHV0
RXZlbnQ6OlR5cGUgdCwgV2ViTW91c2VFdmVudDo6QnV0dG9uIGIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBnZng6OlBvaW50JiBwb3MsIFdlYk1vdXNlRXZlbnQqIGUpCit7Cisg
ICAgZS0+dHlwZSA9IHQ7CisgICAgZS0+YnV0dG9uID0gYjsKKyAgICBlLT5tb2RpZmllcnMgPSAw
OworICAgIGUtPnggPSBwb3MueCgpOworICAgIGUtPnkgPSBwb3MueSgpOworICAgIGUtPmdsb2Jh
bFggPSBwb3MueCgpOworICAgIGUtPmdsb2JhbFkgPSBwb3MueSgpOworICAgIGUtPnRpbWVTdGFt
cFNlY29uZHMgPSBnZXRDdXJyZW50RXZlbnRUaW1lU2VjKCk7CisgICAgZS0+Y2xpY2tDb3VudCA9
IGNsaWNrQ291bnQ7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGtleSBp
cyB0aGUgc3lzdGVtIGtleS4KK3N0YXRpYyBib29sIGFwcGx5S2V5TW9kaWZpZXIoY29uc3Qgc3Ry
aW5nJiBtb2RpZmllck5hbWUsIFdlYklucHV0RXZlbnQqIGV2ZW50KQoreworICAgIGJvb2wgaXNT
eXN0ZW1LZXkgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyKiBjaGFyYWN0ZXJzID0gbW9kaWZpZXJO
YW1lLmNfc3RyKCk7CisgICAgaWYgKCFzdHJjbXAoY2hhcmFjdGVycywgImN0cmxLZXkiKQorI2lm
ICFPUyhNQUNfT1NfWCkKKyAgICAgICAgfHwgIXN0cmNtcChjaGFyYWN0ZXJzLCAiYWRkU2VsZWN0
aW9uS2V5IikKKyNlbmRpZgorICAgICAgICApIHsKKyAgICAgICAgZXZlbnQtPm1vZGlmaWVycyB8
PSBXZWJJbnB1dEV2ZW50OjpDb250cm9sS2V5OworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjaGFy
YWN0ZXJzLCAic2hpZnRLZXkiKSB8fCAhc3RyY21wKGNoYXJhY3RlcnMsICJyYW5nZVNlbGVjdGlv
bktleSIpKQorICAgICAgICBldmVudC0+bW9kaWZpZXJzIHw9IFdlYklucHV0RXZlbnQ6OlNoaWZ0
S2V5OworICAgIGVsc2UgaWYgKCFzdHJjbXAoY2hhcmFjdGVycywgImFsdEtleSIpKSB7CisgICAg
ICAgIGV2ZW50LT5tb2RpZmllcnMgfD0gV2ViSW5wdXRFdmVudDo6QWx0S2V5OworI2lmICFPUyhN
QUNfT1NfWCkKKyAgICAgICAgLy8gT24gV2luZG93cyBhbGwga2V5cyB3aXRoIEFsdCBtb2RpZmll
ciB3aWxsIGJlIG1hcmtlZCBhcyBzeXN0ZW0ga2V5LgorICAgICAgICAvLyBXZSBrZWVwIHRoZSBz
YW1lIGJlaGF2aW9yIG9uIExpbnV4LCBzZWU6CisgICAgICAgIC8vIFdlYktpdC9jaHJvbWl1bS9z
cmMvZ3RrL1dlYklucHV0RXZlbnRGYWN0b3J5LmNwcAorICAgICAgICAvLyBJZiB3ZSB3YW50IHRv
IGNoYW5nZSB0aGlzIGJlaGF2aW9yIG9uIExpbnV4LCB0aGlzIHBpZWNlIG9mIGNvZGUgbXVzdCBi
ZQorICAgICAgICAvLyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgcmVsYXRlZCBjb2RlIGluIGFib3Zl
IGZpbGUuCisgICAgICAgIGlzU3lzdGVtS2V5ID0gdHJ1ZTsKKyNlbmRpZgorI2lmIE9TKE1BQ19P
U19YKQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjaGFyYWN0ZXJzLCAibWV0YUtleSIpIHx8ICFz
dHJjbXAoY2hhcmFjdGVycywgImFkZFNlbGVjdGlvbktleSIpKSB7CisgICAgICAgIGV2ZW50LT5t
b2RpZmllcnMgfD0gV2ViSW5wdXRFdmVudDo6TWV0YUtleTsKKyAgICAgICAgLy8gT24gTWFjIG9u
bHkgY29tbWFuZCBrZXkgcHJlc3NlcyBhcmUgbWFya2VkIGFzIHN5c3RlbSBrZXkuCisgICAgICAg
IC8vIFNlZSB0aGUgcmVsYXRlZCBjb2RlIGluOiBXZWJLaXQvY2hyb21pdW0vc3JjL21hYy9XZWJJ
bnB1dEV2ZW50RmFjdG9yeS5jcHAKKyAgICAgICAgLy8gSXQgbXVzdCBiZSBrZXB0IGluIHN5bmMg
d2l0aCB0aGUgcmVsYXRlZCBjb2RlIGluIGFib3ZlIGZpbGUuCisgICAgICAgIGlzU3lzdGVtS2V5
ID0gdHJ1ZTsKKyNlbHNlCisgICAgfSBlbHNlIGlmICghd2NzY21wKGNoYXJhY3RlcnMsIEwibWV0
YUtleSIpKSB7CisgICAgICAgIGV2ZW50LT5tb2RpZmllcnMgfD0gV2ViSW5wdXRFdmVudDo6TWV0
YUtleTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gaXNTeXN0ZW1LZXk7Cit9CisKK3N0YXRp
YyBib29sIGFwcGx5S2V5TW9kaWZpZXJzKGNvbnN0IENwcFZhcmlhbnQqIGFyZ3VtZW50LCBXZWJJ
bnB1dEV2ZW50KiBldmVudCkKK3sKKyAgICBib29sIGlzU3lzdGVtS2V5ID0gZmFsc2U7CisgICAg
aWYgKGFyZ3VtZW50LT5pc09iamVjdCgpKSB7CisgICAgICAgIFZlY3RvcjxzdHJpbmc+IG1vZGlm
aWVycyA9IGFyZ3VtZW50LT50b1N0cmluZ1ZlY3RvcigpOworICAgICAgICBmb3IgKFZlY3Rvcjxz
dHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpID0gbW9kaWZpZXJzLmJlZ2luKCk7IGkgIT0gbW9kaWZp
ZXJzLmVuZCgpOyArK2kpCisgICAgICAgICAgICBpc1N5c3RlbUtleSB8PSBhcHBseUtleU1vZGlm
aWVyKCppLCBldmVudCk7CisgICAgfSBlbHNlIGlmIChhcmd1bWVudC0+aXNTdHJpbmcoKSkKKyAg
ICAgICAgaXNTeXN0ZW1LZXkgPSBhcHBseUtleU1vZGlmaWVyKGFyZ3VtZW50LT50b1N0cmluZygp
LCBldmVudCk7CisgICAgcmV0dXJuIGlzU3lzdGVtS2V5OworfQorCisvLyBHZXQgdGhlIGVkaXQg
Y29tbWFuZCBjb3JyZXNwb25kaW5nIHRvIGEga2V5Ym9hcmQgZXZlbnQuCisvLyBSZXR1cm5zIHRy
dWUgaWYgdGhlIHNwZWNpZmllZCBldmVudCBjb3JyZXNwb25kcyB0byBhbiBlZGl0IGNvbW1hbmQs
IHRoZSBuYW1lCisvLyBvZiB0aGUgZWRpdCBjb21tYW5kIHdpbGwgYmUgc3RvcmVkIGluIHwqbmFt
ZXwuCitib29sIGdldEVkaXRDb21tYW5kKGNvbnN0IFdlYktleWJvYXJkRXZlbnQmIGV2ZW50LCBz
dHJpbmcqIG5hbWUpCit7CisjaWYgT1MoTUFDX09TX1gpCisgICAgLy8gV2Ugb25seSBjYXJlcyBh
Ym91dCBMZWZ0LFJpZ2h0LFVwLERvd24ga2V5cyB3aXRoIENvbW1hbmQgb3IgQ29tbWFuZCtTaGlm
dAorICAgIC8vIG1vZGlmaWVycy4gVGhlc2Uga2V5IGV2ZW50cyBjb3JyZXNwb25kIHRvIHNvbWUg
c3BlY2lhbCBtb3ZlbWVudCBhbmQKKyAgICAvLyBzZWxlY3Rpb24gZWRpdG9yIGNvbW1hbmRzLCBh
bmQgd2FzIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgaW4KKyAgICAvLyBXZWJLaXQvY2hyb21pdW0v
c3JjL0VkaXRvckNsaWVudEltcGwuY3BwLiBCdXQgdGhlc2Uga2V5cyB3aWxsIGJlIG1hcmtlZAor
ICAgIC8vIGFzIHN5c3RlbSBrZXksIHdoaWNoIHByZXZlbnRzIHRoZW0gZnJvbSBiZWluZyBoYW5k
bGVkLiBUaHVzIHRoZXkgbXVzdCBiZQorICAgIC8vIGhhbmRsZWQgc3BlY2lhbGx5LgorICAgIGlm
ICgoZXZlbnQubW9kaWZpZXJzICYgfldlYktleWJvYXJkRXZlbnQ6OlNoaWZ0S2V5KSAhPSBXZWJL
ZXlib2FyZEV2ZW50OjpNZXRhS2V5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzd2l0
Y2ggKGV2ZW50LndpbmRvd3NLZXlDb2RlKSB7CisgICAgY2FzZSBiYXNlOjpWS0VZX0xFRlQ6Cisg
ICAgICAgICpuYW1lID0gIk1vdmVUb0JlZ2lubmluZ09mTGluZSI7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgYmFzZTo6VktFWV9SSUdIVDoKKyAgICAgICAgKm5hbWUgPSAiTW92ZVRvRW5kT2ZM
aW5lIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBiYXNlOjpWS0VZX1VQOgorICAgICAgICAq
bmFtZSA9ICJNb3ZlVG9CZWdpbm5pbmdPZkRvY3VtZW50IjsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBiYXNlOjpWS0VZX0RPV046CisgICAgICAgICpuYW1lID0gIk1vdmVUb0VuZE9mRG9jdW1l
bnQiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgaWYgKGV2ZW50Lm1vZGlmaWVycyAmIFdlYktleWJvYXJkRXZlbnQ6OlNo
aWZ0S2V5KQorICAgICAgICBuYW1lLT5hcHBlbmQoIkFuZE1vZGlmeVNlbGVjdGlvbiIpOworCisg
ICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisv
LyBLZXkgZXZlbnQgbG9jYXRpb24gY29kZSBpbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAzLgorLy8g
U2VlIGFsc286IGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRz
LWtleWJvYXJkZXZlbnRzCitlbnVtIEtleUxvY2F0aW9uQ29kZSB7CisgICAgRE9NS2V5TG9jYXRp
b25TdGFuZGFyZCAgICAgID0gMHgwMCwKKyAgICBET01LZXlMb2NhdGlvbkxlZnQgICAgICAgICAg
PSAweDAxLAorICAgIERPTUtleUxvY2F0aW9uUmlnaHQgICAgICAgICA9IDB4MDIsCisgICAgRE9N
S2V5TG9jYXRpb25OdW1wYWQgICAgICAgID0gMHgwMworfTsKKworRXZlbnRTZW5kaW5nQ29udHJv
bGxlcjo6RXZlbnRTZW5kaW5nQ29udHJvbGxlcihUZXN0U2hlbGwqIHNoZWxsKQorICAgIDogQUxM
T1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKG1fbWV0aG9kRmFjdG9yeSh0aGlzKSkKK3sKKyAg
ICAvLyBTZXQgc3RhdGljIHRlc3RTaGVsbCB2YXJpYWJsZSBzaW5jZSB3ZSBjYW4ndCBkbyBpdCBp
biBhbiBpbml0aWFsaXplciBsaXN0LgorICAgIC8vIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVs
IG5vdCB0byBhc3NpZ24gdGVzdFNoZWxsIHRvIG5ldyB3aW5kb3dzIHdoaWNoIGFyZQorICAgIC8v
IHRlbXBvcmFyeS4KKyAgICBpZiAoIXRlc3RTaGVsbCkKKyAgICAgICAgdGVzdFNoZWxsID0gc2hl
bGw7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBtYXAgdGhhdCBhc3NvY2lhdGVzIG1ldGhvZHMg
b2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBuYW1lcworICAgIC8vIHRoZXkgd2lsbCB1c2Ugd2hlbiBj
YWxsZWQgYnkgSmF2YVNjcmlwdC4gIFRoZSBhY3R1YWwgYmluZGluZyBvZiB0aG9zZQorICAgIC8v
IG5hbWVzIHRvIHRoZWlyIG1ldGhvZHMgd2lsbCBiZSBkb25lIGJ5IGNhbGxpbmcgYmluZFRvSmF2
YVNjcmlwdCgpIChkZWZpbmVkCisgICAgLy8gYnkgQ3BwQm91bmRDbGFzcywgdGhlIHBhcmVudCB0
byBFdmVudFNlbmRpbmdDb250cm9sbGVyKS4KKyAgICBiaW5kTWV0aG9kKCJtb3VzZURvd24iLCAm
RXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VEb3duKTsKKyAgICBiaW5kTWV0aG9kKCJtb3Vz
ZVVwIiwgJkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Om1vdXNlVXApOworICAgIGJpbmRNZXRob2Qo
ImNvbnRleHRDbGljayIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpjb250ZXh0Q2xpY2spOwor
ICAgIGJpbmRNZXRob2QoIm1vdXNlTW92ZVRvIiwgJkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Om1v
dXNlTW92ZVRvKTsKKyAgICBiaW5kTWV0aG9kKCJtb3VzZVdoZWVsVG8iLCAmRXZlbnRTZW5kaW5n
Q29udHJvbGxlcjo6bW91c2VXaGVlbFRvKTsKKyAgICBiaW5kTWV0aG9kKCJsZWFwRm9yd2FyZCIs
ICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjpsZWFwRm9yd2FyZCk7CisgICAgYmluZE1ldGhvZCgi
a2V5RG93biIsICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjprZXlEb3duKTsKKyAgICBiaW5kTWV0
aG9kKCJkaXNwYXRjaE1lc3NhZ2UiLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZGlzcGF0Y2hN
ZXNzYWdlKTsKKyAgICBiaW5kTWV0aG9kKCJlbmFibGVET01VSUV2ZW50TG9nZ2luZyIsCisgICAg
ICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZW5hYmxlRE9NVUlFdmVudExvZ2dp
bmcpOworICAgIGJpbmRNZXRob2QoImZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudCIsCisgICAg
ICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZmlyZUtleWJvYXJkRXZlbnRzVG9F
bGVtZW50KTsKKyAgICBiaW5kTWV0aG9kKCJjbGVhcktpbGxSaW5nIiwgJkV2ZW50U2VuZGluZ0Nv
bnRyb2xsZXI6OmNsZWFyS2lsbFJpbmcpOworICAgIGJpbmRNZXRob2QoInRleHRab29tSW4iLCAm
RXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6dGV4dFpvb21Jbik7CisgICAgYmluZE1ldGhvZCgidGV4
dFpvb21PdXQiLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6dGV4dFpvb21PdXQpOworICAgIGJp
bmRNZXRob2QoInpvb21QYWdlSW4iLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6em9vbVBhZ2VJ
bik7CisgICAgYmluZE1ldGhvZCgiem9vbVBhZ2VPdXQiLCAmRXZlbnRTZW5kaW5nQ29udHJvbGxl
cjo6em9vbVBhZ2VPdXQpOworICAgIGJpbmRNZXRob2QoInNjaGVkdWxlQXN5bmNocm9ub3VzQ2xp
Y2siLAorICAgICAgICAgICAgICAgJkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnNjaGVkdWxlQXN5
bmNocm9ub3VzQ2xpY2spOworICAgIGJpbmRNZXRob2QoImJlZ2luRHJhZ1dpdGhGaWxlcyIsCisg
ICAgICAgICAgICAgICAmRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6YmVnaW5EcmFnV2l0aEZpbGVz
KTsKKworICAgIC8vIFdoZW4gc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0IHZhbHVlKSwgd2UgYmF0
Y2ggbW91c2UgbW92ZSBhbmQgbW91c2UgdXAKKyAgICAvLyBldmVudHMgc28gd2UgY2FuIHNpbXVs
YXRlIGRyYWcgJiBkcm9wLgorICAgIGJpbmRQcm9wZXJ0eSgiZHJhZ01vZGUiLCAmZHJhZ01vZGUp
OworI2lmIE9TKFdJTkRPV1MpCisgICAgYmluZFByb3BlcnR5KCJXTV9LRVlET1dOIiwgJndtS2V5
RG93bik7CisgICAgYmluZFByb3BlcnR5KCJXTV9LRVlVUCIsICZ3bUtleVVwKTsKKyAgICBiaW5k
UHJvcGVydHkoIldNX0NIQVIiLCAmd21DaGFyKTsKKyAgICBiaW5kUHJvcGVydHkoIldNX0RFQURD
SEFSIiwgJndtRGVhZENoYXIpOworICAgIGJpbmRQcm9wZXJ0eSgiV01fU1lTS0VZRE9XTiIsICZ3
bVN5c0tleURvd24pOworICAgIGJpbmRQcm9wZXJ0eSgiV01fU1lTS0VZVVAiLCAmd21TeXNLZXlV
cCk7CisgICAgYmluZFByb3BlcnR5KCJXTV9TWVNDSEFSIiwgJndtU3lzQ2hhcik7CisgICAgYmlu
ZFByb3BlcnR5KCJXTV9TWVNERUFEQ0hBUiIsICZ3bVN5c0RlYWRDaGFyKTsKKyNlbmRpZgorfQor
Cit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnJlc2V0KCkKK3sKKyAgICAvLyBUaGUgdGVz
dCBzaG91bGQgaGF2ZSBmaW5pc2hlZCBhIGRyYWcgYW5kIHRoZSBtb3VzZSBidXR0b24gc3RhdGUu
CisgICAgQVNTRVJUKGN1cnJlbnREcmFnRGF0YS5pc051bGwoKSk7CisgICAgY3VycmVudERyYWdE
YXRhLnJlc2V0KCk7CisgICAgY3VycmVudERyYWdFZmZlY3QgPSBXZWJLaXQ6OldlYkRyYWdPcGVy
YXRpb25Ob25lOworICAgIGN1cnJlbnREcmFnRWZmZWN0c0FsbG93ZWQgPSBXZWJLaXQ6OldlYkRy
YWdPcGVyYXRpb25Ob25lOworICAgIHByZXNzZWRCdXR0b24gPSBXZWJNb3VzZUV2ZW50OjpCdXR0
b25Ob25lOworICAgIGRyYWdNb2RlLnNldCh0cnVlKTsKKyNpZiBPUyhXSU5ET1dTKQorICAgIHdt
S2V5RG93bi5TZXQoV01fS0VZRE9XTik7CisgICAgd21LZXlVcC5TZXQoV01fS0VZVVApOworICAg
IHdtQ2hhci5TZXQoV01fQ0hBUik7CisgICAgd21EZWFkQ2hhci5TZXQoV01fREVBRENIQVIpOwor
ICAgIHdtU3lzS2V5RG93bi5TZXQoV01fU1lTS0VZRE9XTik7CisgICAgd21TeXNLZXlVcC5TZXQo
V01fU1lTS0VZVVApOworICAgIHdtU3lzQ2hhci5TZXQoV01fU1lTQ0hBUik7CisgICAgd21TeXNE
ZWFkQ2hhci5TZXQoV01fU1lTREVBRENIQVIpOworI2VuZGlmCisgICAgbGFzdE1vdXNlUG9zID0g
V2ViUG9pbnQoMCwgMCk7CisgICAgbGFzdENsaWNrVGltZVNlYyA9IDA7CisgICAgbGFzdENsaWNr
UG9zID0gV2ViUG9pbnQoMCwgMCk7CisgICAgY2xpY2tDb3VudCA9IDA7CisgICAgbGFzdEJ1dHRv
blR5cGUgPSBXZWJNb3VzZUV2ZW50OjpCdXR0b25Ob25lOworICAgIHRpbWVPZmZzZXRNcyA9IDA7
Cit9CisKK1dlYlZpZXcqIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OndlYnZpZXcoKQoreworICAg
IHJldHVybiB0ZXN0U2hlbGwtPndlYlZpZXcoKTsKK30KKwordm9pZCBFdmVudFNlbmRpbmdDb250
cm9sbGVyOjpkb0RyYWdEcm9wKGNvbnN0IFdlYktpdDo6V2ViUG9pbnQmIGV2ZW50UG9zLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkRyYWdEYXRhJiBk
cmFnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJEcmFn
T3BlcmF0aW9uc01hc2sgbWFzaykKK3sKKyAgICBXZWJNb3VzZUV2ZW50IGV2ZW50OworICAgIGlu
aXRNb3VzZUV2ZW50KFdlYklucHV0RXZlbnQ6Ok1vdXNlRG93biwgcHJlc3NlZEJ1dHRvbiwgbGFz
dE1vdXNlUG9zLCAmZXZlbnQpOworICAgIFdlYlBvaW50IGNsaWVudFBvaW50KGV2ZW50LngsIGV2
ZW50LnkpOworICAgIFdlYlBvaW50IHNjcmVlblBvaW50KGV2ZW50Lmdsb2JhbFgsIGV2ZW50Lmds
b2JhbFkpOworICAgIGN1cnJlbnREcmFnRGF0YSA9IGRyYWdEYXRhOworICAgIGN1cnJlbnREcmFn
RWZmZWN0c0FsbG93ZWQgPSBtYXNrOworICAgIGN1cnJlbnREcmFnRWZmZWN0ID0gd2Vidmlldygp
LT5kcmFnVGFyZ2V0RHJhZ0VudGVyKGRyYWdEYXRhLCAwLCBjbGllbnRQb2ludCwgc2NyZWVuUG9p
bnQsIGN1cnJlbnREcmFnRWZmZWN0c0FsbG93ZWQpOworCisgICAgLy8gRmluaXNoIHByb2Nlc3Np
bmcgZXZlbnRzLgorICAgIHJlcGxheVNhdmVkRXZlbnRzKCk7Cit9CisKK1dlYk1vdXNlRXZlbnQ6
OkJ1dHRvbiBFdmVudFNlbmRpbmdDb250cm9sbGVyOjpnZXRCdXR0b25UeXBlRnJvbUJ1dHRvbk51
bWJlcihpbnQgYnV0dG9uQ29kZSkKK3sKKyAgICBpZiAoIWJ1dHRvbkNvZGUpCisgICAgICAgIHJl
dHVybiBXZWJNb3VzZUV2ZW50OjpCdXR0b25MZWZ0OworICAgIGlmIChidXR0b25Db2RlID09IDIp
CisgICAgICAgIHJldHVybiBXZWJNb3VzZUV2ZW50OjpCdXR0b25SaWdodDsKKyAgICByZXR1cm4g
V2ViTW91c2VFdmVudDo6QnV0dG9uTWlkZGxlOworfQorCitpbnQgRXZlbnRTZW5kaW5nQ29udHJv
bGxlcjo6Z2V0QnV0dG9uTnVtYmVyRnJvbVNpbmdsZUFyZyhjb25zdCBDcHBBcmd1bWVudExpc3Qm
IGFyZ3VtZW50cykKK3sKKyAgICBpbnQgYnV0dG9uQ29kZSA9IDA7CisgICAgaWYgKGFyZ3VtZW50
cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc051bWJlcigpKQorICAgICAgICBidXR0b25D
b2RlID0gYXJndW1lbnRzWzBdLnRvSW50MzIoKTsKKyAgICByZXR1cm4gYnV0dG9uQ29kZTsKK30K
Kwordm9pZCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjp1cGRhdGVDbGlja0NvdW50Rm9yQnV0dG9u
KFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBidXR0b25UeXBlKQoreworICAgIGlmICgoZ2V0Q3VycmVu
dEV2ZW50VGltZVNlYygpIC0gbGFzdENsaWNrVGltZVNlYyA8IG11bHRpcGxlQ2xpY2tUaW1lU2Vj
KQorICAgICAgICAmJiAoIW91dHNpZGVNdWx0aUNsaWNrUmFkaXVzKGxhc3RNb3VzZVBvcywgbGFz
dENsaWNrUG9zKSkKKyAgICAgICAgJiYgKGJ1dHRvblR5cGUgPT0gbGFzdEJ1dHRvblR5cGUpKQor
ICAgICAgICArK2NsaWNrQ291bnQ7CisgICAgZWxzZSB7CisgICAgICAgIGNsaWNrQ291bnQgPSAx
OworICAgICAgICBsYXN0QnV0dG9uVHlwZSA9IGJ1dHRvblR5cGU7CisgICAgfQorfQorCisvLwor
Ly8gSW1wbGVtZW50ZWQgamF2YXNjcmlwdCBtZXRob2RzLgorLy8KKwordm9pZCBFdmVudFNlbmRp
bmdDb250cm9sbGVyOjptb3VzZURvd24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMs
IENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAocmVzdWx0KSAvLyBDb3VsZCBiZSAwIGlm
IGludm9rZWQgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisg
ICAgd2VidmlldygpLT5sYXlvdXQoKTsKKworICAgIGludCBidXR0b25OdW1iZXIgPSBnZXRCdXR0
b25OdW1iZXJGcm9tU2luZ2xlQXJnKGFyZ3VtZW50cyk7CisgICAgQVNTRVJUKGJ1dHRvbk51bWJl
ciAhPSAtMSk7CisKKyAgICBXZWJNb3VzZUV2ZW50OjpCdXR0b24gYnV0dG9uVHlwZSA9IGdldEJ1
dHRvblR5cGVGcm9tQnV0dG9uTnVtYmVyKGJ1dHRvbk51bWJlcik7CisKKyAgICB1cGRhdGVDbGlj
a0NvdW50Rm9yQnV0dG9uKGJ1dHRvblR5cGUpOworCisgICAgV2ViTW91c2VFdmVudCBldmVudDsK
KyAgICBwcmVzc2VkQnV0dG9uID0gYnV0dG9uVHlwZTsKKyAgICBpbml0TW91c2VFdmVudChXZWJJ
bnB1dEV2ZW50OjpNb3VzZURvd24sIGJ1dHRvblR5cGUsIGxhc3RNb3VzZVBvcywgJmV2ZW50KTsK
KyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAyICYmIChhcmd1bWVudHNbMV0uaXNPYmplY3Qo
KSB8fCBhcmd1bWVudHNbMV0uaXNTdHJpbmcoKSkpCisgICAgICAgIGFwcGx5S2V5TW9kaWZpZXJz
KCYoYXJndW1lbnRzWzFdKSwgJmV2ZW50KTsKKyAgICB3ZWJ2aWV3KCktPmhhbmRsZUlucHV0RXZl
bnQoZXZlbnQpOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Om1vdXNlVXAoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICBpZiAocmVzdWx0KSAvLyBDb3VsZCBiZSAwIGlmIGludm9rZWQgYXN5bmNocm9ub3VzbHkuCisg
ICAgICAgIHJlc3VsdC0+c2V0TnVsbCgpOworCisgICAgd2VidmlldygpLT5sYXlvdXQoKTsKKwor
ICAgIGludCBidXR0b25OdW1iZXIgPSBnZXRCdXR0b25OdW1iZXJGcm9tU2luZ2xlQXJnKGFyZ3Vt
ZW50cyk7CisgICAgQVNTRVJUKGJ1dHRvbk51bWJlciAhPSAtMSk7CisKKyAgICBXZWJNb3VzZUV2
ZW50OjpCdXR0b24gYnV0dG9uVHlwZSA9IGdldEJ1dHRvblR5cGVGcm9tQnV0dG9uTnVtYmVyKGJ1
dHRvbk51bWJlcik7CisKKyAgICBpZiAoaXNEcmFnTW9kZSgpICYmICFyZXBsYXlpbmdTYXZlZEV2
ZW50cykgeworICAgICAgICBTYXZlZEV2ZW50IHNhdmVkRXZlbnQ7CisgICAgICAgIHNhdmVkRXZl
bnQudHlwZSA9IFNhdmVkRXZlbnQ6Ok1vdXNlVXA7CisgICAgICAgIHNhdmVkRXZlbnQuYnV0dG9u
VHlwZSA9IGJ1dHRvblR5cGU7CisgICAgICAgIG1vdXNlRXZlbnRRdWV1ZS5hcHBlbmQoc2F2ZWRF
dmVudCk7CisgICAgICAgIHJlcGxheVNhdmVkRXZlbnRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgV2ViTW91c2VFdmVudCBldmVudDsKKyAgICAgICAgaW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRF
dmVudDo6TW91c2VVcCwgYnV0dG9uVHlwZSwgbGFzdE1vdXNlUG9zLCAmZXZlbnQpOworICAgICAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAyICYmIChhcmd1bWVudHNbMV0uaXNPYmplY3QoKSB8
fCBhcmd1bWVudHNbMV0uaXNTdHJpbmcoKSkpCisgICAgICAgICAgICBhcHBseUtleU1vZGlmaWVy
cygmKGFyZ3VtZW50c1sxXSksICZldmVudCk7CisgICAgICAgIGRvTW91c2VVcChldmVudCk7Cisg
ICAgfQorfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmRvTW91c2VVcChjb25zdCBX
ZWJNb3VzZUV2ZW50JiBlKQoreworICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5wdXRFdmVudChlKTsK
KworICAgIHByZXNzZWRCdXR0b24gPSBXZWJNb3VzZUV2ZW50OjpCdXR0b25Ob25lOworICAgIGxh
c3RDbGlja1RpbWVTZWMgPSBlLnRpbWVTdGFtcFNlY29uZHM7CisgICAgbGFzdENsaWNrUG9zID0g
bGFzdE1vdXNlUG9zOworCisgICAgLy8gSWYgd2UncmUgaW4gYSBkcmFnIG9wZXJhdGlvbiwgY29t
cGxldGUgaXQuCisgICAgaWYgKGN1cnJlbnREcmFnRGF0YS5pc051bGwoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIFdlYlBvaW50IGNsaWVudFBvaW50KGUueCwgZS55KTsKKyAgICBXZWJQb2ludCBz
Y3JlZW5Qb2ludChlLmdsb2JhbFgsIGUuZ2xvYmFsWSk7CisKKyAgICBjdXJyZW50RHJhZ0VmZmVj
dCA9IHdlYnZpZXcoKS0+ZHJhZ1RhcmdldERyYWdPdmVyKGNsaWVudFBvaW50LCBzY3JlZW5Qb2lu
dCwgY3VycmVudERyYWdFZmZlY3RzQWxsb3dlZCk7CisgICAgaWYgKGN1cnJlbnREcmFnRWZmZWN0
KQorICAgICAgICB3ZWJ2aWV3KCktPmRyYWdUYXJnZXREcm9wKGNsaWVudFBvaW50LCBzY3JlZW5Q
b2ludCk7CisgICAgZWxzZQorICAgICAgICB3ZWJ2aWV3KCktPmRyYWdUYXJnZXREcmFnTGVhdmUo
KTsKKyAgICB3ZWJ2aWV3KCktPmRyYWdTb3VyY2VFbmRlZEF0KGNsaWVudFBvaW50LCBzY3JlZW5Q
b2ludCwgY3VycmVudERyYWdFZmZlY3QpOworICAgIHdlYnZpZXcoKS0+ZHJhZ1NvdXJjZVN5c3Rl
bURyYWdFbmRlZCgpOworCisgICAgY3VycmVudERyYWdEYXRhLnJlc2V0KCk7Cit9CisKK3ZvaWQg
RXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VNb3ZlVG8oY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwo
KTsKKworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMiB8fCAhYXJndW1lbnRzWzBdLmlzTnVt
YmVyKCkgfHwgIWFyZ3VtZW50c1sxXS5pc051bWJlcigpKQorICAgICAgICByZXR1cm47CisgICAg
d2VidmlldygpLT5sYXlvdXQoKTsKKworICAgIFdlYlBvaW50IG1vdXNlUG9zKGFyZ3VtZW50c1sw
XS50b0ludDMyKCksIGFyZ3VtZW50c1sxXS50b0ludDMyKCkpOworCisgICAgaWYgKGlzRHJhZ01v
ZGUoKSAmJiBwcmVzc2VkQnV0dG9uID09IFdlYk1vdXNlRXZlbnQ6OkJ1dHRvbkxlZnQgJiYgIXJl
cGxheWluZ1NhdmVkRXZlbnRzKSB7CisgICAgICAgIFNhdmVkRXZlbnQgc2F2ZWRFdmVudDsKKyAg
ICAgICAgc2F2ZWRFdmVudC50eXBlID0gU2F2ZWRFdmVudDo6TW91c2VNb3ZlOworICAgICAgICBz
YXZlZEV2ZW50LnBvcyA9IG1vdXNlUG9zOworICAgICAgICBtb3VzZUV2ZW50UXVldWUuYXBwZW5k
KHNhdmVkRXZlbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7
CisgICAgICAgIGluaXRNb3VzZUV2ZW50KFdlYklucHV0RXZlbnQ6Ok1vdXNlTW92ZSwgcHJlc3Nl
ZEJ1dHRvbiwgbW91c2VQb3MsICZldmVudCk7CisgICAgICAgIGRvTW91c2VNb3ZlKGV2ZW50KTsK
KyAgICB9Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bW91c2VXaGVlbFRvKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7Cisg
ICAgcmVzdWx0LT5zZXROdWxsKCk7CisKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA8IDIgfHwg
IWFyZ3VtZW50c1swXS5pc051bWJlcigpIHx8ICFhcmd1bWVudHNbMV0uaXNOdW1iZXIoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gRm9yY2UgYSBsYXlvdXQgaGVyZSBqdXN0IHRvIG1ha2Ug
c3VyZSBldmVyeSBwb3NpdGlvbiBoYXMgYmVlbgorICAgIC8vIGRldGVybWluZWQgYmVmb3JlIHdl
IHNlbmQgZXZlbnRzIChhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgbWV0aG9kcworICAgIC8vIHRo
YXQgc2VuZCBhbiBldmVudCBkbykuIFRoZSBsYXlvdXQgdGVzdCBjYWxsaW5nIHRoaXMKKyAgICAv
LyAoc2Nyb2xsYmFycy9vdmVyZmxvdy1zY3JvbGxiYXItaG9yaXpvbnRhbC13aGVlbC1zY3JvbGwu
aHRtbCwgb25seSBvbmUKKyAgICAvLyBmb3Igbm93KSBkb2VzIG5vdCByZWx5IG9uIHRoaXMgdGhv
dWdoLgorICAgIHdlYnZpZXcoKS0+bGF5b3V0KCk7CisKKyAgICBpbnQgaG9yaXpvbnRhbCA9IGFy
Z3VtZW50c1swXS50b0ludDMyKCk7CisgICAgaW50IHZlcnRpY2FsID0gYXJndW1lbnRzWzFdLnRv
SW50MzIoKTsKKworICAgIFdlYk1vdXNlV2hlZWxFdmVudCBldmVudDsKKyAgICBpbml0TW91c2VF
dmVudChXZWJJbnB1dEV2ZW50OjpNb3VzZVdoZWVsLCBwcmVzc2VkQnV0dG9uLCBsYXN0TW91c2VQ
b3MsICZldmVudCk7CisgICAgZXZlbnQud2hlZWxUaWNrc1ggPSBzdGF0aWNfY2FzdDxmbG9hdD4o
aG9yaXpvbnRhbCk7CisgICAgZXZlbnQud2hlZWxUaWNrc1kgPSBzdGF0aWNfY2FzdDxmbG9hdD4o
dmVydGljYWwpOworICAgIGV2ZW50LmRlbHRhWCA9IC1ob3Jpem9udGFsICogc2Nyb2xsYmFyUGl4
ZWxzUGVyVGljazsKKyAgICBldmVudC5kZWx0YVkgPSAtdmVydGljYWwgKiBzY3JvbGxiYXJQaXhl
bHNQZXJUaWNrOworICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5wdXRFdmVudChldmVudCk7Cit9CisK
K3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZG9Nb3VzZU1vdmUoY29uc3QgV2ViTW91c2VF
dmVudCYgZSkKK3sKKyAgICBsYXN0TW91c2VQb3MgPSBXZWJQb2ludChlLngsIGUueSk7CisKKyAg
ICB3ZWJ2aWV3KCktPmhhbmRsZUlucHV0RXZlbnQoZSk7CisKKyAgICBpZiAocHJlc3NlZEJ1dHRv
biA9PSBXZWJNb3VzZUV2ZW50OjpCdXR0b25Ob25lIHx8IGN1cnJlbnREcmFnRGF0YS5pc051bGwo
KSkKKyAgICAgICAgcmV0dXJuOworICAgIFdlYlBvaW50IGNsaWVudFBvaW50KGUueCwgZS55KTsK
KyAgICBXZWJQb2ludCBzY3JlZW5Qb2ludChlLmdsb2JhbFgsIGUuZ2xvYmFsWSk7CisgICAgY3Vy
cmVudERyYWdFZmZlY3QgPSB3ZWJ2aWV3KCktPmRyYWdUYXJnZXREcmFnT3ZlcihjbGllbnRQb2lu
dCwgc2NyZWVuUG9pbnQsIGN1cnJlbnREcmFnRWZmZWN0c0FsbG93ZWQpOworfQorCit2b2lkIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmtleURvd24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1
bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSA8IDEgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygpKQor
ICAgICAgICByZXR1cm47CisgICAgYm9vbCBnZW5lcmF0ZUNoYXIgPSBmYWxzZTsKKworICAgIC8v
IEZJWE1FOiBJJ20gbm90IGV4YWN0bHkgc3VyZSBob3cgd2Ugc2hvdWxkIGNvbnZlcnQgdGhlIHN0
cmluZyB0byBhIGtleQorICAgIC8vIGV2ZW50LiBUaGlzIHNlZW1zIHRvIHdvcmsgaW4gdGhlIGNh
c2VzIEkgdGVzdGVkLgorICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgYWxzbyBnZW5lcmF0ZSBhIEtF
WV9VUD8KKyAgICB3c3RyaW5nIGNvZGVTdHIgPSBVVEY4VG9XaWRlKGFyZ3VtZW50c1swXS50b1N0
cmluZygpKTsKKworICAgIC8vIENvbnZlcnQgXG4gLT4gVktfUkVUVVJOLiAgU29tZSBsYXlvdXQg
dGVzdHMgdXNlIFxuIHRvIG1lYW4gIkVudGVyIiwgd2hlbgorICAgIC8vIFdpbmRvd3MgdXNlcyBc
ciBmb3IgIkVudGVyIi4KKyAgICBpbnQgY29kZSA9IDA7CisgICAgaW50IHRleHQgPSAwOworICAg
IGJvb2wgbmVlZHNTaGlmdEtleU1vZGlmaWVyID0gZmFsc2U7CisgICAgaWYgKEwiXG4iID09IGNv
ZGVTdHIpIHsKKyAgICAgICAgZ2VuZXJhdGVDaGFyID0gdHJ1ZTsKKyAgICAgICAgdGV4dCA9IGNv
ZGUgPSBiYXNlOjpWS0VZX1JFVFVSTjsKKyAgICB9IGVsc2UgaWYgKEwicmlnaHRBcnJvdyIgPT0g
Y29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlfUklHSFQ7CisgICAgZWxzZSBpZiAo
TCJkb3duQXJyb3ciID09IGNvZGVTdHIpCisgICAgICAgIGNvZGUgPSBiYXNlOjpWS0VZX0RPV047
CisgICAgZWxzZSBpZiAoTCJsZWZ0QXJyb3ciID09IGNvZGVTdHIpCisgICAgICAgIGNvZGUgPSBi
YXNlOjpWS0VZX0xFRlQ7CisgICAgZWxzZSBpZiAoTCJ1cEFycm93IiA9PSBjb2RlU3RyKQorICAg
ICAgICBjb2RlID0gYmFzZTo6VktFWV9VUDsKKyAgICBlbHNlIGlmIChMImRlbGV0ZSIgPT0gY29k
ZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlfQkFDSzsKKyAgICBlbHNlIGlmIChMInBh
Z2VVcCIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZLRVlfUFJJT1I7CisgICAg
ZWxzZSBpZiAoTCJwYWdlRG93biIgPT0gY29kZVN0cikKKyAgICAgICAgY29kZSA9IGJhc2U6OlZL
RVlfTkVYVDsKKyAgICBlbHNlIGlmIChMImhvbWUiID09IGNvZGVTdHIpCisgICAgICAgIGNvZGUg
PSBiYXNlOjpWS0VZX0hPTUU7CisgICAgZWxzZSBpZiAoTCJlbmQiID09IGNvZGVTdHIpCisgICAg
ICAgIGNvZGUgPSBiYXNlOjpWS0VZX0VORDsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gQ29tcGFy
ZSB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlIGZ1bmN0aW9uLWtleSBuYW1lcyBkZWZpbmVkIGJ5
IHRoZQorICAgICAgICAvLyBET00gc3BlYyAoaS5lLiAiRjEiLC4uLiwiRjI0IikuIElmIHRoZSBp
bnB1dCBzdHJpbmcgaXMgYSBmdW5jdGlvbi1rZXkKKyAgICAgICAgLy8gbmFtZSwgc2V0IGl0cyBr
ZXkgY29kZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMjQ7ICsraSkgeworICAgICAg
ICAgICAgd3N0cmluZyBmdW5jdGlvbktleU5hbWU7CisgICAgICAgICAgICBmdW5jdGlvbktleU5h
bWUgKz0gTCJGIjsKKyAgICAgICAgICAgIGZ1bmN0aW9uS2V5TmFtZSArPSBJbnRUb1dTdHJpbmco
aSk7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb25LZXlOYW1lID09IGNvZGVTdHIpIHsKKyAgICAg
ICAgICAgICAgICBjb2RlID0gYmFzZTo6VktFWV9GMSArIChpIC0gMSk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb2RlKSB7
CisgICAgICAgICAgICBBU1NFUlQoY29kZVN0ci5sZW5ndGgoKSA9PSAxKTsKKyAgICAgICAgICAg
IHRleHQgPSBjb2RlID0gY29kZVN0clswXTsKKyAgICAgICAgICAgIG5lZWRzU2hpZnRLZXlNb2Rp
ZmllciA9IG5lZWRzU2hpZnRNb2RpZmllcihjb2RlKTsKKyAgICAgICAgICAgIGlmICgoY29kZSAm
IDB4RkYpID49ICdhJyAmJiAoY29kZSAmIDB4RkYpIDw9ICd6JykKKyAgICAgICAgICAgICAgICBj
b2RlIC09ICdhJyAtICdBJzsKKyAgICAgICAgICAgIGdlbmVyYXRlQ2hhciA9IHRydWU7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3Igb25lIGdlbmVyYXRlZCBrZXlib2FyZCBldmVudCwg
d2UgbmVlZCB0byBnZW5lcmF0ZSBhIGtleURvd24va2V5VXAKKyAgICAvLyBwYWlyOyByZWZlciB0
byBFdmVudFNlbmRlci5jcHAgaW4gV2ViS2l0L1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL3dp
bi4KKyAgICAvLyBPbiBXaW5kb3dzLCB3ZSBtaWdodCBhbHNvIG5lZWQgdG8gZ2VuZXJhdGUgYSBj
aGFyIGV2ZW50IHRvIG1pbWljIHRoZQorICAgIC8vIFdpbmRvd3MgZXZlbnQgZmxvdzsgb24gb3Ro
ZXIgcGxhdGZvcm1zIHdlIGNyZWF0ZSBhIG1lcmdlZCBldmVudCBhbmQgdGVzdAorICAgIC8vIHRo
ZSBldmVudCBmbG93IHRoYXQgdGhhdCBwbGF0Zm9ybSBwcm92aWRlcy4KKyAgICBXZWJLZXlib2Fy
ZEV2ZW50IGV2ZW50RG93biwgZXZlbnRDaGFyLCBldmVudFVwOworICAgIGV2ZW50RG93bi50eXBl
ID0gV2ViSW5wdXRFdmVudDo6UmF3S2V5RG93bjsKKyAgICBldmVudERvd24ubW9kaWZpZXJzID0g
MDsKKyAgICBldmVudERvd24ud2luZG93c0tleUNvZGUgPSBjb2RlOworICAgIGlmIChnZW5lcmF0
ZUNoYXIpIHsKKyAgICAgICAgZXZlbnREb3duLnRleHRbMF0gPSB0ZXh0OworICAgICAgICBldmVu
dERvd24udW5tb2RpZmllZFRleHRbMF0gPSB0ZXh0OworICAgIH0KKyAgICBldmVudERvd24uc2V0
S2V5SWRlbnRpZmllckZyb21XaW5kb3dzS2V5Q29kZSgpOworCisgICAgaWYgKGFyZ3VtZW50cy5z
aXplKCkgPj0gMiAmJiAoYXJndW1lbnRzWzFdLmlzT2JqZWN0KCkgfHwgYXJndW1lbnRzWzFdLmlz
U3RyaW5nKCkpKQorICAgICAgICBldmVudERvd24uaXNTeXN0ZW1LZXkgPSBhcHBseUtleU1vZGlm
aWVycygmKGFyZ3VtZW50c1sxXSksICZldmVudERvd24pOworCisgICAgaWYgKG5lZWRzU2hpZnRL
ZXlNb2RpZmllcikKKyAgICAgICAgZXZlbnREb3duLm1vZGlmaWVycyB8PSBXZWJJbnB1dEV2ZW50
OjpTaGlmdEtleTsKKworICAgIC8vIFNlZSBpZiBLZXlMb2NhdGlvbiBhcmd1bWVudCBpcyBnaXZl
bi4KKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAzICYmIGFyZ3VtZW50c1syXS5pc051bWJl
cigpKSB7CisgICAgICAgIGludCBsb2NhdGlvbiA9IGFyZ3VtZW50c1syXS50b0ludDMyKCk7Cisg
ICAgICAgIGlmIChsb2NhdGlvbiA9PSBET01LZXlMb2NhdGlvbk51bXBhZCkKKyAgICAgICAgICAg
IGV2ZW50RG93bi5tb2RpZmllcnMgfD0gV2ViSW5wdXRFdmVudDo6SXNLZXlQYWQ7CisgICAgfQor
CisgICAgZXZlbnRDaGFyID0gZXZlbnRVcCA9IGV2ZW50RG93bjsKKyAgICBldmVudFVwLnR5cGUg
PSBXZWJJbnB1dEV2ZW50OjpLZXlVcDsKKyAgICAvLyBFdmVudFNlbmRpbmdDb250cm9sbGVyLm0g
Zm9yY2VzIGEgbGF5b3V0IGhlcmUsIHdpdGggYXQgbGVhc3Qgb25lCisgICAgLy8gdGVzdCAoZmFz
dC9mb3Jtcy9mb2N1cy1jb250cm9sLXRvLXBhZ2UuaHRtbCkgcmVseWluZyBvbiB0aGlzLgorICAg
IHdlYnZpZXcoKS0+bGF5b3V0KCk7CisKKyAgICAvLyBJbiB0aGUgYnJvd3NlciwgaWYgYSBrZXli
b2FyZCBldmVudCBjb3JyZXNwb25kcyB0byBhbiBlZGl0b3IgY29tbWFuZCwKKyAgICAvLyB0aGUg
Y29tbWFuZCB3aWxsIGJlIGRpc3BhdGNoZWQgdG8gdGhlIHJlbmRlcmVyIGp1c3QgYmVmb3JlIGRp
c3BhdGNoaW5nCisgICAgLy8gdGhlIGtleWJvYXJkIGV2ZW50LCBhbmQgdGhlbiBpdCB3aWxsIGJl
IGV4ZWN1dGVkIGluIHRoZQorICAgIC8vIFJlbmRlclZpZXc6OmhhbmRsZUN1cnJlbnRLZXlib2Fy
ZEV2ZW50KCkgbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQgZnJvbQorICAgIC8vIHRoaXJkX3BhcnR5
L1dlYktpdC9XZWJLaXQvY2hyb21pdW0vc3JjL0VkaXRvckNsaWVudEltcGwuY3BwLgorICAgIC8v
IFdlIGp1c3Qgc2ltdWxhdGUgdGhlIHNhbWUgYmVoYXZpb3IgaGVyZS4KKyAgICBzdHJpbmcgZWRp
dENvbW1hbmQ7CisgICAgaWYgKGdldEVkaXRDb21tYW5kKGV2ZW50RG93biwgJmVkaXRDb21tYW5k
KSkKKyAgICAgICAgdGVzdFNoZWxsLT5kZWxlZ2F0ZSgpLT5zZXRFZGl0Q29tbWFuZChlZGl0Q29t
bWFuZCwgIiIpOworCisgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50RG93bik7
CisKKyAgICB0ZXN0U2hlbGwtPmRlbGVnYXRlKCktPmNsZWFyRWRpdENvbW1hbmQoKTsKKworICAg
IGlmIChnZW5lcmF0ZUNoYXIpIHsKKyAgICAgICAgZXZlbnRDaGFyLnR5cGUgPSBXZWJJbnB1dEV2
ZW50OjpDaGFyOworICAgICAgICBldmVudENoYXIua2V5SWRlbnRpZmllclswXSA9ICdcMCc7Cisg
ICAgICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5wdXRFdmVudChldmVudENoYXIpOworICAgIH0KKwor
ICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5wdXRFdmVudChldmVudFVwKTsKK30KKwordm9pZCBFdmVu
dFNlbmRpbmdDb250cm9sbGVyOjpkaXNwYXRjaE1lc3NhZ2UoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwo
KTsKKworI2lmIE9TKFdJTkRPV1MpCisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPT0gMykgewor
ICAgICAgICAvLyBHcmFiIHRoZSBtZXNzYWdlIGlkIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGRpc3Bh
dGNoIGl0LgorICAgICAgICBpbnQgbXNnID0gYXJndW1lbnRzWzBdLlRvSW50MzIoKTsKKworICAg
ICAgICAvLyBXZWJLaXQncyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gc3R1ZmZzIGEgTVNHIHN0
cnVjdCBhbmQgdXNlcworICAgICAgICAvLyBUcmFuc2xhdGVNZXNzYWdlIGFuZCBEaXNwYXRjaE1l
c3NhZ2UuIFdlIHVzZSBhIFdlYktleWJvYXJkRXZlbnQsIHdoaWNoCisgICAgICAgIC8vIGRvZXNu
J3QgbmVlZCB0byByZWNlaXZlIHRoZSBEZWFkQ2hhciBhbmQgU3lzRGVhZENoYXIgbWVzc2FnZXMu
CisgICAgICAgIGlmIChtc2cgPT0gV01fREVBRENIQVIgfHwgbXNnID09IFdNX1NZU0RFQURDSEFS
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHdlYnZpZXcoKS0+bGF5b3V0KCk7CisK
KyAgICAgICAgdW5zaWduZWQgbG9uZyBscGFyYW0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25n
Pihhcmd1bWVudHNbMl0uVG9Eb3VibGUoKSk7CisgICAgICAgIHdlYnZpZXcoKS0+aGFuZGxlSW5w
dXRFdmVudChXZWJJbnB1dEV2ZW50RmFjdG9yeTo6a2V5Ym9hcmRFdmVudCgwLCBtc2csIGFyZ3Vt
ZW50c1sxXS5Ub0ludDMyKCksIGxwYXJhbSkpOworICAgIH0gZWxzZQorICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyNlbmRpZgorfQorCitib29sIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6
Om5lZWRzU2hpZnRNb2RpZmllcihpbnQga2V5Q29kZSkKK3sKKyAgICAvLyBJZiBjb2RlIGlzIGFu
IHVwcGVyY2FzZSBsZXR0ZXIsIGFzc2lnbiBhIFNISUZUIGtleSB0bworICAgIC8vIGV2ZW50RG93
bi5tb2RpZmllciwgdGhpcyBsb2dpYyBjb21lcyBmcm9tCisgICAgLy8gV2ViS2l0L1dlYktpdFRv
b2xzL0R1bXBSZW5kZXJUcmVlL1dpbi9FdmVudFNlbmRlci5jcHAKKyAgICByZXR1cm4gKGtleUNv
ZGUgJiAweEZGKSA+PSAnQScgJiYgKGtleUNvZGUgJiAweEZGKSA8PSAnWic7Cit9CisKK3ZvaWQg
RXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6bGVhcEZvcndhcmQoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwo
KTsKKworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMSB8fCAhYXJndW1lbnRzWzBdLmlzTnVt
YmVyKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBtaWxsaXNlY29uZHMgPSBhcmd1bWVu
dHNbMF0udG9JbnQzMigpOworICAgIGlmIChpc0RyYWdNb2RlKCkgJiYgcHJlc3NlZEJ1dHRvbiA9
PSBXZWJNb3VzZUV2ZW50OjpCdXR0b25MZWZ0ICYmICFyZXBsYXlpbmdTYXZlZEV2ZW50cykgewor
ICAgICAgICBTYXZlZEV2ZW50IHNhdmVkRXZlbnQ7CisgICAgICAgIHNhdmVkRXZlbnQudHlwZSA9
IFNhdmVkRXZlbnQ6OkxlYXBGb3J3YXJkOworICAgICAgICBzYXZlZEV2ZW50Lm1pbGxpc2Vjb25k
cyA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgbW91c2VFdmVudFF1ZXVlLmFwcGVuZChzYXZlZEV2
ZW50KTsKKyAgICB9IGVsc2UKKyAgICAgICAgZG9MZWFwRm9yd2FyZChtaWxsaXNlY29uZHMpOwor
fQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmRvTGVhcEZvcndhcmQoaW50IG1pbGxp
c2Vjb25kcykKK3sKKyAgICBhZHZhbmNlRXZlbnRUaW1lKG1pbGxpc2Vjb25kcyk7Cit9CisKKy8v
IEFwcGxlJ3MgcG9ydCBvZiBXZWJLaXQgem9vbXMgYnkgYSBmYWN0b3Igb2YgMS4yIChzZWUKKy8v
IFdlYktpdC9XZWJWaWV3L1dlYlZpZXcubW0pCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6
OnRleHRab29tSW4oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQor
eworICAgIHdlYnZpZXcoKS0+c2V0Wm9vbUxldmVsKHRydWUsIHdlYnZpZXcoKS0+em9vbUxldmVs
KCkgKyAxKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBFdmVudFNlbmRpbmdD
b250cm9sbGVyOjp0ZXh0Wm9vbU91dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
KiByZXN1bHQpCit7CisgICAgd2VidmlldygpLT5zZXRab29tTGV2ZWwodHJ1ZSwgd2Vidmlldygp
LT56b29tTGV2ZWwoKSAtIDEpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6Onpvb21QYWdlSW4oY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHdlYnZpZXcoKS0+c2V0Wm9vbUxldmVsKGZhbHNl
LCB3ZWJ2aWV3KCktPnpvb21MZXZlbCgpICsgMSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6em9vbVBhZ2VPdXQoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHdlYnZpZXcoKS0+c2V0Wm9v
bUxldmVsKGZhbHNlLCB3ZWJ2aWV3KCktPnpvb21MZXZlbCgpIC0gMSk7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6cmVwbGF5U2F2ZWRF
dmVudHMoKQoreworICAgIHJlcGxheWluZ1NhdmVkRXZlbnRzID0gdHJ1ZTsKKyAgICB3aGlsZSAo
IW1vdXNlRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgU2F2ZWRFdmVudCBlID0gbW91
c2VFdmVudFF1ZXVlLmZpcnN0KCk7CisgICAgICAgIG1vdXNlRXZlbnRRdWV1ZS5yZW1vdmVGaXJz
dCgpOworCisgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CisgICAgICAgIGNhc2UgU2F2ZWRFdmVu
dDo6TW91c2VNb3ZlOiB7CisgICAgICAgICAgICBXZWJNb3VzZUV2ZW50IGV2ZW50OworICAgICAg
ICAgICAgaW5pdE1vdXNlRXZlbnQoV2ViSW5wdXRFdmVudDo6TW91c2VNb3ZlLCBwcmVzc2VkQnV0
dG9uLCBlLnBvcywgJmV2ZW50KTsKKyAgICAgICAgICAgIGRvTW91c2VNb3ZlKGV2ZW50KTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2F2ZWRFdmVudDo6TGVh
cEZvcndhcmQ6CisgICAgICAgICAgICBkb0xlYXBGb3J3YXJkKGUubWlsbGlzZWNvbmRzKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNhdmVkRXZlbnQ6Ok1vdXNlVXA6IHsKKyAg
ICAgICAgICAgIFdlYk1vdXNlRXZlbnQgZXZlbnQ7CisgICAgICAgICAgICBpbml0TW91c2VFdmVu
dChXZWJJbnB1dEV2ZW50OjpNb3VzZVVwLCBlLmJ1dHRvblR5cGUsIGxhc3RNb3VzZVBvcywgJmV2
ZW50KTsKKyAgICAgICAgICAgIGRvTW91c2VVcChldmVudCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXBsYXlpbmdTYXZlZEV2ZW50cyA9IGZh
bHNlOworfQorCit2b2lkIEV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6OmNvbnRleHRDbGljayhjb25z
dCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAg
IHJlc3VsdC0+c2V0TnVsbCgpOworCisgICAgd2VidmlldygpLT5sYXlvdXQoKTsKKworICAgIHVw
ZGF0ZUNsaWNrQ291bnRGb3JCdXR0b24oV2ViTW91c2VFdmVudDo6QnV0dG9uUmlnaHQpOworCisg
ICAgLy8gR2VuZXJhdGUgcmlnaHQgbW91c2UgZG93biBhbmQgdXAuCisKKyAgICBXZWJNb3VzZUV2
ZW50IGV2ZW50OworICAgIHByZXNzZWRCdXR0b24gPSBXZWJNb3VzZUV2ZW50OjpCdXR0b25SaWdo
dDsKKyAgICBpbml0TW91c2VFdmVudChXZWJJbnB1dEV2ZW50OjpNb3VzZURvd24sIFdlYk1vdXNl
RXZlbnQ6OkJ1dHRvblJpZ2h0LCBsYXN0TW91c2VQb3MsICZldmVudCk7CisgICAgd2Vidmlldygp
LT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50KTsKKworICAgIGluaXRNb3VzZUV2ZW50KFdlYklucHV0
RXZlbnQ6Ok1vdXNlVXAsIFdlYk1vdXNlRXZlbnQ6OkJ1dHRvblJpZ2h0LCBsYXN0TW91c2VQb3Ms
ICZldmVudCk7CisgICAgd2VidmlldygpLT5oYW5kbGVJbnB1dEV2ZW50KGV2ZW50KTsKKworICAg
IHByZXNzZWRCdXR0b24gPSBXZWJNb3VzZUV2ZW50OjpCdXR0b25Ob25lOworfQorCit2b2lkIEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI6OnNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2soY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKKworICAgIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlBvc3RUYXNrKAor
ICAgICAgICBGUk9NX0hFUkUsIG1fbWV0aG9kRmFjdG9yeS5OZXdSdW5uYWJsZU1ldGhvZCgKKyAg
ICAgICAgICAgICZFdmVudFNlbmRpbmdDb250cm9sbGVyOjptb3VzZURvd24sIGFyZ3VtZW50cywg
c3RhdGljX2Nhc3Q8Q3BwVmFyaWFudCo+KDApKSk7CisgICAgTWVzc2FnZUxvb3A6OmN1cnJlbnQo
KS0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwgbV9tZXRob2RGYWN0b3J5Lk5ld1J1bm5h
YmxlTWV0aG9kKAorICAgICAgICAgICAgJkV2ZW50U2VuZGluZ0NvbnRyb2xsZXI6Om1vdXNlVXAs
IGFyZ3VtZW50cywgc3RhdGljX2Nhc3Q8Q3BwVmFyaWFudCo+KDApKSk7Cit9CisKK3N0YXRpYyBX
ZWJTdHJpbmcgZmlsZVBhdGhTdHJpbmdUb1dlYlN0cmluZyhjb25zdCBGaWxlUGF0aDo6U3RyaW5n
VHlwZSYgcGF0aFN0cmluZykKK3sKKyNpZiBPUyhVTklYKQorICAgIHJldHVybiBXaWRlVG9VVEYx
NkhhY2soU3lzTmF0aXZlTUJUb1dpZGUocGF0aFN0cmluZykpOworI2VsaWYgT1MoV0lORE9XUykK
KyAgICByZXR1cm4gV2ViU3RyaW5nKHBhdGhTdHJpbmcpOworI2VuZGlmCit9CisKK3ZvaWQgRXZl
bnRTZW5kaW5nQ29udHJvbGxlcjo6YmVnaW5EcmFnV2l0aEZpbGVzKGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgY3VycmVudERyYWdE
YXRhLmluaXRpYWxpemUoKTsKKyAgICBWZWN0b3I8c3RyaW5nPiBmaWxlcyA9IGFyZ3VtZW50c1sw
XS50b1N0cmluZ1ZlY3RvcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmlsZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgRmlsZVBhdGggcGF0aChmaWxlc1tpXSk7CisgICAgICAgIGZp
bGVfdXRpbDo6QWJzb2x1dGVQYXRoKCZwYXRoKTsKKyAgICAgICAgY3VycmVudERyYWdEYXRhLmFw
cGVuZFRvRmlsZU5hbWVzKGZpbGVQYXRoU3RyaW5nVG9XZWJTdHJpbmcocGF0aC52YWx1ZSgpKSk7
CisgICAgfQorICAgIGN1cnJlbnREcmFnRWZmZWN0c0FsbG93ZWQgPSBXZWJLaXQ6OldlYkRyYWdP
cGVyYXRpb25Db3B5OworCisgICAgLy8gUHJvdmlkZSBhIGRyYWcgc291cmNlLgorICAgIHdlYnZp
ZXcoKS0+ZHJhZ1RhcmdldERyYWdFbnRlcihjdXJyZW50RHJhZ0RhdGEsIDAsIGxhc3RNb3VzZVBv
cywgbGFzdE1vdXNlUG9zLCBjdXJyZW50RHJhZ0VmZmVjdHNBbGxvd2VkKTsKKworICAgIC8vIGRy
YWdNb2RlIHNhdmVzIGV2ZW50cyBhbmQgdGhlbiByZXBsYXlzIHRoZW0gbGF0ZXIuIFdlIGRvbid0
IG5lZWQvd2FudCB0aGF0LgorICAgIGRyYWdNb2RlLnNldChmYWxzZSk7CisKKyAgICAvLyBNYWtl
IHRoZSByZXN0IG9mIGV2ZW50U2VuZGVyIHRoaW5rIGEgZHJhZyBpcyBpbiBwcm9ncmVzcy4KKyAg
ICBwcmVzc2VkQnV0dG9uID0gV2ViTW91c2VFdmVudDo6QnV0dG9uTGVmdDsKKworICAgIHJlc3Vs
dC0+c2V0TnVsbCgpOworfQorCisvLworLy8gVW5pbXBsZW1lbnRlZCBzdHVicworLy8KKwordm9p
ZCBFdmVudFNlbmRpbmdDb250cm9sbGVyOjplbmFibGVET01VSUV2ZW50TG9nZ2luZyhjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7Cit9CisKK3ZvaWQgRXZlbnRTZW5kaW5nQ29udHJvbGxlcjo6ZmlyZUtleWJvYXJkRXZl
bnRzVG9FbGVtZW50KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBFdmVudFNlbmRpbmdDb250cm9s
bGVyOjpjbGVhcktpbGxSaW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJl
c3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KZGlmZiAtLWdpdCBhL1dlYktpdFRv
b2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIuaCBiL1dl
YktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0V2ZW50U2VuZGluZ0NvbnRyb2xsZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJmYzVjCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vRXZlbnRTZW5kaW5n
Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEw
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAq
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAgRXZlbnRTZW5kaW5nQ29udHJvbGxl
ciBjbGFzczoKKyAgQm91bmQgdG8gYSBKYXZhU2NyaXB0IHdpbmRvdy5ldmVudFNlbmRlciBvYmpl
Y3QgdXNpbmcKKyAgQ3BwQm91bmRDbGFzczo6YmluZFRvSmF2YXNjcmlwdCgpLCB0aGlzIGFsbG93
cyBsYXlvdXQgdGVzdHMgdG8gZmlyZSBET00gZXZlbnRzLgorKi8KKworI2lmbmRlZiBFdmVudFNl
bmRpbmdDb250cm9sbGVyX2gKKyNkZWZpbmUgRXZlbnRTZW5kaW5nQ29udHJvbGxlcl9oCisKKyNp
bmNsdWRlICJDcHBCb3VuZENsYXNzLmgiCisjaW5jbHVkZSAiYmFzZS90YXNrLmgiCisjaW5jbHVk
ZSAicHVibGljL1dlYkRyYWdPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViSW5wdXRF
dmVudC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJQb2ludC5oIgorCitjbGFzcyBUZXN0U2hlbGw7
CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgV2ViRHJhZ0RhdGE7CitjbGFzcyBXZWJWaWV3
OworfQorCitjbGFzcyBFdmVudFNlbmRpbmdDb250cm9sbGVyIDogcHVibGljIENwcEJvdW5kQ2xh
c3MgeworcHVibGljOgorICAgIC8vIEJ1aWxkcyB0aGUgcHJvcGVydHkgYW5kIG1ldGhvZCBsaXN0
cyBuZWVkZWQgdG8gYmluZCB0aGlzIGNsYXNzIHRvIGEgSlMKKyAgICAvLyBvYmplY3QuCisgICAg
RXZlbnRTZW5kaW5nQ29udHJvbGxlcihUZXN0U2hlbGwqKTsKKworICAgIC8vIFJlc2V0cyBzb21l
IHN0YXRpYyB2YXJpYWJsZSBzdGF0ZS4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBTaW11
bGF0ZSBkcmFnJmRyb3Agc3lzdGVtIGNhbGwuCisgICAgc3RhdGljIHZvaWQgZG9EcmFnRHJvcChj
b25zdCBXZWJLaXQ6OldlYlBvaW50JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFdlYktpdDo6V2ViRHJhZ0RhdGEmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViS2l0
OjpXZWJEcmFnT3BlcmF0aW9uc01hc2spOworCisgICAgLy8gSlMgY2FsbGJhY2sgbWV0aG9kcy4K
KyAgICB2b2lkIG1vdXNlRG93bihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisgICAgdm9pZCBtb3VzZVVwKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsK
KyAgICB2b2lkIG1vdXNlTW92ZVRvKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQq
KTsKKyAgICB2b2lkIG1vdXNlV2hlZWxUbyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJp
YW50Kik7CisgICAgdm9pZCBsZWFwRm9yd2FyZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisgICAgdm9pZCBrZXlEb3duKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKyAgICB2b2lkIGRpc3BhdGNoTWVzc2FnZShjb25zdCBDcHBBcmd1bWVudExpc3Qm
LCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCB0ZXh0Wm9vbUluKGNvbnN0IENwcEFyZ3VtZW50TGlz
dCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHRleHRab29tT3V0KGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHpvb21QYWdlSW4oY29uc3QgQ3BwQXJndW1l
bnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgem9vbVBhZ2VPdXQoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgc2NoZWR1bGVBc3luY2hyb25vdXND
bGljayhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBiZWdp
bkRyYWdXaXRoRmlsZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAg
IENwcFZhcmlhbnQgZHJhZ01vZGU7CisKKyAgICAvLyBVbmltcGxlbWVudGVkIHN0dWJzCisgICAg
dm9pZCBjb250ZXh0Q2xpY2soY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOwor
ICAgIHZvaWQgZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCopOworICAgIHZvaWQgZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGNsZWFyS2lsbFJpbmco
Y29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gUHJvcGVydGll
cyB1c2VkIGluIGxheW91dCB0ZXN0cy4KKyNpZiBkZWZpbmVkKE9TX1dJTikKKyAgICBDcHBWYXJp
YW50IHdtS2V5RG93bjsKKyAgICBDcHBWYXJpYW50IHdtS2V5VXA7CisgICAgQ3BwVmFyaWFudCB3
bUNoYXI7CisgICAgQ3BwVmFyaWFudCB3bURlYWRDaGFyOworICAgIENwcFZhcmlhbnQgd21TeXNL
ZXlEb3duOworICAgIENwcFZhcmlhbnQgd21TeXNLZXlVcDsKKyAgICBDcHBWYXJpYW50IHdtU3lz
Q2hhcjsKKyAgICBDcHBWYXJpYW50IHdtU3lzRGVhZENoYXI7CisjZW5kaWYKKworcHJpdmF0ZToK
KyAgICAvLyBSZXR1cm5zIHRoZSB0ZXN0IHNoZWxsJ3Mgd2Vidmlldy4KKyAgICBzdGF0aWMgV2Vi
S2l0OjpXZWJWaWV3KiB3ZWJ2aWV3KCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZHJhZ01v
ZGUgaXMgdHJ1ZS4KKyAgICBib29sIGlzRHJhZ01vZGUoKSB7IHJldHVybiBkcmFnTW9kZS5pc0Jv
b2woKSAmJiBkcmFnTW9kZS50b0Jvb2xlYW4oKTsgfQorCisgICAgLy8gU29tZXRpbWVzIHdlIHF1
ZXVlIHVwIG1vdXNlIG1vdmUgYW5kIG1vdXNlIHVwIGV2ZW50cyBmb3IgZHJhZyBkcm9wCisgICAg
Ly8gaGFuZGxpbmcgcHVycG9zZXMuICBUaGVzZSBtZXRob2RzIGRpc3BhdGNoIHRoZSBldmVudC4K
KyAgICBzdGF0aWMgdm9pZCBkb01vdXNlTW92ZShjb25zdCBXZWJLaXQ6OldlYk1vdXNlRXZlbnQm
KTsKKyAgICBzdGF0aWMgdm9pZCBkb01vdXNlVXAoY29uc3QgV2ViS2l0OjpXZWJNb3VzZUV2ZW50
Jik7CisgICAgc3RhdGljIHZvaWQgZG9MZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKTsKKyAg
ICBzdGF0aWMgdm9pZCByZXBsYXlTYXZlZEV2ZW50cygpOworCisgICAgLy8gSGVscGVyIHRvIHJl
dHVybiB0aGUgYnV0dG9uIHR5cGUgZ2l2ZW4gYSBidXR0b24gY29kZQorICAgIHN0YXRpYyBXZWJL
aXQ6OldlYk1vdXNlRXZlbnQ6OkJ1dHRvbiBnZXRCdXR0b25UeXBlRnJvbUJ1dHRvbk51bWJlcihp
bnQpOworCisgICAgLy8gSGVscGVyIHRvIGV4dHJhY3QgdGhlIGJ1dHRvbiBudW1iZXIgZnJvbSB0
aGUgb3B0aW9uYWwgYXJndW1lbnQgaW4KKyAgICAvLyBtb3VzZURvd24gYW5kIG1vdXNlVXAKKyAg
ICBzdGF0aWMgaW50IGdldEJ1dHRvbk51bWJlckZyb21TaW5nbGVBcmcoY29uc3QgQ3BwQXJndW1l
bnRMaXN0Jik7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBrZXkgY29k
ZSBwYXNzZWQgaW4gbmVlZHMgYSBzaGlmdCBrZXkKKyAgICAvLyBtb2RpZmllciB0byBiZSBwYXNz
ZWQgaW50byB0aGUgZ2VuZXJhdGVkIGV2ZW50LgorICAgIGJvb2wgbmVlZHNTaGlmdE1vZGlmaWVy
KGludCk7CisKKyAgICB2b2lkIHVwZGF0ZUNsaWNrQ291bnRGb3JCdXR0b24oV2ViS2l0OjpXZWJN
b3VzZUV2ZW50OjpCdXR0b24pOworCisgICAgU2NvcGVkUnVubmFibGVNZXRob2RGYWN0b3J5PEV2
ZW50U2VuZGluZ0NvbnRyb2xsZXI+IG1fbWV0aG9kRmFjdG9yeTsKKworICAgIC8vIE5vbi1vd25p
bmcgcG9pbnRlci4gIFRoZSBFdmVudFNlbmRpbmdDb250cm9sbGVyIGlzIG93bmVkIGJ5IHRoZSBU
ZXN0U2hlbGwuCisgICAgc3RhdGljIFRlc3RTaGVsbCogdGVzdFNoZWxsOworCisgICAgLy8gTG9j
YXRpb24gb2YgbGFzdCBtb3VzZU1vdmVUbyBldmVudC4KKyAgICBzdGF0aWMgV2ViS2l0OjpXZWJQ
b2ludCBsYXN0TW91c2VQb3M7CisKKyAgICAvLyBDdXJyZW50bHkgcHJlc3NlZCBtb3VzZSBidXR0
b24gKExlZnQvUmlnaHQvTWlkZGxlIG9yIE5vbmUpCisgICAgc3RhdGljIFdlYktpdDo6V2ViTW91
c2VFdmVudDo6QnV0dG9uIHByZXNzZWRCdXR0b247CisKKyAgICAvLyBUaGUgbGFzdCBidXR0b24g
bnVtYmVyIHBhc3NlZCB0byBtb3VzZURvd24gYW5kIG1vdXNlVXAuCisgICAgLy8gVXNlZCB0byBk
ZXRlcm1pbmUgd2hldGhlciB0aGUgY2xpY2sgY291bnQgY29udGludWVzIHRvCisgICAgLy8gaW5j
cmVtZW50IG9yIG5vdC4KKyAgICBzdGF0aWMgV2ViS2l0OjpXZWJNb3VzZUV2ZW50OjpCdXR0b24g
bGFzdEJ1dHRvblR5cGU7Cit9OworCisjZW5kaWYgLy8gRXZlbnRTZW5kaW5nQ29udHJvbGxlcl9o
CisK
</data>
<flag name="review"
          id="33274"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>